Skip to content

Commit 7ae8e75

Browse files
author
Harmen
authored
PUBSUB
2 parents a860672 + 8e2ff94 commit 7ae8e75

27 files changed

+2540
-43
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ script: make test testrace int
1010
sudo: false
1111

1212
go:
13-
- 1.11
13+
- 1.12

cmd_connection.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,33 @@ func (m *Miniredis) cmdPing(c *server.Peer, cmd string, args []string) {
2121
if !m.handleAuth(c) {
2222
return
2323
}
24-
c.WriteInline("PONG")
24+
25+
if len(args) > 1 {
26+
setDirty(c)
27+
c.WriteError(errWrongNumber(cmd))
28+
return
29+
}
30+
31+
payload := ""
32+
if len(args) > 0 {
33+
payload = args[0]
34+
}
35+
36+
// PING is allowed in subscribed state
37+
if sub := getCtx(c).subscriber; sub != nil {
38+
c.Block(func(c *server.Writer) {
39+
c.WriteLen(2)
40+
c.WriteBulk("pong")
41+
c.WriteBulk(payload)
42+
})
43+
return
44+
}
45+
46+
if payload == "" {
47+
c.WriteInline("PONG")
48+
return
49+
}
50+
c.WriteBulk(payload)
2551
}
2652

2753
// AUTH
@@ -31,6 +57,10 @@ func (m *Miniredis) cmdAuth(c *server.Peer, cmd string, args []string) {
3157
c.WriteError(errWrongNumber(cmd))
3258
return
3359
}
60+
if m.checkPubsub(c) {
61+
return
62+
}
63+
3464
pw := args[0]
3565

