github.com/letsencrypt/boulder@v0.20251208.0/observer/obs_conf_test.go (about)

     1  package observer
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/letsencrypt/boulder/cmd"
     9  	"github.com/letsencrypt/boulder/config"
    10  	"github.com/letsencrypt/boulder/metrics"
    11  	"github.com/letsencrypt/boulder/observer/probers"
    12  	_ "github.com/letsencrypt/boulder/observer/probers/mock"
    13  	"github.com/letsencrypt/boulder/test"
    14  )
    15  
    16  const (
    17  	debugAddr = ":8040"
    18  	errDBZMsg = "over 9000"
    19  	mockConf  = "Mock"
    20  )
    21  
    22  func TestObsConf_makeMonitors(t *testing.T) {
    23  	var errDBZ = errors.New(errDBZMsg)
    24  	var cfgSyslog = cmd.SyslogConfig{StdoutLevel: 6, SyslogLevel: 6}
    25  	var cfgDur = config.Duration{Duration: time.Second * 5}
    26  	var cfgBuckets = []float64{.001}
    27  	var validMonConf = &MonConf{
    28  		cfgDur, mockConf, probers.Settings{"valid": true, "pname": "foo", "pkind": "bar"}}
    29  	var invalidMonConf = &MonConf{
    30  		cfgDur, mockConf, probers.Settings{"valid": false, "errmsg": errDBZMsg, "pname": "foo", "pkind": "bar"}}
    31  	type fields struct {
    32  		Syslog    cmd.SyslogConfig
    33  		Buckets   []float64
    34  		DebugAddr string
    35  		MonConfs  []*MonConf
    36  	}
    37  	tests := []struct {
    38  		name    string
    39  		fields  fields
    40  		errs    []error
    41  		wantErr bool
    42  	}{
    43  		// valid
    44  		{"1 valid", fields{cfgSyslog, cfgBuckets, debugAddr, []*MonConf{validMonConf}}, nil, false},
    45  		{"2 valid", fields{
    46  			cfgSyslog, cfgBuckets, debugAddr, []*MonConf{validMonConf, validMonConf}}, nil, false},
    47  		{"1 valid, 1 invalid", fields{
    48  			cfgSyslog, cfgBuckets, debugAddr, []*MonConf{validMonConf, invalidMonConf}}, []error{errDBZ}, false},
    49  		{"1 valid, 2 invalid", fields{
    50  			cfgSyslog, cfgBuckets, debugAddr, []*MonConf{invalidMonConf, validMonConf, invalidMonConf}}, []error{errDBZ, errDBZ}, false},
    51  		// invalid
    52  		{"1 invalid", fields{cfgSyslog, cfgBuckets, debugAddr, []*MonConf{invalidMonConf}}, []error{errDBZ}, true},
    53  		{"0", fields{cfgSyslog, cfgBuckets, debugAddr, []*MonConf{}}, nil, true},
    54  	}
    55  	for _, tt := range tests {
    56  		t.Run(tt.name, func(t *testing.T) {
    57  			c := &ObsConf{
    58  				Syslog:    tt.fields.Syslog,
    59  				Buckets:   tt.fields.Buckets,
    60  				DebugAddr: tt.fields.DebugAddr,
    61  				MonConfs:  tt.fields.MonConfs,
    62  			}
    63  			_, errs, err := c.makeMonitors(metrics.NoopRegisterer)
    64  			if len(errs) != len(tt.errs) {
    65  				t.Errorf("ObsConf.validateMonConfs() errs = %d, want %d", len(errs), len(tt.errs))
    66  				t.Logf("%v", errs)
    67  			}
    68  			if (err != nil) != tt.wantErr {
    69  				t.Errorf("ObsConf.validateMonConfs() err = %v, want %v", err, tt.wantErr)
    70  			}
    71  		})
    72  	}
    73  }
    74  
    75  func TestObsConf_ValidateDebugAddr(t *testing.T) {
    76  	type fields struct {
    77  		DebugAddr string
    78  	}
    79  	tests := []struct {
    80  		name    string
    81  		fields  fields
    82  		wantErr bool
    83  	}{
    84  		// valid
    85  		{"max len and range", fields{":65535"}, false},
    86  		{"min len and range", fields{":1"}, false},
    87  		{"2 digits", fields{":80"}, false},
    88  		// invalid
    89  		{"out of range high", fields{":65536"}, true},
    90  		{"out of range low", fields{":0"}, true},
    91  		{"not even a port", fields{":foo"}, true},
    92  		{"missing :", fields{"foo"}, true},
    93  		{"missing port", fields{"foo:"}, true},
    94  	}
    95  	for _, tt := range tests {
    96  		t.Run(tt.name, func(t *testing.T) {
    97  			c := &ObsConf{
    98  				DebugAddr: tt.fields.DebugAddr,
    99  			}
   100  			err := c.validateDebugAddr()
   101  			if tt.wantErr {
   102  				test.AssertError(t, err, "ObsConf.ValidateDebugAddr() should have errored")
   103  			} else {
   104  				test.AssertNotError(t, err, "ObsConf.ValidateDebugAddr() shouldn't have errored")
   105  			}
   106  		})
   107  	}
   108  }
   109  
   110  func TestObsConf_validateSyslog(t *testing.T) {
   111  	type fields struct {
   112  		Syslog cmd.SyslogConfig
   113  	}
   114  	tests := []struct {
   115  		name    string
   116  		fields  fields
   117  		wantErr bool
   118  	}{
   119  		// valid
   120  		{"valid", fields{cmd.SyslogConfig{StdoutLevel: 6, SyslogLevel: 6}}, false},
   121  		// invalid
   122  		{"both too high", fields{cmd.SyslogConfig{StdoutLevel: 9, SyslogLevel: 9}}, true},
   123  		{"stdout too high", fields{cmd.SyslogConfig{StdoutLevel: 9, SyslogLevel: 6}}, true},
   124  		{"syslog too high", fields{cmd.SyslogConfig{StdoutLevel: 6, SyslogLevel: 9}}, true},
   125  		{"both too low", fields{cmd.SyslogConfig{StdoutLevel: -1, SyslogLevel: -1}}, true},
   126  		{"stdout too low", fields{cmd.SyslogConfig{StdoutLevel: -1, SyslogLevel: 6}}, true},
   127  		{"syslog too low", fields{cmd.SyslogConfig{StdoutLevel: 6, SyslogLevel: -1}}, true},
   128  	}
   129  	for _, tt := range tests {
   130  		t.Run(tt.name, func(t *testing.T) {
   131  			c := &ObsConf{
   132  				Syslog: tt.fields.Syslog,
   133  			}
   134  			err := c.validateSyslog()
   135  			if tt.wantErr {
   136  				test.AssertError(t, err, "ObsConf.validateSyslog() should have errored")
   137  			} else {
   138  				test.AssertNotError(t, err, "ObsConf.validateSyslog() shouldn't have errored")
   139  			}
   140  		})
   141  	}
   142  }