├── .gitattributes
├── .gitignore
├── CHANGELOG.md
├── CSRedis.Tests
├── CSRedis.Tests.csproj
├── ConnectionTests.cs
├── HashTests.cs
├── HyperLogLogTests.cs
├── KeyTests.cs
├── ListTests.cs
├── Properties
│ └── AssemblyInfo.cs
├── PubSubTests.cs
├── RegressionTests.cs
├── ScriptingTests.cs
├── SentinelTests.cs
├── ServerTests.cs
├── SetTests.cs
├── SortedSetTests.cs
├── StringTests.cs
└── TransactionTests.cs
├── CSRedis.sln
├── CSRedis
├── CSRedis.csproj
├── CSRedis.nuspec
├── Events.cs
├── Exceptions.cs
├── IRedisClient.cs
├── IRedisClientAsync.cs
├── IRedisClientSync.cs
├── Internal
│ ├── Commands
│ │ ├── RedisArray.cs
│ │ ├── RedisBool.cs
│ │ ├── RedisBytes.cs
│ │ ├── RedisDate.cs
│ │ ├── RedisFloat.cs
│ │ ├── RedisHash.cs
│ │ ├── RedisInt.cs
│ │ ├── RedisIsMasterDownByAddrCommand.cs
│ │ ├── RedisObject.cs
│ │ ├── RedisRoleCommand.cs
│ │ ├── RedisScanCommand.cs
│ │ ├── RedisSlowLogCommand.cs
│ │ ├── RedisStatus.cs
│ │ ├── RedisString.cs
│ │ ├── RedisSubscription.cs
│ │ └── RedisTuple.cs
│ ├── Fakes
│ │ ├── FakeRedisSocket.cs
│ │ └── FakeStream.cs
│ ├── IO
│ │ ├── AsyncConnector.cs
│ │ ├── IRedisSocket.cs
│ │ ├── RedisAsyncCommandToken.cs
│ │ ├── RedisIO.cs
│ │ ├── RedisPooledSocket.cs
│ │ ├── RedisReader.cs
│ │ ├── RedisSocket.cs
│ │ ├── RedisWriter.cs
│ │ ├── SocketAsyncPool.cs
│ │ └── SocketPool.cs
│ ├── MonitorListener.cs
│ ├── RedisCommand.cs
│ ├── RedisConnector.cs
│ ├── RedisListener.cs
│ ├── RedisPipeline.cs
│ ├── RedisTransaction.cs
│ ├── SubscriptionListener.cs
│ └── Utilities
│ │ ├── RedisArgs.cs
│ │ └── Serializer.cs
├── Properties
│ └── AssemblyInfo.cs
├── RedisClient.Async.cs
├── RedisClient.Sync.cs
├── RedisClient.cs
├── RedisConnectionPool.cs
├── RedisSentinelClient.Async.cs
├── RedisSentinelClient.Sync.cs
├── RedisSentinelClient.cs
├── RedisSentinelManager.cs
└── Types.cs
├── LICENSE
├── README.md
└── csredis.pub.snk
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Set default behaviour to automatically normalize line endings.
2 | * text=auto
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.sln.docstates
8 |
9 | # Configuration
10 | [Ap]pp[Ll]ocal.config
11 |
12 | # Build results
13 |
14 | [Dd]ebug/
15 | [Rr]elease/
16 | x64/
17 | build/
18 | [Bb]in/
19 | [Oo]bj/
20 |
21 | # MSTest test Results
22 | [Tt]est[Rr]esult*/
23 | [Bb]uild[Ll]og.*
24 |
25 | *_i.c
26 | *_p.c
27 | *.ilk
28 | *.meta
29 | *.obj
30 | *.pch
31 | *.pdb
32 | *.pgc
33 | *.pgd
34 | *.rsp
35 | *.sbr
36 | *.tlb
37 | *.tli
38 | *.tlh
39 | *.tmp
40 | *.tmp_proj
41 | *.log
42 | *.vspscc
43 | *.vssscc
44 | .builds
45 | *.pidb
46 | *.log
47 | *.scc
48 | *.sln.ide
49 |
50 | # Visual C++ cache files
51 | ipch/
52 | *.aps
53 | *.ncb
54 | *.opensdf
55 | *.sdf
56 | *.cachefile
57 |
58 | # Visual Studio profiler
59 | *.psess
60 | *.vsp
61 | *.vspx
62 |
63 | # Guidance Automation Toolkit
64 | *.gpState
65 |
66 | # ReSharper is a .NET coding add-in
67 | _ReSharper*/
68 | *.[Rr]e[Ss]harper
69 |
70 | # TeamCity is a build add-in
71 | _TeamCity*
72 |
73 | # DotCover is a Code Coverage Tool
74 | *.dotCover
75 |
76 | # NCrunch
77 | *.ncrunch*
78 | .*crunch*.local.xml
79 |
80 | # Installshield output folder
81 | [Ee]xpress/
82 |
83 | # DocProject is a documentation generator add-in
84 | DocProject/buildhelp/
85 | DocProject/Help/*.HxT
86 | DocProject/Help/*.HxC
87 | DocProject/Help/*.hhc
88 | DocProject/Help/*.hhk
89 | DocProject/Help/*.hhp
90 | DocProject/Help/Html2
91 | DocProject/Help/html
92 |
93 | # Click-Once directory
94 | publish/
95 |
96 | # Publish Web Output
97 | *.Publish.xml
98 | *.pubxml
99 |
100 | # NuGet Packages Directory
101 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line
102 | #packages/
103 |
104 | # Windows Azure Build Output
105 | csx
106 | *.build.csdef
107 |
108 | # Windows Store app package directory
109 | AppPackages/
110 |
111 | # Others
112 | sql/
113 | *.Cache
114 | ClientBin/
115 | [Ss]tyle[Cc]op.*
116 | ~$*
117 | *~
118 | *.dbmdl
119 | *.[Pp]ublish.xml
120 | *.pfx
121 | *.publishsettings
122 |
123 | # RIA/Silverlight projects
124 | Generated_Code/
125 |
126 | # Backup & report files from converting an old project file to a newer
127 | # Visual Studio version. Backup files are not needed, because we have git ;-)
128 | _UpgradeReport_Files/
129 | Backup*/
130 | UpgradeLog*.XML
131 | UpgradeLog*.htm
132 |
133 | # SQL Server files
134 | App_Data/*.mdf
135 | App_Data/*.ldf
136 |
137 |
138 | #LightSwitch generated files
139 | GeneratedArtifacts/
140 | _Pvt_Extensions/
141 | ModelManifest.xml
142 |
143 | # =========================
144 | # Windows detritus
145 | # =========================
146 |
147 | # Windows image file caches
148 | Thumbs.db
149 | ehthumbs.db
150 |
151 | # Folder config file
152 | Desktop.ini
153 |
154 | # Recycle Bin used on file shares
155 | $RECYCLE.BIN/
156 |
157 | # Mac desktop service store files
158 | .DS_Store
159 | *.nupkg
160 | /ctstone.Redis/nuget-pack-push.cmd
161 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## csredis 3.2.6
2 | **[new]** SSL Support
3 |
4 | ## csredis 3.2.5
5 | **[new]** RedisConnectionPool: a pooled collection of Redis connections
6 | **[fix]** Public interface inheritance
7 | **[change]** Compatibility for sever 2.8.14
8 | **[new]** Exposing host/port
9 | **[fix]** Internal reorganization
10 |
11 | ## csredis 3.2.1
12 | **[fix]** Unnecessary memory allocation when not using async methods
13 |
14 | ## csredis 3.1.18
15 | **[fix]** Encoding issues
16 | **[new]** Strongname signed assembly available on NuGet
17 |
18 | ## csredis 3.1.1
19 | **[breaking]** Changed RedisClient.Connected property to RedisClient.IsConnected
20 | **[breaking]** Changed RedisClient.Reconnected event to RedisClient.Connected. Event is now raised when the connection is first established as well as when the connection reconnects
21 | **[breaking]** Changed RedisClient.ReconnectTimeout to RedisClient.ReconnectWait
22 | **[fix]** Fixes to async handling
23 | **[fix]** Fixes to pipeline handling
24 |
25 | ## csredis 3.0.0.0
26 | Major internal rewrite with several breaking changes. Upgrade with care!
27 | **[breaking]** Changed base namespace: CSRedis
28 | **[breaking]** Consolidated async methods into main client (removed RedisClientAsync)
29 | **[new]** Reconnection support
30 | **[new]** Command support through Redis 2.8.12
31 | **[fix]** Improved unit tests
32 | **[fix]** Improved async handling
33 | **[fix]** Better support for Sentinel and managed connections
34 |
35 | ## csredis 2.1.1.0
36 | Added support for Redis 2.8 commands (SCAN, SSCAN, HSCAN, ZSCAN)
37 |
38 | ## csredis 2.1.0.0
39 | Improved serialization performance
40 | Added support for ISerializable
41 |
42 | ## csredis 2.0.0.0
43 | Improved handling of pipeline and MULTI/EXEC result parsing.
44 | Breaking change: RedisClient.Multi() returns void instead of string. MULTI server reply may be observed by attaching to TransactionStarted event
45 | RedisClient.StartPipe() now accepts optional boolean indicating whether or not result parsing should occur.
46 | RedisClient.StartPipeTransaction() added to facilitate automatic creation of transaction inside a pipeline.
47 | RedisClient.EndPipe(bool) has no effect and should not be used
48 | RedisClient constructor overloads added to handle default values for port and timeout
49 | TransactionQueuedEventArgs now includes the command and arguments that were queued.
50 |
51 | ## csredis 1.4.7.1
52 | Fixed bug in tracing for empty stack
53 |
54 | ## csredis 1.4.7.0
55 | Added tracing
56 |
57 | ## csredis 1.4.6.0
58 | Better handling of sorted set members in ZREM
59 |
60 | ## csredis 1.4.5.0
61 | Better handling of sorted set scores in ZADD
62 |
63 | ## csredis 1.4.4.0
64 | Fix for non-existent hashes now returns null
65 |
66 | ## csredis 1.4.3.0
67 | Fix for null keys/values in hashes
68 |
69 | ## csredis 1.4.2.0
70 | Added XML inline documentation
71 |
72 | ## csredis 1.4.1.0
73 | Added support for extended SET command introduced in Redis 2.6.12
74 |
75 | ## csredis 1.4.0.0
76 | Added async subscriptions and transactions
77 |
78 | ## csredis 1.3.0.0
79 | Fixed byte streaming bug in RedisClient
80 |
81 | ## csredis 1.2.0.0
82 | Fixed bug when reading large amounts of data concurrently
83 |
84 | ## csredis 1.1.0.0
85 | Added async subscriptions and transactions
86 |
--------------------------------------------------------------------------------
/CSRedis.Tests/CSRedis.Tests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | {422A4579-8C59-4E92-8EB5-2A45C38D27FB}
7 | Library
8 | Properties
9 | CSRedis.Tests
10 | CSRedis.Tests
11 | v4.5
12 | 512
13 | {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
14 | 10.0
15 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
16 | $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
17 | False
18 | UnitTest
19 |
20 |
21 | true
22 | full
23 | false
24 | bin\Debug\
25 | DEBUG;TRACE
26 | prompt
27 | 4
28 |
29 |
30 | pdbonly
31 | true
32 | bin\Release\
33 | TRACE
34 | prompt
35 | 4
36 |
37 |
38 | true
39 | $(StrongNameKeyPath)
40 |
41 |
42 | true
43 | true
44 | ..\csredis.pub.snk
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | {d35e185e-a7e1-41e1-846c-21944f56074f}
82 | CSRedis
83 |
84 |
85 |
86 |
87 |
88 |
89 | False
90 |
91 |
92 | False
93 |
94 |
95 | False
96 |
97 |
98 | False
99 |
100 |
101 |
102 |
103 |
104 |
105 |
112 |
--------------------------------------------------------------------------------
/CSRedis.Tests/ConnectionTests.cs:
--------------------------------------------------------------------------------
1 | using CSRedis.Internal;
2 | using CSRedis.Internal.Fakes;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Net;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace CSRedis.Tests
12 | {
13 | class TestHelper
14 | {
15 | public const string Host = "fakehost";
16 | public const int Port = 9999;
17 |
18 | public static void Test(string reply, Func syncFunc, Func> asyncFunc, Action test)
19 | {
20 | using (var mock = new FakeRedisSocket(reply, reply))
21 | using (var redis = new RedisClient(mock, new DnsEndPoint(Host, Port)))
22 | {
23 | if (syncFunc != null)
24 | {
25 | var r1 = syncFunc(redis);
26 | test(mock, r1);
27 | }
28 |
29 | if (asyncFunc != null)
30 | {
31 | var r2 = asyncFunc(redis);
32 | test(mock, r2.Result);
33 | }
34 | }
35 | }
36 | }
37 |
38 |
39 | [TestClass]
40 | public class ConnectionTests
41 | {
42 | [TestMethod, TestCategory("Connection")]
43 | public void AuthTest()
44 | {
45 | TestHelper.Test(
46 | "+OK\r\n",
47 | x => x.Auth("my password"),
48 | x => x.AuthAsync("my password"),
49 | (x, r) =>
50 | {
51 | Assert.AreEqual("OK", r);
52 | Assert.AreEqual("*2\r\n$4\r\nAUTH\r\n$11\r\nmy password\r\n", x.GetMessage());
53 | });
54 | }
55 |
56 | [TestMethod, TestCategory("Connection")]
57 | public void EchoTest()
58 | {
59 | TestHelper.Test(
60 | "$11\r\nhello world\r\n",
61 | x => x.Echo("hello world"),
62 | x => x.EchoAsync("hello world"),
63 | (x, r) =>
64 | {
65 | Assert.AreEqual("hello world", r);
66 | Assert.AreEqual("*2\r\n$4\r\nECHO\r\n$11\r\nhello world\r\n", x.GetMessage());
67 | });
68 | }
69 |
70 | [TestMethod, TestCategory("Connection")]
71 | public void PingTest()
72 | {
73 | TestHelper.Test(
74 | "+PONG\r\n",
75 | x => x.Ping(),
76 | x => x.PingAsync(),
77 | (x, r) =>
78 | {
79 | Assert.AreEqual("PONG", r);
80 | Assert.AreEqual("*1\r\n$4\r\nPING\r\n", x.GetMessage());
81 | });
82 | }
83 |
84 | [TestMethod, TestCategory("Connection")]
85 | public void QuitTest()
86 | {
87 | TestHelper.Test(
88 | "+OK\r\n",
89 | x => x.Quit(),
90 | null,
91 | (x, r) =>
92 | {
93 | Assert.AreEqual("OK", r);
94 | Assert.AreEqual("*1\r\n$4\r\nQUIT\r\n", x.GetMessage());
95 | });
96 |
97 | TestHelper.Test(
98 | "+OK\r\n",
99 | null,
100 | x => x.QuitAsync(),
101 | (x, r) =>
102 | {
103 | Assert.AreEqual("OK", r);
104 | Assert.AreEqual("*1\r\n$4\r\nQUIT\r\n", x.GetMessage());
105 | });
106 | // TODO: test Connected==false
107 | }
108 |
109 | [TestMethod, TestCategory("Connection")]
110 | public void SelectTest()
111 | {
112 | TestHelper.Test(
113 | "+OK\r\n",
114 | x => x.Select(2),
115 | x => x.SelectAsync(2),
116 | (x, r) =>
117 | {
118 | Assert.AreEqual("OK", r);
119 | Assert.AreEqual("*2\r\n$6\r\nSELECT\r\n$1\r\n2\r\n", x.GetMessage());
120 | });
121 | }
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/CSRedis.Tests/HashTests.cs:
--------------------------------------------------------------------------------
1 | using CSRedis.Internal;
2 | using CSRedis.Internal.Fakes;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Net;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace CSRedis.Tests
12 | {
13 | public class MyGeneric
14 | {
15 | public string field1 { get; set; }
16 | }
17 |
18 | [TestClass]
19 | public class HashTests
20 | {
21 | [TestMethod, TestCategory("Hashes")]
22 | public void TestHDel()
23 | {
24 | using (var mock = new FakeRedisSocket(":2\r\n"))
25 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
26 | {
27 | Assert.AreEqual(2, redis.HDel("test", "test1", "test2"));
28 | Assert.AreEqual("*4\r\n$4\r\nHDEL\r\n$4\r\ntest\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n", mock.GetMessage());
29 | }
30 | }
31 |
32 | [TestMethod, TestCategory("Hashes")]
33 | public void TestHExists()
34 | {
35 | using (var mock = new FakeRedisSocket(":1\r\n"))
36 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
37 | {
38 | Assert.IsTrue(redis.HExists("test", "field"));
39 | Assert.AreEqual("*3\r\n$7\r\nHEXISTS\r\n$4\r\ntest\r\n$5\r\nfield\r\n", mock.GetMessage());
40 | }
41 | }
42 |
43 | [TestMethod, TestCategory("Hashes")]
44 | public void TestHGet()
45 | {
46 | using (var mock = new FakeRedisSocket("$4\r\ntest\r\n"))
47 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
48 | {
49 | Assert.AreEqual("test", redis.HGet("test", "field"));
50 | Assert.AreEqual("*3\r\n$4\r\nHGET\r\n$4\r\ntest\r\n$5\r\nfield\r\n", mock.GetMessage());
51 | }
52 | }
53 |
54 | [TestMethod, TestCategory("Hashes")]
55 | public void TestHGetAll_Dictionary()
56 | {
57 | using (var mock = new FakeRedisSocket("*2\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n"))
58 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
59 | {
60 | var response = redis.HGetAll("test");
61 | Assert.AreEqual(1, response.Count);
62 | Assert.IsTrue(response.ContainsKey("field1"));
63 | Assert.AreEqual("test1", response["field1"]);
64 | Assert.AreEqual("*2\r\n$7\r\nHGETALL\r\n$4\r\ntest\r\n", mock.GetMessage());
65 | }
66 | }
67 |
68 | [TestMethod, TestCategory("Hashes")]
69 | public void TestHGetAll_Generic()
70 | {
71 | using (var mock = new FakeRedisSocket("*2\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n"))
72 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
73 | {
74 | var response = redis.HGetAll("test");
75 | Assert.AreEqual("test1", response.field1);
76 | Assert.AreEqual("*2\r\n$7\r\nHGETALL\r\n$4\r\ntest\r\n", mock.GetMessage());
77 | }
78 | }
79 |
80 | [TestMethod, TestCategory("Hashes")]
81 | public void TestHIncrBy()
82 | {
83 | using (var mock = new FakeRedisSocket(":5\r\n"))
84 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
85 | {
86 | Assert.AreEqual(5, redis.HIncrBy("test", "field", 1));
87 | Assert.AreEqual("*4\r\n$7\r\nHINCRBY\r\n$4\r\ntest\r\n$5\r\nfield\r\n$1\r\n1\r\n", mock.GetMessage());
88 | }
89 | }
90 |
91 | [TestMethod, TestCategory("Hashes")]
92 | public void TestHIncrByFloat()
93 | {
94 | using (var mock = new FakeRedisSocket("$4\r\n3.14\r\n"))
95 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
96 | {
97 | Assert.AreEqual(3.14, redis.HIncrByFloat("test", "field", 1.14));
98 | Assert.AreEqual("*4\r\n$12\r\nHINCRBYFLOAT\r\n$4\r\ntest\r\n$5\r\nfield\r\n$4\r\n1.14\r\n", mock.GetMessage());
99 | }
100 | }
101 |
102 | [TestMethod, TestCategory("Hashes")]
103 | public void TestHKeys()
104 | {
105 | using (var mock = new FakeRedisSocket("*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
106 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
107 | {
108 | var response = redis.HKeys("test");
109 | Assert.AreEqual(2, response.Length);
110 | Assert.AreEqual("test1", response[0]);
111 | Assert.AreEqual("test2", response[1]);
112 | Assert.AreEqual("*2\r\n$5\r\nHKEYS\r\n$4\r\ntest\r\n", mock.GetMessage());
113 | }
114 | }
115 |
116 | [TestMethod, TestCategory("Hashes")]
117 | public void TestHLen()
118 | {
119 | using (var mock = new FakeRedisSocket(":5\r\n"))
120 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
121 | {
122 | Assert.AreEqual(5, redis.HLen("test"));
123 | Assert.AreEqual("*2\r\n$4\r\nHLEN\r\n$4\r\ntest\r\n", mock.GetMessage());
124 | }
125 | }
126 |
127 | [TestMethod, TestCategory("Hashes")]
128 | public void TestHMGet()
129 | {
130 | using (var mock = new FakeRedisSocket("*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
131 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
132 | {
133 | var response = redis.HMGet("test", "field1", "field2");
134 | Assert.AreEqual(2, response.Length);
135 | Assert.AreEqual("test1", response[0]);
136 | Assert.AreEqual("test2", response[1]);
137 | Assert.AreEqual("*4\r\n$5\r\nHMGET\r\n$4\r\ntest\r\n$6\r\nfield1\r\n$6\r\nfield2\r\n", mock.GetMessage());
138 | }
139 | }
140 |
141 | [TestMethod, TestCategory("Hashes")]
142 | public void TestHMSet_Array()
143 | {
144 | using (var mock = new FakeRedisSocket("+OK\r\n"))
145 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
146 | {
147 | Assert.AreEqual("OK", redis.HMSet("test", "field1", "test1"));
148 | Assert.AreEqual("*4\r\n$5\r\nHMSET\r\n$4\r\ntest\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n", mock.GetMessage());
149 | }
150 | }
151 |
152 | [TestMethod, TestCategory("Hashes")]
153 | public void TestHMSet_Generic()
154 | {
155 | using (var mock = new FakeRedisSocket("+OK\r\n"))
156 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
157 | {
158 | Assert.AreEqual("OK", redis.HMSet("test", new { field1 = "test1" }));
159 | Assert.AreEqual("*4\r\n$5\r\nHMSET\r\n$4\r\ntest\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n", mock.GetMessage());
160 | }
161 | }
162 |
163 | [TestMethod, TestCategory("Hashes")]
164 | public void TestHMSet_Dictionary()
165 | {
166 | using (var mock = new FakeRedisSocket("+OK\r\n"))
167 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
168 | {
169 | Assert.AreEqual("OK", redis.HMSet("test", new Dictionary { { "field1", "test1" } }));
170 | Assert.AreEqual("*4\r\n$5\r\nHMSET\r\n$4\r\ntest\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n", mock.GetMessage());
171 | }
172 | }
173 |
174 | [TestMethod, TestCategory("Hashes")]
175 | public void TestHSet()
176 | {
177 | using (var mock = new FakeRedisSocket(":1\r\n"))
178 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
179 | {
180 | Assert.IsTrue(redis.HSet("test", "field1", "test1"));
181 | Assert.AreEqual("*4\r\n$4\r\nHSET\r\n$4\r\ntest\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n", mock.GetMessage());
182 | }
183 | }
184 |
185 | [TestMethod, TestCategory("Hashes")]
186 | public void TestHSetNX()
187 | {
188 | using (var mock = new FakeRedisSocket(":1\r\n"))
189 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
190 | {
191 | Assert.IsTrue(redis.HSetNx("test", "field1", "test1"));
192 | Assert.AreEqual("*4\r\n$6\r\nHSETNX\r\n$4\r\ntest\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n", mock.GetMessage());
193 | }
194 | }
195 |
196 | [TestMethod, TestCategory("Hashes")]
197 | public void TestHVals()
198 | {
199 | using (var mock = new FakeRedisSocket("*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
200 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
201 | {
202 | var response = redis.HVals("test");
203 | Assert.AreEqual(2, response.Length);
204 | Assert.AreEqual("test1", response[0]);
205 | Assert.AreEqual("test2", response[1]);
206 | Assert.AreEqual("*2\r\n$5\r\nHVALS\r\n$4\r\ntest\r\n", mock.GetMessage());
207 | }
208 | }
209 |
210 | [TestMethod, TestCategory("Hashes")]
211 | public void TestHScan()
212 | {
213 | string reply = "*2\r\n$2\r\n23\r\n*2\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n";
214 | using (var mock = new FakeRedisSocket(reply, reply, reply, reply))
215 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
216 | {
217 | var response1 = redis.HScan("test", 0);
218 | Assert.AreEqual(23, response1.Cursor);
219 | Assert.AreEqual(1, response1.Items.Length);
220 | Assert.AreEqual("field1", response1.Items[0].Item1);
221 | Assert.AreEqual("test1", response1.Items[0].Item2);
222 | Assert.AreEqual("*3\r\n$5\r\nHSCAN\r\n$4\r\ntest\r\n$1\r\n0\r\n", mock.GetMessage(), "Basic test");
223 |
224 | var response2 = redis.HScan("test", 0, pattern: "*");
225 | Assert.AreEqual("*5\r\n$5\r\nHSCAN\r\n$4\r\ntest\r\n$1\r\n0\r\n$5\r\nMATCH\r\n$1\r\n*\r\n", mock.GetMessage(), "Pattern test");
226 |
227 | var response3 = redis.HScan("test", 0, count: 5);
228 | Assert.AreEqual("*5\r\n$5\r\nHSCAN\r\n$4\r\ntest\r\n$1\r\n0\r\n$5\r\nCOUNT\r\n$1\r\n5\r\n", mock.GetMessage(), "Count test");
229 |
230 | var response4 = redis.HScan("test", 0, "*", 5);
231 | Assert.AreEqual("*7\r\n$5\r\nHSCAN\r\n$4\r\ntest\r\n$1\r\n0\r\n$5\r\nMATCH\r\n$1\r\n*\r\n$5\r\nCOUNT\r\n$1\r\n5\r\n", mock.GetMessage(), "Pattern + Count test");
232 | }
233 | }
234 | }
235 | }
236 |
--------------------------------------------------------------------------------
/CSRedis.Tests/HyperLogLogTests.cs:
--------------------------------------------------------------------------------
1 | using CSRedis.Internal;
2 | using CSRedis.Internal.Fakes;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Net;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace CSRedis.Tests
12 | {
13 | [TestClass]
14 | public class HyperLogLogTests
15 | {
16 | [TestMethod, TestCategory("HyperLogLog")]
17 | public void PfAddTest()
18 | {
19 | using (var mock = new FakeRedisSocket(":1\r\n"))
20 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
21 | {
22 | Assert.IsTrue(redis.PfAdd("test", "test1", "test2"));
23 | Assert.AreEqual("*4\r\n$5\r\nPFADD\r\n$4\r\ntest\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n", mock.GetMessage());
24 | }
25 | }
26 |
27 | [TestMethod, TestCategory("HyperLogLog")]
28 | public void PfCountTest()
29 | {
30 | using (var mock = new FakeRedisSocket(":2\r\n"))
31 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
32 | {
33 | Assert.AreEqual(2, redis.PfCount("test1", "test2"));
34 | Assert.AreEqual("*3\r\n$7\r\nPFCOUNT\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n", mock.GetMessage());
35 | }
36 | }
37 |
38 | [TestMethod, TestCategory("HyperLogLog")]
39 | public void PfMergeTest()
40 | {
41 | using (var mock = new FakeRedisSocket("+OK\r\n"))
42 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
43 | {
44 | Assert.AreEqual("OK", redis.PfMerge("destination", "source1", "source2"));
45 | Assert.AreEqual("*4\r\n$7\r\nPFMERGE\r\n$11\r\ndestination\r\n$7\r\nsource1\r\n$7\r\nsource2\r\n", mock.GetMessage());
46 | }
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/CSRedis.Tests/ListTests.cs:
--------------------------------------------------------------------------------
1 | using CSRedis.Internal;
2 | using CSRedis.Internal.Fakes;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Net;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace CSRedis.Tests
12 | {
13 | [TestClass]
14 | public class ListTests
15 | {
16 | [TestMethod, TestCategory("Lists")]
17 | public void TestBLPopWithKey()
18 | {
19 | string reply = "*2\r\n$4\r\ntest\r\n$5\r\ntest1\r\n";
20 | using (var mock = new FakeRedisSocket(reply, reply))
21 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
22 | {
23 | var response1 = redis.BLPopWithKey(60, "test");
24 | Assert.AreEqual("test", response1.Item1);
25 | Assert.AreEqual("test1", response1.Item2);
26 | Assert.AreEqual("*3\r\n$5\r\nBLPOP\r\n$4\r\ntest\r\n$2\r\n60\r\n", mock.GetMessage());
27 |
28 | var response2 = redis.BLPopWithKey(TimeSpan.FromMinutes(1), "test");
29 | Assert.AreEqual("*3\r\n$5\r\nBLPOP\r\n$4\r\ntest\r\n$2\r\n60\r\n", mock.GetMessage());
30 | }
31 | }
32 |
33 | [TestMethod, TestCategory("Lists")]
34 | public void TestBLPop()
35 | {
36 | string reply = "*2\r\n$4\r\ntest\r\n$5\r\ntest1\r\n";
37 | using (var mock = new FakeRedisSocket(reply, reply))
38 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
39 | {
40 | Assert.AreEqual("test1", redis.BLPop(60, "test"));
41 | Assert.AreEqual("*3\r\n$5\r\nBLPOP\r\n$4\r\ntest\r\n$2\r\n60\r\n", mock.GetMessage());
42 |
43 | Assert.AreEqual("test1", redis.BLPop(TimeSpan.FromMinutes(1), "test"));
44 | Assert.AreEqual("*3\r\n$5\r\nBLPOP\r\n$4\r\ntest\r\n$2\r\n60\r\n", mock.GetMessage());
45 | }
46 | }
47 |
48 | [TestMethod, TestCategory("Lists")]
49 | public void TestBRPopWithKey()
50 | {
51 | string reply = "*2\r\n$4\r\ntest\r\n$5\r\ntest1\r\n";
52 | using (var mock = new FakeRedisSocket(reply, reply))
53 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
54 | {
55 | var response1 = redis.BRPopWithKey(60, "test");
56 | Assert.AreEqual("test", response1.Item1);
57 | Assert.AreEqual("test1", response1.Item2);
58 | Assert.AreEqual("*3\r\n$5\r\nBRPOP\r\n$4\r\ntest\r\n$2\r\n60\r\n", mock.GetMessage());
59 |
60 | var response2 = redis.BRPopWithKey(TimeSpan.FromMinutes(1), "test");
61 | Assert.AreEqual("*3\r\n$5\r\nBRPOP\r\n$4\r\ntest\r\n$2\r\n60\r\n", mock.GetMessage());
62 | }
63 | }
64 |
65 | [TestMethod, TestCategory("Lists")]
66 | public void TestBRPop()
67 | {
68 | string reply = "*2\r\n$4\r\ntest\r\n$5\r\ntest1\r\n";
69 | using (var mock = new FakeRedisSocket(reply, reply))
70 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
71 | {
72 | Assert.AreEqual("test1", redis.BRPop(60, "test"));
73 | Assert.AreEqual("*3\r\n$5\r\nBRPOP\r\n$4\r\ntest\r\n$2\r\n60\r\n", mock.GetMessage());
74 |
75 | Assert.AreEqual("test1", redis.BRPop(TimeSpan.FromMinutes(1), "test"));
76 | Assert.AreEqual("*3\r\n$5\r\nBRPOP\r\n$4\r\ntest\r\n$2\r\n60\r\n", mock.GetMessage());
77 | }
78 | }
79 |
80 | [TestMethod, TestCategory("Lists")]
81 | public void TestBRPopLPush()
82 | {
83 | string reply = "$5\r\ntest1\r\n";
84 | using (var mock = new FakeRedisSocket(reply, reply))
85 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
86 | {
87 | Assert.AreEqual("test1", redis.BRPopLPush("test", "new", 60));
88 | Assert.AreEqual("*4\r\n$10\r\nBRPOPLPUSH\r\n$4\r\ntest\r\n$3\r\nnew\r\n$2\r\n60\r\n", mock.GetMessage());
89 |
90 | Assert.AreEqual("test1", redis.BRPopLPush("test", "new", TimeSpan.FromMinutes(1)));
91 | Assert.AreEqual("*4\r\n$10\r\nBRPOPLPUSH\r\n$4\r\ntest\r\n$3\r\nnew\r\n$2\r\n60\r\n", mock.GetMessage());
92 | }
93 | }
94 |
95 | [TestMethod, TestCategory("Lists")]
96 | public void TestLIndex()
97 | {
98 | using (var mock = new FakeRedisSocket("$5\r\ntest1\r\n"))
99 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
100 | {
101 | Assert.AreEqual("test1", redis.LIndex("test", 0));
102 | Assert.AreEqual("*3\r\n$6\r\nLINDEX\r\n$4\r\ntest\r\n$1\r\n0\r\n", mock.GetMessage());
103 | }
104 | }
105 |
106 | [TestMethod, TestCategory("Lists")]
107 | public void TestLInsert()
108 | {
109 | string reply = ":2\r\n";
110 | using (var mock = new FakeRedisSocket(reply, reply))
111 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
112 | {
113 | Assert.AreEqual(2, redis.LInsert("test", RedisInsert.Before, "field1", "test1"));
114 | Assert.AreEqual("*5\r\n$7\r\nLINSERT\r\n$4\r\ntest\r\n$6\r\nBEFORE\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n", mock.GetMessage());
115 |
116 | Assert.AreEqual(2, redis.LInsert("test", RedisInsert.After, "field1", "test1"));
117 | Assert.AreEqual("*5\r\n$7\r\nLINSERT\r\n$4\r\ntest\r\n$5\r\nAFTER\r\n$6\r\nfield1\r\n$5\r\ntest1\r\n", mock.GetMessage());
118 | }
119 | }
120 |
121 | [TestMethod, TestCategory("Lists")]
122 | public void TestLLen()
123 | {
124 | using (var mock = new FakeRedisSocket(":3\r\n"))
125 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
126 | {
127 | Assert.AreEqual(3, redis.LLen("test"));
128 | Assert.AreEqual("*2\r\n$4\r\nLLEN\r\n$4\r\ntest\r\n", mock.GetMessage());
129 | }
130 | }
131 |
132 | [TestMethod, TestCategory("Lists")]
133 | public void TestLPop()
134 | {
135 | using (var mock = new FakeRedisSocket("$5\r\ntest1\r\n"))
136 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
137 | {
138 | Assert.AreEqual("test1", redis.LPop("test"));
139 | Assert.AreEqual("*2\r\n$4\r\nLPOP\r\n$4\r\ntest\r\n", mock.GetMessage());
140 | }
141 | }
142 |
143 | [TestMethod, TestCategory("Lists")]
144 | public void TestLPush()
145 | {
146 | using (var mock = new FakeRedisSocket(":2\r\n"))
147 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
148 | {
149 | Assert.AreEqual(2, redis.LPush("test", "test1", "test2"));
150 | Assert.AreEqual("*4\r\n$5\r\nLPUSH\r\n$4\r\ntest\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n", mock.GetMessage());
151 | }
152 | }
153 |
154 | [TestMethod, TestCategory("Lists")]
155 | public void TestLPushX()
156 | {
157 | using (var mock = new FakeRedisSocket(":2\r\n"))
158 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
159 | {
160 | Assert.AreEqual(2, redis.LPushX("test", "test1"));
161 | Assert.AreEqual("*3\r\n$6\r\nLPUSHX\r\n$4\r\ntest\r\n$5\r\ntest1\r\n", mock.GetMessage());
162 | }
163 | }
164 |
165 | [TestMethod, TestCategory("Lists")]
166 | public void TestLRange()
167 | {
168 | using (var mock = new FakeRedisSocket("*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
169 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
170 | {
171 | var response = redis.LRange("test", -10, 10);
172 | Assert.AreEqual(2, response.Length);
173 | Assert.AreEqual("test1", response[0]);
174 | Assert.AreEqual("test2", response[1]);
175 | Assert.AreEqual("*4\r\n$6\r\nLRANGE\r\n$4\r\ntest\r\n$3\r\n-10\r\n$2\r\n10\r\n", mock.GetMessage());
176 | }
177 | }
178 |
179 | [TestMethod, TestCategory("Lists")]
180 | public void TestLRem()
181 | {
182 | using (var mock = new FakeRedisSocket(":2\r\n"))
183 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
184 | {
185 | Assert.AreEqual(2, redis.LRem("test", -2, "test1"));
186 | Assert.AreEqual("*4\r\n$4\r\nLREM\r\n$4\r\ntest\r\n$2\r\n-2\r\n$5\r\ntest1\r\n", mock.GetMessage());
187 | }
188 | }
189 |
190 | [TestMethod, TestCategory("Lists")]
191 | public void TestLSet()
192 | {
193 | using (var mock = new FakeRedisSocket("+OK\r\n"))
194 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
195 | {
196 | Assert.AreEqual("OK", redis.LSet("test", 0, "test1"));
197 | Assert.AreEqual("*4\r\n$4\r\nLSET\r\n$4\r\ntest\r\n$1\r\n0\r\n$5\r\ntest1\r\n", mock.GetMessage());
198 | }
199 | }
200 |
201 | [TestMethod, TestCategory("Lists")]
202 | public void TestLTrim()
203 | {
204 | using (var mock = new FakeRedisSocket("+OK\r\n"))
205 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
206 | {
207 | Assert.AreEqual("OK", redis.LTrim("test", 0, 3));
208 | Assert.AreEqual("*4\r\n$5\r\nLTRIM\r\n$4\r\ntest\r\n$1\r\n0\r\n$1\r\n3\r\n", mock.GetMessage());
209 | }
210 | }
211 |
212 | [TestMethod, TestCategory("Lists")]
213 | public void TestRPop()
214 | {
215 | using (var mock = new FakeRedisSocket("$5\r\ntest1\r\n"))
216 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
217 | {
218 | Assert.AreEqual("test1", redis.RPop("test"));
219 | Assert.AreEqual("*2\r\n$4\r\nRPOP\r\n$4\r\ntest\r\n", mock.GetMessage());
220 | }
221 | }
222 |
223 | [TestMethod, TestCategory("Lists")]
224 | public void TestRPopLPush()
225 | {
226 | using (var mock = new FakeRedisSocket("$5\r\ntest1\r\n"))
227 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
228 | {
229 | Assert.AreEqual("test1", redis.RPopLPush("test", "new"));
230 | Assert.AreEqual("*3\r\n$9\r\nRPOPLPUSH\r\n$4\r\ntest\r\n$3\r\nnew\r\n", mock.GetMessage());
231 | }
232 | }
233 |
234 | [TestMethod, TestCategory("Lists")]
235 | public void TestRPush()
236 | {
237 | using (var mock = new FakeRedisSocket(":3\r\n"))
238 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
239 | {
240 | Assert.AreEqual(3, redis.RPush("test", "test1"));
241 | Assert.AreEqual("*3\r\n$5\r\nRPUSH\r\n$4\r\ntest\r\n$5\r\ntest1\r\n", mock.GetMessage());
242 | }
243 | }
244 |
245 | [TestMethod, TestCategory("Lists")]
246 | public void TestRPushX()
247 | {
248 | using (var mock = new FakeRedisSocket(":3\r\n"))
249 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
250 | {
251 | Assert.AreEqual(3, redis.RPushX("test", "test1"));
252 | Assert.AreEqual("*3\r\n$6\r\nRPUSHX\r\n$4\r\ntest\r\n$5\r\ntest1\r\n", mock.GetMessage());
253 | }
254 | }
255 | }
256 | }
257 |
--------------------------------------------------------------------------------
/CSRedis.Tests/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("CSRedis.Tests")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("CSRedis")]
13 | [assembly: AssemblyCopyright("Copyright © 2013")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("1cb6fd5f-f699-4ce7-8592-e0c4d41df956")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/CSRedis.Tests/PubSubTests.cs:
--------------------------------------------------------------------------------
1 | using CSRedis.Internal;
2 | using CSRedis.Internal.Fakes;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Net;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace CSRedis.Tests
12 | {
13 | [TestClass]
14 | public class PubSubTests
15 | {
16 | /*[TestMethod, TestCategory("PubSub")]
17 | public void PSubscriptionTest()
18 | {
19 | using (var mock = new FakeRedisSocket(true,
20 | "*3\r\n$10\r\npsubscribe\r\n$2\r\nf*\r\n:1\r\n"
21 | + "*3\r\n$10\r\npsubscribe\r\n$2\r\ns*\r\n:2\r\n"
22 | + "*4\r\n$8\r\npmessage\r\n$2\r\nf*\r\n$5\r\nfirst\r\n$5\r\nHello\r\n",
23 | "*3\r\n$12\r\npunsubscribe\r\n$2\r\ns*\r\n:1\r\n*3\r\n$12\r\npunsubscribe\r\n$2\r\nf*\r\n:0\r\n"))
24 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
25 | {
26 | var changes = new List();
27 | var messages = new List();
28 | redis.SubscriptionChanged += (s,a) => changes.Add(a.Response);
29 | redis.SubscriptionReceived += (s, a) => messages.Add(a.Message);
30 | Task.Delay(500)
31 | .ContinueWith(t => redis.PUnsubscribe())
32 | .ContinueWith(t =>
33 | {
34 | Assert.AreEqual(4, changes.Count);
35 | Assert.AreEqual("f*", changes[0].Pattern);
36 | Assert.AreEqual(1, changes[0].Count);
37 | Assert.IsNull(changes[0].Channel);
38 | Assert.AreEqual("psubscribe", changes[0].Type);
39 |
40 | Assert.AreEqual("s*", changes[1].Pattern);
41 | Assert.AreEqual(2, changes[1].Count);
42 | Assert.IsNull(changes[1].Channel);
43 | Assert.AreEqual("psubscribe", changes[1].Type);
44 |
45 | Assert.AreEqual("s*", changes[2].Pattern);
46 | Assert.AreEqual(1, changes[2].Count);
47 | Assert.IsNull(changes[2].Channel);
48 | Assert.AreEqual("punsubscribe", changes[2].Type);
49 |
50 | Assert.AreEqual("f*", changes[3].Pattern);
51 | Assert.AreEqual(0, changes[3].Count);
52 | Assert.IsNull(changes[3].Channel);
53 | Assert.AreEqual("punsubscribe", changes[3].Type);
54 |
55 | Assert.AreEqual(1, messages.Count);
56 | Assert.AreEqual("f*", messages[0].Pattern);
57 | Assert.AreEqual("first", messages[0].Channel);
58 | Assert.AreEqual("Hello", messages[0].Body);
59 | Assert.AreEqual("pmessage", messages[0].Type);
60 | });
61 | redis.PSubscribe("f*", "s*");
62 | }
63 | }*/
64 |
65 | [TestMethod, TestCategory("PubSub")]
66 | public void PublishTest()
67 | {
68 | using (var mock = new FakeRedisSocket(":3\r\n"))
69 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
70 | {
71 | Assert.AreEqual(3, redis.Publish("test", "message"));
72 | Assert.AreEqual("*3\r\n$7\r\nPUBLISH\r\n$4\r\ntest\r\n$7\r\nmessage\r\n", mock.GetMessage());
73 | }
74 | }
75 |
76 | [TestMethod, TestCategory("PubSub")]
77 | public void PubSubChannelsTest()
78 | {
79 | using (var mock = new FakeRedisSocket("*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
80 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
81 | {
82 | var response = redis.PubSubChannels("pattern");
83 | Assert.AreEqual(2, response.Length);
84 | Assert.AreEqual("test1", response[0]);
85 | Assert.AreEqual("test2", response[1]);
86 | Assert.AreEqual("*3\r\n$6\r\nPUBSUB\r\n$8\r\nCHANNELS\r\n$7\r\npattern\r\n", mock.GetMessage());
87 | }
88 | }
89 |
90 | [TestMethod, TestCategory("PubSub")]
91 | public void PubSubNumSubTest()
92 | {
93 | using (var mock = new FakeRedisSocket("*4\r\n$5\r\ntest1\r\n:1\r\n$5\r\ntest2\r\n:5\r\n"))
94 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
95 | {
96 | var response = redis.PubSubNumSub("channel1", "channel2");
97 | Assert.AreEqual(2, response.Length);
98 | Assert.AreEqual("test1", response[0].Item1);
99 | Assert.AreEqual(1, response[0].Item2);
100 | Assert.AreEqual("test2", response[1].Item1);
101 | Assert.AreEqual(5, response[1].Item2);
102 | Assert.AreEqual("*4\r\n$6\r\nPUBSUB\r\n$6\r\nNUMSUB\r\n$8\r\nchannel1\r\n$8\r\nchannel2\r\n", mock.GetMessage());
103 | }
104 | }
105 |
106 | [TestMethod, TestCategory("PubSub")]
107 | public void PubSubNumPatTest()
108 | {
109 | using (var mock = new FakeRedisSocket(":3\r\n"))
110 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
111 | {
112 | Assert.AreEqual(3, redis.PubSubNumPat());
113 | Assert.AreEqual("*2\r\n$6\r\nPUBSUB\r\n$6\r\nNUMPAT\r\n", mock.GetMessage());
114 | }
115 | }
116 |
117 | /*[TestMethod, TestCategory("PubSub")]
118 | public void SubscriptionTest()
119 | {
120 | using (var mock = new FakeRedisSocket(true,
121 | "*3\r\n$9\r\nsubscribe\r\n$5\r\nfirst\r\n:1\r\n"
122 | + "*3\r\n$9\r\nsubscribe\r\n$6\r\nsecond\r\n:2\r\n"
123 | + "*3\r\n$7\r\nmessage\r\n$5\r\nfirst\r\n$5\r\nHello\r\n",
124 | "*3\r\n$11\r\nunsubscribe\r\n$6\r\nsecond\r\n:1\r\n*3\r\n$11\r\nunsubscribe\r\n$5\r\nfirst\r\n:0\r\n"))
125 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
126 | {
127 | var changes = new List();
128 | var messages = new List();
129 | redis.SubscriptionChanged += (s, a) => changes.Add(a.Response);
130 | redis.SubscriptionReceived += (s, a) => messages.Add(a.Message);
131 | Task.Delay(500)
132 | .ContinueWith(t => redis.Unsubscribe())
133 | .ContinueWith(t =>
134 | {
135 | Assert.AreEqual(4, changes.Count);
136 | Assert.AreEqual("first", changes[0].Channel);
137 | Assert.AreEqual(1, changes[0].Count);
138 | Assert.IsNull(changes[0].Pattern);
139 | Assert.AreEqual("subscribe", changes[0].Type);
140 |
141 | Assert.AreEqual("second", changes[1].Channel);
142 | Assert.AreEqual(2, changes[1].Count);
143 | Assert.IsNull(changes[1].Pattern);
144 | Assert.AreEqual("subscribe", changes[1].Type);
145 |
146 | Assert.AreEqual("second", changes[2].Channel);
147 | Assert.AreEqual(1, changes[2].Count);
148 | Assert.IsNull(changes[2].Pattern);
149 | Assert.AreEqual("unsubscribe", changes[2].Type);
150 |
151 | Assert.AreEqual("first", changes[3].Channel);
152 | Assert.AreEqual(0, changes[3].Count);
153 | Assert.IsNull(changes[3].Pattern);
154 | Assert.AreEqual("unsubscribe", changes[3].Type);
155 |
156 | Assert.AreEqual(1, messages.Count);
157 | Assert.IsNull(messages[0].Pattern);
158 | Assert.AreEqual("first", messages[0].Channel);
159 | Assert.AreEqual("Hello", messages[0].Body);
160 | Assert.AreEqual("message", messages[0].Type);
161 | });
162 | redis.Subscribe("first", "second");
163 | }
164 | }*/
165 | }
166 | }
167 |
--------------------------------------------------------------------------------
/CSRedis.Tests/RegressionTests.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Microsoft.VisualStudio.TestTools.UnitTesting;
3 | using CSRedis.Internal;
4 | using CSRedis.Internal.Fakes;
5 | using System.Net;
6 |
7 | namespace CSRedis.Tests
8 | {
9 | [TestClass]
10 | public class RegressionTests
11 | {
12 | [TestMethod, TestCategory("Regression")]
13 | public void SetUTF8Test()
14 | {
15 | using (var mock = new FakeRedisSocket("+OK\r\n", "+OK\r\n"))
16 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
17 | {
18 | Assert.AreEqual("OK", redis.Set("test", "é"));
19 | Assert.AreEqual("*3\r\n$3\r\nSET\r\n$4\r\ntest\r\n$2\r\né\r\n", mock.GetMessage());
20 |
21 | Assert.AreEqual("OK", redis.SetAsync("test", "é").Result);
22 | Assert.AreEqual("*3\r\n$3\r\nSET\r\n$4\r\ntest\r\n$2\r\né\r\n", mock.GetMessage());
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/CSRedis.Tests/ScriptingTests.cs:
--------------------------------------------------------------------------------
1 | using CSRedis.Internal;
2 | using CSRedis.Internal.Fakes;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Net;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace CSRedis.Tests
12 | {
13 | [TestClass]
14 | public class ScriptingTests
15 | {
16 |
17 |
18 | [TestMethod, TestCategory("Scripting")]
19 | public void EvalTest()
20 | {
21 | using (var mock = new FakeRedisSocket("*4\r\n$4\r\nkey1\r\n$4\r\nkey2\r\n$5\r\nfirst\r\n$6\r\nsecond\r\n"))
22 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
23 | {
24 | var response = redis.Eval("return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}", new[] { "key1", "key2" }, "first", "second");
25 | Assert.IsTrue(response is object[]);
26 | Assert.AreEqual(4, (response as object[]).Length);
27 | Assert.AreEqual("key1", (response as object[])[0]);
28 | Assert.AreEqual("key2", (response as object[])[1]);
29 | Assert.AreEqual("first", (response as object[])[2]);
30 | Assert.AreEqual("second", (response as object[])[3]);
31 | Assert.AreEqual("*7\r\n$4\r\nEVAL\r\n$40\r\nreturn {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}\r\n$1\r\n2\r\n$4\r\nkey1\r\n$4\r\nkey2\r\n$5\r\nfirst\r\n$6\r\nsecond\r\n", mock.GetMessage());
32 | }
33 | }
34 |
35 | [TestMethod, TestCategory("Scripting")]
36 | public void EvalSHATest()
37 | {
38 | using (var mock = new FakeRedisSocket("*4\r\n$4\r\nkey1\r\n$4\r\nkey2\r\n$5\r\nfirst\r\n$6\r\nsecond\r\n"))
39 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
40 | {
41 | var response = redis.EvalSHA("checksum", new[] { "key1", "key2" }, "first", "second");
42 | Assert.IsTrue(response is object[]);
43 | Assert.AreEqual(4, (response as object[]).Length);
44 | Assert.AreEqual("key1", (response as object[])[0]);
45 | Assert.AreEqual("key2", (response as object[])[1]);
46 | Assert.AreEqual("first", (response as object[])[2]);
47 | Assert.AreEqual("second", (response as object[])[3]);
48 | Assert.AreEqual("*7\r\n$7\r\nEVALSHA\r\n$8\r\nchecksum\r\n$1\r\n2\r\n$4\r\nkey1\r\n$4\r\nkey2\r\n$5\r\nfirst\r\n$6\r\nsecond\r\n", mock.GetMessage());
49 | }
50 | }
51 |
52 | [TestMethod, TestCategory("Scripting")]
53 | public void ScriptExistsTests()
54 | {
55 | using (var mock = new FakeRedisSocket("*2\r\n:1\r\n:0\r\n"))
56 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
57 | {
58 | var response = redis.ScriptExists("checksum1", "checksum2");
59 | Assert.AreEqual(2, response.Length);
60 | Assert.IsTrue(response[0]);
61 | Assert.IsFalse(response[1]);
62 |
63 | Assert.AreEqual("*4\r\n$6\r\nSCRIPT\r\n$6\r\nEXISTS\r\n$9\r\nchecksum1\r\n$9\r\nchecksum2\r\n", mock.GetMessage());
64 | }
65 | }
66 |
67 | [TestMethod, TestCategory("Scripting")]
68 | public void ScriptFlushTest()
69 | {
70 | using (var mock = new FakeRedisSocket("+OK\r\n"))
71 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
72 | {
73 | Assert.AreEqual("OK", redis.ScriptFlush());
74 | Assert.AreEqual("*2\r\n$6\r\nSCRIPT\r\n$5\r\nFLUSH\r\n", mock.GetMessage());
75 | }
76 | }
77 |
78 | [TestMethod, TestCategory("Scripting")]
79 | public void ScriptKillTest()
80 | {
81 | using (var mock = new FakeRedisSocket("+OK\r\n"))
82 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
83 | {
84 | Assert.AreEqual("OK", redis.ScriptKill());
85 | Assert.AreEqual("*2\r\n$6\r\nSCRIPT\r\n$4\r\nKILL\r\n", mock.GetMessage());
86 | }
87 | }
88 |
89 | [TestMethod, TestCategory("Scripting")]
90 | public void ScriptLoadTest()
91 | {
92 | using (var mock = new FakeRedisSocket("$8\r\nchecksum\r\n"))
93 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
94 | {
95 | Assert.AreEqual("checksum", redis.ScriptLoad("return 1"));
96 | Assert.AreEqual("*3\r\n$6\r\nSCRIPT\r\n$4\r\nLOAD\r\n$8\r\nreturn 1\r\n", mock.GetMessage());
97 | }
98 | }
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/CSRedis.Tests/SetTests.cs:
--------------------------------------------------------------------------------
1 | using CSRedis.Internal;
2 | using CSRedis.Internal.Fakes;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Net;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace CSRedis.Tests
12 | {
13 | [TestClass]
14 | public class SetTests
15 | {
16 | [TestMethod, TestCategory("Sets")]
17 | public void TestSAdd()
18 | {
19 | using (var mock = new FakeRedisSocket(":3\r\n"))
20 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
21 | {
22 | Assert.AreEqual(3, redis.SAdd("test", "test1"));
23 | Assert.AreEqual("*3\r\n$4\r\nSADD\r\n$4\r\ntest\r\n$5\r\ntest1\r\n", mock.GetMessage());
24 | }
25 | }
26 |
27 | [TestMethod, TestCategory("Sets")]
28 | public void TestSCard()
29 | {
30 | using (var mock = new FakeRedisSocket(":3\r\n"))
31 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
32 | {
33 | Assert.AreEqual(3, redis.SCard("test"));
34 | Assert.AreEqual("*2\r\n$5\r\nSCARD\r\n$4\r\ntest\r\n", mock.GetMessage());
35 | }
36 | }
37 |
38 | [TestMethod, TestCategory("Sets")]
39 | public void TestSDiff()
40 | {
41 | using (var mock = new FakeRedisSocket("*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
42 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
43 | {
44 | var response = redis.SDiff("test", "another");
45 | Assert.AreEqual(2, response.Length);
46 | Assert.AreEqual("test1", response[0]);
47 | Assert.AreEqual("test2", response[1]);
48 | Assert.AreEqual("*3\r\n$5\r\nSDIFF\r\n$4\r\ntest\r\n$7\r\nanother\r\n", mock.GetMessage());
49 | }
50 | }
51 |
52 | [TestMethod, TestCategory("Sets")]
53 | public void TestSDiffStore()
54 | {
55 | using (var mock = new FakeRedisSocket(":3\r\n"))
56 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
57 | {
58 | Assert.AreEqual(3, redis.SDiffStore("destination", "key1", "key2"));
59 | Assert.AreEqual("*4\r\n$10\r\nSDIFFSTORE\r\n$11\r\ndestination\r\n$4\r\nkey1\r\n$4\r\nkey2\r\n", mock.GetMessage());
60 | }
61 | }
62 |
63 | [TestMethod, TestCategory("Sets")]
64 | public void TestInter()
65 | {
66 | using (var mock = new FakeRedisSocket("*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
67 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
68 | {
69 | var response = redis.SInter("test", "another");
70 | Assert.AreEqual(2, response.Length);
71 | Assert.AreEqual("test1", response[0]);
72 | Assert.AreEqual("test2", response[1]);
73 | Assert.AreEqual("*3\r\n$6\r\nSINTER\r\n$4\r\ntest\r\n$7\r\nanother\r\n", mock.GetMessage());
74 | }
75 | }
76 |
77 | [TestMethod, TestCategory("Sets")]
78 | public void TestSInterStore()
79 | {
80 | using (var mock = new FakeRedisSocket(":3\r\n"))
81 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
82 | {
83 | Assert.AreEqual(3, redis.SInterStore("destination", "key1", "key2"));
84 | Assert.AreEqual("*4\r\n$11\r\nSINTERSTORE\r\n$11\r\ndestination\r\n$4\r\nkey1\r\n$4\r\nkey2\r\n", mock.GetMessage());
85 | }
86 | }
87 |
88 | [TestMethod, TestCategory("Sets")]
89 | public void TestSIsMember()
90 | {
91 | using (var mock = new FakeRedisSocket(":1\r\n"))
92 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
93 | {
94 | Assert.IsTrue(redis.SIsMember("test", "test1"));
95 | Assert.AreEqual("*3\r\n$9\r\nSISMEMBER\r\n$4\r\ntest\r\n$5\r\ntest1\r\n", mock.GetMessage());
96 | }
97 | }
98 |
99 | [TestMethod, TestCategory("Sets")]
100 | public void TestSMembers()
101 | {
102 | using (var mock = new FakeRedisSocket("*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
103 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
104 | {
105 | var response = redis.SMembers("test");
106 | Assert.AreEqual(2, response.Length);
107 | Assert.AreEqual("test1", response[0]);
108 | Assert.AreEqual("test2", response[1]);
109 | Assert.AreEqual("*2\r\n$8\r\nSMEMBERS\r\n$4\r\ntest\r\n", mock.GetMessage());
110 | }
111 | }
112 |
113 | [TestMethod, TestCategory("Sets")]
114 | public void TestSMove()
115 | {
116 | using (var mock = new FakeRedisSocket(":1\r\n"))
117 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
118 | {
119 | Assert.IsTrue(redis.SMove("test", "destination", "test1"));
120 | Assert.AreEqual("*4\r\n$5\r\nSMOVE\r\n$4\r\ntest\r\n$11\r\ndestination\r\n$5\r\ntest1\r\n", mock.GetMessage());
121 | }
122 | }
123 |
124 | [TestMethod, TestCategory("Sets")]
125 | public void TestSPop()
126 | {
127 | using (var mock = new FakeRedisSocket("$5\r\ntest1\r\n"))
128 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
129 | {
130 | Assert.AreEqual("test1", redis.SPop("test"));
131 | Assert.AreEqual("*2\r\n$4\r\nSPOP\r\n$4\r\ntest\r\n", mock.GetMessage());
132 | }
133 | }
134 |
135 | [TestMethod, TestCategory("Sets")]
136 | public void TestSRandMember()
137 | {
138 | using (var mock = new FakeRedisSocket("$5\r\ntest1\r\n", "*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
139 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
140 | {
141 | Assert.AreEqual("test1", redis.SRandMember("test"));
142 | Assert.AreEqual("*2\r\n$11\r\nSRANDMEMBER\r\n$4\r\ntest\r\n", mock.GetMessage());
143 |
144 | var response = redis.SRandMember("test", 2);
145 | Assert.AreEqual(2, response.Length);
146 | Assert.AreEqual("test1", response[0]);
147 | Assert.AreEqual("test2", response[1]);
148 | Assert.AreEqual("*3\r\n$11\r\nSRANDMEMBER\r\n$4\r\ntest\r\n$1\r\n2\r\n", mock.GetMessage());
149 | }
150 | }
151 |
152 | [TestMethod, TestCategory("Sets")]
153 | public void TestSRem()
154 | {
155 | using (var mock = new FakeRedisSocket(":2\r\n"))
156 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
157 | {
158 | Assert.AreEqual(2, redis.SRem("test", "test1", "test2"));
159 | Assert.AreEqual("*4\r\n$4\r\nSREM\r\n$4\r\ntest\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n", mock.GetMessage());
160 | }
161 | }
162 |
163 | [TestMethod, TestCategory("Sets")]
164 | public void TestSScan()
165 | {
166 | string reply = "*2\r\n$2\r\n23\r\n*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n";
167 | using (var mock = new FakeRedisSocket(reply, reply, reply, reply))
168 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
169 | {
170 | var response1 = redis.SScan("test", 0);
171 | Assert.AreEqual(23, response1.Cursor);
172 | Assert.AreEqual(2, response1.Items.Length);
173 | Assert.AreEqual("test1", response1.Items[0]);
174 | Assert.AreEqual("test2", response1.Items[1]);
175 | Assert.AreEqual("*3\r\n$5\r\nSSCAN\r\n$4\r\ntest\r\n$1\r\n0\r\n", mock.GetMessage(), "Basic test");
176 |
177 | var response2 = redis.SScan("test", 0, pattern: "*");
178 | Assert.AreEqual("*5\r\n$5\r\nSSCAN\r\n$4\r\ntest\r\n$1\r\n0\r\n$5\r\nMATCH\r\n$1\r\n*\r\n", mock.GetMessage(), "Pattern test");
179 |
180 | var response3 = redis.SScan("test", 0, count: 5);
181 | Assert.AreEqual("*5\r\n$5\r\nSSCAN\r\n$4\r\ntest\r\n$1\r\n0\r\n$5\r\nCOUNT\r\n$1\r\n5\r\n", mock.GetMessage(), "Count test");
182 |
183 | var response4 = redis.SScan("test", 0, "*", 5);
184 | Assert.AreEqual("*7\r\n$5\r\nSSCAN\r\n$4\r\ntest\r\n$1\r\n0\r\n$5\r\nMATCH\r\n$1\r\n*\r\n$5\r\nCOUNT\r\n$1\r\n5\r\n", mock.GetMessage(), "Pattern + Count test");
185 | }
186 | }
187 |
188 | [TestMethod, TestCategory("Sets")]
189 | public void TestSUnion()
190 | {
191 | using (var mock = new FakeRedisSocket("*2\r\n$5\r\ntest1\r\n$5\r\ntest2\r\n"))
192 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
193 | {
194 | var response = redis.SUnion("test", "another");
195 | Assert.AreEqual(2, response.Length);
196 | Assert.AreEqual("test1", response[0]);
197 | Assert.AreEqual("test2", response[1]);
198 | Assert.AreEqual("*3\r\n$6\r\nSUNION\r\n$4\r\ntest\r\n$7\r\nanother\r\n", mock.GetMessage());
199 | }
200 | }
201 |
202 | [TestMethod, TestCategory("Sets")]
203 | public void TestSUnionStore()
204 | {
205 | using (var mock = new FakeRedisSocket(":3\r\n"))
206 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
207 | {
208 | Assert.AreEqual(3, redis.SUnionStore("destination", "key1", "key2"));
209 | Assert.AreEqual("*4\r\n$11\r\nSUNIONSTORE\r\n$11\r\ndestination\r\n$4\r\nkey1\r\n$4\r\nkey2\r\n", mock.GetMessage());
210 | }
211 | }
212 | }
213 | }
214 |
--------------------------------------------------------------------------------
/CSRedis.Tests/TransactionTests.cs:
--------------------------------------------------------------------------------
1 | using CSRedis.Internal;
2 | using CSRedis.Internal.Fakes;
3 | using Microsoft.VisualStudio.TestTools.UnitTesting;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Linq;
7 | using System.Net;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | namespace CSRedis.Tests
12 | {
13 | [TestClass]
14 | public class TransactionTests
15 | {
16 | [TestMethod, TestCategory("Transactions")]
17 | public void DiscardTest()
18 | {
19 | using (var mock = new FakeRedisSocket("+OK\r\n"))
20 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
21 | {
22 | Assert.AreEqual("OK", redis.Discard());
23 | Assert.AreEqual("*1\r\n$7\r\nDISCARD\r\n", mock.GetMessage());
24 | }
25 | }
26 |
27 | [TestMethod, TestCategory("Transactions")]
28 | public void ExecTest()
29 | {
30 | using (var mock = new FakeRedisSocket("*1\r\n$2\r\nhi\r\n"))
31 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
32 | {
33 | var response = redis.Exec();
34 | Assert.AreEqual(1, response.Length);
35 | Assert.AreEqual("hi", response[0]);
36 | Assert.AreEqual("*1\r\n$4\r\nEXEC\r\n", mock.GetMessage());
37 | }
38 | }
39 |
40 | [TestMethod, TestCategory("Transactions")]
41 | public void MultiTest()
42 | {
43 | using (var mock = new FakeRedisSocket("+OK\r\n"))
44 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
45 | {
46 | Assert.AreEqual("OK", redis.Multi());
47 | Assert.AreEqual("*1\r\n$5\r\nMULTI\r\n", mock.GetMessage());
48 | }
49 | }
50 |
51 | [TestMethod, TestCategory("Transactions")]
52 | public void UnwatchTest()
53 | {
54 | using (var mock = new FakeRedisSocket("+OK\r\n"))
55 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
56 | {
57 | Assert.AreEqual("OK", redis.Unwatch());
58 | Assert.AreEqual("*1\r\n$7\r\nUNWATCH\r\n", mock.GetMessage());
59 | }
60 | }
61 |
62 | [TestMethod, TestCategory("Transactions")]
63 | public void WatchTest()
64 | {
65 | using (var mock = new FakeRedisSocket("+OK\r\n"))
66 | using (var redis = new RedisClient(mock, new DnsEndPoint("fakehost", 9999)))
67 | {
68 | Assert.AreEqual("OK", redis.Watch());
69 | Assert.AreEqual("*1\r\n$5\r\nWATCH\r\n", mock.GetMessage());
70 | }
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/CSRedis.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 2013
4 | VisualStudioVersion = 12.0.30501.0
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSRedis", "CSRedis\CSRedis.csproj", "{D35E185E-A7E1-41E1-846C-21944F56074F}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSRedis.Tests", "CSRedis.Tests\CSRedis.Tests.csproj", "{422A4579-8C59-4E92-8EB5-2A45C38D27FB}"
9 | EndProject
10 | Global
11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 | Debug|Any CPU = Debug|Any CPU
13 | Release|Any CPU = Release|Any CPU
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {D35E185E-A7E1-41E1-846C-21944F56074F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {D35E185E-A7E1-41E1-846C-21944F56074F}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {D35E185E-A7E1-41E1-846C-21944F56074F}.Release|Any CPU.ActiveCfg = Release|Any CPU
19 | {D35E185E-A7E1-41E1-846C-21944F56074F}.Release|Any CPU.Build.0 = Release|Any CPU
20 | {422A4579-8C59-4E92-8EB5-2A45C38D27FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {422A4579-8C59-4E92-8EB5-2A45C38D27FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {422A4579-8C59-4E92-8EB5-2A45C38D27FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {422A4579-8C59-4E92-8EB5-2A45C38D27FB}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | EndGlobal
29 |
--------------------------------------------------------------------------------
/CSRedis/CSRedis.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Release
6 | AnyCPU
7 | {D35E185E-A7E1-41E1-846C-21944F56074F}
8 | Library
9 | Properties
10 | CSRedis
11 | csredis
12 | v4.0
13 | 512
14 |
15 |
16 |
17 | AnyCPU
18 | true
19 | full
20 | false
21 | bin\Debug\
22 | DEBUG;TRACE
23 | prompt
24 | 4
25 | bin\Debug\csredis.XML
26 |
27 |
28 | AnyCPU
29 | pdbonly
30 | true
31 | bin\Release\
32 | TRACE
33 | prompt
34 | 4
35 | bin\Release\csredis.XML
36 |
37 |
38 |
39 |
40 |
41 | true
42 | $(StrongNameKeyPath)
43 |
44 |
45 | true
46 | true
47 | ..\csredis.pub.snk
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | RedisClient.cs
105 |
106 |
107 | RedisClient.cs
108 |
109 |
110 |
111 | RedisSentinelClient.cs
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 | RedisSentinelClient.cs
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
134 |
--------------------------------------------------------------------------------
/CSRedis/CSRedis.nuspec:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | $id$
5 | $version$
6 | $title$
7 | $author$
8 | $author$
9 | http://www.apache.org/licenses/LICENSE-2.0.html
10 | https://github.com/ctstone/csredis
11 | false
12 | $description$
13 | https://github.com/ctstone/csredis/blob/master/CHANGELOG.md
14 | Copyright 2014
15 | Redis Sentinel Async NoSQL
16 |
17 |
--------------------------------------------------------------------------------
/CSRedis/Events.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 |
6 | namespace CSRedis
7 | {
8 | ///
9 | /// Provides data for the event that is raised when a subscription message is received
10 | ///
11 | public class RedisSubscriptionReceivedEventArgs : EventArgs
12 | {
13 | ///
14 | /// The subscription message
15 | ///
16 | public RedisSubscriptionMessage Message { get; private set; }
17 |
18 | internal RedisSubscriptionReceivedEventArgs(RedisSubscriptionMessage message)
19 | {
20 | Message = message;
21 | }
22 | }
23 |
24 | ///
25 | /// Provides data for the event that is raised when a subscription channel is opened or closed
26 | ///
27 | public class RedisSubscriptionChangedEventArgs : EventArgs
28 | {
29 | ///
30 | /// The subscription response
31 | ///
32 | public RedisSubscriptionChannel Response { get; private set; }
33 |
34 | internal RedisSubscriptionChangedEventArgs(RedisSubscriptionChannel response)
35 | {
36 | Response = response;
37 | }
38 | }
39 |
40 | ///
41 | /// Provides data for the event that is raised when a transaction command has been processed by the server
42 | ///
43 | public class RedisTransactionQueuedEventArgs : EventArgs
44 | {
45 | ///
46 | /// The status code of the transaction command
47 | ///
48 | public string Status { get; private set; }
49 |
50 | ///
51 | /// The command that was queued
52 | ///
53 | public string Command { get; private set; }
54 |
55 | ///
56 | /// The arguments of the queued command
57 | ///
58 | public object[] Arguments { get; private set; }
59 |
60 | internal RedisTransactionQueuedEventArgs(string status, string command, object[] arguments)
61 | {
62 | Status = status;
63 | Command = command;
64 | Arguments = arguments;
65 | }
66 | }
67 |
68 | ///
69 | /// Provides data for the event that is raised when a Redis MONITOR message is received
70 | ///
71 | public class RedisMonitorEventArgs : EventArgs
72 | {
73 | ///
74 | /// Monitor output
75 | ///
76 | public object Message { get; private set; }
77 |
78 | internal RedisMonitorEventArgs(object message)
79 | {
80 | Message = message;
81 | }
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/CSRedis/Exceptions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace CSRedis
4 | {
5 | ///
6 | /// Represents a Redis server error reply
7 | ///
8 | public class RedisException : RedisClientException
9 | {
10 | ///
11 | /// Instantiate a new instance of the RedisException class
12 | ///
13 | /// Server response
14 | public RedisException(string message)
15 | : base(message)
16 | { }
17 | }
18 |
19 | ///
20 | /// The exception that is thrown when an unexpected value is found in a Redis request or response
21 | ///
22 | public class RedisProtocolException : RedisClientException
23 | {
24 | ///
25 | /// Instantiate a new instance of the RedisProtocolException class
26 | ///
27 | /// Protocol violoation message
28 | public RedisProtocolException(string message)
29 | : base(message)
30 | { }
31 | }
32 |
33 | ///
34 | /// Exception thrown by RedisClient
35 | ///
36 | public class RedisClientException : Exception
37 | {
38 | ///
39 | /// Instantiate a new instance of the RedisClientException class
40 | ///
41 | /// Exception message
42 | public RedisClientException(string message)
43 | : base(message)
44 | { }
45 |
46 | ///
47 | /// Instantiate a new instance of the RedisClientException class
48 | ///
49 | /// Exception message
50 | /// Inner exception
51 | public RedisClientException(string message, Exception inner)
52 | : base(message, inner)
53 | { }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/CSRedis/IRedisClient.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 |
6 | namespace CSRedis
7 | {
8 | ///
9 | /// Common properties of the RedisClient
10 | ///
11 | public interface IRedisClient :IDisposable
12 | {
13 | ///
14 | /// Occurs when a subscription message is received
15 | ///
16 | event EventHandler SubscriptionReceived;
17 |
18 | ///
19 | /// Occurs when a subscription channel is added or removed
20 | ///
21 | event EventHandler SubscriptionChanged;
22 |
23 | ///
24 | /// Occurs when a transaction command is acknowledged by the server
25 | ///
26 | event EventHandler TransactionQueued;
27 |
28 | ///
29 | /// Occurs when a monitor message is received
30 | ///
31 | event EventHandler MonitorReceived;
32 |
33 | ///
34 | /// Occurs when the connection has sucessfully reconnected
35 | ///
36 | event EventHandler Connected;
37 |
38 |
39 | ///
40 | /// Get the Redis server hostname
41 | ///
42 | string Host { get; }
43 |
44 | ///
45 | /// Get the Redis server port
46 | ///
47 | int Port { get; }
48 |
49 | ///
50 | /// Get a value indicating whether the Redis client is connected to the server
51 | ///
52 | bool IsConnected { get; }
53 |
54 | ///
55 | /// Get or set the string encoding used to communicate with the server
56 | ///
57 | Encoding Encoding { get; set; }
58 |
59 | ///
60 | /// Get or set the connection read timeout (milliseconds)
61 | ///
62 | int ReceiveTimeout { get; set; }
63 |
64 | ///
65 | /// Get or set the connection send timeout (milliseconds)
66 | ///
67 | int SendTimeout { get; set; }
68 |
69 | ///
70 | /// Get or set the number of times to attempt a reconnect after a connection fails
71 | ///
72 | int ReconnectAttempts { get; set; }
73 |
74 | ///
75 | /// Get or set the amount of time (milliseconds) to wait between reconnect attempts
76 | ///
77 | int ReconnectWait { get; set; }
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/CSRedis/Internal/Commands/RedisArray.cs:
--------------------------------------------------------------------------------
1 | using CSRedis.Internal.IO;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 |
7 | namespace CSRedis.Internal.Commands
8 | {
9 | class RedisArray : RedisCommand