github.com/datastax/go-cassandra-native-protocol@v0.0.0-20220706104457-5e8aad05cf90/message/register_test.go (about) 1 // Copyright 2020 DataStax 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package message 16 17 import ( 18 "bytes" 19 "errors" 20 "testing" 21 22 "github.com/stretchr/testify/assert" 23 24 "github.com/datastax/go-cassandra-native-protocol/primitive" 25 ) 26 27 func TestRegister_DeepCopy(t *testing.T) { 28 msg := &Register{ 29 EventTypes: []primitive.EventType{primitive.EventTypeSchemaChange}, 30 } 31 32 cloned := msg.DeepCopy() 33 assert.Equal(t, msg, cloned) 34 35 cloned.EventTypes = []primitive.EventType{primitive.EventTypeSchemaChange, primitive.EventTypeStatusChange} 36 37 assert.NotEqual(t, msg, cloned) 38 39 assert.Equal(t, []primitive.EventType{primitive.EventTypeSchemaChange}, msg.EventTypes) 40 41 assert.Equal(t, []primitive.EventType{primitive.EventTypeSchemaChange, primitive.EventTypeStatusChange}, cloned.EventTypes) 42 } 43 44 func TestRegisterCodec_Encode(t *testing.T) { 45 codec := ®isterCodec{} 46 for _, version := range primitive.SupportedProtocolVersions() { 47 t.Run(version.String(), func(t *testing.T) { 48 tests := []encodeTestCase{ 49 { 50 "register all events", 51 &Register{EventTypes: []primitive.EventType{ 52 primitive.EventTypeSchemaChange, 53 primitive.EventTypeTopologyChange, 54 primitive.EventTypeStatusChange, 55 }}, 56 []byte{ 57 0, 3, // list length 58 // element SCHEMA_CHANGE 59 0, 13, S, C, H, E, M, A, __, C, H, A, N, G, E, 60 // element TOPOLOGY_CHANGE 61 0, 15, T, O, P, O, L, O, G, Y, __, C, H, A, N, G, E, 62 // element STATUS_CHANGE 63 0, 13, S, T, A, T, U, S, __, C, H, A, N, G, E, 64 }, 65 nil, 66 }, 67 { 68 "not a register", 69 &Options{}, 70 nil, 71 errors.New("expected *message.Register, got *message.Options"), 72 }, 73 { 74 "register with no events", 75 &Register{}, 76 nil, 77 errors.New("REGISTER messages must have at least one event type"), 78 }, 79 { 80 "register with wrong event", 81 &Register{EventTypes: []primitive.EventType{"NOT A VALID EVENT"}}, 82 nil, 83 errors.New("invalid event type: NOT A VALID EVENT"), 84 }, 85 } 86 for _, tt := range tests { 87 t.Run(tt.name, func(t *testing.T) { 88 dest := &bytes.Buffer{} 89 err := codec.Encode(tt.input, dest, version) 90 assert.Equal(t, tt.expected, dest.Bytes()) 91 assert.Equal(t, tt.err, err) 92 }) 93 } 94 }) 95 } 96 } 97 98 func TestRegisterCodec_EncodedLength(t *testing.T) { 99 codec := ®isterCodec{} 100 for _, version := range primitive.SupportedProtocolVersions() { 101 t.Run(version.String(), func(t *testing.T) { 102 tests := []encodedLengthTestCase{ 103 { 104 "register all events", 105 &Register{EventTypes: []primitive.EventType{ 106 primitive.EventTypeSchemaChange, 107 primitive.EventTypeTopologyChange, 108 primitive.EventTypeStatusChange, 109 }}, 110 primitive.LengthOfShort + // list length 111 primitive.LengthOfString("SCHEMA_CHANGE") + 112 primitive.LengthOfString("TOPOLOGY_CHANGE") + 113 primitive.LengthOfString("STATUS_CHANGE"), 114 nil, 115 }, 116 { 117 "not a register", 118 &Options{}, 119 -1, 120 errors.New("expected *message.Register, got *message.Options"), 121 }, 122 } 123 for _, tt := range tests { 124 t.Run(tt.name, func(t *testing.T) { 125 actual, err := codec.EncodedLength(tt.input, version) 126 assert.Equal(t, tt.expected, actual) 127 assert.Equal(t, tt.err, err) 128 }) 129 } 130 }) 131 } 132 } 133 134 func TestRegisterCodec_Decode(t *testing.T) { 135 codec := ®isterCodec{} 136 for _, version := range primitive.SupportedProtocolVersions() { 137 t.Run(version.String(), func(t *testing.T) { 138 tests := []decodeTestCase{ 139 { 140 "register all events", 141 []byte{ 142 0, 3, // list length 143 // element SCHEMA_CHANGE 144 0, 13, S, C, H, E, M, A, __, C, H, A, N, G, E, 145 // element TOPOLOGY_CHANGE 146 0, 15, T, O, P, O, L, O, G, Y, __, C, H, A, N, G, E, 147 // element STATUS_CHANGE 148 0, 13, S, T, A, T, U, S, __, C, H, A, N, G, E, 149 }, 150 &Register{EventTypes: []primitive.EventType{ 151 primitive.EventTypeSchemaChange, 152 primitive.EventTypeTopologyChange, 153 primitive.EventTypeStatusChange, 154 }}, 155 nil, 156 }, 157 { 158 "register with no events", // not tolerated when encoding 159 []byte{0, 0}, 160 &Register{EventTypes: []primitive.EventType{}}, 161 nil, 162 }, 163 { 164 "register with wrong event", 165 []byte{ 166 0, 1, // list length 167 0, 13, U, N, K, N, O, W, N, __, E, V, E, N, T, 168 }, 169 nil, 170 errors.New("invalid event type: UNKNOWN_EVENT"), 171 }, 172 } 173 for _, tt := range tests { 174 t.Run(tt.name, func(t *testing.T) { 175 source := bytes.NewBuffer(tt.input) 176 actual, err := codec.Decode(source, version) 177 assert.Equal(t, tt.expected, actual) 178 assert.Equal(t, tt.err, err) 179 }) 180 } 181 }) 182 } 183 }