1// Copyright 2015 The etcd Authors 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 15package rafthttp 16 17import ( 18 "bytes" 19 "reflect" 20 "testing" 21 22 "go.etcd.io/etcd/raft/raftpb" 23) 24 25func TestMessage(t *testing.T) { 26 // Lower readBytesLimit to make test pass in restricted resources environment 27 originalLimit := readBytesLimit 28 readBytesLimit = 1000 29 defer func() { 30 readBytesLimit = originalLimit 31 }() 32 tests := []struct { 33 msg raftpb.Message 34 encodeErr error 35 decodeErr error 36 }{ 37 { 38 raftpb.Message{ 39 Type: raftpb.MsgApp, 40 From: 1, 41 To: 2, 42 Term: 1, 43 LogTerm: 1, 44 Index: 3, 45 Entries: []raftpb.Entry{{Term: 1, Index: 4}}, 46 }, 47 nil, 48 nil, 49 }, 50 { 51 raftpb.Message{ 52 Type: raftpb.MsgProp, 53 From: 1, 54 To: 2, 55 Entries: []raftpb.Entry{ 56 {Data: []byte("some data")}, 57 {Data: []byte("some data")}, 58 {Data: []byte("some data")}, 59 }, 60 }, 61 nil, 62 nil, 63 }, 64 { 65 raftpb.Message{ 66 Type: raftpb.MsgProp, 67 From: 1, 68 To: 2, 69 Entries: []raftpb.Entry{ 70 {Data: bytes.Repeat([]byte("a"), int(readBytesLimit+10))}, 71 }, 72 }, 73 nil, 74 ErrExceedSizeLimit, 75 }, 76 } 77 for i, tt := range tests { 78 b := &bytes.Buffer{} 79 enc := &messageEncoder{w: b} 80 if err := enc.encode(&tt.msg); err != tt.encodeErr { 81 t.Errorf("#%d: encode message error expected %v, got %v", i, tt.encodeErr, err) 82 continue 83 } 84 dec := &messageDecoder{r: b} 85 m, err := dec.decode() 86 if err != tt.decodeErr { 87 t.Errorf("#%d: decode message error expected %v, got %v", i, tt.decodeErr, err) 88 continue 89 } 90 if err == nil { 91 if !reflect.DeepEqual(m, tt.msg) { 92 t.Errorf("#%d: message = %+v, want %+v", i, m, tt.msg) 93 } 94 } 95 } 96} 97