Commit 843348f6 authored by Nick Craver's avatar Nick Craver

Tests: eliminate a lot of key collisions

Turns out @mgravell really really liked "foo" and "hashset" years ago =P
parent 9073e65f
using StackExchange.Redis.Tests.Helpers; using StackExchange.Redis.Tests.Helpers;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Threading.Tasks; using System.Threading.Tasks;
using Xunit.Abstractions; using Xunit.Abstractions;
...@@ -25,7 +26,15 @@ static BookSleeveTestBase() ...@@ -25,7 +26,15 @@ static BookSleeveTestBase()
}; };
} }
public static string CreateUniqueName() => Guid.NewGuid().ToString("N"); protected static string Me([CallerMemberName] string caller = null) =>
#if NET462
"net462-" + caller;
#elif NETCOREAPP2_0
"netcoreapp2.0-" + caller;
#else
"unknown-" + caller;
#endif
internal static IServer GetServer(ConnectionMultiplexer conn) => conn.GetServer(conn.GetEndPoints()[0]); internal static IServer GetServer(ConnectionMultiplexer conn) => conn.GetServer(conn.GetEndPoints()[0]);
internal static ConnectionMultiplexer GetRemoteConnection(bool open = true, bool allowAdmin = false, bool waitForOpen = false, int syncTimeout = 5000, int ioTimeout = 5000) internal static ConnectionMultiplexer GetRemoteConnection(bool open = true, bool allowAdmin = false, bool waitForOpen = false, int syncTimeout = 5000, int ioTimeout = 5000)
......
...@@ -16,7 +16,7 @@ public void ValueEquals() ...@@ -16,7 +16,7 @@ public void ValueEquals()
Assert.True(x.Equals(y), "equals"); Assert.True(x.Equals(y), "equals");
Assert.True(x == y, "operator"); Assert.True(x == y, "operator");
} }
static RedisKey Me([CallerMemberName] string caller = null) => caller;
[Fact] [Fact]
public void TestManualIncr() public void TestManualIncr()
{ {
......
...@@ -15,7 +15,7 @@ public void TestNullString() ...@@ -15,7 +15,7 @@ public void TestNullString()
{ {
var redis = muxer.GetDatabase(db); var redis = muxer.GetDatabase(db);
const string expectedTestValue = null; const string expectedTestValue = null;
var uid = CreateUniqueName(); var uid = Me();
redis.StringSetAsync(uid, "abc"); redis.StringSetAsync(uid, "abc");
redis.StringSetAsync(uid, expectedTestValue); redis.StringSetAsync(uid, expectedTestValue);
string testValue = redis.StringGet(uid); string testValue = redis.StringGet(uid);
...@@ -31,7 +31,7 @@ public void TestEmptyString() ...@@ -31,7 +31,7 @@ public void TestEmptyString()
{ {
var redis = muxer.GetDatabase(db); var redis = muxer.GetDatabase(db);
const string expectedTestValue = ""; const string expectedTestValue = "";
var uid = CreateUniqueName(); var uid = Me();
redis.StringSetAsync(uid, expectedTestValue); redis.StringSetAsync(uid, expectedTestValue);
string testValue = redis.StringGet(uid); string testValue = redis.StringGet(uid);
......
...@@ -19,7 +19,7 @@ public void TestPublishWithNoSubscribers() ...@@ -19,7 +19,7 @@ public void TestPublishWithNoSubscribers()
using (var muxer = GetUnsecuredConnection()) using (var muxer = GetUnsecuredConnection())
{ {
var conn = muxer.GetSubscriber(); var conn = muxer.GetSubscriber();
Assert.Equal(0, conn.Publish("channel", "message")); Assert.Equal(0, conn.Publish(Me() + "channel", "message"));
} }
} }
...@@ -29,7 +29,7 @@ public void TestMassivePublishWithWithoutFlush_Local() ...@@ -29,7 +29,7 @@ public void TestMassivePublishWithWithoutFlush_Local()
using (var muxer = GetUnsecuredConnection(waitForOpen: true)) using (var muxer = GetUnsecuredConnection(waitForOpen: true))
{ {
var conn = muxer.GetSubscriber(); var conn = muxer.GetSubscriber();
TestMassivePublish(conn, "local"); TestMassivePublish(conn, Me(), "local");
} }
} }
...@@ -39,11 +39,11 @@ public void TestMassivePublishWithWithoutFlush_Remote() ...@@ -39,11 +39,11 @@ public void TestMassivePublishWithWithoutFlush_Remote()
using (var muxer = GetRemoteConnection(waitForOpen: true)) using (var muxer = GetRemoteConnection(waitForOpen: true))
{ {
var conn = muxer.GetSubscriber(); var conn = muxer.GetSubscriber();
TestMassivePublish(conn, "remote"); TestMassivePublish(conn, Me(), "remote");
} }
} }
private void TestMassivePublish(ISubscriber conn, string caption) private void TestMassivePublish(ISubscriber conn, string channel, string caption)
{ {
const int loop = 100000; const int loop = 100000;
...@@ -55,7 +55,7 @@ private void TestMassivePublish(ISubscriber conn, string caption) ...@@ -55,7 +55,7 @@ private void TestMassivePublish(ISubscriber conn, string caption)
var withFAF = Stopwatch.StartNew(); var withFAF = Stopwatch.StartNew();
for (int i = 0; i < loop; i++) for (int i = 0; i < loop; i++)
{ {
conn.Publish("foo", "bar", CommandFlags.FireAndForget); conn.Publish(channel, "bar", CommandFlags.FireAndForget);
} }
withFAF.Stop(); withFAF.Stop();
...@@ -65,7 +65,7 @@ private void TestMassivePublish(ISubscriber conn, string caption) ...@@ -65,7 +65,7 @@ private void TestMassivePublish(ISubscriber conn, string caption)
var withAsync = Stopwatch.StartNew(); var withAsync = Stopwatch.StartNew();
for (int i = 0; i < loop; i++) for (int i = 0; i < loop; i++)
{ {
tasks[i] = conn.PublishAsync("foo", "bar"); tasks[i] = conn.PublishAsync(channel, "bar");
} }
conn.WaitAll(tasks); conn.WaitAll(tasks);
withAsync.Stop(); withAsync.Stop();
...@@ -127,7 +127,7 @@ public async Task PubSubOrder() ...@@ -127,7 +127,7 @@ public async Task PubSubOrder()
[Fact] [Fact]
public void TestPublishWithSubscribers() public void TestPublishWithSubscribers()
{ {
var channel = "channel" + Guid.NewGuid(); var channel = Me();
using (var muxerA = GetUnsecuredConnection()) using (var muxerA = GetUnsecuredConnection())
using (var muxerB = GetUnsecuredConnection()) using (var muxerB = GetUnsecuredConnection())
using (var conn = GetUnsecuredConnection()) using (var conn = GetUnsecuredConnection())
...@@ -148,7 +148,7 @@ public void TestPublishWithSubscribers() ...@@ -148,7 +148,7 @@ public void TestPublishWithSubscribers()
[Fact] [Fact]
public void TestMultipleSubscribersGetMessage() public void TestMultipleSubscribersGetMessage()
{ {
var channel = "channel" + Guid.NewGuid(); var channel = Me();
using (var muxerA = GetUnsecuredConnection()) using (var muxerA = GetUnsecuredConnection())
using (var muxerB = GetUnsecuredConnection()) using (var muxerB = GetUnsecuredConnection())
using (var conn = GetUnsecuredConnection()) using (var conn = GetUnsecuredConnection())
...@@ -184,17 +184,18 @@ public void Issue38() ...@@ -184,17 +184,18 @@ public void Issue38()
{ {
var sub = pub.GetSubscriber(); var sub = pub.GetSubscriber();
int count = 0; int count = 0;
var prefix = Me();
void handler(RedisChannel channel, RedisValue payload) => Interlocked.Increment(ref count); void handler(RedisChannel channel, RedisValue payload) => Interlocked.Increment(ref count);
var a0 = sub.SubscribeAsync("foo", handler); var a0 = sub.SubscribeAsync(prefix + "foo", handler);
var a1 = sub.SubscribeAsync("bar", handler); var a1 = sub.SubscribeAsync(prefix + "bar", handler);
var b0 = sub.SubscribeAsync("f*o", handler); var b0 = sub.SubscribeAsync(prefix + "f*o", handler);
var b1 = sub.SubscribeAsync("b*r", handler); var b1 = sub.SubscribeAsync(prefix + "b*r", handler);
sub.WaitAll(a0, a1, b0, b1); sub.WaitAll(a0, a1, b0, b1);
var c = sub.PublishAsync("foo", "foo"); var c = sub.PublishAsync(prefix + "foo", "foo");
var d = sub.PublishAsync("f@o", "f@o"); var d = sub.PublishAsync(prefix + "f@o", "f@o");
var e = sub.PublishAsync("bar", "bar"); var e = sub.PublishAsync(prefix + "bar", "bar");
var f = sub.PublishAsync("b@r", "b@r"); var f = sub.PublishAsync(prefix + "b@r", "b@r");
pub.WaitAll(c, d, e, f); pub.WaitAll(c, d, e, f);
long total = c.Result + d.Result + e.Result + f.Result; long total = c.Result + d.Result + e.Result + f.Result;
...@@ -222,19 +223,20 @@ public void TestPartialSubscriberGetMessage() ...@@ -222,19 +223,20 @@ public void TestPartialSubscriberGetMessage()
var listenA = muxerA.GetSubscriber(); var listenA = muxerA.GetSubscriber();
var listenB = muxerB.GetSubscriber(); var listenB = muxerB.GetSubscriber();
var pub = conn.GetSubscriber(); var pub = conn.GetSubscriber();
var tA = listenA.SubscribeAsync("channel", (s, msg) => { if (s == "channel" && msg == "message") Interlocked.Increment(ref gotA); }); var prefix = Me();
var tB = listenB.SubscribeAsync("chann*", (s, msg) => { if (s == "channel" && msg == "message") Interlocked.Increment(ref gotB); }); var tA = listenA.SubscribeAsync(prefix + "channel", (s, msg) => { if (s == prefix + "channel" && msg == "message") Interlocked.Increment(ref gotA); });
var tB = listenB.SubscribeAsync(prefix + "chann*", (s, msg) => { if (s == prefix + "channel" && msg == "message") Interlocked.Increment(ref gotB); });
listenA.Wait(tA); listenA.Wait(tA);
listenB.Wait(tB); listenB.Wait(tB);
Assert.Equal(2, pub.Publish("channel", "message")); Assert.Equal(2, pub.Publish(prefix + "channel", "message"));
AllowReasonableTimeToPublishAndProcess(); AllowReasonableTimeToPublishAndProcess();
Assert.Equal(1, Interlocked.CompareExchange(ref gotA, 0, 0)); Assert.Equal(1, Interlocked.CompareExchange(ref gotA, 0, 0));
Assert.Equal(1, Interlocked.CompareExchange(ref gotB, 0, 0)); Assert.Equal(1, Interlocked.CompareExchange(ref gotB, 0, 0));
// and unsubscibe... // and unsubscibe...
tB = listenB.UnsubscribeAsync("chann*", null); tB = listenB.UnsubscribeAsync(prefix + "chann*", null);
listenB.Wait(tB); listenB.Wait(tB);
Assert.Equal(1, pub.Publish("channel", "message")); Assert.Equal(1, pub.Publish(prefix + "channel", "message"));
AllowReasonableTimeToPublishAndProcess(); AllowReasonableTimeToPublishAndProcess();
Assert.Equal(2, Interlocked.CompareExchange(ref gotA, 0, 0)); Assert.Equal(2, Interlocked.CompareExchange(ref gotA, 0, 0));
Assert.Equal(1, Interlocked.CompareExchange(ref gotB, 0, 0)); Assert.Equal(1, Interlocked.CompareExchange(ref gotB, 0, 0));
...@@ -247,26 +249,27 @@ public void TestSubscribeUnsubscribeAndSubscribeAgain() ...@@ -247,26 +249,27 @@ public void TestSubscribeUnsubscribeAndSubscribeAgain()
using (var pubMuxer = GetUnsecuredConnection()) using (var pubMuxer = GetUnsecuredConnection())
using (var subMuxer = GetUnsecuredConnection()) using (var subMuxer = GetUnsecuredConnection())
{ {
var prefix = Me();
var pub = pubMuxer.GetSubscriber(); var pub = pubMuxer.GetSubscriber();
var sub = subMuxer.GetSubscriber(); var sub = subMuxer.GetSubscriber();
int x = 0, y = 0; int x = 0, y = 0;
var t1 = sub.SubscribeAsync("abc", delegate { Interlocked.Increment(ref x); }); var t1 = sub.SubscribeAsync(prefix + "abc", delegate { Interlocked.Increment(ref x); });
var t2 = sub.SubscribeAsync("ab*", delegate { Interlocked.Increment(ref y); }); var t2 = sub.SubscribeAsync(prefix + "ab*", delegate { Interlocked.Increment(ref y); });
sub.WaitAll(t1, t2); sub.WaitAll(t1, t2);
pub.Publish("abc", ""); pub.Publish(prefix + "abc", "");
AllowReasonableTimeToPublishAndProcess(); AllowReasonableTimeToPublishAndProcess();
Assert.Equal(1, Volatile.Read(ref x)); Assert.Equal(1, Volatile.Read(ref x));
Assert.Equal(1, Volatile.Read(ref y)); Assert.Equal(1, Volatile.Read(ref y));
t1 = sub.UnsubscribeAsync("abc", null); t1 = sub.UnsubscribeAsync(prefix + "abc", null);
t2 = sub.UnsubscribeAsync("ab*", null); t2 = sub.UnsubscribeAsync(prefix + "ab*", null);
sub.WaitAll(t1, t2); sub.WaitAll(t1, t2);
pub.Publish("abc", ""); pub.Publish(prefix + "abc", "");
Assert.Equal(1, Volatile.Read(ref x)); Assert.Equal(1, Volatile.Read(ref x));
Assert.Equal(1, Volatile.Read(ref y)); Assert.Equal(1, Volatile.Read(ref y));
t1 = sub.SubscribeAsync("abc", delegate { Interlocked.Increment(ref x); }); t1 = sub.SubscribeAsync(prefix + "abc", delegate { Interlocked.Increment(ref x); });
t2 = sub.SubscribeAsync("ab*", delegate { Interlocked.Increment(ref y); }); t2 = sub.SubscribeAsync(prefix + "ab*", delegate { Interlocked.Increment(ref y); });
sub.WaitAll(t1, t2); sub.WaitAll(t1, t2);
pub.Publish("abc", ""); pub.Publish(prefix + "abc", "");
AllowReasonableTimeToPublishAndProcess(); AllowReasonableTimeToPublishAndProcess();
Assert.Equal(2, Volatile.Read(ref x)); Assert.Equal(2, Volatile.Read(ref x));
Assert.Equal(2, Volatile.Read(ref y)); Assert.Equal(2, Volatile.Read(ref y));
......
...@@ -62,8 +62,9 @@ public void KeysScripting() ...@@ -62,8 +62,9 @@ public void KeysScripting()
using (var muxer = GetScriptConn()) using (var muxer = GetScriptConn())
{ {
var conn = muxer.GetDatabase(); var conn = muxer.GetDatabase();
conn.StringSet("foo", "bar"); var key = Me();
var result = (string)conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { "foo" }, null); conn.StringSet(key, "bar");
var result = (string)conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { key }, null);
Assert.Equal("bar", result); Assert.Equal("bar", result);
} }
} }
...@@ -77,16 +78,17 @@ public void TestRandomThingFromForum() ...@@ -77,16 +78,17 @@ public void TestRandomThingFromForum()
using (var muxer = GetScriptConn()) using (var muxer = GetScriptConn())
{ {
var prefix = Me();
var conn = muxer.GetDatabase(); var conn = muxer.GetDatabase();
conn.StringSetAsync("A", "0"); conn.StringSetAsync(prefix + "A", "0");
conn.StringSetAsync("B", "5"); conn.StringSetAsync(prefix + "B", "5");
conn.StringSetAsync("C", "10"); conn.StringSetAsync(prefix + "C", "10");
var a = conn.ScriptEvaluateAsync(script, new RedisKey[] { "A" }, new RedisValue[] { 6 }); var a = conn.ScriptEvaluateAsync(script, new RedisKey[] { prefix + "A" }, new RedisValue[] { 6 });
var b = conn.ScriptEvaluateAsync(script, new RedisKey[] { "B" }, new RedisValue[] { 6 }); var b = conn.ScriptEvaluateAsync(script, new RedisKey[] { prefix + "B" }, new RedisValue[] { 6 });
var c = conn.ScriptEvaluateAsync(script, new RedisKey[] { "C" }, new RedisValue[] { 6 }); var c = conn.ScriptEvaluateAsync(script, new RedisKey[] { prefix + "C" }, new RedisValue[] { 6 });
var vals = conn.StringGetAsync(new RedisKey[] { "A", "B", "C" }); var vals = conn.StringGetAsync(new RedisKey[] { prefix + "A", prefix + "B", prefix + "C" });
Assert.Equal(1, (long)conn.Wait(a)); // exit code when current val is non-positive Assert.Equal(1, (long)conn.Wait(a)); // exit code when current val is non-positive
Assert.Equal(0, (long)conn.Wait(b)); // exit code when result would be negative Assert.Equal(0, (long)conn.Wait(b)); // exit code when result would be negative
...@@ -102,9 +104,9 @@ public void HackyGetPerf() ...@@ -102,9 +104,9 @@ public void HackyGetPerf()
{ {
using (var muxer = GetScriptConn()) using (var muxer = GetScriptConn())
{ {
var key = Me();
var conn = muxer.GetDatabase(); var conn = muxer.GetDatabase();
conn.StringSetAsync("foo", "bar"); conn.StringSetAsync(key + "foo", "bar");
var key = CreateUniqueName();
var result = (long)conn.ScriptEvaluate(@" var result = (long)conn.ScriptEvaluate(@"
redis.call('psetex', KEYS[1], 60000, 'timing') redis.call('psetex', KEYS[1], 60000, 'timing')
for i = 1,100000 do for i = 1,100000 do
...@@ -126,23 +128,24 @@ public void MultiIncrWithoutReplies() ...@@ -126,23 +128,24 @@ public void MultiIncrWithoutReplies()
{ {
const int DB = 0; // any database number const int DB = 0; // any database number
var conn = muxer.GetDatabase(DB); var conn = muxer.GetDatabase(DB);
var prefix = Me();
// prime some initial values // prime some initial values
conn.KeyDeleteAsync(new RedisKey[] { "a", "b", "c" }); conn.KeyDeleteAsync(new RedisKey[] { prefix + "a", prefix + "b", prefix + "c" });
conn.StringIncrementAsync("b"); conn.StringIncrementAsync(prefix + "b");
conn.StringIncrementAsync("c"); conn.StringIncrementAsync(prefix + "c");
conn.StringIncrementAsync("c"); conn.StringIncrementAsync(prefix + "c");
// run the script, passing "a", "b", "c", "c" to // run the script, passing "a", "b", "c", "c" to
// increment a & b by 1, c twice // increment a & b by 1, c twice
var result = conn.ScriptEvaluateAsync( var result = conn.ScriptEvaluateAsync(
"for i,key in ipairs(KEYS) do redis.call('incr', key) end", "for i,key in ipairs(KEYS) do redis.call('incr', key) end",
new RedisKey[] { "a", "b", "c", "c" }, // <== aka "KEYS" in the script new RedisKey[] { prefix + "a", prefix + "b", prefix + "c", prefix + "c" }, // <== aka "KEYS" in the script
null); // <== aka "ARGV" in the script null); // <== aka "ARGV" in the script
// check the incremented values // check the incremented values
var a = conn.StringGetAsync("a"); var a = conn.StringGetAsync(prefix + "a");
var b = conn.StringGetAsync("b"); var b = conn.StringGetAsync(prefix + "b");
var c = conn.StringGetAsync("c"); var c = conn.StringGetAsync(prefix + "c");
Assert.True(conn.Wait(result).IsNull, "result"); Assert.True(conn.Wait(result).IsNull, "result");
Assert.Equal(1, (long)conn.Wait(a)); Assert.Equal(1, (long)conn.Wait(a));
...@@ -158,23 +161,24 @@ public void MultiIncrByWithoutReplies() ...@@ -158,23 +161,24 @@ public void MultiIncrByWithoutReplies()
{ {
const int DB = 0; // any database number const int DB = 0; // any database number
var conn = muxer.GetDatabase(DB); var conn = muxer.GetDatabase(DB);
var prefix = Me();
// prime some initial values // prime some initial values
conn.KeyDeleteAsync(new RedisKey[] { "a", "b", "c" }); conn.KeyDeleteAsync(new RedisKey[] { prefix + "a", prefix + "b", prefix + "c" });
conn.StringIncrementAsync("b"); conn.StringIncrementAsync(prefix + "b");
conn.StringIncrementAsync("c"); conn.StringIncrementAsync(prefix + "c");
conn.StringIncrementAsync("c"); conn.StringIncrementAsync(prefix + "c");
//run the script, passing "a", "b", "c" and 1,2,3 //run the script, passing "a", "b", "c" and 1,2,3
// increment a &b by 1, c twice // increment a &b by 1, c twice
var result = conn.ScriptEvaluateAsync( var result = conn.ScriptEvaluateAsync(
"for i,key in ipairs(KEYS) do redis.call('incrby', key, ARGV[i]) end", "for i,key in ipairs(KEYS) do redis.call('incrby', key, ARGV[i]) end",
new RedisKey[] { "a", "b", "c" }, // <== aka "KEYS" in the script new RedisKey[] { prefix + "a", prefix + "b", prefix + "c" }, // <== aka "KEYS" in the script
new RedisValue[] { 1, 1, 2 }); // <== aka "ARGV" in the script new RedisValue[] { 1, 1, 2 }); // <== aka "ARGV" in the script
// check the incremented values // check the incremented values
var a = conn.StringGetAsync("a"); var a = conn.StringGetAsync(prefix + "a");
var b = conn.StringGetAsync("b"); var b = conn.StringGetAsync(prefix + "b");
var c = conn.StringGetAsync("c"); var c = conn.StringGetAsync(prefix + "c");
Assert.True(conn.Wait(result).IsNull, "result"); Assert.True(conn.Wait(result).IsNull, "result");
Assert.Equal(1, (long)conn.Wait(a)); Assert.Equal(1, (long)conn.Wait(a));
...@@ -189,8 +193,9 @@ public void DisableStringInference() ...@@ -189,8 +193,9 @@ public void DisableStringInference()
using (var muxer = GetScriptConn()) using (var muxer = GetScriptConn())
{ {
var conn = muxer.GetDatabase(0); var conn = muxer.GetDatabase(0);
conn.StringSet("foo", "bar"); var key = Me();
var result = (byte[])conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { "foo" }); conn.StringSet(key, "bar");
var result = (byte[])conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { key });
Assert.Equal("bar", Encoding.UTF8.GetString(result)); Assert.Equal("bar", Encoding.UTF8.GetString(result));
} }
} }
...@@ -201,17 +206,18 @@ public void FlushDetection() ...@@ -201,17 +206,18 @@ public void FlushDetection()
using (var muxer = GetScriptConn(allowAdmin: true)) using (var muxer = GetScriptConn(allowAdmin: true))
{ {
var conn = muxer.GetDatabase(0); var conn = muxer.GetDatabase(0);
conn.StringSet("foo", "bar"); var key = Me();
var result = (string)conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { "foo" }, null); conn.StringSet(key, "bar");
var result = (string)conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { key }, null);
Assert.Equal("bar", result); Assert.Equal("bar", result);
// now cause all kinds of problems // now cause all kinds of problems
GetServer(muxer).ScriptFlush(); GetServer(muxer).ScriptFlush();
//expect this one to <strike>fail</strike> just work fine (self-fix) //expect this one to <strike>fail</strike> just work fine (self-fix)
conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { "foo" }, null); conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { key }, null);
result = (string)conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { "foo" }, null); result = (string)conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { key }, null);
Assert.Equal("bar", result); Assert.Equal("bar", result);
} }
} }
...@@ -326,13 +332,14 @@ public void ChangeDbInScript() ...@@ -326,13 +332,14 @@ public void ChangeDbInScript()
{ {
using (var muxer = GetScriptConn()) using (var muxer = GetScriptConn())
{ {
muxer.GetDatabase(1).StringSet("foo", "db 1"); var key = Me();
muxer.GetDatabase(2).StringSet("foo", "db 2"); muxer.GetDatabase(1).StringSet(key, "db 1");
muxer.GetDatabase(2).StringSet(key, "db 2");
var conn = muxer.GetDatabase(2); var conn = muxer.GetDatabase(2);
var evalResult = conn.ScriptEvaluateAsync(@"redis.call('select', 1) var evalResult = conn.ScriptEvaluateAsync(@"redis.call('select', 1)
return redis.call('get','foo')", null, null); return redis.call('get','" + key +"')", null, null);
var getResult = conn.StringGetAsync("foo"); var getResult = conn.StringGetAsync(key);
Assert.Equal("db 1", (string)conn.Wait(evalResult)); Assert.Equal("db 1", (string)conn.Wait(evalResult));
// now, our connection thought it was in db 2, but the script changed to db 1 // now, our connection thought it was in db 2, but the script changed to db 1
...@@ -345,14 +352,15 @@ public void ChangeDbInTranScript() ...@@ -345,14 +352,15 @@ public void ChangeDbInTranScript()
{ {
using (var muxer = GetScriptConn()) using (var muxer = GetScriptConn())
{ {
muxer.GetDatabase(1).StringSet("foo", "db 1"); var key = Me();
muxer.GetDatabase(2).StringSet("foo", "db 2"); muxer.GetDatabase(1).StringSet(key, "db 1");
muxer.GetDatabase(2).StringSet(key, "db 2");
var conn = muxer.GetDatabase(2); var conn = muxer.GetDatabase(2);
var tran = conn.CreateTransaction(); var tran = conn.CreateTransaction();
var evalResult = tran.ScriptEvaluateAsync(@"redis.call('select', 1) var evalResult = tran.ScriptEvaluateAsync(@"redis.call('select', 1)
return redis.call('get','foo')", null, null); return redis.call('get','" + key + "')", null, null);
var getResult = tran.StringGetAsync("foo"); var getResult = tran.StringGetAsync(key);
Assert.True(tran.Execute()); Assert.True(tran.Execute());
Assert.Equal("db 1", (string)conn.Wait(evalResult)); Assert.Equal("db 1", (string)conn.Wait(evalResult));
......
...@@ -27,7 +27,9 @@ private async Task<string> DoStuff(ConnectionMultiplexer conn) ...@@ -27,7 +27,9 @@ private async Task<string> DoStuff(ConnectionMultiplexer conn)
var db = conn.GetDatabase(); var db = conn.GetDatabase();
var timeout = Task.Delay(5000); var timeout = Task.Delay(5000);
var len = db.ListLengthAsync("list"); var key = Me();
var key2 = key + "2";
var len = db.ListLengthAsync(key);
if (await Task.WhenAny(timeout, len).ForAwait() != len) if (await Task.WhenAny(timeout, len).ForAwait() != len)
{ {
...@@ -36,12 +38,12 @@ private async Task<string> DoStuff(ConnectionMultiplexer conn) ...@@ -36,12 +38,12 @@ private async Task<string> DoStuff(ConnectionMultiplexer conn)
if ((await len.ForAwait()) == 0) if ((await len.ForAwait()) == 0)
{ {
db.ListRightPush("list", "foo", flags: CommandFlags.FireAndForget); db.ListRightPush(key, "foo", flags: CommandFlags.FireAndForget);
} }
var tran = db.CreateTransaction(); var tran = db.CreateTransaction();
var x = tran.ListRightPopLeftPushAsync("list", "list2"); var x = tran.ListRightPopLeftPushAsync(key, key2);
var y = tran.SetAddAsync("set", "bar"); var y = tran.SetAddAsync(key + "set", "bar");
var z = tran.KeyExpireAsync("list2", TimeSpan.FromSeconds(60)); var z = tran.KeyExpireAsync(key2, TimeSpan.FromSeconds(60));
timeout = Task.Delay(5000); timeout = Task.Delay(5000);
var exec = tran.ExecuteAsync(); var exec = tran.ExecuteAsync();
...@@ -56,7 +58,7 @@ private async Task<string> DoStuff(ConnectionMultiplexer conn) ...@@ -56,7 +58,7 @@ private async Task<string> DoStuff(ConnectionMultiplexer conn)
await Task.WhenAll(x, y, z).ForAwait(); await Task.WhenAll(x, y, z).ForAwait();
var db2 = conn.GetDatabase(); var db2 = conn.GetDatabase();
db2.HashGet("hash", "whatever"); db2.HashGet(key + "hash", "whatever");
return "ok"; return "ok";
} }
else else
......
...@@ -33,6 +33,7 @@ public void AggressiveParallel(TestMode testMode) ...@@ -33,6 +33,7 @@ public void AggressiveParallel(TestMode testMode)
int errorCount = 0; int errorCount = 0;
int bgErrorCount = 0; int bgErrorCount = 0;
var evt = new ManualResetEvent(false); var evt = new ManualResetEvent(false);
var key = Me();
using (var c1 = Create(testMode)) using (var c1 = Create(testMode))
using (var c2 = Create(testMode)) using (var c2 = Create(testMode))
{ {
...@@ -45,7 +46,7 @@ void cb(object obj) ...@@ -45,7 +46,7 @@ void cb(object obj)
for (int i = 0; i < 1000; i++) for (int i = 0; i < 1000; i++)
{ {
conn.LockTakeAsync("abc", "def", TimeSpan.FromSeconds(5)); conn.LockTakeAsync(key, "def", TimeSpan.FromSeconds(5));
} }
conn.Ping(); conn.Ping();
if (Interlocked.Decrement(ref count) == 0) evt.Set(); if (Interlocked.Decrement(ref count) == 0) evt.Set();
...@@ -153,7 +154,7 @@ public void TakeLockAndExtend(TestMode mode) ...@@ -153,7 +154,7 @@ public void TakeLockAndExtend(TestMode mode)
wrong = Guid.NewGuid().ToString(); wrong = Guid.NewGuid().ToString();
int DB = mode == TestMode.Twemproxy ? 0 : 7; int DB = mode == TestMode.Twemproxy ? 0 : 7;
RedisKey Key = "lock-key"; RedisKey Key = Me();
var db = conn.GetDatabase(DB); var db = conn.GetDatabase(DB);
...@@ -237,12 +238,13 @@ public void TestBasicLockNotTaken(TestMode testMode) ...@@ -237,12 +238,13 @@ public void TestBasicLockNotTaken(TestMode testMode)
const int LOOP = 50; const int LOOP = 50;
var db = conn.GetDatabase(0); var db = conn.GetDatabase(0);
var key = Me();
for (int i = 0; i < LOOP; i++) for (int i = 0; i < LOOP; i++)
{ {
db.KeyDeleteAsync("lock-not-exists"); db.KeyDeleteAsync(key);
taken = db.LockTakeAsync("lock-not-exists", "new-value", TimeSpan.FromSeconds(10)); taken = db.LockTakeAsync(key, "new-value", TimeSpan.FromSeconds(10));
newValue = db.StringGetAsync("lock-not-exists"); newValue = db.StringGetAsync(key);
ttl = db.KeyTimeToLiveAsync("lock-not-exists"); ttl = db.KeyTimeToLiveAsync(key);
} }
Assert.True(conn.Wait(taken), "taken"); Assert.True(conn.Wait(taken), "taken");
Assert.Equal("new-value", (string)conn.Wait(newValue)); Assert.Equal("new-value", (string)conn.Wait(newValue));
...@@ -259,11 +261,12 @@ public void TestBasicLockTaken(TestMode testMode) ...@@ -259,11 +261,12 @@ public void TestBasicLockTaken(TestMode testMode)
using (var conn = Create(testMode)) using (var conn = Create(testMode))
{ {
var db = conn.GetDatabase(0); var db = conn.GetDatabase(0);
db.KeyDelete("lock-exists"); var key = Me();
db.StringSet("lock-exists", "old-value", TimeSpan.FromSeconds(20)); db.KeyDelete(key);
var taken = db.LockTakeAsync("lock-exists", "new-value", TimeSpan.FromSeconds(10)); db.StringSet(key, "old-value", TimeSpan.FromSeconds(20));
var newValue = db.StringGetAsync("lock-exists"); var taken = db.LockTakeAsync(key, "new-value", TimeSpan.FromSeconds(10));
var ttl = db.KeyTimeToLiveAsync("lock-exists"); var newValue = db.StringGetAsync(key);
var ttl = db.KeyTimeToLiveAsync(key);
Assert.False(conn.Wait(taken), "taken"); Assert.False(conn.Wait(taken), "taken");
Assert.Equal("old-value", (string)conn.Wait(newValue)); Assert.Equal("old-value", (string)conn.Wait(newValue));
......
...@@ -20,20 +20,21 @@ public void KeysScan(bool supported) ...@@ -20,20 +20,21 @@ public void KeysScan(bool supported)
{ {
const int DB = 7; const int DB = 7;
var db = conn.GetDatabase(DB); var db = conn.GetDatabase(DB);
var prefix = Me() + ":";
var server = GetServer(conn); var server = GetServer(conn);
server.FlushDatabase(DB); server.FlushDatabase(DB);
for (int i = 0; i < 100; i++) for (int i = 0; i < 100; i++)
{ {
db.StringSet("KeysScan:" + i, Guid.NewGuid().ToString(), flags: CommandFlags.FireAndForget); db.StringSet(prefix + i, Guid.NewGuid().ToString(), flags: CommandFlags.FireAndForget);
} }
var seq = server.Keys(DB, pageSize: 50); var seq = server.Keys(DB, pageSize: 50);
bool isScanning = seq is IScanningCursor; bool isScanning = seq is IScanningCursor;
Assert.Equal(supported, isScanning); Assert.Equal(supported, isScanning);
Assert.Equal(100, seq.Distinct().Count()); Assert.Equal(100, seq.Distinct().Count());
Assert.Equal(100, seq.Distinct().Count()); Assert.Equal(100, seq.Distinct().Count());
Assert.Equal(100, server.Keys(DB, "KeysScan:*").Distinct().Count()); Assert.Equal(100, server.Keys(DB, prefix + "*").Distinct().Count());
// 7, 70, 71, ..., 79 // 7, 70, 71, ..., 79
Assert.Equal(11, server.Keys(DB, "KeysScan:7*").Distinct().Count()); Assert.Equal(11, server.Keys(DB, prefix + "7*").Distinct().Count());
} }
} }
...@@ -195,7 +196,7 @@ public void SortedSetScan(bool supported) ...@@ -195,7 +196,7 @@ public void SortedSetScan(bool supported)
string[] disabledCommands = supported ? null : new[] { "zscan" }; string[] disabledCommands = supported ? null : new[] { "zscan" };
using (var conn = Create(disabledCommands: disabledCommands)) using (var conn = Create(disabledCommands: disabledCommands))
{ {
RedisKey key = Me(); RedisKey key = Me() + supported;
var db = conn.GetDatabase(); var db = conn.GetDatabase();
db.KeyDelete(key); db.KeyDelete(key);
...@@ -304,7 +305,7 @@ public void HashScanLarge(int pageSize) ...@@ -304,7 +305,7 @@ public void HashScanLarge(int pageSize)
{ {
using (var conn = Create()) using (var conn = Create())
{ {
RedisKey key = Me(); RedisKey key = Me() + pageSize;
var db = conn.GetDatabase(); var db = conn.GetDatabase();
db.KeyDelete(key); db.KeyDelete(key);
...@@ -364,7 +365,7 @@ public void SetScanLarge(int pageSize) ...@@ -364,7 +365,7 @@ public void SetScanLarge(int pageSize)
{ {
using (var conn = Create()) using (var conn = Create())
{ {
RedisKey key = Me(); RedisKey key = Me() + pageSize;
var db = conn.GetDatabase(); var db = conn.GetDatabase();
db.KeyDelete(key); db.KeyDelete(key);
...@@ -385,7 +386,7 @@ public void SortedSetScanLarge(int pageSize) ...@@ -385,7 +386,7 @@ public void SortedSetScanLarge(int pageSize)
{ {
using (var conn = Create()) using (var conn = Create())
{ {
RedisKey key = Me(); RedisKey key = Me() + pageSize;
var db = conn.GetDatabase(); var db = conn.GetDatabase();
db.KeyDelete(key); db.KeyDelete(key);
......
...@@ -112,7 +112,7 @@ public void CompareScriptToDirect() ...@@ -112,7 +112,7 @@ public void CompareScriptToDirect()
// we're using a pipeline here, so send 1000 messages, but for timing: only care about the last // we're using a pipeline here, so send 1000 messages, but for timing: only care about the last
const int LOOP = 5000; const int LOOP = 5000;
RedisKey key = "foo"; RedisKey key = Me();
RedisKey[] keys = new[] { key }; // script takes an array RedisKey[] keys = new[] { key }; // script takes an array
// run via script // run via script
......
...@@ -74,7 +74,8 @@ public void BasicSmokeTest() ...@@ -74,7 +74,8 @@ public void BasicSmokeTest()
{ {
var raw = conn.GetDatabase(1); var raw = conn.GetDatabase(1);
var foo = raw.WithKeyPrefix("foo"); var prefix = Me();
var foo = raw.WithKeyPrefix(prefix);
var foobar = foo.WithKeyPrefix("bar"); var foobar = foo.WithKeyPrefix("bar");
string key = Me(); string key = Me();
...@@ -92,10 +93,10 @@ public void BasicSmokeTest() ...@@ -92,10 +93,10 @@ public void BasicSmokeTest()
val = (string)foo.StringGet("bar" + key); val = (string)foo.StringGet("bar" + key);
Assert.Equal(t, val); // foobarBasicSmokeTest Assert.Equal(t, val); // foobarBasicSmokeTest
val = (string)raw.StringGet("foo" + key); val = (string)raw.StringGet(prefix + key);
Assert.Equal(s, val); // fooBasicSmokeTest Assert.Equal(s, val); // fooBasicSmokeTest
val = (string)raw.StringGet("foobar" + key); val = (string)raw.StringGet(prefix + "bar" + key);
Assert.Equal(t, val); // foobarBasicSmokeTest Assert.Equal(t, val); // foobarBasicSmokeTest
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment