-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver_test.go
148 lines (123 loc) · 3.47 KB
/
server_test.go
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package http
import (
"fmt"
"io"
"net"
"testing"
)
func TestNewServer(t *testing.T) {
router := &HTTPRouter{}
listenAddr := "localhost:8080"
server := NewServer(listenAddr, router)
if server.listenAddr != listenAddr {
t.Errorf("Expected listenAddr to be %s, got %s", listenAddr, server.listenAddr)
}
if server.router != router {
t.Error("Expected router to be the one passed to NewServer")
}
if server.listener != nil {
t.Error("Expected listener to be nil initially")
}
}
func TestStart(t *testing.T) {
s, port := startTestServer(t, NewHTTPRouter())
defer s.Shutdown()
// Connect to the server and send a message
conn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port))
if err != nil {
t.Fatal(err)
}
defer conn.Close()
expected := "HTTP/1.1 404 Not Found\r\nContent-Length: 10\r\nContent-Type: text/plain\r\n\r\nNot Found\n"
request := "GET /unknown HTTP/1.1\r\n\r\n"
// Write the request to the client side
_, err = conn.Write([]byte(request))
if err != nil {
t.Fatalf("Failed to write to client connection: %s", err)
}
response, err := io.ReadAll(conn)
if err != nil {
t.Fatalf("failed to read: %s", err)
}
if string(response) != expected {
t.Errorf("expected %q, but got %q", expected, response)
}
}
func TestHandleConnection(t *testing.T) {
s, port := startTestServer(t, NewHTTPRouter())
defer s.Shutdown()
// Register the handler before sending any requests
s.router.HandlerFunc("GET", "/echo", func(r *HTTPRequest, w ResponseWriter) {
w.Write([]byte("Hello\n"))
})
// Function to handle a connection and return the response
sendRequest := func(request string) string {
conn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port))
if err != nil {
t.Fatal(err)
}
defer conn.Close()
// Write the request to the client side
_, err = conn.Write([]byte(request))
if err != nil {
t.Fatalf("Failed to write to client connection: %s", err)
}
response, err := io.ReadAll(conn)
if err != nil {
t.Fatalf("failed to read: %s", err)
}
return string(response)
}
tests := []struct {
name string
data string
want string
}{
{
name: "Bad request body",
data: "INVALID REQUEST\r\n\r\n",
want: "HTTP/1.1 400 Bad Request\r\nContent-Length: 12\r\nContent-Type: text/plain\r\n\r\nBad Request\n",
},
{
name: "Invalid path",
data: "GET /unknown HTTP/1.1\r\n\r\n",
want: "HTTP/1.1 404 Not Found\r\nContent-Length: 10\r\nContent-Type: text/plain\r\n\r\nNot Found\n",
},
{
name: "Registered path",
data: "GET /echo HTTP/1.1\r\n\r\n",
want: "HTTP/1.1 200 OK\r\nContent-Length: 6\r\nContent-Type: text/plain\r\n\r\nHello\n",
},
}
for _, tt := range tests {
got := sendRequest(tt.data)
if tt.want != got {
t.Errorf("Expected response %q, but got %q", tt.want, got)
}
}
}
func TestGetPort(t *testing.T) {
s, port := startTestServer(t, NewHTTPRouter())
defer s.Shutdown()
expected := s.listener.Addr().(*net.TCPAddr).Port
if port != expected {
t.Errorf("Port is %d, got %d", expected, port)
}
}
func TestServerSetAndIsRunning(t *testing.T) {
server := &Server{}
// Test initial state
if server.isRunning() {
t.Fatalf("Expected server to not be running, but got running=true")
}
// Test setting state to true
server.setRunning(true)
if !server.isRunning() {
t.Fatalf("Expected server to be running, but got running=false")
}
// Test setting state to false
server.setRunning(false)
if server.isRunning() {
t.Fatalf("Expected server to not be running, but got running=true")
}
}