/internal/remote/codec_test.go

https://github.com/apache/rocketmq-client-go · Go · 368 lines · 311 code · 41 blank · 16 comment · 121 complexity · 2eb2ccef49a70d77a020511529c6901e MD5 · raw file

  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. See the NOTICE file distributed with
  4. * this work for additional information regarding copyright ownership.
  5. * The ASF licenses this file to You under the Apache License, Version 2.0
  6. * (the "License"); you may not use this file except in compliance with
  7. * the License. You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package remote
  18. import (
  19. "encoding/json"
  20. "fmt"
  21. "math/rand"
  22. "reflect"
  23. "testing"
  24. "unsafe"
  25. jsoniter "github.com/json-iterator/go"
  26. "github.com/stretchr/testify/assert"
  27. )
  28. type testHeader struct {
  29. }
  30. func (t testHeader) Encode() map[string]string {
  31. properties := make(map[string]string)
  32. for i := 0; i < 10; i++ {
  33. properties[randomString(rand.Intn(20))] = randomString(rand.Intn(20))
  34. }
  35. return properties
  36. }
  37. func randomBytes(length int) []byte {
  38. bs := make([]byte, length)
  39. if _, err := rand.Read(bs); err != nil {
  40. panic("read random bytes fail")
  41. }
  42. return bs
  43. }
  44. func randomString(length int) string {
  45. bs := make([]byte, length)
  46. for i := 0; i < len(bs); i++ {
  47. bs[i] = byte(97 + rand.Intn(26))
  48. }
  49. return string(bs)
  50. }
  51. func randomNewRemotingCommand() *RemotingCommand {
  52. var h testHeader
  53. body := randomBytes(rand.Intn(100))
  54. return NewRemotingCommand(int16(rand.Intn(1000)), h, body)
  55. }
  56. func Test_encode(t *testing.T) {
  57. for i := 0; i < 1000; i++ {
  58. rc := randomNewRemotingCommand()
  59. if _, err := encode(rc); err != nil {
  60. t.Fatalf("encode RemotingCommand to bytes fail: %v", err)
  61. }
  62. }
  63. }
  64. func Benchmark_encode(b *testing.B) {
  65. rc := randomNewRemotingCommand()
  66. b.ResetTimer()
  67. for i := 0; i < b.N; i++ {
  68. if _, err := encode(rc); err != nil {
  69. b.Fatalf("encode RemotingCommand to bytes fail: %v", err)
  70. }
  71. }
  72. }
  73. func Test_decode(t *testing.T) {
  74. for i := 0; i < 1000; i++ {
  75. rc := randomNewRemotingCommand()
  76. bs, err := encode(rc)
  77. if err != nil {
  78. t.Fatalf("encode RemotingCommand to bytes fail: %v", err)
  79. }
  80. bs = bs[4:]
  81. decodedRc, err := decode(bs)
  82. if err != nil {
  83. t.Fatalf("decode bytes to RemotingCommand fail: %v", err)
  84. }
  85. if rc.Code != decodedRc.Code {
  86. t.Fatalf("wrong Code. want=%d, got=%d", rc.Code, decodedRc.Code)
  87. }
  88. if rc.Version != decodedRc.Version {
  89. t.Fatalf("wrong Version. want=%d, got=%d", rc.Version, decodedRc.Version)
  90. }
  91. if rc.Opaque != decodedRc.Opaque {
  92. t.Fatalf("wrong opaque. want=%d, got=%d", rc.Opaque, decodedRc.Opaque)
  93. }
  94. if rc.Remark != decodedRc.Remark {
  95. t.Fatalf("wrong remark. want=%s, got=%s", rc.Remark, decodedRc.Remark)
  96. }
  97. if rc.Flag != decodedRc.Flag {
  98. t.Fatalf("wrong flag. want=%d, got=%d", rc.Flag, decodedRc.Flag)
  99. }
  100. if !reflect.DeepEqual(rc.ExtFields, decodedRc.ExtFields) {
  101. t.Fatalf("wrong extFields, want=%v, got=%v", rc.ExtFields, decodedRc.ExtFields)
  102. }
  103. }
  104. }
  105. func Benchmark_decode(b *testing.B) {
  106. rc := randomNewRemotingCommand()
  107. bs, err := encode(rc)
  108. if err != nil {
  109. b.Fatalf("encode RemotingCommand to bytes fail: %v", err)
  110. }
  111. b.ResetTimer()
  112. bs = bs[4:]
  113. for i := 0; i < b.N; i++ {
  114. if _, err := decode(bs); err != nil {
  115. b.Fatalf("decode bytes to RemotingCommand fail: %v", err)
  116. }
  117. }
  118. }
  119. func Test_jsonCodec_encodeHeader(t *testing.T) {
  120. for i := 0; i < 1000; i++ {
  121. rc := randomNewRemotingCommand()
  122. if _, err := jsonSerializer.encodeHeader(rc); err != nil {
  123. t.Fatalf("encode header with jsonCodec fail: %v", err)
  124. }
  125. }
  126. }
  127. func Benchmark_jsonCodec_encodeHeader(b *testing.B) {
  128. rc := randomNewRemotingCommand()
  129. b.ResetTimer()
  130. for i := 0; i < b.N; i++ {
  131. if _, err := jsonSerializer.encodeHeader(rc); err != nil {
  132. b.Fatalf("encode header with jsonCodec fail: %v", err)
  133. }
  134. }
  135. }
  136. func Test_jsonCodec_decodeHeader(t *testing.T) {
  137. for i := 0; i < 1; i++ {
  138. rc := randomNewRemotingCommand()
  139. headers, err := jsonSerializer.encodeHeader(rc)
  140. if err != nil {
  141. t.Fatalf("encode header with jsonCodec fail: %v", err)
  142. }
  143. decodedRc, err := jsonSerializer.decodeHeader(headers)
  144. if err != nil {
  145. t.Fatalf("decode header with jsonCodec fail: %v", err)
  146. }
  147. if rc.Code != decodedRc.Code {
  148. t.Fatalf("wrong Code. want=%d, got=%d", rc.Code, decodedRc.Code)
  149. }
  150. if rc.Version != decodedRc.Version {
  151. t.Fatalf("wrong Version. want=%d, got=%d", rc.Version, decodedRc.Version)
  152. }
  153. if rc.Opaque != decodedRc.Opaque {
  154. t.Fatalf("wrong opaque. want=%d, got=%d", rc.Opaque, decodedRc.Opaque)
  155. }
  156. if rc.Remark != decodedRc.Remark {
  157. t.Fatalf("wrong remark. want=%s, got=%s", rc.Remark, decodedRc.Remark)
  158. }
  159. if rc.Flag != decodedRc.Flag {
  160. t.Fatalf("wrong flag. want=%d, got=%d", rc.Flag, decodedRc.Flag)
  161. }
  162. if !reflect.DeepEqual(rc.ExtFields, decodedRc.ExtFields) {
  163. t.Fatalf("wrong extFields, want=%v, got=%v", rc.ExtFields, decodedRc.ExtFields)
  164. }
  165. }
  166. }
  167. func Benchmark_jsonCodec_decodeHeader(b *testing.B) {
  168. rc := randomNewRemotingCommand()
  169. headers, err := jsonSerializer.encodeHeader(rc)
  170. if err != nil {
  171. b.Fatalf("encode header with jsonCodec fail: %v", err)
  172. }
  173. b.ResetTimer()
  174. for i := 0; i < b.N; i++ {
  175. if _, err := jsonSerializer.decodeHeader(headers); err != nil {
  176. b.Fatalf("decode header with jsonCodec fail: %v", err)
  177. }
  178. }
  179. }
  180. func Test_rmqCodec_encodeHeader(t *testing.T) {
  181. for i := 0; i < 1000; i++ {
  182. rc := randomNewRemotingCommand()
  183. if _, err := rocketMqSerializer.encodeHeader(rc); err != nil {
  184. t.Fatalf("encode header with rmqCodec fail: %v", err)
  185. }
  186. }
  187. }
  188. func Benchmark_rmqCodec_encodeHeader(b *testing.B) {
  189. rc := randomNewRemotingCommand()
  190. b.ResetTimer()
  191. for i := 0; i < b.N; i++ {
  192. if _, err := rocketMqSerializer.encodeHeader(rc); err != nil {
  193. b.Fatalf("encode header with rmqCodec fail: %v", err)
  194. }
  195. }
  196. }
  197. func Test_rmqCodec_decodeHeader(t *testing.T) {
  198. for i := 0; i < 1; i++ {
  199. rc := randomNewRemotingCommand()
  200. headers, err := rocketMqSerializer.encodeHeader(rc)
  201. if err != nil {
  202. t.Fatalf("encode header with rmqCodec fail: %v", err)
  203. }
  204. decodedRc, err := rocketMqSerializer.decodeHeader(headers)
  205. if err != nil {
  206. t.Fatalf("decode header with rmqCodec fail: %v", err)
  207. }
  208. if rc.Code != decodedRc.Code {
  209. t.Fatalf("wrong Code. want=%d, got=%d", rc.Code, decodedRc.Code)
  210. }
  211. if rc.Version != decodedRc.Version {
  212. t.Fatalf("wrong Version. want=%d, got=%d", rc.Version, decodedRc.Version)
  213. }
  214. if rc.Opaque != decodedRc.Opaque {
  215. t.Fatalf("wrong opaque. want=%d, got=%d", rc.Opaque, decodedRc.Opaque)
  216. }
  217. if rc.Remark != decodedRc.Remark {
  218. t.Fatalf("wrong remark. want=%s, got=%s", rc.Remark, decodedRc.Remark)
  219. }
  220. if rc.Flag != decodedRc.Flag {
  221. t.Fatalf("wrong flag. want=%d, got=%d", rc.Flag, decodedRc.Flag)
  222. }
  223. if !reflect.DeepEqual(rc.ExtFields, decodedRc.ExtFields) {
  224. t.Fatalf("wrong extFields, want=%v, got=%v", rc.ExtFields, decodedRc.ExtFields)
  225. }
  226. }
  227. }
  228. func Benchmark_rmqCodec_decodeHeader(b *testing.B) {
  229. rc := randomNewRemotingCommand()
  230. headers, err := rocketMqSerializer.encodeHeader(rc)
  231. if err != nil {
  232. b.Fatalf("encode header with rmqCodec fail: %v", err)
  233. }
  234. b.ResetTimer()
  235. for i := 0; i < b.N; i++ {
  236. if _, err := rocketMqSerializer.decodeHeader(headers); err != nil {
  237. b.Fatalf("decode header with rmqCodec fail: %v", err)
  238. }
  239. }
  240. }
  241. func TestCommandJsonEncodeDecode(t *testing.T) {
  242. var h testHeader
  243. cmd := NewRemotingCommand(192, h, []byte("Hello RocketMQCodecs"))
  244. codecType = JsonCodecs
  245. cmdData, err := encode(cmd)
  246. if err != nil {
  247. t.Errorf("failed to encode remotingCommand in JSON, %s", err)
  248. } else {
  249. if len(cmdData) == 0 {
  250. t.Errorf("failed to encode remotingCommand, result is empty.")
  251. }
  252. }
  253. cmdData = cmdData[4:]
  254. newCmd, err := decode(cmdData)
  255. if err != nil {
  256. t.Errorf("failed to decode remoting in JSON. %s", err)
  257. }
  258. if newCmd.Code != cmd.Code {
  259. t.Errorf("wrong command code. want=%d, got=%d", cmd.Code, newCmd.Code)
  260. }
  261. if newCmd.Version != cmd.Version {
  262. t.Errorf("wrong command version. want=%d, got=%d", cmd.Version, newCmd.Version)
  263. }
  264. if newCmd.Opaque != cmd.Opaque {
  265. t.Errorf("wrong command version. want=%d, got=%d", cmd.Opaque, newCmd.Opaque)
  266. }
  267. if newCmd.Flag != cmd.Flag {
  268. t.Errorf("wrong commad flag. want=%d, got=%d", cmd.Flag, newCmd.Flag)
  269. }
  270. if newCmd.Remark != cmd.Remark {
  271. t.Errorf("wrong command remakr. want=%s, got=%s", cmd.Remark, newCmd.Remark)
  272. }
  273. }
  274. func TestCommandRocketMQEncodeDecode(t *testing.T) {
  275. var h testHeader
  276. cmd := NewRemotingCommand(192, h, []byte("Hello RocketMQCodecs"))
  277. codecType = RocketMQCodecs
  278. cmdData, err := encode(cmd)
  279. if err != nil {
  280. t.Errorf("failed to encode remotingCommand in JSON, %s", err)
  281. } else {
  282. if len(cmdData) == 0 {
  283. t.Errorf("failed to encode remotingCommand, result is empty.")
  284. }
  285. }
  286. cmdData = cmdData[4:]
  287. newCmd, err := decode(cmdData)
  288. if err != nil {
  289. t.Errorf("failed to decode remoting in JSON. %s", err)
  290. }
  291. if newCmd.Code != cmd.Code {
  292. t.Errorf("wrong command code. want=%d, got=%d", cmd.Code, newCmd.Code)
  293. }
  294. if newCmd.Language != cmd.Language {
  295. t.Errorf("wrong command language. want=%d, got=%d", cmd.Language, newCmd.Language)
  296. }
  297. if newCmd.Version != cmd.Version {
  298. t.Errorf("wrong command version. want=%d, got=%d", cmd.Version, newCmd.Version)
  299. }
  300. if newCmd.Opaque != cmd.Opaque {
  301. t.Errorf("wrong command version. want=%d, got=%d", cmd.Opaque, newCmd.Opaque)
  302. }
  303. if newCmd.Flag != cmd.Flag {
  304. t.Errorf("wrong commad flag. want=%d, got=%d", cmd.Flag, newCmd.Flag)
  305. }
  306. if newCmd.Remark != cmd.Remark {
  307. t.Errorf("wrong command remakr. want=%s, got=%s", cmd.Remark, newCmd.Remark)
  308. }
  309. }
  310. func TestCommandJsonIter(t *testing.T) {
  311. var h testHeader
  312. cmd := NewRemotingCommand(192, h, []byte("Hello RocketMQCodecs"))
  313. cmdData, err := json.Marshal(cmd)
  314. assert.Nil(t, err)
  315. fmt.Printf("cmd data from json: %v\n", *(*string)(unsafe.Pointer(&cmdData)))
  316. data, err := jsoniter.Marshal(cmd)
  317. assert.Nil(t, err)
  318. fmt.Printf("cmd data from jsoniter: %v\n", *(*string)(unsafe.Pointer(&data)))
  319. var cmdResp RemotingCommand
  320. err = json.Unmarshal(cmdData, &cmdResp)
  321. assert.Nil(t, err)
  322. fmt.Printf("cmd: %#v language: %v\n", cmdResp, cmdResp.Language)
  323. var cmdResp2 RemotingCommand
  324. err = json.Unmarshal(data, &cmdResp2)
  325. assert.Nil(t, err)
  326. fmt.Printf("cmd: %#v language: %v\n", cmdResp2, cmdResp2.Language)
  327. }