mirror of
https://github.com/go-micro/go-micro.git
synced 2026-04-30 19:15:24 +02:00
a100a47340
* Initial plan * Update JSON codec to use modern protojson for proper Any type support Co-authored-by: asim <17530+asim@users.noreply.github.com> * Add comprehensive tests for google.protobuf.Any JSON marshaling Co-authored-by: asim <17530+asim@users.noreply.github.com> * Revert codec/proto to old protobuf package for backward compatibility Co-authored-by: asim <17530+asim@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: asim <17530+asim@users.noreply.github.com>
99 lines
2.8 KiB
Go
99 lines
2.8 KiB
Go
package json
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"go-micro.dev/v5/codec"
|
|
"google.golang.org/protobuf/types/known/anypb"
|
|
"google.golang.org/protobuf/types/known/wrapperspb"
|
|
)
|
|
|
|
// mockReadWriteCloser implements io.ReadWriteCloser for testing
|
|
type mockReadWriteCloser struct {
|
|
*bytes.Buffer
|
|
}
|
|
|
|
func (m *mockReadWriteCloser) Close() error {
|
|
return nil
|
|
}
|
|
|
|
// TestCodecAnyTypeWrite tests that google.protobuf.Any types are properly written with @type field
|
|
func TestCodecAnyTypeWrite(t *testing.T) {
|
|
buf := &mockReadWriteCloser{Buffer: bytes.NewBuffer(nil)}
|
|
c := NewCodec(buf).(*Codec)
|
|
|
|
// Create a StringValue message
|
|
stringValue := wrapperspb.String("test value")
|
|
|
|
// Wrap it in an Any message
|
|
anyMsg, err := anypb.New(stringValue)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create Any message: %v", err)
|
|
}
|
|
|
|
// Write the message
|
|
msg := &codec.Message{
|
|
Type: codec.Response,
|
|
}
|
|
if err := c.Write(msg, anyMsg); err != nil {
|
|
t.Fatalf("Failed to write Any message: %v", err)
|
|
}
|
|
|
|
// Parse the written JSON
|
|
var result map[string]interface{}
|
|
if err := json.Unmarshal(buf.Bytes(), &result); err != nil {
|
|
t.Fatalf("Failed to unmarshal JSON: %v", err)
|
|
}
|
|
|
|
// Check that @type field exists
|
|
typeURL, ok := result["@type"].(string)
|
|
if !ok {
|
|
t.Fatalf("@type field not found in JSON output. Got: %v", buf.String())
|
|
}
|
|
|
|
// Verify the type URL is correct
|
|
expectedTypeURL := "type.googleapis.com/google.protobuf.StringValue"
|
|
if typeURL != expectedTypeURL {
|
|
t.Errorf("Expected @type to be %s, got %s", expectedTypeURL, typeURL)
|
|
}
|
|
|
|
t.Logf("Successfully wrote Any type with @type field: %s", buf.String())
|
|
}
|
|
|
|
// TestCodecAnyTypeRead tests that JSON with @type field can be read into google.protobuf.Any
|
|
func TestCodecAnyTypeRead(t *testing.T) {
|
|
// JSON representation of an Any message with @type field
|
|
jsonData := `{"@type":"type.googleapis.com/google.protobuf.StringValue","value":"test value"}`
|
|
|
|
buf := &mockReadWriteCloser{Buffer: bytes.NewBufferString(jsonData + "\n")}
|
|
c := NewCodec(buf).(*Codec)
|
|
|
|
// Read into an Any message
|
|
anyMsg := &anypb.Any{}
|
|
if err := c.ReadBody(anyMsg); err != nil {
|
|
t.Fatalf("Failed to read Any message: %v", err)
|
|
}
|
|
|
|
// Verify the type URL is set
|
|
expectedTypeURL := "type.googleapis.com/google.protobuf.StringValue"
|
|
if anyMsg.TypeUrl != expectedTypeURL {
|
|
t.Errorf("Expected TypeUrl to be %s, got %s", expectedTypeURL, anyMsg.TypeUrl)
|
|
}
|
|
|
|
// Unmarshal the contained message
|
|
stringValue := &wrapperspb.StringValue{}
|
|
if err := anyMsg.UnmarshalTo(stringValue); err != nil {
|
|
t.Fatalf("Failed to unmarshal contained message: %v", err)
|
|
}
|
|
|
|
// Verify the value
|
|
expectedValue := "test value"
|
|
if stringValue.Value != expectedValue {
|
|
t.Errorf("Expected value to be %s, got %s", expectedValue, stringValue.Value)
|
|
}
|
|
|
|
t.Logf("Successfully read Any type from JSON with @type field")
|
|
}
|