...

Source file src/golang.conradwood.net/go-easyops/utils/packetizer_test.go

Documentation: golang.conradwood.net/go-easyops/utils

     1  package utils
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"math/rand"
     7  	"testing"
     8  )
     9  
    10  const (
    11  	RANDSOURCE  = 1233
    12  	MAX_SIZE    = 7000
    13  	MAX_PACKETS = 10000
    14  )
    15  
    16  func TestSelectedPackets(t *testing.T) {
    17  	packets := [][]byte{
    18  		[]byte("abc"),
    19  		[]byte("abcd"),
    20  		[]byte("abcde"),
    21  		[]byte("ab{cde"),
    22  		[]byte("ab}cde"),
    23  		[]byte("ab\\}cde"),
    24  		[]byte("ab\\\\cde"),
    25  		[]byte("ab\\{cde"),
    26  	}
    27  	test_packets(t, packets)
    28  }
    29  
    30  func TestRandomDataAndRandomSize(t *testing.T) {
    31  	r := rand.New(rand.NewSource(RANDSOURCE))
    32  	var packets [][]byte
    33  	for i := 0; i < MAX_PACKETS; i++ {
    34  		packlen := r.Intn(MAX_SIZE)
    35  		packet := make([]byte, packlen)
    36  		for i, _ := range packet {
    37  			b := byte(r.Intn(255))
    38  			packet[i] = b
    39  		}
    40  		packets = append(packets, packet) // store for later comparison
    41  	}
    42  	test_packets(t, packets)
    43  }
    44  func test_packets(t *testing.T, packets [][]byte) {
    45  	b := &bytes.Buffer{}
    46  	pw, _ := NewPacketWriter(b, '{', '\\', '}')
    47  	for _, packet := range packets {
    48  		_, err := pw.Write(packet)
    49  		if err != nil {
    50  			t.Fail()
    51  			t.Logf("failed to write: %s\n", err)
    52  			return
    53  		}
    54  	}
    55  	err := pw.Close()
    56  	if err != nil {
    57  		t.Fail()
    58  		t.Logf("failed to close: %s\n", err)
    59  	}
    60  	bb := b.Bytes()
    61  	if len(bb) == 0 {
    62  		t.Fail()
    63  		t.Logf("empty buffer after writing packets")
    64  		return
    65  	}
    66  	w := bytes.NewBuffer(bb)
    67  	compare(t, w, packets)
    68  }
    69  
    70  // compare what the writer gives us with "expected"
    71  func compare(t *testing.T, w io.Reader, expected [][]byte) {
    72  	pr, _ := NewPacketReader(w, '{', '\\', '}')
    73  	i := 0
    74  	buf := make([]byte, 8192)
    75  	for {
    76  		n, err := pr.Read(buf)
    77  		if err != nil {
    78  			if err == io.EOF {
    79  				//t.Logf("EOF on reader\n")
    80  				break
    81  			}
    82  			t.Fail()
    83  			t.Logf("Unexpected read error: %s\n", err)
    84  			return
    85  		}
    86  
    87  		if i > len(expected) {
    88  			t.Fail()
    89  			t.Logf("read too many packets")
    90  			return
    91  		}
    92  		packet := buf[:n]
    93  		mp := expected[i]
    94  		if !bytes.Equal(packet, mp) {
    95  			t.Fail()
    96  			t.Logf("packet mismatch (position %d). output in /tmp/packetizer_read.bin and /tmp/packetizer_expected.bin", i)
    97  			write_packets(packet, mp)
    98  			return
    99  		}
   100  		i++
   101  
   102  	}
   103  	if i != len(expected) {
   104  		t.Fail()
   105  		t.Logf("read too few packets. expected %d, read %d packets\n", len(expected), i)
   106  	}
   107  }
   108  
   109  func write_packets(a, b []byte) {
   110  	WriteFile("/tmp/packetizer_read.bin", a)
   111  	WriteFile("/tmp/packetizer_expected.bin", b)
   112  	s := Hexdump("", a)
   113  	WriteFile("/tmp/packetizer_read.txt", []byte(s))
   114  	s = Hexdump("", b)
   115  	WriteFile("/tmp/packetizer_expected.txt", []byte(s))
   116  
   117  }
   118  

View as plain text