Skip to content

Commit fd36dce

Browse files
committed
feature: Ping/Pong stream flags
Signed-off-by: Valery Piashchynski <[email protected]>
1 parent 014c308 commit fd36dce

File tree

10 files changed

+105
-5237
lines changed

10 files changed

+105
-5237
lines changed

pkg/frame/frame.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ const WORD = 4
1414
type Frame struct {
1515
// Payload, max length 4.2GB.
1616
payload []byte
17-
1817
// Header
1918
header []byte
2019
}
@@ -128,10 +127,31 @@ func (*Frame) SetStreamFlag(header []byte) {
128127

129128
func (*Frame) IsStream(header []byte) bool {
130129
_ = header[11]
131-
return header[10]&STREAM == 1
130+
return header[10]&STREAM != 0
131+
}
132+
133+
func (*Frame) IsPing(header []byte) bool {
134+
_ = header[11]
135+
return header[10]&PING != 0
136+
}
137+
138+
func (*Frame) SetPingBit(header []byte) {
139+
_ = header[11]
140+
header[10] |= PING
141+
}
142+
143+
func (*Frame) IsPong(header []byte) bool {
144+
_ = header[11]
145+
return header[10]&PONG != 0
146+
}
147+
148+
func (*Frame) SetPongBit(header []byte) {
149+
_ = header[11]
150+
header[10] |= PONG
132151
}
133152

134153
func (*Frame) SetStopBit(header []byte) {
154+
_ = header[11]
135155
header[10] |= STOP
136156
}
137157

pkg/frame/frame_flags.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@ const (
1515
Version1 byte = 0x01
1616

1717
/*
18-
10th byte
18+
10th byte, stream
1919
*/
2020

2121
// STREAM bit
2222
STREAM byte = 0x01
2323
// STOP command
2424
STOP byte = 0x02
25+
// PING command
26+
PING byte = 0x04
27+
// PONG command
28+
PONG byte = 0x08
2529
)

pkg/frame/frame_test.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,81 @@ func TestFrame_Bytes(t *testing.T) {
296296
assert.Equal(t, []uint32{323423432}, rf.ReadOptions(rf.Header()))
297297
}
298298

299+
func TestFrame_NotPingPong(t *testing.T) {
300+
nf := NewFrame()
301+
nf.WriteVersion(nf.Header(), 1)
302+
nf.WriteFlags(nf.Header(), CONTROL, CodecGob)
303+
nf.WritePayloadLen(nf.Header(), uint32(len([]byte(TestPayload))))
304+
305+
nf.WriteOptions(nf.HeaderPtr(), 323423432)
306+
assert.Equal(t, []uint32{323423432}, nf.ReadOptions(nf.Header()))
307+
nf.WritePayload([]byte(TestPayload))
308+
309+
nf.WriteCRC(nf.Header())
310+
assert.Equal(t, true, nf.VerifyCRC(nf.Header()))
311+
data := nf.Bytes()
312+
313+
rf := ReadFrame(data)
314+
315+
assert.False(t, rf.IsPing(rf.Header()))
316+
assert.False(t, rf.IsPong(rf.Header()))
317+
assert.Equal(t, rf.ReadVersion(rf.Header()), nf.ReadVersion(nf.Header()))
318+
assert.Equal(t, rf.ReadFlags(), nf.ReadFlags())
319+
assert.Equal(t, rf.ReadPayloadLen(rf.Header()), nf.ReadPayloadLen(nf.Header()))
320+
assert.Equal(t, true, rf.VerifyCRC(rf.Header()))
321+
assert.Equal(t, []uint32{323423432}, rf.ReadOptions(rf.Header()))
322+
}
323+
324+
func TestFrame_Ping(t *testing.T) {
325+
nf := NewFrame()
326+
nf.WriteVersion(nf.Header(), 1)
327+
nf.WriteFlags(nf.Header(), CONTROL, CodecGob)
328+
nf.WritePayloadLen(nf.Header(), uint32(len([]byte(TestPayload))))
329+
330+
nf.WriteOptions(nf.HeaderPtr(), 323423432)
331+
assert.Equal(t, []uint32{323423432}, nf.ReadOptions(nf.Header()))
332+
nf.WritePayload([]byte(TestPayload))
333+
nf.SetPingBit(nf.Header())
334+
335+
nf.WriteCRC(nf.Header())
336+
assert.Equal(t, true, nf.VerifyCRC(nf.Header()))
337+
data := nf.Bytes()
338+
339+
rf := ReadFrame(data)
340+
341+
assert.True(t, rf.IsPing(rf.Header()))
342+
assert.Equal(t, rf.ReadVersion(rf.Header()), nf.ReadVersion(nf.Header()))
343+
assert.Equal(t, rf.ReadFlags(), nf.ReadFlags())
344+
assert.Equal(t, rf.ReadPayloadLen(rf.Header()), nf.ReadPayloadLen(nf.Header()))
345+
assert.Equal(t, true, rf.VerifyCRC(rf.Header()))
346+
assert.Equal(t, []uint32{323423432}, rf.ReadOptions(rf.Header()))
347+
}
348+
349+
func TestFrame_Pong(t *testing.T) {
350+
nf := NewFrame()
351+
nf.WriteVersion(nf.Header(), 1)
352+
nf.WriteFlags(nf.Header(), CONTROL, CodecGob)
353+
nf.WritePayloadLen(nf.Header(), uint32(len([]byte(TestPayload))))
354+
355+
nf.WriteOptions(nf.HeaderPtr(), 323423432)
356+
assert.Equal(t, []uint32{323423432}, nf.ReadOptions(nf.Header()))
357+
nf.WritePayload([]byte(TestPayload))
358+
nf.SetPongBit(nf.Header())
359+
360+
nf.WriteCRC(nf.Header())
361+
assert.Equal(t, true, nf.VerifyCRC(nf.Header()))
362+
data := nf.Bytes()
363+
364+
rf := ReadFrame(data)
365+
366+
assert.True(t, rf.IsPong(rf.Header()))
367+
assert.Equal(t, rf.ReadVersion(rf.Header()), nf.ReadVersion(nf.Header()))
368+
assert.Equal(t, rf.ReadFlags(), nf.ReadFlags())
369+
assert.Equal(t, rf.ReadPayloadLen(rf.Header()), nf.ReadPayloadLen(nf.Header()))
370+
assert.Equal(t, true, rf.VerifyCRC(rf.Header()))
371+
assert.Equal(t, []uint32{323423432}, rf.ReadOptions(rf.Header()))
372+
}
373+
299374
func BenchmarkCRC32(b *testing.B) {
300375
b.ReportAllocs()
301376
b.ResetTimer()

pkg/shared_memory/interface.go

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

pkg/shared_memory/posix/posix_shm.go

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

0 commit comments

Comments
 (0)