284 lines
9.3 KiB
Go
284 lines
9.3 KiB
Go
/*
|
|
* 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 tests
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/golang/mock/gomock"
|
|
|
|
"github.com/apache/thrift/lib/go/test/gopath/src/optionalfieldstest"
|
|
"github.com/apache/thrift/lib/go/thrift"
|
|
)
|
|
|
|
func TestIsSetReturnFalseOnCreation(t *testing.T) {
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
if ao.IsSetS() {
|
|
t.Errorf("Optional field S is set on initialization")
|
|
}
|
|
if ao.IsSetI() {
|
|
t.Errorf("Optional field I is set on initialization")
|
|
}
|
|
if ao.IsSetB() {
|
|
t.Errorf("Optional field B is set on initialization")
|
|
}
|
|
if ao.IsSetS2() {
|
|
t.Errorf("Optional field S2 is set on initialization")
|
|
}
|
|
if ao.IsSetI2() {
|
|
t.Errorf("Optional field I2 is set on initialization")
|
|
}
|
|
if ao.IsSetB2() {
|
|
t.Errorf("Optional field B2 is set on initialization")
|
|
}
|
|
if ao.IsSetAa() {
|
|
t.Errorf("Optional field Aa is set on initialization")
|
|
}
|
|
if ao.IsSetL() {
|
|
t.Errorf("Optional field L is set on initialization")
|
|
}
|
|
if ao.IsSetL2() {
|
|
t.Errorf("Optional field L2 is set on initialization")
|
|
}
|
|
if ao.IsSetM() {
|
|
t.Errorf("Optional field M is set on initialization")
|
|
}
|
|
if ao.IsSetM2() {
|
|
t.Errorf("Optional field M2 is set on initialization")
|
|
}
|
|
if ao.IsSetBin() {
|
|
t.Errorf("Optional field Bin is set on initialization")
|
|
}
|
|
if ao.IsSetBin2() {
|
|
t.Errorf("Optional field Bin2 is set on initialization")
|
|
}
|
|
}
|
|
|
|
func TestDefaultValuesOnCreation(t *testing.T) {
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
if ao.GetS() != "DEFAULT" {
|
|
t.Errorf("Unexpected default value %#v for field S", ao.GetS())
|
|
}
|
|
if ao.GetI() != 42 {
|
|
t.Errorf("Unexpected default value %#v for field I", ao.GetI())
|
|
}
|
|
if ao.GetB() != false {
|
|
t.Errorf("Unexpected default value %#v for field B", ao.GetB())
|
|
}
|
|
if ao.GetS2() != "" {
|
|
t.Errorf("Unexpected default value %#v for field S2", ao.GetS2())
|
|
}
|
|
if ao.GetI2() != 0 {
|
|
t.Errorf("Unexpected default value %#v for field I2", ao.GetI2())
|
|
}
|
|
if ao.GetB2() != false {
|
|
t.Errorf("Unexpected default value %#v for field B2", ao.GetB2())
|
|
}
|
|
if l := ao.GetL(); len(l) != 0 {
|
|
t.Errorf("Unexpected default value %#v for field L", l)
|
|
}
|
|
if l := ao.GetL2(); len(l) != 2 || l[0] != 1 || l[1] != 2 {
|
|
t.Errorf("Unexpected default value %#v for field L2", l)
|
|
}
|
|
//FIXME: should we return empty map here?
|
|
if m := ao.GetM(); m != nil {
|
|
t.Errorf("Unexpected default value %#v for field M", m)
|
|
}
|
|
if m := ao.GetM2(); len(m) != 2 || m[1] != 2 || m[3] != 4 {
|
|
t.Errorf("Unexpected default value %#v for field M2", m)
|
|
}
|
|
if bv := ao.GetBin(); bv != nil {
|
|
t.Errorf("Unexpected default value %#v for field Bin", bv)
|
|
}
|
|
if bv := ao.GetBin2(); !bytes.Equal(bv, []byte("asdf")) {
|
|
t.Errorf("Unexpected default value %#v for field Bin2", bv)
|
|
}
|
|
}
|
|
|
|
func TestInitialValuesOnCreation(t *testing.T) {
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
if ao.S != "DEFAULT" {
|
|
t.Errorf("Unexpected initial value %#v for field S", ao.S)
|
|
}
|
|
if ao.I != 42 {
|
|
t.Errorf("Unexpected initial value %#v for field I", ao.I)
|
|
}
|
|
if ao.B != false {
|
|
t.Errorf("Unexpected initial value %#v for field B", ao.B)
|
|
}
|
|
if ao.S2 != nil {
|
|
t.Errorf("Unexpected initial value %#v for field S2", ao.S2)
|
|
}
|
|
if ao.I2 != nil {
|
|
t.Errorf("Unexpected initial value %#v for field I2", ao.I2)
|
|
}
|
|
if ao.B2 != nil {
|
|
t.Errorf("Unexpected initial value %#v for field B2", ao.B2)
|
|
}
|
|
if ao.L != nil || len(ao.L) != 0 {
|
|
t.Errorf("Unexpected initial value %#v for field L", ao.L)
|
|
}
|
|
if ao.L2 != nil {
|
|
t.Errorf("Unexpected initial value %#v for field L2", ao.L2)
|
|
}
|
|
if ao.M != nil {
|
|
t.Errorf("Unexpected initial value %#v for field M", ao.M)
|
|
}
|
|
if ao.M2 != nil {
|
|
t.Errorf("Unexpected initial value %#v for field M2", ao.M2)
|
|
}
|
|
if ao.Bin != nil || len(ao.Bin) != 0 {
|
|
t.Errorf("Unexpected initial value %#v for field Bin", ao.Bin)
|
|
}
|
|
if !bytes.Equal(ao.Bin2, []byte("asdf")) {
|
|
t.Errorf("Unexpected initial value %#v for field Bin2", ao.Bin2)
|
|
}
|
|
}
|
|
|
|
func TestIsSetReturnTrueAfterUpdate(t *testing.T) {
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
ao.S = "somevalue"
|
|
ao.I = 123
|
|
ao.B = true
|
|
ao.Aa = optionalfieldstest.NewStructA()
|
|
if !ao.IsSetS() {
|
|
t.Errorf("Field S should be set")
|
|
}
|
|
if !ao.IsSetI() {
|
|
t.Errorf("Field I should be set")
|
|
}
|
|
if !ao.IsSetB() {
|
|
t.Errorf("Field B should be set")
|
|
}
|
|
if !ao.IsSetAa() {
|
|
t.Errorf("Field aa should be set")
|
|
}
|
|
}
|
|
|
|
func TestListNotEmpty(t *testing.T) {
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
ao.L = []int64{1, 2, 3}
|
|
if !ao.IsSetL() {
|
|
t.Errorf("Field L should be set")
|
|
}
|
|
}
|
|
|
|
//Make sure that optional fields are not being serialized
|
|
func TestNoOptionalUnsetFieldsOnWire(t *testing.T) {
|
|
mockCtrl := gomock.NewController(t)
|
|
defer mockCtrl.Finish()
|
|
proto := NewMockTProtocol(mockCtrl)
|
|
gomock.InOrder(
|
|
proto.EXPECT().WriteStructBegin(context.Background(), "all_optional").Return(nil),
|
|
proto.EXPECT().WriteFieldStop(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteStructEnd(context.Background()).Return(nil),
|
|
)
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
ao.Write(context.Background(), proto)
|
|
}
|
|
|
|
func TestNoSetToDefaultFieldsOnWire(t *testing.T) {
|
|
mockCtrl := gomock.NewController(t)
|
|
defer mockCtrl.Finish()
|
|
proto := NewMockTProtocol(mockCtrl)
|
|
gomock.InOrder(
|
|
proto.EXPECT().WriteStructBegin(context.Background(), "all_optional").Return(nil),
|
|
proto.EXPECT().WriteFieldStop(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteStructEnd(context.Background()).Return(nil),
|
|
)
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
ao.I = 42
|
|
ao.Write(context.Background(), proto)
|
|
}
|
|
|
|
//Make sure that only one field is being serialized when set to non-default
|
|
func TestOneISetFieldOnWire(t *testing.T) {
|
|
mockCtrl := gomock.NewController(t)
|
|
defer mockCtrl.Finish()
|
|
proto := NewMockTProtocol(mockCtrl)
|
|
gomock.InOrder(
|
|
proto.EXPECT().WriteStructBegin(context.Background(), "all_optional").Return(nil),
|
|
proto.EXPECT().WriteFieldBegin(context.Background(), "i", thrift.TType(thrift.I64), int16(2)).Return(nil),
|
|
proto.EXPECT().WriteI64(context.Background(), int64(123)).Return(nil),
|
|
proto.EXPECT().WriteFieldEnd(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteFieldStop(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteStructEnd(context.Background()).Return(nil),
|
|
)
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
ao.I = 123
|
|
ao.Write(context.Background(), proto)
|
|
}
|
|
|
|
func TestOneLSetFieldOnWire(t *testing.T) {
|
|
mockCtrl := gomock.NewController(t)
|
|
defer mockCtrl.Finish()
|
|
proto := NewMockTProtocol(mockCtrl)
|
|
gomock.InOrder(
|
|
proto.EXPECT().WriteStructBegin(context.Background(), "all_optional").Return(nil),
|
|
proto.EXPECT().WriteFieldBegin(context.Background(), "l", thrift.TType(thrift.LIST), int16(9)).Return(nil),
|
|
proto.EXPECT().WriteListBegin(context.Background(), thrift.TType(thrift.I64), 2).Return(nil),
|
|
proto.EXPECT().WriteI64(context.Background(), int64(1)).Return(nil),
|
|
proto.EXPECT().WriteI64(context.Background(), int64(2)).Return(nil),
|
|
proto.EXPECT().WriteListEnd(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteFieldEnd(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteFieldStop(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteStructEnd(context.Background()).Return(nil),
|
|
)
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
ao.L = []int64{1, 2}
|
|
ao.Write(context.Background(), proto)
|
|
}
|
|
|
|
func TestOneBinSetFieldOnWire(t *testing.T) {
|
|
mockCtrl := gomock.NewController(t)
|
|
defer mockCtrl.Finish()
|
|
proto := NewMockTProtocol(mockCtrl)
|
|
gomock.InOrder(
|
|
proto.EXPECT().WriteStructBegin(context.Background(), "all_optional").Return(nil),
|
|
proto.EXPECT().WriteFieldBegin(context.Background(), "bin", thrift.TType(thrift.STRING), int16(13)).Return(nil),
|
|
proto.EXPECT().WriteBinary(context.Background(), []byte("somebytestring")).Return(nil),
|
|
proto.EXPECT().WriteFieldEnd(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteFieldStop(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteStructEnd(context.Background()).Return(nil),
|
|
)
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
ao.Bin = []byte("somebytestring")
|
|
ao.Write(context.Background(), proto)
|
|
}
|
|
|
|
func TestOneEmptyBinSetFieldOnWire(t *testing.T) {
|
|
mockCtrl := gomock.NewController(t)
|
|
defer mockCtrl.Finish()
|
|
proto := NewMockTProtocol(mockCtrl)
|
|
gomock.InOrder(
|
|
proto.EXPECT().WriteStructBegin(context.Background(), "all_optional").Return(nil),
|
|
proto.EXPECT().WriteFieldBegin(context.Background(), "bin", thrift.TType(thrift.STRING), int16(13)).Return(nil),
|
|
proto.EXPECT().WriteBinary(context.Background(), []byte{}).Return(nil),
|
|
proto.EXPECT().WriteFieldEnd(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteFieldStop(context.Background()).Return(nil),
|
|
proto.EXPECT().WriteStructEnd(context.Background()).Return(nil),
|
|
)
|
|
ao := optionalfieldstest.NewAllOptional()
|
|
ao.Bin = []byte{}
|
|
ao.Write(context.Background(), proto)
|
|
}
|