github.com/verrazzano/verrazzano@v1.7.1/tools/psr/backend/workers/http/get/get_test.go (about)

     1  // Copyright (c) 2022, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package get
     5  
     6  import (
     7  	"errors"
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/verrazzano/verrazzano/pkg/log/vzlog"
    10  	"github.com/verrazzano/verrazzano/tools/psr/backend/config"
    11  	"github.com/verrazzano/verrazzano/tools/psr/backend/osenv"
    12  	"net/http"
    13  	"strings"
    14  	"testing"
    15  )
    16  
    17  type fakeHTTP struct {
    18  	error
    19  	resp     *http.Response
    20  	bodyData string
    21  }
    22  
    23  type fakeBody struct {
    24  	data string
    25  }
    26  
    27  type fakeEnv struct {
    28  	data map[string]string
    29  }
    30  
    31  // TestGetters tests the worker getters
    32  // GIVEN a worker
    33  //
    34  //	WHEN the getter methods are calls
    35  //	THEN ensure that the correct results are returned
    36  func TestGetters(t *testing.T) {
    37  	envMap := map[string]string{
    38  		ServiceName:      "test-service-name",
    39  		ServiceNamespace: "test-namespace",
    40  		ServicePort:      "1",
    41  		Path:             "test-path",
    42  	}
    43  	f := fakeEnv{data: envMap}
    44  	saveEnv := osenv.GetEnvFunc
    45  	osenv.GetEnvFunc = f.GetEnv
    46  	defer func() {
    47  		osenv.GetEnvFunc = saveEnv
    48  	}()
    49  
    50  	w, err := NewHTTPGetWorker()
    51  	assert.NoError(t, err)
    52  
    53  	wd := w.GetWorkerDesc()
    54  	assert.Equal(t, config.WorkerTypeHTTPGet, wd.WorkerType)
    55  	assert.Equal(t, "The get worker makes GET request on the given endpoint", wd.Description)
    56  	assert.Equal(t, metricsPrefix, wd.MetricsPrefix)
    57  
    58  	logged := w.WantLoopInfoLogged()
    59  	assert.False(t, logged)
    60  }
    61  
    62  func TestGetMetricDescList(t *testing.T) {
    63  	envMap := map[string]string{
    64  		ServiceName:      "test-service-name",
    65  		ServiceNamespace: "test-namespace",
    66  		ServicePort:      "1",
    67  		Path:             "test-path",
    68  	}
    69  	f := fakeEnv{data: envMap}
    70  	saveEnv := osenv.GetEnvFunc
    71  	osenv.GetEnvFunc = f.GetEnv
    72  	defer func() {
    73  		osenv.GetEnvFunc = saveEnv
    74  	}()
    75  
    76  	tests := []struct {
    77  		name   string
    78  		fqName string
    79  		help   string
    80  	}{
    81  		{name: "1", fqName: "http_get_request_count_total", help: "The total number of GET requests"},
    82  		{name: "2", fqName: "http_get_request_succeeded_count_total", help: "The total number of successful GET requests"},
    83  		{name: "3", fqName: "http_get_request_failed_count_total", help: "The total number of failed GET requests"},
    84  	}
    85  	for _, test := range tests {
    86  		t.Run(test.name, func(t *testing.T) {
    87  
    88  			wi, err := NewHTTPGetWorker()
    89  			w := wi.(worker)
    90  			assert.NoError(t, err)
    91  			dl := w.GetMetricDescList()
    92  			var found int
    93  			for _, d := range dl {
    94  				s := d.String()
    95  				if strings.Contains(s, test.fqName) && strings.Contains(s, test.help) {
    96  					found++
    97  				}
    98  			}
    99  			assert.Equal(t, 1, found)
   100  		})
   101  	}
   102  }
   103  
   104  func TestGetMetricList(t *testing.T) {
   105  	envMap := map[string]string{
   106  		ServiceName:      "test-service-name",
   107  		ServiceNamespace: "test-namespace",
   108  		ServicePort:      "1",
   109  		Path:             "test-path",
   110  	}
   111  	f := fakeEnv{data: envMap}
   112  	saveEnv := osenv.GetEnvFunc
   113  	osenv.GetEnvFunc = f.GetEnv
   114  	defer func() {
   115  		osenv.GetEnvFunc = saveEnv
   116  	}()
   117  
   118  	tests := []struct {
   119  		name   string
   120  		fqName string
   121  		help   string
   122  	}{
   123  		{name: "1", fqName: "http_get_request_count_total", help: "The total number of GET requests"},
   124  		{name: "2", fqName: "http_get_request_succeeded_count_total", help: "The total number of successful GET requests"},
   125  		{name: "3", fqName: "http_get_request_failed_count_total", help: "The total number of failed GET requests"},
   126  	}
   127  	for _, test := range tests {
   128  		t.Run(test.name, func(t *testing.T) {
   129  			wi, err := NewHTTPGetWorker()
   130  			w := wi.(worker)
   131  			assert.NoError(t, err)
   132  			ml := w.GetMetricList()
   133  			var found int
   134  			for _, m := range ml {
   135  				s := m.Desc().String()
   136  				if strings.Contains(s, test.fqName) && strings.Contains(s, test.help) {
   137  					found++
   138  				}
   139  			}
   140  			assert.Equal(t, 1, found)
   141  		})
   142  	}
   143  }
   144  
   145  // TestGetEnvDescList tests the GetEnvDescList method
   146  // GIVEN a worker
   147  //
   148  //	WHEN the GetEnvDescList methods is called
   149  //	THEN ensure that the correct results are returned
   150  func TestGetEnvDescList(t *testing.T) {
   151  	envMap := map[string]string{
   152  		ServiceName:      "test-service-name",
   153  		ServiceNamespace: "test-namespace",
   154  		ServicePort:      "1",
   155  		Path:             "test-path",
   156  	}
   157  	f := fakeEnv{data: envMap}
   158  	saveEnv := osenv.GetEnvFunc
   159  	osenv.GetEnvFunc = f.GetEnv
   160  	defer func() {
   161  		osenv.GetEnvFunc = saveEnv
   162  	}()
   163  
   164  	tests := []struct {
   165  		name     string
   166  		key      string
   167  		defval   string
   168  		required bool
   169  	}{
   170  		{name: "1",
   171  			key:      ServiceName,
   172  			defval:   "",
   173  			required: true,
   174  		},
   175  		{name: "2",
   176  			key:      ServiceNamespace,
   177  			defval:   "",
   178  			required: true,
   179  		},
   180  		{name: "3",
   181  			key:      ServicePort,
   182  			defval:   "",
   183  			required: true,
   184  		},
   185  		{name: "4",
   186  			key:      Path,
   187  			defval:   "",
   188  			required: true,
   189  		},
   190  	}
   191  
   192  	for _, test := range tests {
   193  		t.Run(test.name, func(t *testing.T) {
   194  			w, err := NewHTTPGetWorker()
   195  			assert.NoError(t, err)
   196  			el := w.GetEnvDescList()
   197  			for _, e := range el {
   198  				if e.Key == test.key {
   199  					assert.Equal(t, test.defval, e.DefaultVal)
   200  					assert.Equal(t, test.required, e.Required)
   201  				}
   202  			}
   203  		})
   204  	}
   205  }
   206  
   207  // TestDoWork tests the DoWork method
   208  // GIVEN a worker
   209  //
   210  //	WHEN the DoWork methods is called
   211  //	THEN ensure that the correct results are returned
   212  func TestDoWork(t *testing.T) {
   213  	envMap := map[string]string{
   214  		ServiceName:      "test-service-name",
   215  		ServiceNamespace: "test-namespace",
   216  		ServicePort:      "1",
   217  		Path:             "test-path",
   218  	}
   219  	f := fakeEnv{data: envMap}
   220  	saveEnv := osenv.GetEnvFunc
   221  	osenv.GetEnvFunc = f.GetEnv
   222  	defer func() {
   223  		osenv.GetEnvFunc = saveEnv
   224  	}()
   225  
   226  	tests := []struct {
   227  		name         string
   228  		bodyData     string
   229  		getError     error
   230  		doworkError  error
   231  		statusCode   int
   232  		nilResp      bool
   233  		reqCount     int
   234  		successCount int
   235  		failureCount int
   236  	}{
   237  		{
   238  			name:         "1",
   239  			bodyData:     "testsuccess",
   240  			statusCode:   200,
   241  			reqCount:     1,
   242  			successCount: 1,
   243  			failureCount: 0,
   244  		},
   245  		{
   246  			name:         "2",
   247  			bodyData:     "testerror",
   248  			getError:     errors.New("error"),
   249  			reqCount:     1,
   250  			successCount: 0,
   251  			failureCount: 1,
   252  		},
   253  		{
   254  			name:         "3",
   255  			bodyData:     "testRespError",
   256  			statusCode:   500,
   257  			reqCount:     1,
   258  			successCount: 0,
   259  			failureCount: 1,
   260  		},
   261  		{
   262  			name:         "4",
   263  			bodyData:     "testNilResp",
   264  			doworkError:  errors.New("GET request to endpoint received a nil response"),
   265  			nilResp:      true,
   266  			reqCount:     1,
   267  			successCount: 0,
   268  			failureCount: 1,
   269  		},
   270  	}
   271  	for _, test := range tests {
   272  		t.Run(test.name, func(t *testing.T) {
   273  			f := httpGetFunc
   274  			defer func() {
   275  				httpGetFunc = f
   276  			}()
   277  			var resp *http.Response
   278  			if !test.nilResp {
   279  				resp = &http.Response{
   280  					StatusCode:    test.statusCode,
   281  					Body:          &fakeBody{data: test.bodyData},
   282  					ContentLength: int64(len(test.bodyData)),
   283  				}
   284  			}
   285  			httpGetFunc = fakeHTTP{
   286  				bodyData: test.bodyData,
   287  				error:    test.getError,
   288  				resp:     resp,
   289  			}.Get
   290  
   291  			wi, err := NewHTTPGetWorker()
   292  			assert.NoError(t, err)
   293  			w := wi.(worker)
   294  			err = w.DoWork(config.CommonConfig{
   295  				WorkerType: "Fake",
   296  			}, vzlog.DefaultLogger())
   297  			if test.doworkError == nil && test.getError == nil {
   298  				assert.NoError(t, err)
   299  			} else {
   300  				assert.Error(t, err)
   301  			}
   302  
   303  			assert.Equal(t, int64(test.reqCount), w.getRequestsCountTotal.Val)
   304  			assert.Equal(t, int64(test.successCount), w.getRequestsSucceededCountTotal.Val)
   305  			assert.Equal(t, int64(test.failureCount), w.getRequestsFailedCountTotal.Val)
   306  		})
   307  	}
   308  }
   309  
   310  func (f fakeHTTP) Get(url string) (resp *http.Response, err error) {
   311  	return f.resp, f.error
   312  }
   313  
   314  func (f fakeBody) Read(d []byte) (n int, err error) {
   315  	copy(d, f.data)
   316  	return len(f.data), nil
   317  }
   318  
   319  func (f fakeBody) Close() error {
   320  	return nil
   321  }
   322  
   323  func (f *fakeEnv) GetEnv(key string) string {
   324  	return f.data[key]
   325  }