Skip to content

Commit b02bc88

Browse files
feat: add more method to Context (#25)
* feat: add more method to Context * test: improve test coverage
1 parent 7562a84 commit b02bc88

File tree

3 files changed

+160
-21
lines changed

3 files changed

+160
-21
lines changed

router_context.go

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@ import (
99
)
1010

1111
// NewContext creates a routeContext pointer.
12-
func NewContext(session Session, request *message.Entry) *routeContext {
13-
return &routeContext{
14-
session: session,
15-
reqEntry: request,
16-
}
12+
func NewContext() *routeContext {
13+
return &routeContext{}
1714
}
1815

1916
// Context is a generic context in a message routing.
@@ -24,9 +21,22 @@ type Context interface {
2421
// Session returns the current session.
2522
Session() Session
2623

24+
// SetSession sets session.
25+
SetSession(sess Session)
26+
2727
// Request returns request message entry.
2828
Request() *message.Entry
2929

30+
// SetRequest encodes data with session's codec and sets request message entry.
31+
SetRequest(id, data interface{}) error
32+
33+
// MustSetRequest encodes data with session's codec and sets request message entry.
34+
// panics on error.
35+
MustSetRequest(id, data interface{}) Context
36+
37+
// SetRequestMessage sets request message entry directly.
38+
SetRequestMessage(entry *message.Entry) Context
39+
3040
// Bind decodes request message entry to v.
3141
Bind(v interface{}) error
3242

@@ -104,11 +114,47 @@ func (c *routeContext) Session() Session {
104114
return c.session
105115
}
106116

117+
// SetSession sets session.
118+
func (c *routeContext) SetSession(sess Session) {
119+
c.session = sess
120+
}
121+
107122
// Request implements Context.Request method.
108123
func (c *routeContext) Request() *message.Entry {
109124
return c.reqEntry
110125
}
111126

127+
// SetRequest sets request by id and data.
128+
func (c *routeContext) SetRequest(id, data interface{}) error {
129+
codec := c.session.Codec()
130+
if codec == nil {
131+
return fmt.Errorf("codec is nil")
132+
}
133+
dataRaw, err := codec.Encode(data)
134+
if err != nil {
135+
return err
136+
}
137+
c.reqEntry = &message.Entry{
138+
ID: id,
139+
Data: dataRaw,
140+
}
141+
return nil
142+
}
143+
144+
// MustSetRequest implements Context.MustSetRequest method.
145+
func (c *routeContext) MustSetRequest(id, data interface{}) Context {
146+
if err := c.SetRequest(id, data); err != nil {
147+
panic(err)
148+
}
149+
return c
150+
}
151+
152+
// SetRequestMessage sets request message entry.
153+
func (c *routeContext) SetRequestMessage(entry *message.Entry) Context {
154+
c.reqEntry = entry
155+
return c
156+
}
157+
112158
// Bind implements Context.Bind method.
113159
func (c *routeContext) Bind(v interface{}) error {
114160
if c.session.Codec() == nil {

router_context_test.go

Lines changed: 108 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,25 @@ func newContext(sess *session, msg *message.Entry) *routeContext {
1313
return &routeContext{session: sess, reqEntry: msg}
1414
}
1515

16-
func TestRouteContext_Deadline(t *testing.T) {
16+
func Test_routeContext_Deadline(t *testing.T) {
1717
c := newContext(nil, nil)
1818
dl, ok := c.Deadline()
1919
assert.False(t, ok)
2020
assert.Zero(t, dl)
2121
}
2222

23-
func TestRouteContext_Done(t *testing.T) {
23+
func Test_routeContext_Done(t *testing.T) {
2424
c := newContext(nil, nil)
2525
done := c.Done()
2626
assert.Nil(t, done)
2727
}
2828

29-
func TestRouteContext_Err(t *testing.T) {
29+
func Test_routeContext_Err(t *testing.T) {
3030
c := newContext(nil, nil)
3131
assert.Nil(t, c.Err())
3232
}
3333

34-
func TestRouteContext_Value(t *testing.T) {
34+
func Test_routeContext_Value(t *testing.T) {
3535
c := newContext(nil, nil)
3636
assert.Nil(t, c.Value("not found"))
3737
c.Set("found", true)
@@ -40,7 +40,7 @@ func TestRouteContext_Value(t *testing.T) {
4040
assert.Nil(t, c.Value(123))
4141
}
4242

43-
func TestRouteContext_Get(t *testing.T) {
43+
func Test_routeContext_Get(t *testing.T) {
4444
c := newContext(nil, nil)
4545
v, ok := c.Get("not found")
4646
assert.False(t, ok)
@@ -52,15 +52,15 @@ func TestRouteContext_Get(t *testing.T) {
5252
assert.True(t, v.(bool))
5353
}
5454

55-
func TestRouteContext_Set(t *testing.T) {
55+
func Test_routeContext_Set(t *testing.T) {
5656
c := newContext(nil, nil)
5757
c.Set("found", true)
5858
v, ok := c.storage["found"]
5959
assert.True(t, ok)
6060
assert.True(t, v.(bool))
6161
}
6262

63-
func TestRouteContext_Remove(t *testing.T) {
63+
func Test_routeContext_Remove(t *testing.T) {
6464
c := newContext(nil, nil)
6565
c.Set("found", true)
6666
c.Remove("found")
@@ -69,7 +69,7 @@ func TestRouteContext_Remove(t *testing.T) {
6969
assert.Nil(t, v)
7070
}
7171

72-
func TestRouteContext_Bind(t *testing.T) {
72+
func Test_routeContext_Bind(t *testing.T) {
7373
t.Run("when session has codec", func(t *testing.T) {
7474
entry := &message.Entry{
7575
ID: 1,
@@ -100,14 +100,14 @@ func TestRouteContext_Bind(t *testing.T) {
100100
})
101101
}
102102

103-
func TestRouteContext_Session(t *testing.T) {
103+
func Test_routeContext_Session(t *testing.T) {
104104
sess := newSession(nil, &sessionOption{})
105105

106106
c := newContext(sess, nil)
107107
assert.Equal(t, c.Session(), sess)
108108
}
109109

110-
func TestRouteContext_SetResponse(t *testing.T) {
110+
func Test_routeContext_SetResponse(t *testing.T) {
111111
t.Run("when session hasn't codec", func(t *testing.T) {
112112
entry := &message.Entry{
113113
ID: 1,
@@ -153,7 +153,7 @@ func TestRouteContext_SetResponse(t *testing.T) {
153153
})
154154
}
155155

156-
func TestRouteContext_Send(t *testing.T) {
156+
func Test_routeContext_Send(t *testing.T) {
157157
t.Run("when success", func(t *testing.T) {
158158
sess := newSession(nil, &sessionOption{})
159159
ctx := newContext(sess, nil)
@@ -164,7 +164,7 @@ func TestRouteContext_Send(t *testing.T) {
164164
})
165165
}
166166

167-
func TestRouteContext_SendTo(t *testing.T) {
167+
func Test_routeContext_SendTo(t *testing.T) {
168168
t.Run("when success", func(t *testing.T) {
169169
sess1 := newSession(nil, &sessionOption{})
170170
sess2 := newSession(nil, &sessionOption{})
@@ -176,7 +176,7 @@ func TestRouteContext_SendTo(t *testing.T) {
176176
})
177177
}
178178

179-
func TestRouteContext_reset(t *testing.T) {
179+
func Test_routeContext_reset(t *testing.T) {
180180
ctx := newContext(nil, nil)
181181
sess := newSession(nil, &sessionOption{})
182182
entry := &message.Entry{
@@ -190,7 +190,7 @@ func TestRouteContext_reset(t *testing.T) {
190190
assert.Nil(t, ctx.respEntry)
191191
}
192192

193-
func TestRouteContext_Copy(t *testing.T) {
193+
func Test_routeContext_Copy(t *testing.T) {
194194
ctx := newContext(nil, nil)
195195
ctx.SetResponseMessage(&message.Entry{ID: 1, Data: []byte("resp origin")})
196196

@@ -243,7 +243,7 @@ func Test_routeContext_MustSetResponse(t *testing.T) {
243243

244244
c := newContext(sess, entry)
245245
assert.NotPanics(t, func() {
246-
c.MustSetResponse(1, "test")
246+
assert.Equal(t, c.MustSetResponse(1, "test"), c)
247247
})
248248
})
249249
}
@@ -267,3 +267,96 @@ func Test_routeContext_RawResponseData(t *testing.T) {
267267
assert.Nil(t, c.RawResponseData())
268268
})
269269
}
270+
271+
func Test_routeContext_SetSession(t *testing.T) {
272+
sess := newSession(nil, &sessionOption{})
273+
c := newContext(nil, nil)
274+
c.SetSession(sess)
275+
assert.Equal(t, c.Session(), sess)
276+
}
277+
278+
func Test_routeContext_SetRequest(t *testing.T) {
279+
t.Run("when session hasn't codec", func(t *testing.T) {
280+
sess := newSession(nil, &sessionOption{})
281+
c := newContext(sess, nil)
282+
err := c.SetRequest(1, []string{"invalid", "data"})
283+
assert.Error(t, err)
284+
assert.Nil(t, c.reqEntry)
285+
})
286+
t.Run("when encode failed", func(t *testing.T) {
287+
ctrl := gomock.NewController(t)
288+
defer ctrl.Finish()
289+
290+
codec := mock.NewMockCodec(ctrl)
291+
codec.EXPECT().Encode(gomock.Any()).Return(nil, fmt.Errorf("some err"))
292+
sess := newSession(nil, &sessionOption{Codec: codec})
293+
294+
c := newContext(sess, nil)
295+
err := c.SetRequest(1, "test")
296+
assert.Error(t, err)
297+
assert.Nil(t, c.reqEntry)
298+
})
299+
t.Run("when succeed", func(t *testing.T) {
300+
ctrl := gomock.NewController(t)
301+
defer ctrl.Finish()
302+
entry := &message.Entry{
303+
ID: 1,
304+
Data: []byte("test"),
305+
}
306+
codec := mock.NewMockCodec(ctrl)
307+
codec.EXPECT().Encode(gomock.Any()).Return([]byte("test"), nil)
308+
sess := newSession(nil, &sessionOption{Codec: codec})
309+
310+
c := newContext(sess, nil)
311+
err := c.SetRequest(1, "test")
312+
assert.NoError(t, err)
313+
assert.Equal(t, c.reqEntry, entry)
314+
})
315+
}
316+
317+
func Test_routeContext_MustSetRequest(t *testing.T) {
318+
t.Run("when session hasn't codec", func(t *testing.T) {
319+
sess := newSession(nil, &sessionOption{})
320+
321+
c := newContext(sess, nil)
322+
assert.Panics(t, func() {
323+
c.MustSetRequest(1, []string{"invalid", "data"})
324+
})
325+
})
326+
t.Run("when encode failed", func(t *testing.T) {
327+
ctrl := gomock.NewController(t)
328+
defer ctrl.Finish()
329+
330+
codec := mock.NewMockCodec(ctrl)
331+
codec.EXPECT().Encode(gomock.Any()).Return(nil, fmt.Errorf("some err"))
332+
sess := newSession(nil, &sessionOption{Codec: codec})
333+
334+
c := newContext(sess, nil)
335+
assert.Panics(t, func() {
336+
c.MustSetRequest(1, "test")
337+
})
338+
})
339+
t.Run("when succeed", func(t *testing.T) {
340+
ctrl := gomock.NewController(t)
341+
defer ctrl.Finish()
342+
343+
codec := mock.NewMockCodec(ctrl)
344+
codec.EXPECT().Encode(gomock.Any()).Return([]byte("test"), nil)
345+
sess := newSession(nil, &sessionOption{Codec: codec})
346+
347+
c := newContext(sess, nil)
348+
assert.NotPanics(t, func() {
349+
assert.Equal(t, c.MustSetRequest(1, "test"), c)
350+
})
351+
})
352+
}
353+
354+
func Test_routeContext_SetRequestMessage(t *testing.T) {
355+
entry := &message.Entry{
356+
ID: 1,
357+
Data: []byte("test"),
358+
}
359+
c := NewContext()
360+
c.SetRequestMessage(entry)
361+
assert.Equal(t, c.reqEntry, entry)
362+
}

session.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func newSession(conn net.Conn, opt *sessionOption) *session {
5454
respQueue: make(chan Context, opt.respQueueSize),
5555
packer: opt.Packer,
5656
codec: opt.Codec,
57-
ctxPool: sync.Pool{New: func() interface{} { return NewContext(nil, nil) }},
57+
ctxPool: sync.Pool{New: func() interface{} { return NewContext() }},
5858
}
5959
}
6060

0 commit comments

Comments
 (0)