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)
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
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
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