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  }