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  }