Skip to content

Commit 443cbd0

Browse files
Tobias Kaupatjkralik
authored andcommitted
Move inactivity monitor to separate package
- Add test for DTLS - Add server option for DTLS
1 parent d043645 commit 443cbd0

File tree

8 files changed

+113
-33
lines changed

8 files changed

+113
-33
lines changed

dtls/inactivitymonitor.go

Lines changed: 0 additions & 8 deletions
This file was deleted.

dtls/options.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/plgd-dev/go-coap/v2/net/blockwise"
99
"github.com/plgd-dev/go-coap/v2/net/keepalive"
10+
"github.com/plgd-dev/go-coap/v2/net/monitor/inactivity"
1011
)
1112

1213
// HandlerFuncOpt handler function option.
@@ -119,6 +120,22 @@ func WithKeepAlive(keepalive *keepalive.KeepAlive) KeepAliveOpt {
119120
return KeepAliveOpt{keepalive: keepalive}
120121
}
121122

123+
// InactivityMonitorOpt notifies when a connection was inactive for a given duration.
124+
type InactivityMonitorOpt struct {
125+
inactivityMonitor inactivity.Monitor
126+
}
127+
128+
func (o InactivityMonitorOpt) apply(opts *serverOptions) {
129+
opts.inactivityMonitor = o.inactivityMonitor
130+
}
131+
132+
// WithInactivityMonitor set deadline's for read/write operations over client connection.
133+
func WithInactivityMonitor(interval time.Duration, onInactive inactivity.OnInactiveFunc) InactivityMonitorOpt {
134+
return InactivityMonitorOpt{
135+
inactivityMonitor: inactivity.NewInactivityMonitor(interval, onInactive),
136+
}
137+
}
138+
122139
// NetOpt network option.
123140
type NetOpt struct {
124141
net string

dtls/server.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package dtls
33
import (
44
"context"
55
"fmt"
6-
"github.com/plgd-dev/go-coap/v2/udp"
76
"net"
87
"sync"
98
"time"
@@ -14,6 +13,7 @@ import (
1413
coapNet "github.com/plgd-dev/go-coap/v2/net"
1514
"github.com/plgd-dev/go-coap/v2/net/blockwise"
1615
"github.com/plgd-dev/go-coap/v2/net/keepalive"
16+
"github.com/plgd-dev/go-coap/v2/net/monitor/inactivity"
1717
"github.com/plgd-dev/go-coap/v2/udp/client"
1818
udpMessage "github.com/plgd-dev/go-coap/v2/udp/message"
1919
"github.com/plgd-dev/go-coap/v2/udp/message/pool"
@@ -63,7 +63,7 @@ var defaultServerOptions = serverOptions{
6363
return nil
6464
},
6565
keepalive: keepalive.New(),
66-
inactivityMonitor: udp.NewInactivityMonitor(10*time.Minute, closeClientConn),
66+
inactivityMonitor: inactivity.NewInactivityMonitor(10*time.Minute, inactivity.CloseClientConn),
6767
blockwiseEnable: true,
6868
blockwiseSZX: blockwise.SZX1024,
6969
blockwiseTransferTimeout: time.Second * 5,
@@ -82,7 +82,7 @@ type serverOptions struct {
8282
errors ErrorFunc
8383
goPool GoPoolFunc
8484
keepalive *keepalive.KeepAlive
85-
inactivityMonitor InactivityMonitor
85+
inactivityMonitor inactivity.Monitor
8686
net string
8787
blockwiseSZX blockwise.SZX
8888
blockwiseEnable bool
@@ -107,7 +107,7 @@ type Server struct {
107107
errors ErrorFunc
108108
goPool GoPoolFunc
109109
keepalive *keepalive.KeepAlive
110-
inactivityMonitor InactivityMonitor
110+
inactivityMonitor inactivity.Monitor
111111
blockwiseSZX blockwise.SZX
112112
blockwiseEnable bool
113113
blockwiseTransferTimeout time.Duration

dtls/server_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/plgd-dev/go-coap/v2/message"
1818
"github.com/plgd-dev/go-coap/v2/message/codes"
1919
coapNet "github.com/plgd-dev/go-coap/v2/net"
20+
"github.com/plgd-dev/go-coap/v2/net/monitor/inactivity"
2021
"github.com/plgd-dev/go-coap/v2/udp/client"
2122
"github.com/plgd-dev/go-coap/v2/udp/message/pool"
2223
"github.com/stretchr/testify/require"
@@ -160,3 +161,68 @@ func TestServer_SetContextValueWithPKI(t *testing.T) {
160161
_, err = cc.Get(ctx, "/")
161162
require.NoError(t, err)
162163
}
164+
165+
func TestServer_InactiveMonitor(t *testing.T) {
166+
inactivityDetected := false
167+
168+
srvCtx, srvCancel := context.WithTimeout(context.Background(), time.Second*3600)
169+
defer srvCancel()
170+
serverCgf, clientCgf, _, err := createDTLSConfig(srvCtx)
171+
require.NoError(t, err)
172+
173+
ld, err := coapNet.NewDTLSListener("udp4", "", serverCgf)
174+
require.NoError(t, err)
175+
defer ld.Close()
176+
177+
var checkCloseWg sync.WaitGroup
178+
defer checkCloseWg.Wait()
179+
sd := dtls.NewServer(
180+
dtls.WithOnNewClientConn(func(cc *client.ClientConn, dtlsConn *piondtls.Conn) {
181+
checkCloseWg.Add(1)
182+
cc.AddOnClose(func() {
183+
checkCloseWg.Done()
184+
})
185+
}),
186+
dtls.WithKeepAlive(nil),
187+
dtls.WithInactivityMonitor(100*time.Millisecond, func(cc inactivity.ClientConn) {
188+
require.False(t, inactivityDetected)
189+
inactivityDetected = true
190+
cc.Close()
191+
}),
192+
)
193+
194+
var serverWg sync.WaitGroup
195+
defer func() {
196+
sd.Stop()
197+
serverWg.Wait()
198+
}()
199+
serverWg.Add(1)
200+
go func() {
201+
defer serverWg.Done()
202+
err := sd.Serve(ld)
203+
require.NoError(t, err)
204+
}()
205+
206+
cc, err := dtls.Dial(ld.Addr().String(), clientCgf,
207+
dtls.WithKeepAlive(nil),
208+
)
209+
require.NoError(t, err)
210+
checkCloseWg.Add(1)
211+
cc.AddOnClose(func() {
212+
checkCloseWg.Done()
213+
})
214+
215+
// send ping to create serverside connection
216+
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
217+
defer cancel()
218+
err = cc.Ping(ctx)
219+
require.NoError(t, err)
220+
221+
err = cc.Ping(ctx)
222+
require.NoError(t, err)
223+
224+
cc.Close()
225+
226+
checkCloseWg.Wait()
227+
require.True(t, inactivityDetected)
228+
}

udp/inactivitymonitor.go renamed to net/monitor/inactivity/inactivitymonitor.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
1-
package udp
1+
package inactivity
22

33
import (
4-
"github.com/plgd-dev/go-coap/v2/udp/client"
4+
"context"
55
"sync/atomic"
66
"time"
77
)
88

9-
type OnInactiveFunc func(cc *client.ClientConn)
10-
11-
type InactivityMonitor interface {
12-
Run(cc *client.ClientConn) error
9+
type Monitor interface {
10+
Run(cc ClientConn) error
1311
Notify()
1412
}
1513

14+
type OnInactiveFunc func(cc ClientConn)
15+
16+
type ClientConn interface {
17+
Context() context.Context
18+
Close() error
19+
}
20+
1621
type inactivityMonitor struct {
1722
inactiveInterval time.Duration
1823
onInactive OnInactiveFunc
@@ -31,18 +36,18 @@ func (m *inactivityMonitor) LastActivity() time.Time {
3136
return time.Time{}
3237
}
3338

34-
func closeClientConn(cc *client.ClientConn) {
39+
func CloseClientConn(cc ClientConn) {
3540
cc.Close()
3641
}
3742

38-
func NewInactivityMonitor(interval time.Duration, onInactive OnInactiveFunc) InactivityMonitor {
43+
func NewInactivityMonitor(interval time.Duration, onInactive OnInactiveFunc) Monitor {
3944
return &inactivityMonitor{
4045
inactiveInterval: interval,
4146
onInactive: onInactive,
4247
}
4348
}
4449

45-
func (m *inactivityMonitor) Run(cc *client.ClientConn) error {
50+
func (m *inactivityMonitor) Run(cc ClientConn) error {
4651
if m.onInactive == nil || m.inactiveInterval == time.Duration(0) {
4752
return nil
4853
}

udp/options.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/plgd-dev/go-coap/v2/net/blockwise"
99
"github.com/plgd-dev/go-coap/v2/net/keepalive"
10+
"github.com/plgd-dev/go-coap/v2/net/monitor/inactivity"
1011
)
1112

1213
// HandlerFuncOpt handler function option.
@@ -121,17 +122,17 @@ func WithKeepAlive(keepalive *keepalive.KeepAlive) KeepAliveOpt {
121122

122123
// InactivityMonitorOpt notifies when a connection was inactive for a given duration.
123124
type InactivityMonitorOpt struct {
124-
inactivityMonitor InactivityMonitor
125+
inactivityMonitor inactivity.Monitor
125126
}
126127

127128
func (o InactivityMonitorOpt) apply(opts *serverOptions) {
128129
opts.inactivityMonitor = o.inactivityMonitor
129130
}
130131

131132
// WithInactivityMonitor set deadline's for read/write operations over client connection.
132-
func WithInactivityMonitor(interval time.Duration, onInactive OnInactiveFunc) InactivityMonitorOpt {
133+
func WithInactivityMonitor(interval time.Duration, onInactive inactivity.OnInactiveFunc) InactivityMonitorOpt {
133134
return InactivityMonitorOpt{
134-
inactivityMonitor: NewInactivityMonitor(interval, onInactive),
135+
inactivityMonitor: inactivity.NewInactivityMonitor(interval, onInactive),
135136
}
136137
}
137138

udp/server.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,14 @@ import (
88
"time"
99

1010
"github.com/plgd-dev/go-coap/v2/message"
11+
"github.com/plgd-dev/go-coap/v2/message/codes"
12+
coapNet "github.com/plgd-dev/go-coap/v2/net"
1113
"github.com/plgd-dev/go-coap/v2/net/blockwise"
12-
1314
"github.com/plgd-dev/go-coap/v2/net/keepalive"
14-
15-
"github.com/plgd-dev/go-coap/v2/message/codes"
15+
"github.com/plgd-dev/go-coap/v2/net/monitor/inactivity"
1616
"github.com/plgd-dev/go-coap/v2/udp/client"
1717
udpMessage "github.com/plgd-dev/go-coap/v2/udp/message"
1818
"github.com/plgd-dev/go-coap/v2/udp/message/pool"
19-
20-
coapNet "github.com/plgd-dev/go-coap/v2/net"
2119
kitSync "github.com/plgd-dev/kit/sync"
2220
)
2321

@@ -56,7 +54,7 @@ var defaultServerOptions = serverOptions{
5654
return nil
5755
},
5856
keepalive: keepalive.New(),
59-
inactivityMonitor: NewInactivityMonitor(10*time.Minute, closeClientConn),
57+
inactivityMonitor: inactivity.NewInactivityMonitor(10*time.Minute, inactivity.CloseClientConn),
6058
blockwiseEnable: true,
6159
blockwiseSZX: blockwise.SZX1024,
6260
blockwiseTransferTimeout: time.Second * 3,
@@ -74,7 +72,7 @@ type serverOptions struct {
7472
errors ErrorFunc
7573
goPool GoPoolFunc
7674
keepalive *keepalive.KeepAlive
77-
inactivityMonitor InactivityMonitor
75+
inactivityMonitor inactivity.Monitor
7876
net string
7977
blockwiseSZX blockwise.SZX
8078
blockwiseEnable bool
@@ -92,7 +90,7 @@ type Server struct {
9290
errors ErrorFunc
9391
goPool GoPoolFunc
9492
keepalive *keepalive.KeepAlive
95-
inactivityMonitor InactivityMonitor
93+
inactivityMonitor inactivity.Monitor
9694
blockwiseSZX blockwise.SZX
9795
blockwiseEnable bool
9896
blockwiseTransferTimeout time.Duration

udp/server_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/plgd-dev/go-coap/v2/message"
1313
"github.com/plgd-dev/go-coap/v2/message/codes"
1414
coapNet "github.com/plgd-dev/go-coap/v2/net"
15+
"github.com/plgd-dev/go-coap/v2/net/monitor/inactivity"
1516
"github.com/plgd-dev/go-coap/v2/udp"
1617
"github.com/plgd-dev/go-coap/v2/udp/client"
1718
"github.com/plgd-dev/go-coap/v2/udp/message/pool"
@@ -205,7 +206,7 @@ func TestServer_InactiveMonitor(t *testing.T) {
205206
})
206207
}),
207208
udp.WithKeepAlive(nil),
208-
udp.WithInactivityMonitor(100*time.Millisecond, func(cc *client.ClientConn) {
209+
udp.WithInactivityMonitor(100*time.Millisecond, func(cc inactivity.ClientConn) {
209210
require.False(t, inactivityDetected)
210211
inactivityDetected = true
211212
cc.Close()

0 commit comments

Comments
 (0)