3666
m.Lock()
@@ -58,6 +88,9 @@ func (m *Miniredis) cmdEcho(c *server.Peer, cmd string, args []string) {
5888
if !m.handleAuth(c) {
5989
return
6090
}
91+
if m.checkPubsub(c) {
92+
return
93+
}
6194

6295
msg := args[0]
6396
c.WriteBulk(msg)
@@ -73,6 +106,9 @@ func (m *Miniredis) cmdSelect(c *server.Peer, cmd string, args []string) {
73106
if !m.handleAuth(c) {
74107
return
75108
}
109+
if m.checkPubsub(c) {
110+
return
111+
}
76112

77113
id, err := strconv.Atoi(args[0])
78114
if err != nil {

cmd_connection_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,26 @@ func TestAuth(t *testing.T) {
3030
ok(t, err)
3131
}
3232

33+
func TestPing(t *testing.T) {
34+
s, err := Run()
35+
ok(t, err)
36+
defer s.Close()
37+
c, err := redis.Dial("tcp", s.Addr())
38+
ok(t, err)
39+
40+
r, err := redis.String(c.Do("PING"))
41+
ok(t, err)
42+
equals(t, "PONG", r)
43+
44+
r, err = redis.String(c.Do("PING", "hi"))
45+
ok(t, err)
46+
equals(t, "hi", r)
47+
48+
_, err = c.Do("PING", "foo", "bar")
49+
mustFail(t, err, errWrongNumber("ping"))
50+
51+
}
52+
3353
func TestEcho(t *testing.T) {
3454
s, err := Run()
3555
ok(t, err)

cmd_generic.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ func makeCmdExpire(m *Miniredis, unix bool, d time.Duration) func(*server.Peer,
4949
if !m.handleAuth(c) {
5050
return
5151
}
52+
if m.checkPubsub(c) {
53+
return
54+
}
5255

5356
key := args[0]
5457
value := args[1]
@@ -102,6 +105,10 @@ func (m *Miniredis) cmdTTL(c *server.Peer, cmd string, args []string) {
102105
if !m.handleAuth(c) {
103106
return
104107
}
108+
if m.checkPubsub(c) {
109+
return
110+
}
111+
105112
key := args[0]
106113

107114
withTx(m, c, func(c *server.Peer, ctx *connCtx) {
@@ -133,6 +140,10 @@ func (m *Miniredis) cmdPTTL(c *server.Peer, cmd string, args []string) {
133140
if !m.handleAuth(c) {
134141
return
135142
}
143+
if m.checkPubsub(c) {
144+
return
145+
}
146+
136147
key := args[0]
137148

138149
withTx(m, c, func(c *server.Peer, ctx *connCtx) {
@@ -164,6 +175,10 @@ func (m *Miniredis) cmdPersist(c *server.Peer, cmd string, args []string) {
164175
if !m.handleAuth(c) {
165176
return
166177
}
178+
if m.checkPubsub(c) {
179+
return
180+
}
181+
167182
key := args[0]
168183

169184
withTx(m, c, func(c *server.Peer, ctx *connCtx) {
@@ -191,6 +206,9 @@ func (m *Miniredis) cmdDel(c *server.Peer, cmd string, args []string) {
191206
if !m.handleAuth(c) {
192207
return
193208
}
209+
if m.checkPubsub(c) {
210+
return
211+
}
194212

195213
withTx(m, c, func(c *server.Peer, ctx *connCtx) {
196214
db := m.db(ctx.selectedDB)
@@ -216,6 +234,9 @@ func (m *Miniredis) cmdType(c *server.Peer, cmd string, args []string) {
216234
if !m.handleAuth(c) {
217235
return
218236
}
237+
if m.checkPubsub(c) {
238+
return
239+
}
219240

220241
key := args[0]
221242

@@ -242,6 +263,9 @@ func (m *Miniredis) cmdExists(c *server.Peer, cmd string, args []string) {
242263
if !m.handleAuth(c) {
243264
return
244265
}
266+
if m.checkPubsub(c) {
267+
return
268+
}
245269

246270
withTx(m, c, func(c *server.Peer, ctx *connCtx) {
247271
db := m.db(ctx.selectedDB)
@@ -266,6 +290,9 @@ func (m *Miniredis) cmdMove(c *server.Peer, cmd string, args []string) {
266290
if !m.handleAuth(c) {
267291
return
268292
}
293+
if m.checkPubsub(c) {
294+
return
295+
}
269296

270297
key := args[0]
271298
targetDB, err := strconv.Atoi(args[1])
@@ -299,6 +326,9 @@ func (m *Miniredis) cmdKeys(c *server.Peer, cmd string, args []string) {
299326
if !m.handleAuth(c) {
300327
return
301328
}
329+
if m.checkPubsub(c) {
330+
return
331+
}
302332

303333
key := args[0]
304334

@@ -323,6 +353,9 @@ func (m *Miniredis) cmdRandomkey(c *server.Peer, cmd string, args []string) {
323353
if !m.handleAuth(c) {
324354
return
325355
}
356+
if m.checkPubsub(c) {
357+
return
358+
}
326359

327360
withTx(m, c, func(c *server.Peer, ctx *connCtx) {
328361
db := m.db(ctx.selectedDB)
@@ -352,6 +385,9 @@ func (m *Miniredis) cmdRename(c *server.Peer, cmd string, args []string) {
352385
if !m.handleAuth(c) {
353386
return
354387
}
388+
if m.checkPubsub(c) {
389+
return
390+
}
355391

356392
from, to := args[0], args[1]
357393

@@ -378,6 +414,9 @@ func (m *Miniredis) cmdRenamenx(c *server.Peer, cmd string, args []string) {
378414
if !m.handleAuth(c) {
379415
return
380416
}
417+
if m.checkPubsub(c) {
418+
return
419+
}
381420

382421
from, to := args[0], args[1]
383422

@@ -409,6 +448,9 @@ func (m *Miniredis) cmdScan(c *server.Peer, cmd string, args []string) {
409448
if !m.handleAuth(c) {
410449
return
411450
}
451+
if m.checkPubsub(c) {
452+
return
453+
}
412454

413455
cursor, err := strconv.Atoi(args[0])
414456
if err != nil {

cmd_hash.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ func (m *Miniredis) cmdHset(c *server.Peer, cmd string, args []string) {
3737
if !m.handleAuth(c) {
3838
return
3939
}
40+
if m.checkPubsub(c) {
41+
return
42+
}
4043

4144
key, field, value := args[0], args[1], args[2]
4245

@@ -66,6 +69,9 @@ func (m *Miniredis) cmdHsetnx(c *server.Peer, cmd string, args []string) {
6669
if !m.handleAuth(c) {
6770
return
6871
}
72+
if m.checkPubsub(c) {
73+
return
74+
}
6975

7076
key, field, value := args[0], args[1], args[2]
7177

@@ -102,6 +108,9 @@ func (m *Miniredis) cmdHmset(c *server.Peer, cmd string, args []string) {
102108
if !m.handleAuth(c) {
103109
return
104110
}
111+
if m.checkPubsub(c) {
112+
return
113+
}
105114

106115
key, args := args[0], args[1:]
107116
if len(args)%2 != 0 {
@@ -138,6 +147,9 @@ func (m *Miniredis) cmdHget(c *server.Peer, cmd string, args []string) {
138147
if !m.handleAuth(c) {
139148
return
140149
}
150+
if m.checkPubsub(c) {
151+
return
152+
}
141153

142154
key, field := args[0], args[1]
143155

@@ -172,6 +184,9 @@ func (m *Miniredis) cmdHdel(c *server.Peer, cmd string, args []string) {
172184
if !m.handleAuth(c) {
173185
return
174186
}
187+
if m.checkPubsub(c) {
188+
return
189+
}
175190

176191
key, fields := args[0], args[1:]
177192

@@ -217,6 +232,9 @@ func (m *Miniredis) cmdHexists(c *server.Peer, cmd string, args []string) {
217232
if !m.handleAuth(c) {
218233
return
219234
}
235+
if m.checkPubsub(c) {
236+
return
237+
}
220238

221239
key, field := args[0], args[1]
222240

@@ -251,6 +269,9 @@ func (m *Miniredis) cmdHgetall(c *server.Peer, cmd string, args []string) {
251269
if !m.handleAuth(c) {
252270
return
253271
}
272+
if m.checkPubsub(c) {
273+
return
274+
}
254275

255276
key := args[0]
256277

@@ -285,6 +306,9 @@ func (m *Miniredis) cmdHkeys(c *server.Peer, cmd string, args []string) {
285306
if !m.handleAuth(c) {
286307
return
287308
}
309+
if m.checkPubsub(c) {
310+
return
311+
}
288312

289313
key := args[0]
290314

@@ -318,6 +342,9 @@ func (m *Miniredis) cmdHvals(c *server.Peer, cmd string, args []string) {
318342
if !m.handleAuth(c) {
319343
return
320344
}
345+
if m.checkPubsub(c) {
346+
return
347+
}
321348

322349
key := args[0]
323350

@@ -351,6 +378,9 @@ func (m *Miniredis) cmdHlen(c *server.Peer, cmd string, args []string) {
351378
if !m.handleAuth(c) {
352379
return
353380
}
381+
if m.checkPubsub(c) {
382+
return
383+
}
354384

355385
key := args[0]
356386

@@ -381,6 +411,9 @@ func (m *Miniredis) cmdHmget(c *server.Peer, cmd string, args []string) {
381411
if !m.handleAuth(c) {
382412
return
383413
}
414+
if m.checkPubsub(c) {
415+
return
416+
}
384417

385418
key := args[0]
386419

@@ -419,6 +452,9 @@ func (m *Miniredis) cmdHincrby(c *server.Peer, cmd string, args []string) {
419452
if !m.handleAuth(c) {
420453
return
421454
}
455+
if m.checkPubsub(c) {
456+
return
457+
}
422458

423459
key, field, deltas := args[0], args[1], args[2]
424460

@@ -456,6 +492,9 @@ func (m *Miniredis) cmdHincrbyfloat(c *server.Peer, cmd string, args []string) {
456492
if !m.handleAuth(c) {
457493
return
458494
}
495+
if m.checkPubsub(c) {
496+
return
497+
}
459498

460499
key, field, deltas := args[0], args[1], args[2]
461500

@@ -493,6 +532,9 @@ func (m *Miniredis) cmdHscan(c *server.Peer, cmd string, args []string) {
493532
if !m.handleAuth(c) {
494533
return
495534
}
535+
if m.checkPubsub(c) {
536+
return
537+
}
496538

497539
key := args[0]
498540
cursor, err := strconv.Atoi(args[1])

0 commit comments

Comments
 (0)