gopkg.in/hugelgupf/u-root.v2@v2.0.0-20180831055005-3f8fdb0ce09d/pkg/sos/server_test.go (about) 1 // Copyright 2018 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 sos 6 7 import ( 8 "encoding/json" 9 "fmt" 10 "math/rand" 11 "net/http" 12 "net/http/httptest" 13 "path/filepath" 14 "reflect" 15 "sync" 16 "testing" 17 ) 18 19 func TestSOSHtmlPath(t *testing.T) { 20 var tests = []struct { 21 paths []string 22 result string 23 }{ 24 {paths: []string{""}, result: htmlRoot}, 25 {paths: []string{"css"}, result: filepath.Join(htmlRoot, "css")}, 26 {paths: []string{"html", "wifi.html"}, result: filepath.Join(htmlRoot, "html/wifi.html")}, 27 {paths: []string{"html/wifi.html"}, result: filepath.Join(htmlRoot, "html/wifi.html")}, 28 } 29 30 for _, test := range tests { 31 if p := HTMLPath(test.paths...); p != test.result { 32 t.Errorf("%v: want %v, got %v", test, test.result, p) 33 } 34 } 35 } 36 37 func TestSOSHtmlPathWithPresetRoot(t *testing.T) { 38 //set up 39 testRoot := "/a/b/html" 40 SetHTMLRoot("/a", "b", "html") 41 42 var tests = []struct { 43 paths []string 44 result string 45 }{ 46 {paths: []string{""}, result: testRoot}, 47 {paths: []string{"css"}, result: filepath.Join(testRoot, "css")}, 48 {paths: []string{"html", "wifi.html"}, result: filepath.Join(testRoot, "html/wifi.html")}, 49 {paths: []string{"html/wifi.html"}, result: filepath.Join(testRoot, "html/wifi.html")}, 50 } 51 52 for _, test := range tests { 53 if p := HTMLPath(test.paths...); p != test.result { 54 t.Errorf("%v: want %v, got %v", test, test.result, p) 55 } 56 } 57 } 58 59 func TestRegisterHandle(t *testing.T) { 60 // Set up 61 s := SosServer{NewSosService()} 62 r := s.buildRouter() 63 ts := httptest.NewServer(r) 64 defer ts.Close() 65 m := RegisterReqJson{knownServ1.service, knownServ1.port} 66 67 // Execute 68 if err := makeRequestToServer("POST", ts.URL+"/register", m); err != nil { 69 t.Errorf("error: %v", err) 70 return 71 } 72 73 // Assert 74 if s.service.registry[knownServ1.service] != knownServ1.port { 75 t.Errorf("got:(%v)\nwant:(%v)", s.service.registry[knownServ1.service], knownServ1.port) 76 } 77 } 78 79 func TestUnregisterHandle(t *testing.T) { 80 // Set up 81 s := SosServer{setUpKnownServices()} 82 r := s.buildRouter() 83 ts := httptest.NewServer(r) 84 defer ts.Close() 85 m := UnRegisterReqJson{knownServ1.service} 86 87 // Execute 88 if err := makeRequestToServer("POST", ts.URL+"/unregister", m); err != nil { 89 t.Errorf("error: %v", err) 90 return 91 } 92 // Assert 93 if _, err := s.service.Read(knownServ1.service); !reflect.DeepEqual(err, fmt.Errorf("%v is not in the registry", knownServ1.service)) { 94 t.Errorf("\ngot:(%v)\nwant:(%v)", err, fmt.Errorf("%v is not in the registry", knownServ1.service)) 95 } 96 } 97 98 func TestGetService(t *testing.T) { 99 // Set up 100 r := SosServer{setUpKnownServices()}.buildRouter() 101 ts := httptest.NewServer(r) 102 defer ts.Close() 103 req, err := http.NewRequest("GET", ts.URL+"/service/"+knownServ1.service, nil) 104 if err != nil { 105 t.Errorf("error: %v", err) 106 return 107 } 108 109 // Execute 110 res, err := http.DefaultClient.Do(req) 111 if err != nil { 112 t.Errorf("error: %v", err) 113 return 114 } 115 116 // Assert 117 decoder := json.NewDecoder(res.Body) 118 defer res.Body.Close() 119 var retMsg GetServiceResJson 120 if err := decoder.Decode(&retMsg); err != nil { 121 t.Errorf("Error Decode JSON Response") 122 return 123 } 124 if retMsg.Port != knownServ1.port { 125 t.Errorf("\ngot:(%v)\nwant:(%v)", retMsg.Port, knownServ1.port) 126 } 127 } 128 129 func TestGetServiceFails(t *testing.T) { 130 // Set up 131 r := SosServer{NewSosService()}.buildRouter() 132 ts := httptest.NewServer(r) 133 defer ts.Close() 134 req, err := http.NewRequest("GET", ts.URL+"/service/"+knownServ1.service, nil) 135 if err != nil { 136 t.Errorf("error: %v", err) 137 return 138 } 139 140 // Execute 141 res, err := http.DefaultClient.Do(req) 142 if err != nil { 143 t.Errorf("error: %v", err) 144 return 145 } 146 147 // Assert 148 if res.StatusCode != http.StatusNotFound { 149 t.Errorf("\ngot:(%v)\nwant:(%v)", res.StatusCode, http.StatusNotFound) 150 } 151 } 152 153 func TestRace(t *testing.T) { 154 // Set Up 155 numRegisterGoRoutines, numUnregisterGoRoutines, numReadGoRoutines := 10, 10, 100 156 serviceChoices := []RegistryEntryStub{ 157 knownServ1, knownServ2, knownServ3, 158 newServ1, newServ2, newServ3, 159 } 160 161 r := SosServer{setUpKnownServices()}.buildRouter() 162 ts := httptest.NewServer(r) 163 defer ts.Close() 164 165 // Execute 166 var wg sync.WaitGroup 167 168 for i := 0; i < numRegisterGoRoutines; i++ { 169 wg.Add(1) 170 go func() { 171 defer wg.Done() 172 idx := rand.Intn(len(serviceChoices)) 173 m := RegisterReqJson{serviceChoices[idx].service, serviceChoices[idx].port} 174 makeRequestToServer("POST", ts.URL+"/register", m) 175 }() 176 } 177 178 for i := 0; i < numUnregisterGoRoutines; i++ { 179 wg.Add(1) 180 go func() { 181 defer wg.Done() 182 idx := rand.Intn(len(serviceChoices)) 183 m := UnRegisterReqJson{serviceChoices[idx].service} 184 makeRequestToServer("POST", ts.URL+"/unregister", m) 185 }() 186 } 187 188 for i := 0; i < numReadGoRoutines; i++ { 189 wg.Add(1) 190 go func() { 191 defer wg.Done() 192 idx := rand.Intn(len(serviceChoices)) 193 req, err := http.NewRequest("GET", ts.URL+"/service/"+serviceChoices[idx].service, nil) 194 if err != nil { 195 t.Errorf("error: %v", err) 196 return 197 } 198 http.DefaultClient.Do(req) 199 }() 200 } 201 202 wg.Wait() 203 }