msgfilterclear_test.go raw

   1  package wire
   2  
   3  import (
   4  	"bytes"
   5  	"reflect"
   6  	"testing"
   7  	
   8  	"github.com/davecgh/go-spew/spew"
   9  )
  10  
  11  // TestFilterCLearLatest tests the MsgFilterClear API against the latest protocol version.
  12  func TestFilterClearLatest(t *testing.T) {
  13  	pver := ProtocolVersion
  14  	msg := NewMsgFilterClear()
  15  	// Ensure the command is expected value.
  16  	wantCmd := "filterclear"
  17  	if cmd := msg.Command(); cmd != wantCmd {
  18  		t.Errorf(
  19  			"NewMsgFilterClear: wrong command - got %v want %v",
  20  			cmd, wantCmd,
  21  		)
  22  	}
  23  	// Ensure max payload is expected value for latest protocol version.
  24  	wantPayload := uint32(0)
  25  	maxPayload := msg.MaxPayloadLength(pver)
  26  	if maxPayload != wantPayload {
  27  		t.Errorf(
  28  			"MaxPayloadLength: wrong max payload length for "+
  29  				"protocol version %d - got %v, want %v", pver,
  30  			maxPayload, wantPayload,
  31  		)
  32  	}
  33  }
  34  
  35  // TestFilterClearCrossProtocol tests the MsgFilterClear API when encoding with the latest protocol version and decoding
  36  // with BIP0031Version.
  37  func TestFilterClearCrossProtocol(t *testing.T) {
  38  	msg := NewMsgFilterClear()
  39  	// Encode with latest protocol version.
  40  	var buf bytes.Buffer
  41  	e := msg.BtcEncode(&buf, ProtocolVersion, LatestEncoding)
  42  	if e != nil {
  43  		t.Errorf("encode of MsgFilterClear failed %v e <%v>", msg, e)
  44  	}
  45  	// Decode with old protocol version.
  46  	var readmsg MsgFilterClear
  47  	e = readmsg.BtcDecode(&buf, BIP0031Version, LatestEncoding)
  48  	if e == nil {
  49  		t.Errorf(
  50  			"decode of MsgFilterClear succeeded when it "+
  51  				"shouldn't have %v", msg,
  52  		)
  53  	}
  54  }
  55  
  56  // TestFilterClearWire tests the MsgFilterClear wire encode and decode for various protocol versions.
  57  func TestFilterClearWire(t *testing.T) {
  58  	msgFilterClear := NewMsgFilterClear()
  59  	msgFilterClearEncoded := []byte{}
  60  	tests := []struct {
  61  		in   *MsgFilterClear // Message to encode
  62  		out  *MsgFilterClear // Expected decoded message
  63  		buf  []byte          // Wire encoding
  64  		pver uint32          // Protocol version for wire encoding
  65  		enc  MessageEncoding // Message encoding format
  66  	}{
  67  		// Latest protocol version.
  68  		{
  69  			msgFilterClear,
  70  			msgFilterClear,
  71  			msgFilterClearEncoded,
  72  			ProtocolVersion,
  73  			BaseEncoding,
  74  		},
  75  		// Protocol version BIP0037Version + 1.
  76  		{
  77  			msgFilterClear,
  78  			msgFilterClear,
  79  			msgFilterClearEncoded,
  80  			BIP0037Version + 1,
  81  			BaseEncoding,
  82  		},
  83  		// Protocol version BIP0037Version.
  84  		{
  85  			msgFilterClear,
  86  			msgFilterClear,
  87  			msgFilterClearEncoded,
  88  			BIP0037Version,
  89  			BaseEncoding,
  90  		},
  91  	}
  92  	t.Logf("Running %d tests", len(tests))
  93  	for i, test := range tests {
  94  		// Encode the message to wire format.
  95  		var buf bytes.Buffer
  96  		e := test.in.BtcEncode(&buf, test.pver, test.enc)
  97  		if e != nil {
  98  			t.Errorf("BtcEncode #%d error %v", i, e)
  99  			continue
 100  		}
 101  		if !bytes.Equal(buf.Bytes(), test.buf) {
 102  			t.Errorf(
 103  				"BtcEncode #%d\n got: %s want: %s", i,
 104  				spew.Sdump(buf.Bytes()), spew.Sdump(test.buf),
 105  			)
 106  			continue
 107  		}
 108  		// Decode the message from wire format.
 109  		var msg MsgFilterClear
 110  		rbuf := bytes.NewReader(test.buf)
 111  		e = msg.BtcDecode(rbuf, test.pver, test.enc)
 112  		if e != nil {
 113  			t.Errorf("BtcDecode #%d error %v", i, e)
 114  			continue
 115  		}
 116  		if !reflect.DeepEqual(&msg, test.out) {
 117  			t.Errorf(
 118  				"BtcDecode #%d\n got: %s want: %s", i,
 119  				spew.Sdump(msg), spew.Sdump(test.out),
 120  			)
 121  			continue
 122  		}
 123  	}
 124  }
 125  
 126  // TestFilterClearWireErrors performs negative tests against wire encode and decode of MsgFilterClear to confirm error
 127  // paths work correctly.
 128  func TestFilterClearWireErrors(t *testing.T) {
 129  	pverNoFilterClear := BIP0037Version - 1
 130  	wireErr := &MessageError{}
 131  	baseFilterClear := NewMsgFilterClear()
 132  	baseFilterClearEncoded := []byte{}
 133  	tests := []struct {
 134  		in       *MsgFilterClear // value to encode
 135  		buf      []byte          // Wire encoding
 136  		pver     uint32          // Protocol version for wire encoding
 137  		enc      MessageEncoding // Message encoding format
 138  		max      int             // Max size of fixed buffer to induce errors
 139  		writeErr error           // Expected write error
 140  		readErr  error           // Expected read error
 141  	}{
 142  		// Force error due to unsupported protocol version.
 143  		{
 144  			baseFilterClear, baseFilterClearEncoded,
 145  			pverNoFilterClear, BaseEncoding, 4, wireErr, wireErr,
 146  		},
 147  	}
 148  	t.Logf("Running %d tests", len(tests))
 149  	var e error
 150  	for i, test := range tests {
 151  		// Encode to wire format.
 152  		w := newFixedWriter(test.max)
 153  		if e = test.in.BtcEncode(w, test.pver, test.enc); E.Chk(e) {
 154  		}
 155  		if reflect.TypeOf(e) != reflect.TypeOf(test.writeErr) {
 156  			t.Errorf(
 157  				"BtcEncode #%d wrong error got: %v, want: %v",
 158  				i, e, test.writeErr,
 159  			)
 160  			continue
 161  		}
 162  		// For errors which are not of type MessageError, check them for equality.
 163  		if _, ok := e.(*MessageError); !ok {
 164  			if e != test.writeErr {
 165  				t.Errorf(
 166  					"BtcEncode #%d wrong error got: %v, want: %v", i, e, test.writeErr,
 167  				)
 168  				continue
 169  			}
 170  		}
 171  		// Decode from wire format.
 172  		var msg MsgFilterClear
 173  		r := newFixedReader(test.max, test.buf)
 174  		e = msg.BtcDecode(r, test.pver, test.enc)
 175  		if reflect.TypeOf(e) != reflect.TypeOf(test.readErr) {
 176  			t.Errorf(
 177  				"BtcDecode #%d wrong error got: %v, want: %v",
 178  				i, e, test.readErr,
 179  			)
 180  			continue
 181  		}
 182  		// For errors which are not of type MessageError, check them for equality.
 183  		if _, ok := e.(*MessageError); !ok {
 184  			if e != test.readErr {
 185  				t.Errorf(
 186  					"BtcDecode #%d wrong error got: %v, want: %v", i, e, test.readErr,
 187  				)
 188  				continue
 189  			}
 190  		}
 191  	}
 192  }
 193