| /* |
| * 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 hessian_test |
| |
| import ( |
| "bufio" |
| "bytes" |
| "testing" |
| "time" |
| ) |
| |
| import ( |
| "github.com/apache/dubbo-go-hessian2" |
| dupclass "github.com/apache/dubbo-go-hessian2/hessian_test/hessian_test" |
| ) |
| |
| import ( |
| "github.com/stretchr/testify/assert" |
| ) |
| |
| const ( |
| ExpectedErrorMsg = "reflect.Set: value of type hessian_test.CaseZ is not assignable to type hessian_test.CaseZ" |
| ) |
| |
| type CaseZ struct { |
| Name string |
| } |
| |
| func (CaseZ) JavaClassName() string { |
| return "com.test.caseZ" |
| } |
| |
| func doTestHessianEncodeHeader(t *testing.T, packageType hessian.PackageType, responseStatus byte, body interface{}) ([]byte, error) { |
| codecW := hessian.NewHessianCodec(nil) |
| resp, err := codecW.Write(hessian.Service{ |
| Path: "test", |
| Interface: "ITest", |
| Version: "v1.0", |
| Method: "test", |
| Timeout: time.Second * 10, |
| }, hessian.DubboHeader{ |
| SerialID: 2, |
| Type: packageType, |
| ID: 1, |
| ResponseStatus: responseStatus, |
| }, body) |
| assert.Nil(t, err) |
| return resp, err |
| } |
| |
| func TestDupStructNameRequest(t *testing.T) { |
| hessian.RegisterPOJO(&dupclass.CaseZ{}) |
| hessian.RegisterPOJO(&CaseZ{}) |
| |
| packageType := hessian.PackageRequest |
| responseStatus := hessian.Zero |
| var body interface{} |
| body = []interface{}{"a"} |
| resp, err := doTestHessianEncodeHeader(t, packageType, responseStatus, body) |
| assert.Nil(t, err) |
| |
| codecR := hessian.NewHessianCodec(bufio.NewReader(bytes.NewReader(resp))) |
| |
| h := &hessian.DubboHeader{} |
| err = codecR.ReadHeader(h) |
| assert.Nil(t, err) |
| assert.Equal(t, byte(2), h.SerialID) |
| assert.Equal(t, packageType, h.Type&(hessian.PackageRequest|hessian.PackageResponse|hessian.PackageHeartbeat)) |
| assert.Equal(t, int64(1), h.ID) |
| assert.Equal(t, responseStatus, h.ResponseStatus) |
| |
| c := make([]interface{}, 7) |
| err = codecR.ReadBody(c) |
| assert.Nil(t, err) |
| t.Log(c) |
| assert.True(t, len(body.([]interface{})) == len(c[5].([]interface{}))) |
| } |
| |
| func TestDupStructNameResponse(t *testing.T) { |
| defer func() { |
| if err := recover(); err != nil { |
| if errStr, ok := err.(string); ok { |
| assert.Equal(t, ExpectedErrorMsg, errStr) |
| } |
| } |
| }() |
| |
| var body interface{} |
| body = &CaseZ{Name: "TestDupStructNameResponse"} |
| err, codecR, h := doTestHeader(t, body) |
| assert.Nil(t, err) |
| |
| decodedResponse := &hessian.Response{} |
| err = codecR.ReadBody(decodedResponse) |
| assert.Nil(t, err) |
| |
| checkResponseBody(t, decodedResponse, h, body) |
| } |
| |
| func TestDupStructNameResponse2(t *testing.T) { |
| defer func() { |
| if err := recover(); err != nil { |
| if errStr, ok := err.(string); ok { |
| assert.Equal(t, ExpectedErrorMsg, errStr) |
| } |
| } |
| }() |
| |
| var body interface{} |
| body = &dupclass.CaseZ{Name: "TestDupStructNameResponse"} |
| err, codecR, h := doTestHeader(t, body) |
| assert.Nil(t, err) |
| |
| decodedResponse := &hessian.Response{} |
| err = codecR.ReadBody(decodedResponse) |
| assert.Nil(t, err) |
| |
| checkResponseBody(t, decodedResponse, h, body) |
| } |
| |
| func doTestHeader(t *testing.T, body interface{}) (error, *hessian.HessianCodec, *hessian.DubboHeader) { |
| hessian.RegisterPOJO(&dupclass.CaseZ{}) |
| hessian.RegisterPOJO(&CaseZ{}) |
| |
| packageType := hessian.PackageResponse |
| responseStatus := hessian.Response_OK |
| resp, err := doTestHessianEncodeHeader(t, packageType, responseStatus, body) |
| assert.Nil(t, err) |
| |
| codecR := hessian.NewHessianCodec(bufio.NewReader(bytes.NewReader(resp))) |
| |
| h := &hessian.DubboHeader{} |
| err = codecR.ReadHeader(h) |
| assert.Nil(t, err) |
| |
| assert.Equal(t, byte(2), h.SerialID) |
| assert.Equal(t, packageType, h.Type&(hessian.PackageRequest|hessian.PackageResponse|hessian.PackageHeartbeat)) |
| assert.Equal(t, int64(1), h.ID) |
| assert.Equal(t, responseStatus, h.ResponseStatus) |
| return err, codecR, h |
| } |
| |
| func checkResponseBody(t *testing.T, decodedResponse *hessian.Response, h *hessian.DubboHeader, body interface{}) { |
| t.Log(decodedResponse) |
| |
| if h.ResponseStatus != hessian.Zero && h.ResponseStatus != hessian.Response_OK { |
| assert.Equal(t, "java exception:"+body.(string), decodedResponse.Exception.Error()) |
| return |
| } |
| |
| in := hessian.EnsureRawAny(hessian.UnpackPtrValue(hessian.EnsurePackValue(body))) |
| out := hessian.EnsureRawAny(hessian.UnpackPtrValue(hessian.EnsurePackValue(decodedResponse.RspObj))) |
| assert.Equal(t, in, out) |
| } |
| |
| func TestDuplicatedClassGetGoType(t *testing.T) { |
| assert.Equal(t, "github.com/apache/dubbo-go-hessian2/hessian_test_test/hessian_test.CaseZ", hessian.GetGoType(&CaseZ{})) |
| assert.Equal(t, "github.com/apache/dubbo-go-hessian2/hessian_test/hessian_test/hessian_test.CaseZ", hessian.GetGoType(&dupclass.CaseZ{})) |
| } |