You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

message_test.go 3.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package mq
  2. import (
  3. "bytes"
  4. "fmt"
  5. "testing"
  6. "unsafe"
  7. jsoniter "github.com/json-iterator/go"
  8. . "github.com/smartystreets/goconvey/convey"
  9. myreflect "gitlink.org.cn/cloudream/common/utils/reflect"
  10. )
  11. func TestMessage(t *testing.T) {
  12. Convey("测试jsoniter", t, func() {
  13. type MyAny interface{}
  14. type Struct1 struct {
  15. Value string
  16. }
  17. type Struct2 struct {
  18. Value string
  19. }
  20. type Top struct {
  21. A1 Struct1
  22. A2 MyAny
  23. Nil MyAny
  24. }
  25. top := Top{
  26. A1: Struct1{
  27. Value: "s1",
  28. },
  29. A2: Struct2{
  30. Value: "s2",
  31. },
  32. Nil: nil,
  33. }
  34. jsoniter.RegisterTypeEncoderFunc(myreflect.TypeOf[MyAny]().String(),
  35. func(ptr unsafe.Pointer, stream *jsoniter.Stream) {
  36. val := *((*MyAny)(ptr))
  37. stream.WriteArrayStart()
  38. if val != nil {
  39. stream.WriteString(myreflect.TypeOfValue(val).String())
  40. stream.WriteRaw(",")
  41. stream.WriteVal(val)
  42. }
  43. stream.WriteArrayEnd()
  44. },
  45. func(p unsafe.Pointer) bool {
  46. return false
  47. })
  48. jsoniter.RegisterTypeDecoderFunc(myreflect.TypeOf[MyAny]().String(),
  49. func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
  50. vp := (*MyAny)(ptr)
  51. nextTkType := iter.WhatIsNext()
  52. if nextTkType == jsoniter.NilValue {
  53. *vp = nil
  54. } else if nextTkType == jsoniter.ArrayValue {
  55. iter.ReadArray()
  56. typ := iter.ReadString()
  57. iter.ReadArray()
  58. if typ == "message.Struct1" {
  59. var st Struct1
  60. iter.ReadVal(&st)
  61. *vp = st
  62. } else if typ == "message.Struct2" {
  63. var st Struct2
  64. iter.ReadVal(&st)
  65. *vp = st
  66. }
  67. iter.ReadArray()
  68. }
  69. })
  70. buf := bytes.NewBuffer(nil)
  71. enc := jsoniter.NewEncoder(buf)
  72. err := enc.Encode(top)
  73. So(err, ShouldBeNil)
  74. dec := jsoniter.NewDecoder(buf)
  75. var newTop Top
  76. dec.Decode(&newTop)
  77. fmt.Printf("%s\n", buf.String())
  78. fmt.Printf("%#+v", newTop)
  79. })
  80. Convey("body中包含nil数组", t, func() {
  81. type Body struct {
  82. NilArr []string
  83. }
  84. RegisterMessage[Body]()
  85. msg := MakeMessage(Body{})
  86. data, err := Serialize(msg)
  87. So(err, ShouldBeNil)
  88. retMsg, err := Deserialize(data)
  89. So(err, ShouldBeNil)
  90. So(retMsg.Body.(Body).NilArr, ShouldBeNil)
  91. })
  92. Convey("body中包含匿名结构体", t, func() {
  93. type Emb struct {
  94. Value string `json:"value"`
  95. }
  96. type Body struct {
  97. Emb
  98. }
  99. RegisterMessage[Body]()
  100. msg := MakeMessage(Body{Emb: Emb{Value: "test"}})
  101. data, err := Serialize(msg)
  102. So(err, ShouldBeNil)
  103. retMsg, err := Deserialize(data)
  104. So(err, ShouldBeNil)
  105. So(retMsg.Body.(Body).Value, ShouldEqual, "test")
  106. })
  107. Convey("使用TypeSet类型,但字段值为nil", t, func() {
  108. type MyTypeSet interface {
  109. Test()
  110. }
  111. type Body struct {
  112. Value MyTypeSet
  113. }
  114. RegisterMessage[Body]()
  115. RegisterTypeSet[MyTypeSet]()
  116. msg := MakeMessage(Body{Value: nil})
  117. data, err := Serialize(msg)
  118. So(err, ShouldBeNil)
  119. retMsg, err := Deserialize(data)
  120. So(err, ShouldBeNil)
  121. So(retMsg.Body.(Body).Value, ShouldBeNil)
  122. })
  123. Convey("字段实际类型不在TypeSet范围内", t, func() {
  124. type MyTypeSet interface{}
  125. type Body struct {
  126. Value MyTypeSet
  127. }
  128. RegisterMessage[Body]()
  129. RegisterTypeSet[MyTypeSet]()
  130. msg := MakeMessage(Body{Value: struct{}{}})
  131. _, err := Serialize(msg)
  132. So(err, ShouldNotBeNil)
  133. })
  134. }