Skip to content

Commit eef5d8f

Browse files
authored
Merge pull request #261 from xmidt-org/feat/refactor/simplify-listenerConfig-struct
chore: simplify listener config struct
2 parents 612219b + 0177d40 commit eef5d8f

File tree

6 files changed

+41
-108
lines changed

6 files changed

+41
-108
lines changed

chrysom/listenerClient.go

+9-23
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const (
3939
)
4040

4141
// ListenerConfig contains config data for polling the Argus client.
42-
type ListenerClientConfig struct {
42+
type ListenerConfig struct {
4343
// Listener provides a mechanism to fetch a copy of all items within a bucket on
4444
// an interval.
4545
// (Optional). If not provided, listening won't be enabled for this client.
@@ -73,19 +73,18 @@ type observerConfig struct {
7373

7474
// NewListenerClient creates a new ListenerClient to be used to poll Argus
7575
// for updates.
76-
func NewListenerClient(config ListenerClientConfig,
76+
func NewListenerClient(config ListenerConfig,
7777
setLogger func(context.Context, *zap.Logger) context.Context,
7878
measures Measures, r Reader,
7979
) (*ListenerClient, error) {
80-
err := validateListenerConfig(&config)
81-
if err != nil {
82-
return nil, err
80+
if config.Listener == nil {
81+
return nil, ErrNoListenerProvided
8382
}
84-
85-
if setLogger == nil {
86-
setLogger = func(ctx context.Context, _ *zap.Logger) context.Context {
87-
return ctx
88-
}
83+
if config.Logger == nil {
84+
config.Logger = sallust.Default()
85+
}
86+
if config.PullInterval == 0 {
87+
config.PullInterval = defaultPullInterval
8988
}
9089
if r == nil {
9190
return nil, ErrNoReaderProvided
@@ -166,16 +165,3 @@ func (c *ListenerClient) Stop(ctx context.Context) error {
166165
atomic.SwapInt32(&c.observer.state, stopped)
167166
return nil
168167
}
169-
170-
func validateListenerConfig(config *ListenerClientConfig) error {
171-
if config.Listener == nil {
172-
return ErrNoListenerProvided
173-
}
174-
if config.Logger == nil {
175-
config.Logger = sallust.Default()
176-
}
177-
if config.PullInterval == 0 {
178-
config.PullInterval = defaultPullInterval
179-
}
180-
return nil
181-
}

chrysom/listenerClient_test.go

+8-43
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ var (
3232
},
3333
[]string{OutcomeLabel},
3434
)}
35-
happyListenerClientConfig = ListenerClientConfig{
35+
happyListenerConfig = ListenerConfig{
3636
Listener: mockListener,
3737
PullInterval: time.Second,
3838
Logger: sallust.Default(),
@@ -109,86 +109,51 @@ func newStartStopClient(includeListener bool) (*ListenerClient, func(), error) {
109109
rw.Write(getItemsValidPayload())
110110
}))
111111

112-
config := ListenerClientConfig{
112+
config := ListenerConfig{
113113
PullInterval: time.Millisecond * 200,
114114
Logger: sallust.Default(),
115115
}
116116
if includeListener {
117117
config.Listener = mockListener
118118
}
119-
client, err := NewListenerClient(config, nil, mockMeasures, &BasicClient{})
119+
client, err := NewListenerClient(config, sallust.With, mockMeasures, &BasicClient{})
120120
if err != nil {
121121
return nil, nil, err
122122
}
123123

124124
return client, server.Close, nil
125125
}
126126

127-
func TestValidateListenerConfig(t *testing.T) {
128-
tcs := []struct {
129-
desc string
130-
expectedErr error
131-
config ListenerClientConfig
132-
}{
133-
{
134-
desc: "Happy case Success",
135-
config: happyListenerClientConfig,
136-
},
137-
{
138-
desc: "No listener Failure",
139-
config: ListenerClientConfig{},
140-
expectedErr: ErrNoListenerProvided,
141-
},
142-
{
143-
desc: "No logger and no pull interval Success",
144-
config: ListenerClientConfig{
145-
Listener: mockListener,
146-
},
147-
},
148-
}
149-
for _, tc := range tcs {
150-
t.Run(tc.desc, func(t *testing.T) {
151-
assert := assert.New(t)
152-
c := tc.config
153-
err := validateListenerConfig(&c)
154-
assert.True(errors.Is(err, tc.expectedErr),
155-
fmt.Errorf("error [%v] doesn't contain error [%v] in its err chain",
156-
err, tc.expectedErr),
157-
)
158-
})
159-
}
160-
}
161-
162127
func TestNewListenerClient(t *testing.T) {
163128
tcs := []struct {
164129
desc string
165-
config ListenerClientConfig
130+
config ListenerConfig
166131
expectedErr error
167132
measures Measures
168133
reader Reader
169134
}{
170135
{
171136
desc: "Listener Config Failure",
172-
config: ListenerClientConfig{},
137+
config: ListenerConfig{},
173138
expectedErr: ErrNoListenerProvided,
174139
},
175140
{
176141
desc: "No reader Failure",
177-
config: happyListenerClientConfig,
142+
config: happyListenerConfig,
178143
measures: mockMeasures,
179144
expectedErr: ErrNoReaderProvided,
180145
},
181146
{
182147
desc: "Happy case Success",
183-
config: happyListenerClientConfig,
148+
config: happyListenerConfig,
184149
measures: mockMeasures,
185150
reader: &BasicClient{},
186151
},
187152
}
188153
for _, tc := range tcs {
189154
t.Run(tc.desc, func(t *testing.T) {
190155
assert := assert.New(t)
191-
_, err := NewListenerClient(tc.config, nil, tc.measures, tc.reader)
156+
_, err := NewListenerClient(tc.config, sallust.With, tc.measures, tc.reader)
192157
assert.True(errors.Is(err, tc.expectedErr),
193158
fmt.Errorf("error [%v] doesn't contain error [%v] in its err chain",
194159
err, tc.expectedErr),

go.mod

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
github.com/prometheus/client_model v0.6.1
1313
github.com/spf13/cast v1.6.0
1414
github.com/stretchr/testify v1.9.0
15+
github.com/xmidt-org/arrange v0.4.0
1516
github.com/xmidt-org/bascule v0.11.6
1617
github.com/xmidt-org/httpaux v0.4.0
1718
github.com/xmidt-org/sallust v0.2.2
@@ -31,6 +32,7 @@ require (
3132
github.com/go-logfmt/logfmt v0.6.0 // indirect
3233
github.com/gorilla/mux v1.8.1 // indirect
3334
github.com/hashicorp/hcl v1.0.0 // indirect
35+
github.com/justinas/alice v1.2.0 // indirect
3436
github.com/magiconair/properties v1.8.7 // indirect
3537
github.com/mitchellh/mapstructure v1.5.0 // indirect
3638
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
@@ -45,7 +47,6 @@ require (
4547
github.com/spf13/viper v1.18.2 // indirect
4648
github.com/stretchr/objx v0.5.2 // indirect
4749
github.com/subosito/gotenv v1.6.0 // indirect
48-
github.com/xmidt-org/arrange v0.4.0 // indirect
4950
go.uber.org/dig v1.17.1 // indirect
5051
go.uber.org/multierr v1.11.0 // indirect
5152
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect

go.sum

+1
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
274274
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
275275
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
276276
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
277+
github.com/justinas/alice v1.2.0 h1:+MHSA/vccVCF4Uq37S42jwlkvI2Xzl7zTPCN5BnZNVo=
277278
github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
278279
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
279280
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=

service.go

+16-34
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,6 @@ type Config struct {
6666
Validation ValidatorConfig
6767
}
6868

69-
// ListenerConfig contains information needed to initialize the Listener Client service.
70-
type ListenerConfig struct {
71-
Config chrysom.ListenerClientConfig
72-
73-
// Logger for this package.
74-
// Gets passed to Argus config before initializing the client.
75-
// (Optional). Defaults to a no op logger.
76-
Logger *zap.Logger
77-
78-
// Measures for instrumenting this package.
79-
// Gets passed to Argus config before initializing the client.
80-
Measures chrysom.Measures
81-
}
82-
8369
type ClientService struct {
8470
argus chrysom.PushReader
8571
logger *zap.Logger
@@ -109,12 +95,12 @@ func NewService(cfg Config, getLogger func(context.Context) *zap.Logger) (*Clien
10995
// StartListener builds the Argus listener client service from the given configuration.
11096
// It allows adding watchers for the internal subscription state. Call the returned
11197
// function when you are done watching for updates.
112-
func (s *ClientService) StartListener(cfg ListenerConfig, setLogger func(context.Context, *zap.Logger) context.Context, watches ...Watch) (func(), error) {
98+
func (s *ClientService) StartListener(cfg chrysom.ListenerConfig, setLogger func(context.Context, *zap.Logger) context.Context, metrics chrysom.Measures, watches ...Watch) (func(), error) {
11399
if cfg.Logger == nil {
114100
cfg.Logger = sallust.Default()
115101
}
116-
prepArgusListenerClientConfig(&cfg, watches...)
117-
listener, err := chrysom.NewListenerClient(cfg.Config, setLogger, cfg.Measures, s.argus)
102+
prepArgusListenerConfig(&cfg, metrics, watches...)
103+
listener, err := chrysom.NewListenerClient(cfg, setLogger, metrics, s.argus)
118104
if err != nil {
119105
return nil, fmt.Errorf("failed to create chrysom listener client: %v", err)
120106
}
@@ -170,10 +156,10 @@ func prepArgusBasicClientConfig(cfg *Config) error {
170156
return nil
171157
}
172158

173-
func prepArgusListenerClientConfig(cfg *ListenerConfig, watches ...Watch) {
159+
func prepArgusListenerConfig(cfg *chrysom.ListenerConfig, metrics chrysom.Measures, watches ...Watch) {
174160
logger := cfg.Logger
175-
watches = append(watches, webhookListSizeWatch(cfg.Measures.WebhookListSizeGauge))
176-
cfg.Config.Listener = chrysom.ListenerFunc(func(items chrysom.Items) {
161+
watches = append(watches, webhookListSizeWatch(metrics.WebhookListSizeGauge))
162+
cfg.Listener = chrysom.ListenerFunc(func(items chrysom.Items) {
177163
iws, err := ItemsToInternalWebhooks(items)
178164
if err != nil {
179165
logger.Error("Failed to convert items to webhooks", zap.Error(err))
@@ -208,29 +194,25 @@ func ProvideService() fx.Option {
208194
type ListenerIn struct {
209195
fx.In
210196

211-
Measures chrysom.Measures
212-
Logger *zap.Logger
213-
Svc *ClientService
214-
Watcher Watch
215-
LC fx.Lifecycle
197+
Measures chrysom.Measures
198+
Logger *zap.Logger
199+
Svc *ClientService
200+
listenerConfig chrysom.ListenerConfig
201+
Watcher Watch
202+
LC fx.Lifecycle
216203
}
217204

218205
func ProvideListener() fx.Option {
219206
return fx.Options(
220207
fx.Provide(
221-
func(in ListenerIn) (listener ListenerConfig, err error) {
222-
listener = ListenerConfig{
223-
Measures: in.Measures,
224-
Logger: in.Logger,
225-
}
226-
227-
stopWatches, err := in.Svc.StartListener(listener, setLoggerInContext(), in.Watcher)
208+
func(in ListenerIn) (err error) {
209+
stopWatches, err := in.Svc.StartListener(in.listenerConfig, setLoggerInContext(), in.Measures, in.Watcher)
228210
if err != nil {
229-
return listener, fmt.Errorf("webhook service start listener error: %v", err)
211+
return fmt.Errorf("webhook service start listener error: %v", err)
230212
}
231213
in.LC.Append(fx.StopHook(stopWatches))
232214

233-
return listener, nil
215+
return nil
234216
},
235217
),
236218
)

service_test.go

+5-7
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,14 @@ func TestStartListener(t *testing.T) {
6262
tcs := []struct {
6363
desc string
6464
serviceConfig Config
65-
listenerConfig ListenerConfig
65+
listenerConfig chrysom.ListenerConfig
6666
svc ClientService
6767
expectedErr bool
6868
}{
6969
{
70-
desc: "Success Case",
71-
svc: *mockService,
72-
listenerConfig: ListenerConfig{
73-
Config: chrysom.ListenerClientConfig{},
74-
},
70+
desc: "Success Case",
71+
svc: *mockService,
72+
listenerConfig: chrysom.ListenerConfig{},
7573
},
7674
{
7775
desc: "Chrysom Listener Client Creation Failure",
@@ -81,7 +79,7 @@ func TestStartListener(t *testing.T) {
8179
for _, tc := range tcs {
8280
t.Run(tc.desc, func(t *testing.T) {
8381
assert := assert.New(t)
84-
_, err := tc.svc.StartListener(tc.listenerConfig, nil)
82+
_, err := tc.svc.StartListener(tc.listenerConfig, sallust.With, chrysom.Measures{})
8583
if tc.expectedErr {
8684
assert.NotNil(err)
8785
return

0 commit comments

Comments
 (0)