-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver_test.go
More file actions
114 lines (87 loc) · 1.9 KB
/
server_test.go
File metadata and controls
114 lines (87 loc) · 1.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package tftp
import (
"bytes"
"io"
"net"
"os"
"testing"
"time"
)
func TestReadServer(t *testing.T) {
payload1, err := os.ReadFile("./cmd/gopher.png")
if err != nil {
t.Fatal(err)
}
serverconn, err := net.ListenPacket("udp", "127.0.0.1:")
if err != nil {
t.Fatal(err)
}
defer func() {
_ = serverconn.Close()
}()
tftpServer := TFTPServer{
Payload: payload1,
WriteAllowed: false,
ReadAllowed: true,
Timeout: 5 * time.Second,
}
go func() {
_ = tftpServer.Serve(serverconn)
}()
rrq := ReadReq{Filename: "gopher.png", Mode: "octet"}
clientconn, err := net.ListenPacket("udp", "127.0.0.1:")
if err != nil {
t.Fatal(err)
}
defer func() {
_ = clientconn.Close()
}()
rrqbuf, err := rrq.MarshalBinary()
if err != nil {
t.Fatal(err)
}
n, err := clientconn.WriteTo(rrqbuf, serverconn.LocalAddr())
if err != nil {
t.Fatal(err)
}
if n != len(rrqbuf) {
t.Fatalf("expected %d bytes; wrote %d bytes", len(rrqbuf), n)
}
// paylaod2 represent the payload that we recieve from the server
payload2 := new(bytes.Buffer)
for {
_ = clientconn.SetReadDeadline(time.Now().Add(time.Second * 5))
buf := make([]byte, DatagramSize)
n, addr, err := clientconn.ReadFrom(buf)
if err != nil {
t.Fatal(err)
}
data := new(Data)
err = data.UnmarshalBinary(buf[:n])
if err != nil {
t.Fatal(err)
}
_, err = io.Copy(payload2, data.Payload)
if err != nil {
t.Fatal(err)
}
// Ack
ack := Ack{Block: data.Block}
b, err := ack.MarshalBinary()
if err != nil {
t.Fatal(err)
}
// Write the acknowledgement packet to the server
_, err = clientconn.WriteTo(b, addr)
if err != nil {
t.Fatal(err)
}
// Datagram with less than 516 bytes means its the last packet so break the loop
if n < DatagramSize {
break
}
}
if bytes.Equal(payload1, payload2.Bytes()) == false {
t.Fatal("The sent and recieved payloads are not identical!")
}
}