github.com/jlowellwofford/u-root@v1.0.0/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  }