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 := &registerCodec{}
    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 := &registerCodec{}
   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 := &registerCodec{}
   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  }