Skip to content

Commit a655613

Browse files
committed
BDDish test experimentation
1 parent de2aa0b commit a655613

File tree

3 files changed

+80
-45
lines changed

3 files changed

+80
-45
lines changed

cmd/root.go

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,29 +46,6 @@ For example:
4646
Version: meta.Version,
4747
}
4848

49-
func runDaemon(provider ddns.DDNSProvider, daemon *ddns.DDNSDaemon) error {
50-
statusChan := daemon.StartWithDefaults()
51-
for {
52-
select {
53-
case status := <-statusChan:
54-
switch status.Type {
55-
case task.Info:
56-
log.Info().Msg(status.Message)
57-
case task.Error:
58-
log.Error().Msg(status.Message)
59-
case task.Fatal:
60-
log.Error().Msg("FATAL: " + status.Message)
61-
return status.Error
62-
}
63-
if status.IsDone {
64-
return nil
65-
}
66-
default:
67-
time.Sleep(1 * time.Second)
68-
}
69-
}
70-
}
71-
7249
func init() {
7350
if path, err := os.Executable(); err == nil {
7451
meta.ProgramDir = filepath.Dir(path)
@@ -124,3 +101,26 @@ func initConfig() {
124101
errhandler.Handle(err)
125102
}
126103
}
104+
105+
func runDaemon(provider ddns.DDNSProvider, daemon *ddns.DDNSDaemon) error {
106+
statusChan := daemon.StartWithDefaults()
107+
for {
108+
select {
109+
case status := <-statusChan:
110+
switch status.Type {
111+
case task.Info:
112+
log.Info().Msg(status.Message)
113+
case task.Error:
114+
log.Error().Msg(status.Message)
115+
case task.Fatal:
116+
log.Error().Msg("FATAL: " + status.Message)
117+
return status.Error
118+
}
119+
if status.IsDone {
120+
return nil
121+
}
122+
default:
123+
time.Sleep(1 * time.Second)
124+
}
125+
}
126+
}

ddns/ddns.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ func (d *DDNSDaemon) Update() error {
9696
}
9797

9898
// Start continually keeps DDNS up to date.
99-
// updatePeriod - how often to check for updates
100-
// failureRetryDelay - how long to wait until retry after a failure
99+
// updatePeriod - how often to check for updates
100+
// retryDelay - how long to wait until retry after a failure
101101
func (d *DDNSDaemon) Start(updatePeriod, retryDelay time.Duration) (status chan task.Status) {
102102
var lastIP string
103103
var lastIPUpdate time.Time

ddns/ddns_test.go

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import (
66
"time"
77

88
"github.com/golang/mock/gomock"
9+
"github.com/mattolenik/cloudflare-ddns-client/ddns"
910
"github.com/mattolenik/cloudflare-ddns-client/test"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
1013
)
1114

1215
func TestUpdate(t *testing.T) {
@@ -33,10 +36,35 @@ func TestUpdate(t *testing.T) {
3336
assert.Equal(ip, actualIP)
3437
}
3538

39+
type TestFlow struct {
40+
t *testing.T
41+
assert *assert.Assertions
42+
require *require.Assertions
43+
description string
44+
}
45+
46+
func It(t *testing.T, desc string) *TestFlow {
47+
return &TestFlow{
48+
description: desc,
49+
t: t,
50+
assert: assert.New(t),
51+
require: require.New(t),
52+
}
53+
}
54+
55+
// TODO: Make generic so should funcs can take any function type? Make not dependent upon testify if possible
56+
type ShouldFunc func(t *testing.T, assert *assert.Assertions, require *require.Assertions)
57+
58+
func (f *TestFlow) Should(msg string, fn ShouldFunc) *TestFlow {
59+
f.t.Run(fmt.Sprintf("It '%s' should '%s'", f.description, msg), func(t *testing.T) { fn(f.t, f.assert, f.require) })
60+
return f
61+
}
62+
3663
func TestDaemon(t *testing.T) {
37-
assert, _, ctrl, cleanup := test.NewTools(t)
38-
defer cleanup()
64+
daemon := It(t, "daemon")
3965

66+
updatePeriod := 50 * time.Millisecond
67+
retryDelay := 50 * time.Millisecond
4068
domain := "abc.com"
4169
record := "xyz.abc.com"
4270
currentSuffix := 0
@@ -46,26 +74,33 @@ func TestDaemon(t *testing.T) {
4674
currentIP = fmt.Sprintf("1.1.1.%d", currentSuffix)
4775
return currentIP, nil
4876
}
49-
getCurrentIP := func() interface{} { return currentIP }
77+
ctrl := gomock.NewController(t)
78+
defer ctrl.Finish()
79+
ddnsProvider, ipProvider, configProvider := fixtures(ctrl)
80+
ddnsDaemon := ddns.NewDefaultDaemon(ddnsProvider, ipProvider, configProvider)
5081

51-
ddnsProvider := NewMockDDNSProvider(ctrl)
52-
ipProvider := NewMockIPProvider(ctrl)
53-
configProvider := NewMockConfigProvider(ctrl)
54-
ddnsDaemon := NewDefaultDaemon(ddnsProvider, ipProvider, configProvider)
55-
updatePeriod := 50 * time.Millisecond
56-
retryDelay := 50 * time.Millisecond
57-
ddnsDaemon.Start(updatePeriod, retryDelay)
82+
daemon.Should("run", func(t *testing.T, assert *assert.Assertions, require *require.Assertions) {
83+
getCurrentIP := func() interface{} { return currentIP }
5884

59-
configProvider.EXPECT().Get().Return(domain, record, nil)
60-
ipProvider.EXPECT().Get().DoAndReturn(ipGen)
61-
//ddnsProvider.EXPECT().Update(gomock.Eq(domain), gomock.Eq(record), gomock.Eq(ip)).Return(nil).Times(1)
62-
//ddnsProvider.EXPECT().Get(domain, record).Return(ip, nil).Times(1)
63-
ddnsProvider.EXPECT().
64-
Update(
65-
gomock.Eq(domain),
66-
gomock.Eq(record),
67-
FnMatch(gomock.Eq, getCurrentIP),
68-
).AnyTimes()
85+
ddnsDaemon.Start(updatePeriod, retryDelay)
86+
87+
configProvider.EXPECT().Get().Return(domain, record, nil)
88+
ipProvider.EXPECT().Get().DoAndReturn(ipGen)
89+
//ddnsProvider.EXPECT().Update(gomock.Eq(domain), gomock.Eq(record), gomock.Eq(ip)).Return(nil).Times(1)
90+
//ddnsProvider.EXPECT().Get(domain, record).Return(ip, nil).Times(1)
91+
ddnsProvider.EXPECT().
92+
Update(
93+
gomock.Eq(domain),
94+
gomock.Eq(record),
95+
FnMatch(gomock.Eq, getCurrentIP),
96+
).AnyTimes()
97+
})
98+
}
99+
100+
func fixtures(ctrl *gomock.Controller) (ddnsProvider *MockDDNSProvider, ipProvider *MockIPProvider, configProvider *MockConfigProvider) {
101+
return NewMockDDNSProvider(ctrl),
102+
NewMockIPProvider(ctrl),
103+
NewMockConfigProvider(ctrl)
69104
}
70105

71106
type funcMatcher struct {

0 commit comments

Comments
 (0)