github.com/xmidt-org/webpa-common@v1.11.9/xhttp/server_test.go (about) 1 package xhttp 2 3 import ( 4 "crypto/tls" 5 "errors" 6 "net" 7 "net/http" 8 "testing" 9 "time" 10 11 "github.com/go-kit/kit/log" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 "github.com/xmidt-org/webpa-common/logging" 15 ) 16 17 func testNewServerLogger(t *testing.T, logger log.Logger) { 18 var ( 19 assert = assert.New(t) 20 require = require.New(t) 21 serverLogger = NewServerLogger(logger) 22 ) 23 24 require.NotNil(serverLogger) 25 assert.NotPanics(func() { 26 serverLogger.Println("this is a message") 27 }) 28 } 29 30 func TestNewServerLogger(t *testing.T) { 31 t.Run("NilLogger", func(t *testing.T) { 32 testNewServerLogger(t, nil) 33 }) 34 35 t.Run("CustomLogger", func(t *testing.T) { 36 testNewServerLogger(t, log.With(logging.NewTestLogger(nil, t), ServerKey(), "test")) 37 }) 38 } 39 40 func testNewServerConnStateLogger(t *testing.T, logger log.Logger) { 41 var ( 42 assert = assert.New(t) 43 require = require.New(t) 44 connState = NewServerConnStateLogger(logger) 45 ) 46 47 require.NotNil(connState) 48 assert.NotPanics(func() { 49 connState(new(net.IPConn), http.StateNew) 50 }) 51 } 52 53 func TestNewServerConnStateLogger(t *testing.T) { 54 t.Run("NilLogger", func(t *testing.T) { 55 testNewServerConnStateLogger(t, nil) 56 }) 57 58 t.Run("CustomLogger", func(t *testing.T) { 59 testNewServerConnStateLogger(t, log.With(logging.NewTestLogger(nil, t), ServerKey(), "test")) 60 }) 61 } 62 63 const ( 64 expectedCertificateFile = "certificateFile" 65 expectedKeyFile = "keyFile" 66 ) 67 68 // startOptions generates the various permutations of StartOptions that we test with. 69 // Each options struct can be further modified by tests. 70 func startOptions(t *testing.T) []StartOptions { 71 var o []StartOptions 72 73 for _, logger := range []log.Logger{nil, logging.NewTestLogger(nil, t)} { 74 for _, disableKeepAlives := range []bool{false, true} { 75 o = append(o, StartOptions{ 76 Logger: logger, 77 DisableKeepAlives: disableKeepAlives, 78 }) 79 } 80 } 81 82 return o 83 } 84 85 func testNewStarterListenAndServe(t *testing.T) { 86 var ( 87 assert = assert.New(t) 88 require = require.New(t) 89 ) 90 91 for _, o := range startOptions(t) { 92 t.Logf("StartOptions: %v", o) 93 94 for _, expectedError := range []error{errors.New("expected"), http.ErrServerClosed} { 95 httpServer := new(mockHTTPServer) 96 97 httpServer.On("SetKeepAlivesEnabled", !o.DisableKeepAlives).Once() 98 httpServer.On("ListenAndServe").Return(expectedError).Once() 99 100 starter := NewStarter(o, httpServer) 101 require.NotNil(starter) 102 103 assert.NotPanics(func() { 104 assert.Equal(expectedError, starter()) 105 }) 106 107 httpServer.AssertExpectations(t) 108 } 109 } 110 } 111 112 func testNewStarterServe(t *testing.T) { 113 var ( 114 assert = assert.New(t) 115 require = require.New(t) 116 ) 117 118 for _, o := range startOptions(t) { 119 t.Logf("StartOptions: %v", o) 120 121 for _, expectedError := range []error{errors.New("expected"), http.ErrServerClosed} { 122 var ( 123 listener = new(mockListener) 124 httpServer = new(mockHTTPServer) 125 ) 126 127 httpServer.On("SetKeepAlivesEnabled", !o.DisableKeepAlives).Once() 128 httpServer.On("Serve", listener).Return(expectedError).Once() 129 o.Listener = listener 130 131 starter := NewStarter(o, httpServer) 132 require.NotNil(starter) 133 134 assert.NotPanics(func() { 135 assert.Equal(expectedError, starter()) 136 }) 137 138 listener.AssertExpectations(t) 139 httpServer.AssertExpectations(t) 140 } 141 } 142 } 143 144 func testloadconfig(certificatFiles, keyFiles []string) *tls.Config { 145 certPem := []byte(`-----BEGIN CERTIFICATE----- 146 MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw 147 DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow 148 EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d 149 7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B 150 5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr 151 BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1 152 NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l 153 Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc 154 6MF9+Yw1Yy0t 155 -----END CERTIFICATE-----`) 156 keyPem := []byte(`-----BEGIN EC PRIVATE KEY----- 157 MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49 158 AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q 159 EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA== 160 -----END EC PRIVATE KEY-----`) 161 cert, err := tls.X509KeyPair(certPem, keyPem) 162 if err != nil { 163 panic(err) 164 } 165 cfg := &tls.Config{Certificates: []tls.Certificate{cert}} 166 cfg.BuildNameToCertificate() 167 return cfg 168 } 169 170 func testNewStarterListenAndServeTLS(t *testing.T) { 171 var ( 172 assert = assert.New(t) 173 require = require.New(t) 174 ) 175 176 for _, o := range startOptions(t) { 177 t.Logf("StartOptions: %v", o) 178 179 for _, expectedError := range []error{errors.New("expected"), http.ErrServerClosed} { 180 httpServer := new(mockHTTPServer) 181 182 httpServer.On("SetKeepAlivesEnabled", !o.DisableKeepAlives).Once() 183 httpServer.On("ListenAndServe", ).Return(expectedError).Once() 184 o.CertificateFile = []string{expectedCertificateFile} 185 o.KeyFile = []string{expectedKeyFile} 186 187 starter := NewStarter(o, httpServer) 188 require.NotNil(starter) 189 190 assert.NotPanics(func() { 191 assert.Equal(expectedError, starter()) 192 }) 193 194 httpServer.AssertExpectations(t) 195 } 196 } 197 } 198 199 func testNewStarterServeTLS(t *testing.T) { 200 var ( 201 assert = assert.New(t) 202 require = require.New(t) 203 ) 204 205 for _, o := range startOptions(t) { 206 t.Logf("StartOptions: %v", o) 207 208 for _, expectedError := range []error{errors.New("expected"), http.ErrServerClosed} { 209 var ( 210 listener = new(mockListener) 211 httpServer = new(mockHTTPServer) 212 ) 213 214 httpServer.On("SetKeepAlivesEnabled", !o.DisableKeepAlives).Once() 215 httpServer.On("Serve", listener).Return(expectedError).Once() 216 o.Listener = listener 217 o.CertificateFile = []string{expectedCertificateFile} 218 o.KeyFile = []string{expectedKeyFile} 219 220 starter := NewStarter(o, httpServer) 221 require.NotNil(starter) 222 223 assert.NotPanics(func() { 224 assert.Equal(expectedError, starter()) 225 }) 226 227 listener.AssertExpectations(t) 228 httpServer.AssertExpectations(t) 229 } 230 } 231 } 232 233 func TestNewStarter(t *testing.T) { 234 t.Run("ListenAndServe", testNewStarterListenAndServe) 235 t.Run("Serve", testNewStarterServe) 236 t.Run("ListenAndServeTLS", testNewStarterListenAndServeTLS) 237 t.Run("ServeTLS", testNewStarterServeTLS) 238 } 239 240 func TestServerOptions(t *testing.T) { 241 var ( 242 assert = assert.New(t) 243 logger = logging.NewTestLogger(nil, t) 244 listener = new(mockListener) 245 246 o = ServerOptions{ 247 Logger: logger, 248 Listener: listener, 249 DisableKeepAlives: true, 250 CertificateFile: []string{"cert.pem"}, 251 KeyFile: []string{"key.pem"}, 252 } 253 ) 254 255 so := o.StartOptions() 256 assert.NotNil(so.Logger) 257 assert.Equal(listener, so.Listener) 258 assert.True(so.DisableKeepAlives) 259 assert.Equal([]string{"cert.pem"}, so.CertificateFile) 260 assert.Equal([]string{"key.pem"}, so.KeyFile) 261 listener.AssertExpectations(t) 262 } 263 264 func TestNewServer(t *testing.T) { 265 var ( 266 assert = assert.New(t) 267 require = require.New(t) 268 logger = logging.NewTestLogger(nil, t) 269 listener = new(mockListener) 270 271 o = ServerOptions{ 272 Logger: logger, 273 Address: "localhost:1234", 274 ReadTimeout: 31 * time.Hour, 275 ReadHeaderTimeout: 12356 * time.Second, 276 WriteTimeout: 391 * time.Minute, 277 IdleTimeout: 102 * time.Millisecond, 278 MaxHeaderBytes: 48287231, 279 Listener: listener, 280 DisableKeepAlives: true, 281 CertificateFile: []string{"cert.pem"}, 282 KeyFile: []string{"key.pem"}, 283 } 284 ) 285 286 s := NewServer(o) 287 require.NotNil(s) 288 289 assert.Equal("localhost:1234", s.Addr) 290 assert.Equal(31*time.Hour, s.ReadTimeout) 291 assert.Equal(12356*time.Second, s.ReadHeaderTimeout) 292 assert.Equal(391*time.Minute, s.WriteTimeout) 293 assert.Equal(102*time.Millisecond, s.IdleTimeout) 294 assert.Equal(48287231, s.MaxHeaderBytes) 295 assert.NotNil(s.ErrorLog) 296 assert.NotNil(s.ConnState) 297 }