blob: ed854bd6721a2e5674bcd1255cc378757935b0a8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package remote
import (
"encoding/json"
"fmt"
"math/rand"
"reflect"
"testing"
"unsafe"
"github.com/json-iterator/go"
"github.com/stretchr/testify/assert"
)
type testHeader struct {
}
func (t testHeader) Encode() map[string]string {
properties := make(map[string]string)
for i := 0; i < 10; i++ {
properties[randomString(rand.Intn(20))] = randomString(rand.Intn(20))
}
return properties
}
func randomBytes(length int) []byte {
bs := make([]byte, length)
if _, err := rand.Read(bs); err != nil {
panic("read random bytes fail")
}
return bs
}
func randomString(length int) string {
bs := make([]byte, length)
for i := 0; i < len(bs); i++ {
bs[i] = byte(97 + rand.Intn(26))
}
return string(bs)
}
func randomNewRemotingCommand() *RemotingCommand {
var h testHeader
body := randomBytes(rand.Intn(100))
return NewRemotingCommand(int16(rand.Intn(1000)), h, body)
}
func Test_encode(t *testing.T) {
for i := 0; i < 1000; i++ {
rc := randomNewRemotingCommand()
if _, err := encode(rc); err != nil {
t.Fatalf("encode RemotingCommand to bytes fail: %v", err)
}
}
}
func Benchmark_encode(b *testing.B) {
rc := randomNewRemotingCommand()
b.ResetTimer()
for i := 0; i < b.N; i++ {
if _, err := encode(rc); err != nil {
b.Fatalf("encode RemotingCommand to bytes fail: %v", err)
}
}
}
func Test_decode(t *testing.T) {
for i := 0; i < 1000; i++ {
rc := randomNewRemotingCommand()
bs, err := encode(rc)
if err != nil {
t.Fatalf("encode RemotingCommand to bytes fail: %v", err)
}
bs = bs[4:]
decodedRc, err := decode(bs)
if err != nil {
t.Fatalf("decode bytes to RemotingCommand fail: %v", err)
}
if rc.Code != decodedRc.Code {
t.Fatalf("wrong Code. want=%d, got=%d", rc.Code, decodedRc.Code)
}
if rc.Version != decodedRc.Version {
t.Fatalf("wrong Version. want=%d, got=%d", rc.Version, decodedRc.Version)
}
if rc.Opaque != decodedRc.Opaque {
t.Fatalf("wrong opaque. want=%d, got=%d", rc.Opaque, decodedRc.Opaque)
}
if rc.Remark != decodedRc.Remark {
t.Fatalf("wrong remark. want=%s, got=%s", rc.Remark, decodedRc.Remark)
}
if rc.Flag != decodedRc.Flag {
t.Fatalf("wrong flag. want=%d, got=%d", rc.Flag, decodedRc.Flag)
}
if !reflect.DeepEqual(rc.ExtFields, decodedRc.ExtFields) {
t.Fatalf("wrong extFields, want=%v, got=%v", rc.ExtFields, decodedRc.ExtFields)
}
}
}
func Benchmark_decode(b *testing.B) {
rc := randomNewRemotingCommand()
bs, err := encode(rc)
if err != nil {
b.Fatalf("encode RemotingCommand to bytes fail: %v", err)
}
b.ResetTimer()
bs = bs[4:]
for i := 0; i < b.N; i++ {
if _, err := decode(bs); err != nil {
b.Fatalf("decode bytes to RemotingCommand fail: %v", err)
}
}
}
func Test_jsonCodec_encodeHeader(t *testing.T) {
for i := 0; i < 1000; i++ {
rc := randomNewRemotingCommand()
if _, err := jsonSerializer.encodeHeader(rc); err != nil {
t.Fatalf("encode header with jsonCodec fail: %v", err)
}
}
}
func Benchmark_jsonCodec_encodeHeader(b *testing.B) {
rc := randomNewRemotingCommand()
b.ResetTimer()
for i := 0; i < b.N; i++ {
if _, err := jsonSerializer.encodeHeader(rc); err != nil {
b.Fatalf("encode header with jsonCodec fail: %v", err)
}
}
}
func Test_jsonCodec_decodeHeader(t *testing.T) {
for i := 0; i < 1; i++ {
rc := randomNewRemotingCommand()
headers, err := jsonSerializer.encodeHeader(rc)
if err != nil {
t.Fatalf("encode header with jsonCodec fail: %v", err)
}
decodedRc, err := jsonSerializer.decodeHeader(headers)
if err != nil {
t.Fatalf("decode header with jsonCodec fail: %v", err)
}
if rc.Code != decodedRc.Code {
t.Fatalf("wrong Code. want=%d, got=%d", rc.Code, decodedRc.Code)
}
if rc.Version != decodedRc.Version {
t.Fatalf("wrong Version. want=%d, got=%d", rc.Version, decodedRc.Version)
}
if rc.Opaque != decodedRc.Opaque {
t.Fatalf("wrong opaque. want=%d, got=%d", rc.Opaque, decodedRc.Opaque)
}
if rc.Remark != decodedRc.Remark {
t.Fatalf("wrong remark. want=%s, got=%s", rc.Remark, decodedRc.Remark)
}
if rc.Flag != decodedRc.Flag {
t.Fatalf("wrong flag. want=%d, got=%d", rc.Flag, decodedRc.Flag)
}
if !reflect.DeepEqual(rc.ExtFields, decodedRc.ExtFields) {
t.Fatalf("wrong extFields, want=%v, got=%v", rc.ExtFields, decodedRc.ExtFields)
}
}
}
func Benchmark_jsonCodec_decodeHeader(b *testing.B) {
rc := randomNewRemotingCommand()
headers, err := jsonSerializer.encodeHeader(rc)
if err != nil {
b.Fatalf("encode header with jsonCodec fail: %v", err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
if _, err := jsonSerializer.decodeHeader(headers); err != nil {
b.Fatalf("decode header with jsonCodec fail: %v", err)
}
}
}
func Test_rmqCodec_encodeHeader(t *testing.T) {
for i := 0; i < 1000; i++ {
rc := randomNewRemotingCommand()
if _, err := rocketMqSerializer.encodeHeader(rc); err != nil {
t.Fatalf("encode header with rmqCodec fail: %v", err)
}
}
}
func Benchmark_rmqCodec_encodeHeader(b *testing.B) {
rc := randomNewRemotingCommand()
b.ResetTimer()
for i := 0; i < b.N; i++ {
if _, err := rocketMqSerializer.encodeHeader(rc); err != nil {
b.Fatalf("encode header with rmqCodec fail: %v", err)
}
}
}
func Test_rmqCodec_decodeHeader(t *testing.T) {
for i := 0; i < 1; i++ {
rc := randomNewRemotingCommand()
headers, err := rocketMqSerializer.encodeHeader(rc)
if err != nil {
t.Fatalf("encode header with rmqCodec fail: %v", err)
}
decodedRc, err := rocketMqSerializer.decodeHeader(headers)
if err != nil {
t.Fatalf("decode header with rmqCodec fail: %v", err)
}
if rc.Code != decodedRc.Code {
t.Fatalf("wrong Code. want=%d, got=%d", rc.Code, decodedRc.Code)
}
if rc.Version != decodedRc.Version {
t.Fatalf("wrong Version. want=%d, got=%d", rc.Version, decodedRc.Version)
}
if rc.Opaque != decodedRc.Opaque {
t.Fatalf("wrong opaque. want=%d, got=%d", rc.Opaque, decodedRc.Opaque)
}
if rc.Remark != decodedRc.Remark {
t.Fatalf("wrong remark. want=%s, got=%s", rc.Remark, decodedRc.Remark)
}
if rc.Flag != decodedRc.Flag {
t.Fatalf("wrong flag. want=%d, got=%d", rc.Flag, decodedRc.Flag)
}
if !reflect.DeepEqual(rc.ExtFields, decodedRc.ExtFields) {
t.Fatalf("wrong extFields, want=%v, got=%v", rc.ExtFields, decodedRc.ExtFields)
}
}
}
func Benchmark_rmqCodec_decodeHeader(b *testing.B) {
rc := randomNewRemotingCommand()
headers, err := rocketMqSerializer.encodeHeader(rc)
if err != nil {
b.Fatalf("encode header with rmqCodec fail: %v", err)
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
if _, err := rocketMqSerializer.decodeHeader(headers); err != nil {
b.Fatalf("decode header with rmqCodec fail: %v", err)
}
}
}
func TestCommandJsonEncodeDecode(t *testing.T) {
var h testHeader
cmd := NewRemotingCommand(192, h, []byte("Hello RocketMQCodecs"))
codecType = JsonCodecs
cmdData, err := encode(cmd)
if err != nil {
t.Errorf("failed to encode remotingCommand in JSON, %s", err)
} else {
if len(cmdData) == 0 {
t.Errorf("failed to encode remotingCommand, result is empty.")
}
}
cmdData = cmdData[4:]
newCmd, err := decode(cmdData)
if err != nil {
t.Errorf("failed to decode remoting in JSON. %s", err)
}
if newCmd.Code != cmd.Code {
t.Errorf("wrong command code. want=%d, got=%d", cmd.Code, newCmd.Code)
}
if newCmd.Version != cmd.Version {
t.Errorf("wrong command version. want=%d, got=%d", cmd.Version, newCmd.Version)
}
if newCmd.Opaque != cmd.Opaque {
t.Errorf("wrong command version. want=%d, got=%d", cmd.Opaque, newCmd.Opaque)
}
if newCmd.Flag != cmd.Flag {
t.Errorf("wrong commad flag. want=%d, got=%d", cmd.Flag, newCmd.Flag)
}
if newCmd.Remark != cmd.Remark {
t.Errorf("wrong command remakr. want=%s, got=%s", cmd.Remark, newCmd.Remark)
}
}
func TestCommandRocketMQEncodeDecode(t *testing.T) {
var h testHeader
cmd := NewRemotingCommand(192, h, []byte("Hello RocketMQCodecs"))
codecType = RocketMQCodecs
cmdData, err := encode(cmd)
if err != nil {
t.Errorf("failed to encode remotingCommand in JSON, %s", err)
} else {
if len(cmdData) == 0 {
t.Errorf("failed to encode remotingCommand, result is empty.")
}
}
cmdData = cmdData[4:]
newCmd, err := decode(cmdData)
if err != nil {
t.Errorf("failed to decode remoting in JSON. %s", err)
}
if newCmd.Code != cmd.Code {
t.Errorf("wrong command code. want=%d, got=%d", cmd.Code, newCmd.Code)
}
if newCmd.Language != cmd.Language {
t.Errorf("wrong command language. want=%d, got=%d", cmd.Language, newCmd.Language)
}
if newCmd.Version != cmd.Version {
t.Errorf("wrong command version. want=%d, got=%d", cmd.Version, newCmd.Version)
}
if newCmd.Opaque != cmd.Opaque {
t.Errorf("wrong command version. want=%d, got=%d", cmd.Opaque, newCmd.Opaque)
}
if newCmd.Flag != cmd.Flag {
t.Errorf("wrong commad flag. want=%d, got=%d", cmd.Flag, newCmd.Flag)
}
if newCmd.Remark != cmd.Remark {
t.Errorf("wrong command remakr. want=%s, got=%s", cmd.Remark, newCmd.Remark)
}
}
func TestCommandJsonIter(t *testing.T) {
var h testHeader
cmd := NewRemotingCommand(192, h, []byte("Hello RocketMQCodecs"))
cmdData, err := json.Marshal(cmd)
assert.Nil(t, err)
fmt.Printf("cmd data from json: %v\n", *(*string)(unsafe.Pointer(&cmdData)))
data, err := jsoniter.Marshal(cmd)
assert.Nil(t, err)
fmt.Printf("cmd data from jsoniter: %v\n", *(*string)(unsafe.Pointer(&data)))
var cmdResp RemotingCommand
err = json.Unmarshal(cmdData, &cmdResp)
assert.Nil(t, err)
fmt.Printf("cmd: %#v language: %v\n", cmdResp, cmdResp.Language)
var cmdResp2 RemotingCommand
err = json.Unmarshal(data, &cmdResp2)
assert.Nil(t, err)
fmt.Printf("cmd: %#v language: %v\n", cmdResp2, cmdResp2.Language)
}