gopkg.in/hugelgupf/u-root.v9@v9.0.0-20180831063832-3f6f1057f09b/cmds/wifi/service_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 "math/rand" 9 "reflect" 10 "sync" 11 "testing" 12 13 "github.com/u-root/u-root/pkg/wifi" 14 ) 15 16 func setupStubService() (*WifiService, error) { 17 wifiWorker, err := wifi.NewStubWorker("", NearbyWifisStub...) 18 if err != nil { 19 return nil, err 20 } 21 return NewWifiService(wifiWorker) 22 } 23 24 func TestGetState(t *testing.T) { 25 service, err := setupStubService() 26 if err != nil { 27 t.Fatal(err) 28 } 29 service.Start() 30 defer service.Shutdown() 31 32 expectedInitialState := State{ 33 CurEssid: "", 34 ConnectingEssid: "", 35 Refreshing: false, 36 NearbyWifis: nil, 37 } 38 state := service.GetState() 39 if !reflect.DeepEqual(expectedInitialState, state) { 40 t.Errorf("\ngot:%v\nwant:%v\n", state, expectedInitialState) 41 } 42 } 43 44 func TestRaceGetState(t *testing.T) { 45 // Set Up 46 service, err := setupStubService() 47 if err != nil { 48 t.Fatal(err) 49 } 50 service.Start() 51 defer service.Shutdown() 52 numGoRoutines := 100 53 54 var wg sync.WaitGroup 55 for i := 0; i < numGoRoutines; i++ { 56 wg.Add(1) 57 go func() { 58 defer wg.Done() 59 service.GetState() 60 }() 61 } 62 wg.Wait() 63 } 64 65 func TestConnect(t *testing.T) { 66 service, err := setupStubService() 67 if err != nil { 68 t.Fatal(err) 69 } 70 service.Start() 71 defer service.Shutdown() 72 73 if err := service.Connect([]string{EssidStub}); err != nil { 74 t.Errorf("error: %v", err) 75 return 76 } 77 s := service.GetState() 78 if s.CurEssid != EssidStub { 79 t.Errorf("\ngot:%v\nwant:%v\n", s.CurEssid, EssidStub) 80 } 81 } 82 83 func TestRaceConnect(t *testing.T) { 84 //Set Up 85 numGoRoutines := 100 86 service, err := setupStubService() 87 if err != nil { 88 t.Fatal(err) 89 } 90 91 service.Start() 92 defer service.Shutdown() 93 94 var wg sync.WaitGroup 95 for i := 0; i < numGoRoutines; i++ { 96 wg.Add(1) 97 go func() { 98 defer wg.Done() 99 service.Connect([]string{EssidStub}) 100 }() 101 } 102 wg.Wait() 103 } 104 105 func TestRefresh(t *testing.T) { 106 //Set Up 107 service, err := setupStubService() 108 if err != nil { 109 t.Fatal(err) 110 } 111 service.Start() 112 defer service.Shutdown() 113 114 if err := service.Refresh(); err != nil { 115 t.Fatalf("Refresh: error: %v", err) 116 } 117 s := service.GetState() 118 if !reflect.DeepEqual(s.NearbyWifis, NearbyWifisStub) { 119 t.Errorf("\ngot:%v\nwant:%v\n", s.NearbyWifis, NearbyWifisStub) 120 } 121 } 122 123 func TestRaceRefreshWithinDefaultBufferSize(t *testing.T) { 124 //Set Up 125 numGoRoutines := DefaultBufferSize 126 service, err := setupStubService() 127 if err != nil { 128 t.Fatal(err) 129 } 130 131 service.Start() 132 defer service.Shutdown() 133 134 var wg sync.WaitGroup 135 for i := 0; i < numGoRoutines; i++ { 136 wg.Add(1) 137 go func() { 138 defer wg.Done() 139 service.Refresh() 140 }() 141 } 142 wg.Wait() 143 } 144 145 func TestRaceRefreshOverDefaultBufferSize(t *testing.T) { 146 // Set Up 147 numGoRoutines := DefaultBufferSize * 2 148 service, err := setupStubService() 149 if err != nil { 150 t.Fatal(err) 151 } 152 153 service.Start() 154 defer service.Shutdown() 155 156 var wg sync.WaitGroup 157 for i := 0; i < numGoRoutines; i++ { 158 wg.Add(1) 159 go func() { 160 defer wg.Done() 161 service.Refresh() 162 }() 163 } 164 wg.Wait() 165 } 166 167 func TestRaceCond(t *testing.T) { 168 // Set Up 169 numConnectRoutines, numRefreshGoRoutines, numReadGoRoutines := 10, 10, 100 170 service, err := setupStubService() 171 if err != nil { 172 t.Fatal(err) 173 } 174 175 service.Start() 176 defer service.Shutdown() 177 178 essidChoices := []string{"stub1", "stub2", "stub3"} 179 180 var wg sync.WaitGroup 181 182 for i := 0; i < numConnectRoutines; i++ { 183 wg.Add(1) 184 go func() { 185 defer wg.Done() 186 idx := rand.Intn(len(essidChoices)) 187 service.Connect([]string{essidChoices[idx]}) 188 }() 189 } 190 191 for i := 0; i < numRefreshGoRoutines; i++ { 192 wg.Add(1) 193 go func() { 194 defer wg.Done() 195 service.Refresh() 196 }() 197 } 198 199 for i := 0; i < numReadGoRoutines; i++ { 200 wg.Add(1) 201 go func() { 202 defer wg.Done() 203 service.GetState() 204 }() 205 } 206 207 wg.Wait() 208 }