github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/net/codec_test.go (about)

     1  package net
     2  
     3  import (
     4  	"encoding/binary"
     5  	"math/rand"
     6  	"testing"
     7  )
     8  
     9  func TestLengthFieldBasedFrameCodecWith1(t *testing.T) {
    10  	encoderConfig := EncoderConfig{
    11  		ByteOrder:                       binary.BigEndian,
    12  		LengthFieldLength:               1,
    13  		LengthAdjustment:                0,
    14  		LengthIncludesLengthFieldLength: false,
    15  	}
    16  	decoderConfig := DecoderConfig{
    17  		ByteOrder:           binary.BigEndian,
    18  		LengthFieldOffset:   0,
    19  		LengthFieldLength:   1,
    20  		LengthAdjustment:    0,
    21  		InitialBytesToStrip: 1,
    22  	}
    23  	codec := NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig)
    24  
    25  	sz := 256
    26  	data := make([]byte, sz)
    27  	if _, err := rand.Read(data); err != nil {
    28  		panic(err)
    29  	}
    30  	if _, err := codec.Encode(nil, data); err == nil {
    31  		panic("should have a error of exceeding bytes.")
    32  	}
    33  
    34  	sz = 255
    35  	data = make([]byte, sz)
    36  	if _, err := rand.Read(data); err != nil {
    37  		panic(err)
    38  	}
    39  	out, _ := codec.Encode(nil, data)
    40  	if string(out[1:]) != string(data) {
    41  		t.Fatalf("data don't match with big endian, raw data: %s, encoded data: %s\n", string(data), string(out))
    42  	}
    43  
    44  	encoderConfig.ByteOrder = binary.LittleEndian
    45  	decoderConfig.ByteOrder = binary.LittleEndian
    46  	codec = NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig)
    47  	if _, err := rand.Read(data); err != nil {
    48  		panic(err)
    49  	}
    50  	out, _ = codec.Encode(nil, data)
    51  	if string(out[1:]) != string(data) {
    52  		t.Fatalf("data don't match with little endian, raw data: %s, encoded data: %s\n", string(data), string(out))
    53  	}
    54  }
    55  
    56  func TestLengthFieldBasedFrameCodecWith2(t *testing.T) {
    57  	encoderConfig := EncoderConfig{
    58  		ByteOrder:                       binary.BigEndian,
    59  		LengthFieldLength:               2,
    60  		LengthAdjustment:                0,
    61  		LengthIncludesLengthFieldLength: false,
    62  	}
    63  	decoderConfig := DecoderConfig{
    64  		ByteOrder:           binary.BigEndian,
    65  		LengthFieldOffset:   0,
    66  		LengthFieldLength:   2,
    67  		LengthAdjustment:    0,
    68  		InitialBytesToStrip: 2,
    69  	}
    70  	codec := NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig)
    71  
    72  	sz := 65536
    73  	data := make([]byte, sz)
    74  	if _, err := rand.Read(data); err != nil {
    75  		panic(err)
    76  	}
    77  	if _, err := codec.Encode(nil, data); err == nil {
    78  		panic("should have a error of exceeding bytes.")
    79  	}
    80  
    81  	sz = rand.Intn(10) * 1024
    82  	data = make([]byte, sz)
    83  	if _, err := rand.Read(data); err != nil {
    84  		panic(err)
    85  	}
    86  	out, _ := codec.Encode(nil, data)
    87  	if string(out[2:]) != string(data) {
    88  		t.Fatalf("data don't match with big endian, raw data: %s, encoded data: %s\n", string(data), string(out))
    89  	}
    90  
    91  	encoderConfig.ByteOrder = binary.LittleEndian
    92  	decoderConfig.ByteOrder = binary.LittleEndian
    93  	codec = NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig)
    94  	sz = rand.Intn(10) * 1024
    95  	data = make([]byte, sz)
    96  	if _, err := rand.Read(data); err != nil {
    97  		panic(err)
    98  	}
    99  	out, _ = codec.Encode(nil, data)
   100  	if string(out[2:]) != string(data) {
   101  		t.Fatalf("data don't match with little endian, raw data: %s, encoded data: %s\n", string(data), string(out))
   102  	}
   103  }
   104  
   105  func TestLengthFieldBasedFrameCodecWith3(t *testing.T) {
   106  	encoderConfig := EncoderConfig{
   107  		ByteOrder:                       binary.BigEndian,
   108  		LengthFieldLength:               3,
   109  		LengthAdjustment:                0,
   110  		LengthIncludesLengthFieldLength: false,
   111  	}
   112  	decoderConfig := DecoderConfig{
   113  		ByteOrder:           binary.BigEndian,
   114  		LengthFieldOffset:   0,
   115  		LengthFieldLength:   3,
   116  		LengthAdjustment:    0,
   117  		InitialBytesToStrip: 3,
   118  	}
   119  	codec := NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig)
   120  
   121  	sz := 16777216
   122  	data := make([]byte, sz)
   123  	if _, err := rand.Read(data); err != nil {
   124  		panic(err)
   125  	}
   126  	if _, err := codec.Encode(nil, data); err == nil {
   127  		panic("should have a error of exceeding bytes.")
   128  	}
   129  
   130  	sz = rand.Intn(10) * 64 * 1024
   131  	data = make([]byte, sz)
   132  	if _, err := rand.Read(data); err != nil {
   133  		panic(err)
   134  	}
   135  	out, _ := codec.Encode(nil, data)
   136  	if string(out[3:]) != string(data) {
   137  		t.Fatalf("data don't match with big endian, raw data: %s, encoded data: %s\n", string(data), string(out))
   138  	}
   139  
   140  	encoderConfig.ByteOrder = binary.LittleEndian
   141  	decoderConfig.ByteOrder = binary.LittleEndian
   142  	codec = NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig)
   143  	sz = rand.Intn(10) * 64 * 1024
   144  	data = make([]byte, sz)
   145  	if _, err := rand.Read(data); err != nil {
   146  		panic(err)
   147  	}
   148  	out, _ = codec.Encode(nil, data)
   149  	if string(out[3:]) != string(data) {
   150  		t.Fatalf("data don't match with little endian, raw data: %s, encoded data: %s\n", string(data), string(out))
   151  	}
   152  
   153  	buf := make([]byte, 3)
   154  	rand.Read(buf)
   155  	bNum := readUint24(binary.BigEndian, buf)
   156  	p := writeUint24(binary.BigEndian, int(bNum))
   157  	if string(buf) != string(p) {
   158  		t.Fatalf("data don't match with big endian, raw data: %s, recovered data: %s\n", string(buf), string(p))
   159  	}
   160  
   161  	rand.Read(buf)
   162  	bNum = readUint24(binary.LittleEndian, buf)
   163  	p = writeUint24(binary.LittleEndian, int(bNum))
   164  	if string(buf) != string(p) {
   165  		t.Fatalf("data don't match with little endian, raw data: %s, recovered data: %s\n", string(buf), string(p))
   166  	}
   167  }
   168  
   169  func TestLengthFieldBasedFrameCodecWith8(t *testing.T) {
   170  	encoderConfig := EncoderConfig{
   171  		ByteOrder:                       binary.BigEndian,
   172  		LengthFieldLength:               8,
   173  		LengthAdjustment:                0,
   174  		LengthIncludesLengthFieldLength: false,
   175  	}
   176  	decoderConfig := DecoderConfig{
   177  		ByteOrder:           binary.BigEndian,
   178  		LengthFieldOffset:   0,
   179  		LengthFieldLength:   8,
   180  		LengthAdjustment:    0,
   181  		InitialBytesToStrip: 8,
   182  	}
   183  	codec := NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig)
   184  	sz := rand.Intn(10) * 1024 * 1024
   185  	data := make([]byte, sz)
   186  	if _, err := rand.Read(data); err != nil {
   187  		panic(err)
   188  	}
   189  	out, _ := codec.Encode(nil, data)
   190  	if string(out[8:]) != string(data) {
   191  		t.Fatalf("data don't match with big endian, raw data: %s, encoded data: %s\n", string(data), string(out))
   192  	}
   193  
   194  	encoderConfig.ByteOrder = binary.LittleEndian
   195  	decoderConfig.ByteOrder = binary.LittleEndian
   196  	codec = NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig)
   197  	sz = rand.Intn(10) * 1024 * 1024
   198  	data = make([]byte, sz)
   199  	if _, err := rand.Read(data); err != nil {
   200  		panic(err)
   201  	}
   202  	out, _ = codec.Encode(nil, data)
   203  	if string(out[8:]) != string(data) {
   204  		t.Fatalf("data don't match with little endian, raw data: %s, encoded data: %s\n", string(data), string(out))
   205  	}
   206  }
   207  
   208  func TestFixedLengthFrameCodec_Encode(t *testing.T) {
   209  	codec := NewFixedLengthFrameCodec(8)
   210  	if data, err := codec.Encode(nil, make([]byte, 15)); data != nil || err != errInvalidFixedLength {
   211  		panic("should have a error of invalid fixed length")
   212  	}
   213  }
   214  
   215  func TestInnerBufferReadN(t *testing.T) {
   216  	var in innerBuffer
   217  	data := make([]byte, 10)
   218  	if _, err := rand.Read(data); err != nil {
   219  		panic(err)
   220  	}
   221  	in = data
   222  	if _, err := in.readN(-1); err == nil {
   223  		t.Fatal("error missing")
   224  	}
   225  	if _, err := in.readN(11); err == nil {
   226  		t.Fatal("error missing")
   227  	}
   228  	if _, err := in.readN(1); err != nil {
   229  		t.Fatal("unexpected error")
   230  	}
   231  	if len(in) != 9 {
   232  		t.Fatal("wrong length of leftover bytes")
   233  	}
   234  }