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