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  }