From 4589a823fd3da534ee3e80870ad2de86a23c3361 Mon Sep 17 00:00:00 2001
From: Pieter Noordhuis <pcnoordhuis@gmail.com>
Date: Tue, 15 Jun 2010 22:40:21 +0200
Subject: [PATCH] initial basic pub/sub tests

---
 tests/support/redis.tcl |  2 +-
 tests/test_helper.tcl   |  1 +
 tests/unit/pubsub.tcl   | 45 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 tests/unit/pubsub.tcl

diff --git a/tests/support/redis.tcl b/tests/support/redis.tcl
index 338dcf77..7c7c65c6 100644
--- a/tests/support/redis.tcl
+++ b/tests/support/redis.tcl
@@ -41,7 +41,7 @@ array set ::redis::multibulkarg {}
 
 # Flag commands requiring last argument as a bulk write operation
 foreach redis_bulk_cmd {
-    set setnx rpush lpush rpushx lpushx linsert lset lrem sadd srem sismember echo getset smove zadd zrem zscore zincrby append zrank zrevrank hget hdel hexists setex
+    set setnx rpush lpush rpushx lpushx linsert lset lrem sadd srem sismember echo getset smove zadd zrem zscore zincrby append zrank zrevrank hget hdel hexists setex publish
 } {
     set ::redis::bulkarg($redis_bulk_cmd) {}
 }
diff --git a/tests/test_helper.tcl b/tests/test_helper.tcl
index dac91bef..59470e64 100644
--- a/tests/test_helper.tcl
+++ b/tests/test_helper.tcl
@@ -88,6 +88,7 @@ proc main {} {
     execute_tests "unit/cas"
     execute_tests "integration/replication"
     execute_tests "integration/aof"
+    execute_tests "unit/pubsub"
 
     # run tests with VM enabled
     set ::global_overrides {vm-enabled yes}
diff --git a/tests/unit/pubsub.tcl b/tests/unit/pubsub.tcl
new file mode 100644
index 00000000..10af8585
--- /dev/null
+++ b/tests/unit/pubsub.tcl
@@ -0,0 +1,45 @@
+start_server {tags {"pubsub"}} {
+    test "PUBLISH when no one is listening" {
+        assert_equal 0 [r publish chan hello]
+    }
+
+    test "SUBSCRIBE basics" {
+        set rd1 [redis_deferring_client]
+        set rd2 [redis_deferring_client]
+
+        # subscribe first client to two channels
+        $rd1 subscribe chan1 chan2
+        assert_equal {subscribe chan1 1} [$rd1 read]
+        assert_equal {subscribe chan2 2} [$rd1 read]
+
+        # publish on both channels
+        assert_equal 1 [r publish chan1 hello]
+        assert_equal 1 [r publish chan2 world]
+        assert_equal {message chan1 hello} [$rd1 read]
+        assert_equal {message chan2 world} [$rd1 read]
+
+        # subscribe second client to one channel
+        $rd2 subscribe chan1
+        assert_equal {subscribe chan1 1} [$rd2 read]
+
+        # publish on channel with two subscribers
+        assert_equal 2 [r publish chan1 hello]
+        assert_equal {message chan1 hello} [$rd1 read]
+        assert_equal {message chan1 hello} [$rd2 read]
+
+        # unsubscribe first client from all channels
+        $rd1 unsubscribe
+        set msg [$rd1 read]
+        assert_equal "unsubscribe" [lindex $msg 0]
+        assert_match "chan*" [lindex $msg 1]
+        assert_match 1 [lindex $msg 2]
+        set msg [$rd1 read]
+        assert_equal "unsubscribe" [lindex $msg 0]
+        assert_match "chan*" [lindex $msg 1]
+        assert_match 0 [lindex $msg 2]
+
+        # publish on channel with only remaining subscriber
+        assert_equal 1 [r publish chan1 hello]
+        assert_equal {message chan1 hello} [$rd2 read]
+    }
+}
\ No newline at end of file
-- 
2.47.2