gopkg.in/hugelgupf/u-root.v4@v4.0.0-20180831060141-1d761fb73d50/cmds/wifi/server_test.go (about) 1 // Copyright 2017 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "bytes" 9 "encoding/json" 10 "fmt" 11 "math/rand" 12 "net/http" 13 "net/http/httptest" 14 "reflect" 15 "sync" 16 "testing" 17 ) 18 19 type UserInputValidationTestcase struct { 20 name string 21 essid string 22 pass string 23 id string 24 exp []string 25 err error 26 } 27 28 var ( 29 EssidStub = "stub" 30 IdStub = "stub" 31 PassStub = "123456789" 32 33 userInputValidationTestcases = []UserInputValidationTestcase{ 34 { 35 name: "Essid, passphrase, Id", 36 essid: EssidStub, 37 pass: PassStub, 38 id: IdStub, 39 exp: []string{EssidStub, PassStub, IdStub}, 40 err: nil, 41 }, 42 { 43 name: "Essid, passphrase", 44 essid: EssidStub, 45 pass: PassStub, 46 id: "", 47 exp: []string{EssidStub, PassStub}, 48 err: nil, 49 }, 50 { 51 name: "Essid", 52 essid: EssidStub, 53 pass: "", 54 id: "", 55 exp: []string{EssidStub}, 56 err: nil, 57 }, 58 { 59 name: "No Essid", 60 essid: "", 61 pass: PassStub, 62 id: IdStub, 63 exp: nil, 64 err: fmt.Errorf("Invalid user input"), 65 }, 66 { 67 name: "Essid, Id", 68 essid: EssidStub, 69 pass: "", 70 id: IdStub, 71 exp: nil, 72 err: fmt.Errorf("Invalid user input"), 73 }, 74 } 75 ) 76 77 func TestUserInputValidation(t *testing.T) { 78 for _, test := range userInputValidationTestcases { 79 out, err := userInputValidation(test.essid, test.pass, test.id) 80 if !reflect.DeepEqual(err, test.err) || !reflect.DeepEqual(out, test.exp) { 81 t.Logf("TEST %v", test.name) 82 fncCall := fmt.Sprintf("userInputValidation(%v, %v, %v)", test.essid, test.pass, test.id) 83 t.Errorf("%s\ngot:[%v, %v]\nwant:[%v, %v]", fncCall, out, err, test.exp, test.err) 84 } 85 } 86 } 87 88 func setupStubServer() (*WifiServer, error) { 89 service, err := setupStubService() 90 if err != nil { 91 return nil, err 92 } 93 service.Start() 94 return NewWifiServer(service), nil 95 } 96 97 func TestConnectHandlerSuccess(t *testing.T) { 98 // Set Up 99 server, err := setupStubServer() 100 if err != nil { 101 t.Fatal(err) 102 } 103 defer server.service.Shutdown() 104 router := server.buildRouter() 105 ts := httptest.NewServer(router) 106 defer ts.Close() 107 m := ConnectJsonMsg{EssidStub, PassStub, IdStub} 108 b, err := json.Marshal(m) 109 if err != nil { 110 t.Errorf("error: %v", err) 111 return 112 } 113 req, err := http.NewRequest("POST", ts.URL+"/connect", bytes.NewBuffer(b)) 114 if err != nil { 115 t.Errorf("error: %v", err) 116 return 117 } 118 119 // Execute 120 res, err := http.DefaultClient.Do(req) 121 if err != nil { 122 t.Errorf("error: %v", err) 123 return 124 } 125 // Assert 126 decoder := json.NewDecoder(res.Body) 127 defer res.Body.Close() 128 var retMsg struct{ Error string } 129 if err := decoder.Decode(&retMsg); err != nil { 130 t.Errorf("Error Decode JSON Response") 131 return 132 } 133 // nil in response 134 if retMsg != struct{ Error string }{} { 135 t.Errorf("\ngot:%v\nwant:%v", retMsg, struct{ Error string }{}) 136 return 137 } 138 // Check for State change 139 state := server.service.GetState() 140 if state.CurEssid != EssidStub { 141 t.Errorf("\ngot:%v\nwant:%v", state.CurEssid, EssidStub) 142 } 143 } 144 145 func TestConnectHandlerFail(t *testing.T) { 146 // Set Up 147 server, err := setupStubServer() 148 if err != nil { 149 t.Fatal(err) 150 } 151 defer server.service.Shutdown() 152 router := server.buildRouter() 153 ts := httptest.NewServer(router) 154 defer ts.Close() 155 m := ConnectJsonMsg{EssidStub, "", IdStub} 156 b, err := json.Marshal(m) 157 if err != nil { 158 t.Errorf("error: %v", err) 159 return 160 } 161 req, err := http.NewRequest("POST", ts.URL+"/connect", bytes.NewBuffer(b)) 162 if err != nil { 163 t.Errorf("error: %v", err) 164 return 165 } 166 167 // Execute 168 res, err := http.DefaultClient.Do(req) 169 if err != nil { 170 t.Errorf("error: %v", err) 171 return 172 } 173 // Assert 174 decoder := json.NewDecoder(res.Body) 175 defer res.Body.Close() 176 var retMsg struct{ Error string } 177 if err := decoder.Decode(&retMsg); err != nil { 178 t.Errorf("Error Decode JSON Response") 179 return 180 } 181 // Error message in response 182 if retMsg != struct{ Error string }{"Invalid user input"} { 183 t.Errorf("\ngot:%v\nwant:%v", retMsg, struct{ Error string }{}) 184 return 185 } 186 } 187 188 func TestRefreshHandler(t *testing.T) { 189 // Set Up 190 server, err := setupStubServer() 191 if err != nil { 192 t.Fatal(err) 193 } 194 defer server.service.Shutdown() 195 router := server.buildRouter() 196 ts := httptest.NewServer(router) 197 defer ts.Close() 198 req, err := http.NewRequest("POST", ts.URL+"/refresh", nil) 199 if err != nil { 200 t.Errorf("error: %v", err) 201 return 202 } 203 204 // Execute 205 res, err := http.DefaultClient.Do(req) 206 if err != nil { 207 t.Errorf("error: %v", err) 208 return 209 } 210 211 // Assert 212 decoder := json.NewDecoder(res.Body) 213 defer res.Body.Close() 214 var retMsg struct{ Error string } 215 if err := decoder.Decode(&retMsg); err != nil { 216 t.Errorf("Error Decode JSON Response") 217 return 218 } 219 // nil in response 220 if retMsg != struct{ Error string }{} { 221 t.Errorf("\ngot:%v\nwant:%v", retMsg, struct{ Error string }{}) 222 return 223 } 224 } 225 226 func TestHandlersRace(t *testing.T) { 227 // Set Up 228 numConnectRoutines, numRefreshGoRoutines, numReadGoRoutines := 10, 10, 100 229 server, err := setupStubServer() 230 if err != nil { 231 t.Fatal(err) 232 } 233 defer server.service.Shutdown() 234 router := server.buildRouter() 235 ts := httptest.NewServer(router) 236 defer ts.Close() 237 238 essidChoices := []string{"stub1", "stub2", "stub3"} 239 240 // Execute 241 var wg sync.WaitGroup 242 243 for i := 0; i < numConnectRoutines; i++ { 244 wg.Add(1) 245 go func() { 246 defer wg.Done() 247 idx := rand.Intn(len(essidChoices)) 248 m := ConnectJsonMsg{essidChoices[idx], "", ""} 249 b, err := json.Marshal(m) 250 if err != nil { 251 t.Errorf("error: %v", err) 252 return 253 } 254 req, err := http.NewRequest("POST", ts.URL+"/connect", bytes.NewBuffer(b)) 255 if err != nil { 256 t.Errorf("error: %v", err) 257 return 258 } 259 if _, err = http.DefaultClient.Do(req); err != nil { 260 t.Errorf("error: %v", err) 261 return 262 } 263 }() 264 } 265 266 for i := 0; i < numRefreshGoRoutines; i++ { 267 wg.Add(1) 268 go func() { 269 defer wg.Done() 270 req, err := http.NewRequest("POST", ts.URL+"/refresh", nil) 271 if err != nil { 272 t.Errorf("error: %v", err) 273 return 274 } 275 if _, err = http.DefaultClient.Do(req); err != nil { 276 t.Errorf("error: %v", err) 277 return 278 } 279 }() 280 } 281 282 for i := 0; i < numReadGoRoutines; i++ { 283 wg.Add(1) 284 go func() { 285 defer wg.Done() 286 req, err := http.NewRequest("GET", ts.URL+"/", nil) 287 if err != nil { 288 t.Errorf("error: %v", err) 289 return 290 } 291 if _, err = http.DefaultClient.Do(req); err != nil { 292 t.Errorf("error: %v", err) 293 return 294 } 295 }() 296 } 297 wg.Wait() 298 }