Commit e91662e2 authored by Nick Craver's avatar Nick Craver

Tests: tons of performance work.

This is mainly around proper FireAndForget as well as .Wait() elimination. More to do but this is a big first pass.
parent 64df91da
......@@ -17,7 +17,7 @@ public void TestAdhocCommandsAPI()
// needs explicit RedisKey type for key-based
// sharding to work; will still work with strings,
// but no key-based sharding support
RedisKey key = "some_key";
RedisKey key = Me();
// note: if command renames are configured in
// the API, they will still work automatically
......
......@@ -13,14 +13,13 @@ public class BasicOpsTests : TestBase
public BasicOpsTests(ITestOutputHelper output) : base (output) { }
[Fact]
public void PingOnce()
public async Task PingOnce()
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var task = conn.PingAsync();
var duration = muxer.Wait(task);
var duration = await conn.PingAsync().ForAwait();
Log("Ping took: " + duration);
Assert.True(duration.TotalMilliseconds > 0);
}
......@@ -33,7 +32,7 @@ public void RapidDispose()
using (var primary = Create())
{
var conn = primary.GetDatabase();
conn.KeyDelete(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
for (int i = 0; i < 10; i++)
{
......@@ -47,18 +46,17 @@ public void RapidDispose()
}
[Fact]
public void PingMany()
public async Task PingMany()
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var tasks = new Task<TimeSpan>[100];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = conn.PingAsync();
}
muxer.WaitAll(tasks);
await Task.WhenAll(tasks).ForAwait();
Assert.True(tasks[0].Result.TotalMilliseconds > 0);
Assert.True(tasks[tasks.Length - 1].Result.TotalMilliseconds > 0);
}
......@@ -99,7 +97,7 @@ public void SetWithNullValue()
db.StringSet(key, "abc", flags: CommandFlags.FireAndForget);
Assert.True(db.KeyExists(key));
db.StringSet(key, value);
db.StringSet(key, value, flags: CommandFlags.FireAndForget);
var actual = (string)db.StringGet(key);
Assert.Null(actual);
......@@ -119,7 +117,7 @@ public void SetWithDefaultValue()
db.StringSet(key, "abc", flags: CommandFlags.FireAndForget);
Assert.True(db.KeyExists(key));
db.StringSet(key, value);
db.StringSet(key, value, flags: CommandFlags.FireAndForget);
var actual = (string)db.StringGet(key);
Assert.Null(actual);
......@@ -139,7 +137,7 @@ public void SetWithZeroValue()
db.StringSet(key, "abc", flags: CommandFlags.FireAndForget);
Assert.True(db.KeyExists(key));
db.StringSet(key, value);
db.StringSet(key, value, flags: CommandFlags.FireAndForget);
var actual = (string)db.StringGet(key);
Assert.Equal("0", actual);
......@@ -182,10 +180,10 @@ public void GetSetSync()
var conn = muxer.GetDatabase();
RedisKey key = Me();
conn.KeyDelete(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
var d1 = conn.KeyDelete(key);
var g1 = conn.StringGet(key);
conn.StringSet(key, "123");
conn.StringSet(key, "123", flags: CommandFlags.FireAndForget);
var g2 = conn.StringGet(key);
var d2 = conn.KeyDelete(key);
......@@ -204,23 +202,23 @@ public void GetSetSync()
[InlineData(false, false)]
[InlineData(true, true)]
[InlineData(true, false)]
public void GetWithExpiry(bool exists, bool hasExpiry)
public async Task GetWithExpiry(bool exists, bool hasExpiry)
{
using (var conn = Create())
{
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
if (exists)
{
if (hasExpiry)
db.StringSet(key, "val", TimeSpan.FromMinutes(5));
db.StringSet(key, "val", TimeSpan.FromMinutes(5), flags: CommandFlags.FireAndForget);
else
db.StringSet(key, "val");
db.StringSet(key, "val", flags: CommandFlags.FireAndForget);
}
var async = db.StringGetWithExpiryAsync(key);
var syncResult = db.StringGetWithExpiry(key);
var asyncResult = db.Wait(async);
var asyncResult = await async;
if (exists)
{
......@@ -248,8 +246,8 @@ public async Task GetWithExpiryWrongTypeAsync()
{
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.SetAdd(key, "abc");
var del = db.KeyDeleteAsync(key);
var add = db.SetAddAsync(key, "abc");
var ex = await Assert.ThrowsAsync<RedisServerException>(async () =>
{
try
......@@ -269,14 +267,14 @@ public async Task GetWithExpiryWrongTypeAsync()
[Fact]
public void GetWithExpiryWrongTypeSync()
{
RedisKey key = Me();
var ex = Assert.Throws<RedisServerException>(() =>
{
using (var conn = Create())
{
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.SetAdd(key, "abc");
db.KeyDelete(key, CommandFlags.FireAndForget);
db.SetAdd(key, "abc", CommandFlags.FireAndForget);
db.StringGetWithExpiry(key);
}
});
......@@ -431,15 +429,16 @@ private void Incr(IDatabase database, RedisKey key, int delta, ref int total)
[Fact]
public void WrappedDatabasePrefixIntegration()
{
var key = Me();
using (var conn = Create())
{
var db = conn.GetDatabase().WithKeyPrefix("abc");
db.KeyDelete("count");
db.StringIncrement("count");
db.StringIncrement("count");
db.StringIncrement("count");
db.KeyDelete(key, CommandFlags.FireAndForget);
db.StringIncrement(key, flags: CommandFlags.FireAndForget);
db.StringIncrement(key, flags: CommandFlags.FireAndForget);
db.StringIncrement(key, flags: CommandFlags.FireAndForget);
int count = (int)conn.GetDatabase().StringGet("abccount");
int count = (int)conn.GetDatabase().StringGet("abc" + key);
Assert.Equal(3, count);
}
}
......
......@@ -22,4 +22,4 @@ public void BasicOps()
}
}
}
}
\ No newline at end of file
}
......@@ -36,7 +36,7 @@ public void ExportConfiguration()
}
[Fact]
public async Task ConnectUsesSingleSocket()
public void ConnectUsesSingleSocket()
{
using (var sw = new StringWriter())
{
......@@ -46,7 +46,6 @@ public async Task ConnectUsesSingleSocket()
{
using (var muxer = Create(failMessage: i + ": ", log: sw))
{
await Task.Delay(500).ForAwait();
foreach (var ep in muxer.GetEndPoints())
{
var srv = muxer.GetServer(ep);
......@@ -174,8 +173,8 @@ string StringGet(IServer server, RedisKey key, CommandFlags flags = CommandFlags
var key = Me();
const string value = "abc";
var db = conn.GetDatabase();
db.KeyDelete(key);
db.StringSet(key, value);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.StringSet(key, value, flags: CommandFlags.FireAndForget);
servers.First().Ping();
var config = servers.First().ClusterConfiguration;
Assert.NotNull(config);
......@@ -445,12 +444,12 @@ public void SScan()
{
RedisKey key = "a";
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
int totalUnfiltered = 0, totalFiltered = 0;
for (int i = 0; i < 1000; i++)
{
db.SetAdd(key, i);
db.SetAdd(key, i, CommandFlags.FireAndForget);
totalUnfiltered += i;
if (i.ToString().Contains("3")) totalFiltered += i;
}
......@@ -502,7 +501,6 @@ public void AccessRandomKeys()
};
var pairs = new Dictionary<string, string>();
const int COUNT = 500;
Task[] send = new Task[COUNT];
int index = 0;
var servers = conn.GetEndPoints().Select(x => conn.GetServer(x));
......@@ -520,9 +518,8 @@ public void AccessRandomKeys()
var key = Guid.NewGuid().ToString();
var value = Guid.NewGuid().ToString();
pairs.Add(key, value);
send[index++] = cluster.StringSetAsync(key, value);
cluster.StringSet(key, value, flags: CommandFlags.FireAndForget);
}
conn.WaitAll(send);
var expected = new string[COUNT];
var actual = new Task<RedisValue>[COUNT];
......@@ -597,7 +594,7 @@ public void SimpleProfiling()
var profiler = new TestProfiler();
var key = Me();
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
conn.RegisterProfiler(profiler);
conn.BeginProfiling(profiler.MyContext);
......
......@@ -17,32 +17,30 @@ public void ValueEquals()
}
[Fact]
public void TestManualIncr()
public async Task TestManualIncr()
{
using (var muxer = Create(syncTimeout: 120000)) // big timeout while debugging
{
var key = Me();
var conn = muxer.GetDatabase();
for (int i = 0; i < 200; i++)
for (int i = 0; i < 10; i++)
{
conn.KeyDelete(key);
Assert.Equal(1, conn.Wait(ManualIncr(conn, key)));
Assert.Equal(2, conn.Wait(ManualIncr(conn, key)));
conn.KeyDelete(key, CommandFlags.FireAndForget);
Assert.Equal(1, await ManualIncrAsync(conn, key));
Assert.Equal(2, await ManualIncrAsync(conn, key));
Assert.Equal(2, (long)conn.StringGet(key));
}
}
}
public async Task<long?> ManualIncr(IDatabase connection, RedisKey key)
public async Task<long?> ManualIncrAsync(IDatabase connection, RedisKey key)
{
var oldVal = (long?)await connection.StringGetAsync(key).ForAwait();
var newVal = (oldVal ?? 0) + 1;
var tran = connection.CreateTransaction();
{ // check hasn't changed
#pragma warning disable 4014
tran.AddCondition(Condition.StringEqual(key, oldVal));
tran.StringSetAsync(key, newVal);
#pragma warning restore 4014
var t = tran.StringSetAsync(key, newVal);
if (!await tran.ExecuteAsync().ForAwait()) return null; // aborted
return newVal;
}
......
......@@ -26,11 +26,11 @@ public async Task CountKeys()
Skip.IfMissingDatabase(muxer, db1Id);
Skip.IfMissingDatabase(muxer, db2Id);
RedisKey key = Me();
var db61 = muxer.GetDatabase(db1Id);
var db62 = muxer.GetDatabase(db2Id);
db61.StringSet("abc", "def", flags: CommandFlags.FireAndForget);
db61.StringIncrement(key, flags: CommandFlags.FireAndForget);
db62.StringIncrement(key, flags: CommandFlags.FireAndForget);
var dba = muxer.GetDatabase(db1Id);
var dbb = muxer.GetDatabase(db2Id);
dba.StringSet("abc", "def", flags: CommandFlags.FireAndForget);
dba.StringIncrement(key, flags: CommandFlags.FireAndForget);
dbb.StringIncrement(key, flags: CommandFlags.FireAndForget);
var server = GetAnyMaster(muxer);
var c0 = server.DatabaseSizeAsync(db1Id);
......@@ -56,7 +56,7 @@ public void DatabaseCount()
}
[Fact]
public void MultiDatabases()
public async Task MultiDatabases()
{
using (var muxer = Create())
{
......@@ -64,26 +64,22 @@ public void MultiDatabases()
var db0 = muxer.GetDatabase(TestConfig.GetDedicatedDB(muxer));
var db1 = muxer.GetDatabase(TestConfig.GetDedicatedDB(muxer));
var db2 = muxer.GetDatabase(TestConfig.GetDedicatedDB(muxer));
db0.Ping();
db0.KeyDelete(key, CommandFlags.FireAndForget);
db1.KeyDelete(key, CommandFlags.FireAndForget);
db2.KeyDelete(key, CommandFlags.FireAndForget);
muxer.WaitAll(
db0.StringSetAsync(key, "a"),
db1.StringSetAsync(key, "b"),
db2.StringSetAsync(key, "c")
);
db0.StringSet(key, "a", flags: CommandFlags.FireAndForget);
db1.StringSet(key, "b", flags: CommandFlags.FireAndForget);
db2.StringSet(key, "c", flags: CommandFlags.FireAndForget);
var a = db0.StringGetAsync(key);
var b = db1.StringGetAsync(key);
var c = db2.StringGetAsync(key);
muxer.WaitAll(a, b, c);
Assert.Equal("a", muxer.Wait(a)); // db:0
Assert.Equal("b", muxer.Wait(b)); // db:1
Assert.Equal("c", muxer.Wait(c)); // db:2
Assert.Equal("a", await a); // db:0
Assert.Equal("b", await b); // db:1
Assert.Equal("c", await c); // db:2
}
}
}
......
using System;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
......@@ -13,7 +14,7 @@ public class Expiry : TestBase
[Theory]
[InlineData(true)]
[InlineData(false)]
public void TestBasicExpiryTimeSpan(bool disablePTimes)
public async Task TestBasicExpiryTimeSpan(bool disablePTimes)
{
using (var muxer = Create(disabledCommands: GetMap(disablePTimes)))
{
......@@ -32,15 +33,15 @@ public void TestBasicExpiryTimeSpan(bool disablePTimes)
conn.KeyExpire(key, TimeSpan.MaxValue, CommandFlags.FireAndForget);
var e = conn.KeyTimeToLiveAsync(key);
Assert.Null(muxer.Wait(a));
var time = muxer.Wait(b);
Assert.Null(await a);
var time = await b;
Assert.NotNull(time);
Assert.True(time > TimeSpan.FromMinutes(59.9) && time <= TimeSpan.FromMinutes(60));
Assert.Null(muxer.Wait(c));
time = muxer.Wait(d);
Assert.Null(await c);
time = await d;
Assert.NotNull(time);
Assert.True(time > TimeSpan.FromMinutes(89.9) && time <= TimeSpan.FromMinutes(90));
Assert.Null(muxer.Wait(e));
Assert.Null(await e);
}
}
......@@ -49,7 +50,7 @@ public void TestBasicExpiryTimeSpan(bool disablePTimes)
[InlineData(false, true)]
[InlineData(true, false)]
[InlineData(false, false)]
public void TestBasicExpiryDateTime(bool disablePTimes, bool utc)
public async Task TestBasicExpiryDateTime(bool disablePTimes, bool utc)
{
using (var muxer = Create(disabledCommands: GetMap(disablePTimes)))
{
......@@ -70,18 +71,18 @@ public void TestBasicExpiryDateTime(bool disablePTimes, bool utc)
conn.KeyExpire(key, DateTime.MaxValue, CommandFlags.FireAndForget);
var e = conn.KeyTimeToLiveAsync(key);
Assert.Null(muxer.Wait(a));
var time = muxer.Wait(b);
Assert.Null(await a);
var time = await b;
Assert.NotNull(time);
Log("Time: {0}, Expected: {1}-{2}", time, TimeSpan.FromMinutes(59), TimeSpan.FromMinutes(60));
Assert.True(time >= TimeSpan.FromMinutes(59));
Assert.True(time <= TimeSpan.FromMinutes(60));
Assert.Null(muxer.Wait(c));
time = muxer.Wait(d);
Assert.Null(await c);
time = await d;
Assert.NotNull(time);
Assert.True(time >= TimeSpan.FromMinutes(89));
Assert.True(time <= TimeSpan.FromMinutes(90));
Assert.Null(muxer.Wait(e));
Assert.Null(await e);
}
}
}
......
......@@ -150,12 +150,12 @@ public async Task HashIncrDecrFloatingPointAsync()
double sum = 0;
foreach (var value in incr)
{
await db.HashIncrementAsync(key, field, value).ForAwait();
var t = db.HashIncrementAsync(key, field, value);
sum += value;
}
foreach (var value in decr)
{
await db.HashDecrementAsync(key, field, value).ForAwait();
var t = db.HashDecrementAsync(key, field, value);
sum -= value;
}
var val = (double)await db.HashGetAsync(key, field).ForAwait();
......
......@@ -23,7 +23,7 @@ public void GeoAdd()
Skip.IfMissingFeature(conn, nameof(RedisFeatures.Geo), r => r.Geo);
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
// add while not there
Assert.True(db.GeoAdd(key, cefalù.Longitude, cefalù.Latitude, cefalù.Member));
......@@ -51,8 +51,8 @@ public void GetDistance()
Skip.IfMissingFeature(conn, nameof(RedisFeatures.Geo), r => r.Geo);
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.GeoAdd(key, all);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.GeoAdd(key, all, CommandFlags.FireAndForget);
var val = db.GeoDistance(key, "Palermo", "Catania", GeoUnit.Meters);
Assert.True(val.HasValue);
var rounded = Math.Round(val.Value, 10);
......@@ -71,8 +71,8 @@ public void GeoHash()
Skip.IfMissingFeature(conn, nameof(RedisFeatures.Geo), r => r.Geo);
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.GeoAdd(key, all);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.GeoAdd(key, all, CommandFlags.FireAndForget);
var hashes = db.GeoHash(key, new RedisValue[] { palermo.Member, "Nowhere", agrigento.Member });
Assert.Equal(3, hashes.Length);
......@@ -96,8 +96,8 @@ public void GeoGetPosition()
Skip.IfMissingFeature(conn, nameof(RedisFeatures.Geo), r => r.Geo);
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.GeoAdd(key, all);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.GeoAdd(key, all, CommandFlags.FireAndForget);
var pos = db.GeoPosition(key, palermo.Member);
Assert.True(pos.HasValue);
......@@ -117,8 +117,8 @@ public void GeoRemove()
Skip.IfMissingFeature(conn, nameof(RedisFeatures.Geo), r => r.Geo);
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.GeoAdd(key, all);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.GeoAdd(key, all, CommandFlags.FireAndForget);
var pos = db.GeoPosition(key, "Palermo");
Assert.True(pos.HasValue);
......@@ -140,8 +140,8 @@ public void GeoRadius()
Skip.IfMissingFeature(conn, nameof(RedisFeatures.Geo), r => r.Geo);
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.GeoAdd(key, all);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.GeoAdd(key, all, CommandFlags.FireAndForget);
var results = db.GeoRadius(key, cefalù.Member, 60, GeoUnit.Miles, 2, Order.Ascending);
Assert.Equal(2, results.Length);
......@@ -180,7 +180,7 @@ public void GeoRadiusOverloads()
Skip.IfMissingFeature(conn, nameof(RedisFeatures.Geo), r => r.Geo);
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
Assert.True(db.GeoAdd(key, -1.759925, 52.19493, "steve"));
Assert.True(db.GeoAdd(key, -3.360655, 54.66395, "dave"));
......
......@@ -20,13 +20,20 @@ public async Task TestIncrBy()
{
var conn = muxer.GetDatabase();
var key = Me();
await conn.KeyDeleteAsync(key).ForAwait();
for (int i = 1; i < 1000; i++)
var t = conn.KeyDeleteAsync(key).ForAwait();
var aTasks = new Task<long>[1000];
var bTasks = new Task<long>[1000];
for (int i = 1; i < 1001; i++)
{
Assert.Equal(i, await conn.HashIncrementAsync(key, "a", 1).ForAwait());
Assert.Equal(-i, await conn.HashIncrementAsync(key, "b", -1).ForAwait());
//Assert.Equal(i, conn.Wait(conn.Hashes.Increment(5, key, "a", 1)));
//Assert.Equal(-i, conn.Wait(conn.Hashes.Increment(5, key, "b", -1)));
aTasks[i - 1] = conn.HashIncrementAsync(key, "a", 1);
bTasks[i - 1] = conn.HashIncrementAsync(key, "b", -1);
}
await Task.WhenAll(bTasks).ForAwait();
for (int i = 1; i < 1001; i++)
{
Assert.Equal(i, aTasks[i - 1].Result);
Assert.Equal(-i, bTasks[i - 1].Result);
}
}
}
......@@ -93,11 +100,19 @@ public async Task TestIncrByFloat()
Skip.IfMissingFeature(muxer, nameof(RedisFeatures.IncrementFloat), r => r.IncrementFloat);
var conn = muxer.GetDatabase();
var key = Me();
await conn.KeyDeleteAsync(key).ForAwait();
for (int i = 1; i < 1000; i++)
var del = conn.KeyDeleteAsync(key).ForAwait();
var aTasks = new Task<double>[1000];
var bTasks = new Task<double>[1000];
for (int i = 1; i < 1001; i++)
{
Assert.Equal(i, await conn.HashIncrementAsync(key, "a", 1.0).ForAwait());
Assert.Equal(-i, await conn.HashIncrementAsync(key, "b", -1.0).ForAwait());
aTasks[i-1] = conn.HashIncrementAsync(key, "a", 1.0);
bTasks[i-1] = conn.HashIncrementAsync(key, "b", -1.0);
}
await Task.WhenAll(bTasks).ForAwait();
for (int i = 1; i < 1001; i++)
{
Assert.Equal(i, aTasks[i-1].Result);
Assert.Equal(-i, bTasks[i-1].Result);
}
}
}
......@@ -113,15 +128,16 @@ public async Task TestGetAll()
var shouldMatch = new Dictionary<Guid, int>();
var random = new Random();
for (int i = 1; i < 1000; i++)
for (int i = 0; i < 1000; i++)
{
var guid = Guid.NewGuid();
var value = random.Next(int.MaxValue);
shouldMatch[guid] = value;
var x = await conn.HashIncrementAsync(key, guid.ToString(), value).ForAwait();
var t = conn.HashIncrementAsync(key, guid.ToString(), value);
}
var inRedis = (await conn.HashGetAllAsync(key).ForAwait()).ToDictionary(
x => Guid.Parse(x.Name), x => int.Parse(x.Value));
......@@ -151,7 +167,7 @@ public async Task TestGet()
shouldMatch[guid] = value;
var x = await conn.HashIncrementAsync(key, guid.ToString(), value).ForAwait();
var t = conn.HashIncrementAsync(key, guid.ToString(), value);
}
foreach (var k in shouldMatch.Keys)
......@@ -171,7 +187,7 @@ public async Task TestGet()
{
var conn = muxer.GetDatabase();
var hashkey = Me();
await conn.KeyDeleteAsync(hashkey).ForAwait();
var del = conn.KeyDeleteAsync(hashkey).ForAwait();
var val0 = conn.HashGetAsync(hashkey, "field").ForAwait();
var set0 = conn.HashSetAsync(hashkey, "field", "value1").ForAwait();
......@@ -187,6 +203,7 @@ public async Task TestGet()
var set4 = conn.HashSetAsync(hashkey, "empty_type2", RedisValue.EmptyString).ForAwait();
var val5 = conn.HashGetAsync(hashkey, "empty_type2").ForAwait();
await del;
Assert.Null((string)(await val0));
Assert.True(await set0);
Assert.Equal("value1", await val1);
......@@ -210,7 +227,7 @@ public async Task TestGet()
{
var conn = muxer.GetDatabase();
var hashkey = Me();
await conn.KeyDeleteAsync(hashkey).ForAwait();
var del = conn.KeyDeleteAsync(hashkey).ForAwait();
var val0 = conn.HashGetAsync(hashkey, "field").ForAwait();
var set0 = conn.HashSetAsync(hashkey, "field", "value1", When.NotExists).ForAwait();
......@@ -222,6 +239,7 @@ public async Task TestGet()
var val3 = conn.HashGetAsync(hashkey, "field-blob").ForAwait();
var set3 = conn.HashSetAsync(hashkey, "field-blob", Encoding.UTF8.GetBytes("value3"), When.NotExists).ForAwait();
await del;
Assert.Null((string)(await val0));
Assert.True(await set0);
Assert.Equal("value1", await val1);
......@@ -337,11 +355,11 @@ public async Task TestGet()
{
var conn = muxer.GetDatabase();
var hashkey = Me();
await conn.KeyDeleteAsync(hashkey).ForAwait();
var del = conn.KeyDeleteAsync(hashkey).ForAwait();
var ex0 = conn.HashExistsAsync(hashkey, "field").ForAwait();
await conn.HashSetAsync(hashkey, "field", "value").ForAwait();
var set = conn.HashSetAsync(hashkey, "field", "value").ForAwait();
var ex1 = conn.HashExistsAsync(hashkey, "field").ForAwait();
await conn.HashDeleteAsync(hashkey, "field").ForAwait();
var del2= conn.HashDeleteAsync(hashkey, "field").ForAwait();
var ex2 = conn.HashExistsAsync(hashkey, "field").ForAwait();
Assert.False(await ex0);
......@@ -360,14 +378,13 @@ public async Task TestGet()
await conn.KeyDeleteAsync(hashKey).ForAwait();
var keys0 = await conn.HashKeysAsync(hashKey).ForAwait();
Assert.Empty(keys0);
await conn.HashSetAsync(hashKey, "foo", "abc").ForAwait();
await conn.HashSetAsync(hashKey, "bar", "def").ForAwait();
var keys1 = conn.HashKeysAsync(hashKey);
Assert.Empty(keys0);
var arr = await keys1;
Assert.Equal(2, arr.Length);
Assert.Equal("foo", arr[0]);
......@@ -401,23 +418,23 @@ public async Task TestGet()
}
[Fact]
public async Task TestHashLength() // https://redis.io/commands/hlen
public void TestHashLength() // https://redis.io/commands/hlen
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var hashkey = Me();
await conn.KeyDeleteAsync(hashkey).ForAwait();
conn.KeyDeleteAsync(hashkey);
var len0 = await conn.HashLengthAsync(hashkey).ForAwait();
var len0 = conn.HashLengthAsync(hashkey);
await conn.HashSetAsync(hashkey, "foo", "abc").ForAwait();
await conn.HashSetAsync(hashkey, "bar", "def").ForAwait();
conn.HashSetAsync(hashkey, "foo", "abc");
conn.HashSetAsync(hashkey, "bar", "def");
var len1 = await conn.HashLengthAsync(hashkey).ForAwait();
var len1 = conn.HashLengthAsync(hashkey);
Assert.Equal(0, len0);
Assert.Equal(2, len1);
Assert.Equal(0, muxer.Wait(len0));
Assert.Equal(2, muxer.Wait(len1));
}
}
......@@ -457,23 +474,23 @@ public async Task TestGet()
}
[Fact]
public async Task TestGetPairs() // https://redis.io/commands/hgetall
public void TestGetPairs() // https://redis.io/commands/hgetall
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var hashkey = Me();
await conn.KeyDeleteAsync(hashkey).ForAwait();
conn.KeyDeleteAsync(hashkey);
var result0 = await conn.HashGetAllAsync(hashkey).ForAwait();
var result0 = conn.HashGetAllAsync(hashkey);
await conn.HashSetAsync(hashkey, "foo", "abc").ForAwait();
await conn.HashSetAsync(hashkey, "bar", "def").ForAwait();
conn.HashSetAsync(hashkey, "foo", "abc");
conn.HashSetAsync(hashkey, "bar", "def");
var result1 = await conn.HashGetAllAsync(hashkey).ForAwait();
var result1 = conn.HashGetAllAsync(hashkey);
Assert.Empty(result0);
var result = result1.ToStringDictionary();
Assert.Empty(muxer.Wait(result0));
var result = muxer.Wait(result1).ToStringDictionary();
Assert.Equal(2, result.Count);
Assert.Equal("abc", result["foo"]);
Assert.Equal("def", result["bar"]);
......@@ -481,25 +498,25 @@ public async Task TestGet()
}
[Fact]
public async Task TestSetPairs() // https://redis.io/commands/hmset
public void TestSetPairs() // https://redis.io/commands/hmset
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var hashkey = Me();
await conn.KeyDeleteAsync(hashkey).ForAwait();
conn.KeyDeleteAsync(hashkey).ForAwait();
var result0 = await conn.HashGetAllAsync(hashkey).ForAwait();
var result0 = conn.HashGetAllAsync(hashkey);
var data = new HashEntry[] {
new HashEntry("foo", Encoding.UTF8.GetBytes("abc")),
new HashEntry("bar", Encoding.UTF8.GetBytes("def"))
};
await conn.HashSetAsync(hashkey, data).ForAwait();
conn.HashSetAsync(hashkey, data).ForAwait();
var result1 = await conn.HashGetAllAsync(hashkey).ForAwait();
var result1 = conn.Wait(conn.HashGetAllAsync(hashkey));
Assert.Empty(result0);
Assert.Empty(result0.Result);
var result = result1.ToStringDictionary();
Assert.Equal(2, result.Count);
Assert.Equal("abc", result["foo"]);
......
......@@ -12,11 +12,12 @@ public class SO10504853 : TestBase
[Fact]
public void LoopLotsOfTrivialStuff()
{
var key = Me();
Trace.WriteLine("### init");
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
conn.KeyDelete("lots-trivial");
conn.KeyDelete(key, CommandFlags.FireAndForget);
}
const int COUNT = 2;
for (int i = 0; i < COUNT; i++)
......@@ -25,14 +26,14 @@ public void LoopLotsOfTrivialStuff()
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
Assert.Equal(i + 1, conn.StringIncrement("lots-trivial"));
Assert.Equal(i + 1, conn.StringIncrement(key));
}
}
Trace.WriteLine("### close");
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
Assert.Equal(COUNT, (long)conn.StringGet("lots-trivial"));
Assert.Equal(COUNT, (long)conn.StringGet(key));
}
}
......@@ -42,12 +43,13 @@ public void ExecuteWithEmptyStartingPoint()
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var key = Me();
var task = new { priority = 3 };
conn.KeyDeleteAsync("item:1");
conn.HashSetAsync("item:1", "something else", "abc");
conn.HashSetAsync("item:1", "priority", task.priority.ToString());
conn.KeyDeleteAsync(key);
conn.HashSetAsync(key, "something else", "abc");
conn.HashSetAsync(key, "priority", task.priority.ToString());
var taskResult = conn.HashGetAsync("item:1", "priority");
var taskResult = conn.HashGetAsync(key, "priority");
conn.Wait(taskResult);
......@@ -60,17 +62,18 @@ public void ExecuteWithEmptyStartingPoint()
[Fact]
public void ExecuteWithNonHashStartingPoint()
{
var key = Me();
Assert.Throws<RedisServerException>(() =>
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var task = new { priority = 3 };
conn.KeyDeleteAsync("item:1");
conn.StringSetAsync("item:1", "not a hash");
conn.HashSetAsync("item:1", "priority", task.priority.ToString());
conn.KeyDeleteAsync(key);
conn.StringSetAsync(key, "not a hash");
conn.HashSetAsync(key, "priority", task.priority.ToString());
var taskResult = conn.HashGetAsync("item:1", "priority");
var taskResult = conn.HashGetAsync(key, "priority");
try
{
......
using System;
using System.Text;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
......@@ -10,7 +11,7 @@ public class SO10825542 : TestBase
public SO10825542(ITestOutputHelper output) : base(output) { }
[Fact]
public void Execute()
public async Task Execute()
{
using (var muxer = Create())
{
......@@ -18,14 +19,13 @@ public void Execute()
var con = muxer.GetDatabase();
// set the field value and expiration
con.HashSetAsync(key, "field1", Encoding.UTF8.GetBytes("hello world"));
con.KeyExpireAsync(key, TimeSpan.FromSeconds(7200));
con.HashSetAsync(key, "field2", "fooobar");
var task = con.HashGetAllAsync(key);
con.Wait(task);
var hsa = con.HashSetAsync(key, "field1", Encoding.UTF8.GetBytes("hello world"));
var kea = con.KeyExpireAsync(key, TimeSpan.FromSeconds(7200));
var hsa2 = con.HashSetAsync(key, "field2", "fooobar");
var result = await con.HashGetAllAsync(key).ForAwait();
Assert.Equal(2, task.Result.Length);
var dict = task.Result.ToStringDictionary();
Assert.Equal(2, result.Length);
var dict = result.ToStringDictionary();
Assert.Equal("hello world", dict["field1"]);
Assert.Equal("fooobar", dict["field2"]);
}
......
......@@ -19,9 +19,9 @@ public async Task Exec()
var cache = conn.GetDatabase();
// setup some data
cache.KeyDelete(key);
cache.HashSet(key, "full", "some value");
cache.KeyExpire(key, TimeSpan.FromSeconds(3));
cache.KeyDelete(key, CommandFlags.FireAndForget);
cache.HashSet(key, "full", "some value", flags: CommandFlags.FireAndForget);
cache.KeyExpire(key, TimeSpan.FromSeconds(3), CommandFlags.FireAndForget);
// test while exists
var keyExists = cache.KeyExists(key);
......@@ -41,7 +41,7 @@ public async Task Exec()
Assert.False(keyExists);
Assert.Null(ttl);
var r = fullWait.Result;
var r = await fullWait;
Assert.True(r.IsNull);
Assert.Null((string)r);
}
......
using System;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
......@@ -18,7 +17,7 @@ public async Task SetExpirationToPassed()
{
// Given
var cache = conn.GetDatabase();
cache.KeyDelete(key);
cache.KeyDelete(key, CommandFlags.FireAndForget);
cache.HashSet(key, "full", "test", When.NotExists, CommandFlags.PreferMaster);
await Task.Delay(2000).ForAwait();
......
......@@ -38,7 +38,7 @@ public void FlushFetchRandomKey()
Skip.IfMissingDatabase(conn, dbId);
var db = conn.GetDatabase(dbId);
var prefix = Me();
conn.GetServer(TestConfig.Current.MasterServerAndPort).FlushDatabase(dbId);
conn.GetServer(TestConfig.Current.MasterServerAndPort).FlushDatabase(dbId, CommandFlags.FireAndForget);
string anyKey = db.KeyRandom();
Assert.Null(anyKey);
......@@ -56,12 +56,12 @@ public void Zeros()
{
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.StringSet(key, 123);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.StringSet(key, 123, flags: CommandFlags.FireAndForget);
int k = (int)db.StringGet(key);
Assert.Equal(123, k);
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
int i = (int)db.StringGet(key);
Assert.Equal(0, i);
......
......@@ -14,7 +14,7 @@ public void QueryRangeAndLengthByLex()
{
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.SortedSetAdd(key,
new SortedSetEntry[]
......@@ -26,7 +26,7 @@ public void QueryRangeAndLengthByLex()
new SortedSetEntry("e", 0),
new SortedSetEntry("f", 0),
new SortedSetEntry("g", 0),
});
}, CommandFlags.FireAndForget);
var set = db.SortedSetRangeByValue(key, default(RedisValue), "c");
var count = db.SortedSetLengthByValue(key, default(RedisValue), "c");
......@@ -58,7 +58,7 @@ public void RemoveRangeByLex()
{
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.SortedSetAdd(key,
new SortedSetEntry[]
......@@ -68,7 +68,7 @@ public void RemoveRangeByLex()
new SortedSetEntry("c", 0),
new SortedSetEntry("d", 0),
new SortedSetEntry("e", 0),
});
}, CommandFlags.FireAndForget);
db.SortedSetAdd(key,
new SortedSetEntry[]
{
......@@ -77,7 +77,7 @@ public void RemoveRangeByLex()
new SortedSetEntry("zip", 0),
new SortedSetEntry("ALPHA", 0),
new SortedSetEntry("alpha", 0),
});
}, CommandFlags.FireAndForget);
var set = db.SortedSetRangeByRank(key);
Equate(set, set.Length, "ALPHA", "aaaa", "alpha", "b", "c", "d", "e", "foo", "zap", "zip");
......
......@@ -17,18 +17,18 @@ public void Ranges()
RedisKey key = Me();
db.KeyDelete(key, CommandFlags.FireAndForget);
db.ListRightPush(key, "abcdefghijklmnopqrstuvwxyz".Select(x => (RedisValue)x.ToString()).ToArray());
db.ListRightPush(key, "abcdefghijklmnopqrstuvwxyz".Select(x => (RedisValue)x.ToString()).ToArray(), CommandFlags.FireAndForget);
Assert.Equal(26, db.ListLength(key));
Assert.Equal("abcdefghijklmnopqrstuvwxyz", string.Concat(db.ListRange(key)));
var last10 = db.ListRange(key, -10, -1);
Assert.Equal("qrstuvwxyz", string.Concat(last10));
db.ListTrim(key, 0, -11);
db.ListTrim(key, 0, -11, CommandFlags.FireAndForget);
Assert.Equal(16, db.ListLength(key));
Assert.Equal("abcdefghijklmnop", string.Concat(db.ListRange(key)));
}
}
}
}
\ No newline at end of file
}
......@@ -72,35 +72,8 @@ public void TestOpCountByVersionLocal_UpLevel()
{
TestLockOpCountByVersion(conn, 1, false);
TestLockOpCountByVersion(conn, 1, true);
//TestManualLockOpCountByVersion(conn, 5, false);
//TestManualLockOpCountByVersion(conn, 3, true);
}
}
//[Test]
//public void TestOpCountByVersionLocal_DownLevel()
//{
// using (var conn = GetUnsecuredConnection(open: false))
// {
// conn.SetServerVersion(new Version(2, 6, 0), ServerType.Master);
// TestLockOpCountByVersion(conn, 5, false);
// TestLockOpCountByVersion(conn, 3, true);
// //TestManualLockOpCountByVersion(conn, 5, false);
// //TestManualLockOpCountByVersion(conn, 3, true);
// }
//}
//[Test]
//public void TestOpCountByVersionRemote()
//{
// using (var conn = GetRemoteConnection(open: false))
// {
// TestLockOpCountByVersion(conn, 1, false);
// TestLockOpCountByVersion(conn, 1, true);
// //TestManualLockOpCountByVersion(conn, 1, false);
// //TestManualLockOpCountByVersion(conn, 1, true);
// }
//}
private void TestLockOpCountByVersion(ConnectionMultiplexer conn, int expectedOps, bool existFirst)
{
......@@ -108,13 +81,13 @@ private void TestLockOpCountByVersion(ConnectionMultiplexer conn, int expectedOp
RedisKey Key = Me();
var db = conn.GetDatabase();
db.KeyDelete(Key);
db.KeyDelete(Key, CommandFlags.FireAndForget);
RedisValue newVal = "us:" + Guid.NewGuid().ToString();
RedisValue expectedVal = newVal;
if (existFirst)
{
expectedVal = "other:" + Guid.NewGuid().ToString();
db.StringSet(Key, expectedVal, TimeSpan.FromSeconds(LockDuration));
db.StringSet(Key, expectedVal, TimeSpan.FromSeconds(LockDuration), flags: CommandFlags.FireAndForget);
}
long countBefore = GetServer(conn).GetCounters().Interactive.OperationCount;
......@@ -145,7 +118,7 @@ private ConnectionMultiplexer Create(TestMode mode)
}
[Theory, MemberData(nameof(TestModes))]
public void TakeLockAndExtend(TestMode mode)
public async Task TakeLockAndExtend(TestMode mode)
{
bool withTran = mode == TestMode.MultiExec;
using (var conn = Create(mode))
......@@ -158,7 +131,7 @@ public void TakeLockAndExtend(TestMode mode)
var db = conn.GetDatabase(DB);
db.KeyDelete(Key);
db.KeyDelete(Key, CommandFlags.FireAndForget);
var t1 = db.LockTakeAsync(Key, right, TimeSpan.FromSeconds(20));
var t1b = db.LockTakeAsync(Key, wrong, TimeSpan.FromSeconds(10));
......@@ -178,22 +151,22 @@ public void TakeLockAndExtend(TestMode mode)
Assert.NotEqual(default(RedisValue), right);
Assert.NotEqual(default(RedisValue), wrong);
Assert.NotEqual(right, wrong);
Assert.True(conn.Wait(t1), "1");
Assert.False(conn.Wait(t1b), "1b");
Assert.Equal(right, conn.Wait(t2));
if (withTran) Assert.False(conn.Wait(t3), "3");
Assert.Equal(right, conn.Wait(t4));
if (withTran) Assert.False(conn.Wait(t5), "5");
Assert.Equal(right, conn.Wait(t6));
var ttl = conn.Wait(t7).Value.TotalSeconds;
Assert.True(await t1, "1");
Assert.False(await t1b, "1b");
Assert.Equal(right, await t2);
if (withTran) Assert.False(await t3, "3");
Assert.Equal(right, await t4);
if (withTran) Assert.False(await t5, "5");
Assert.Equal(right, await t6);
var ttl = (await t7).Value.TotalSeconds;
Assert.True(ttl > 0 && ttl <= 20, "7");
Assert.True(conn.Wait(t8), "8");
Assert.Equal(right, conn.Wait(t9));
ttl = conn.Wait(t10).Value.TotalSeconds;
Assert.True(await t8, "8");
Assert.Equal(right, await t9);
ttl = (await t10).Value.TotalSeconds;
Assert.True(ttl > 50 && ttl <= 60, "10");
Assert.True(conn.Wait(t11), "11");
Assert.Null((string)conn.Wait(t12));
Assert.True(conn.Wait(t13), "13");
Assert.True(await t11, "11");
Assert.Null((string)await t12);
Assert.True(await t13, "13");
}
}
......@@ -226,7 +199,7 @@ public void TakeLockAndExtend(TestMode mode)
//}
[Theory, MemberData(nameof(TestModes))]
public void TestBasicLockNotTaken(TestMode testMode)
public async Task TestBasicLockNotTaken(TestMode testMode)
{
using (var conn = Create(testMode))
{
......@@ -241,14 +214,14 @@ public void TestBasicLockNotTaken(TestMode testMode)
var key = Me();
for (int i = 0; i < LOOP; i++)
{
db.KeyDeleteAsync(key);
var d = db.KeyDeleteAsync(key);
taken = db.LockTakeAsync(key, "new-value", TimeSpan.FromSeconds(10));
newValue = db.StringGetAsync(key);
ttl = db.KeyTimeToLiveAsync(key);
}
Assert.True(conn.Wait(taken), "taken");
Assert.Equal("new-value", (string)conn.Wait(newValue));
var ttlValue = conn.Wait(ttl).Value.TotalSeconds;
Assert.True(await taken, "taken");
Assert.Equal("new-value", (string)await newValue);
var ttlValue = (await ttl).Value.TotalSeconds;
Assert.True(ttlValue >= 8 && ttlValue <= 10, "ttl");
Assert.Equal(0, errorCount);
......@@ -256,21 +229,21 @@ public void TestBasicLockNotTaken(TestMode testMode)
}
[Theory, MemberData(nameof(TestModes))]
public void TestBasicLockTaken(TestMode testMode)
public async Task TestBasicLockTaken(TestMode testMode)
{
using (var conn = Create(testMode))
{
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.StringSet(key, "old-value", TimeSpan.FromSeconds(20));
db.KeyDelete(key, CommandFlags.FireAndForget);
db.StringSet(key, "old-value", TimeSpan.FromSeconds(20), flags: CommandFlags.FireAndForget);
var taken = db.LockTakeAsync(key, "new-value", TimeSpan.FromSeconds(10));
var newValue = db.StringGetAsync(key);
var ttl = db.KeyTimeToLiveAsync(key);
Assert.False(conn.Wait(taken), "taken");
Assert.Equal("old-value", (string)conn.Wait(newValue));
var ttlValue = conn.Wait(ttl).Value.TotalSeconds;
Assert.False(await taken, "taken");
Assert.Equal("old-value", (string)await newValue);
var ttlValue = (await ttl).Value.TotalSeconds;
Assert.True(ttlValue >= 18 && ttlValue <= 20, "ttl");
}
}
......
......@@ -53,7 +53,7 @@ public void MassiveBulkOpsSync(int threads)
{
RedisKey key = "MBOS";
var conn = muxer.GetDatabase();
conn.KeyDelete(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
#if DEBUG
long oldAlloc = ConnectionMultiplexer.GetResultBoxAllocationCount();
#endif
......@@ -61,7 +61,7 @@ public void MassiveBulkOpsSync(int threads)
{
for (int i = 0; i < workPerThread; i++)
{
conn.StringIncrement(key);
conn.StringIncrement(key, flags: CommandFlags.FireAndForget);
}
}, threads);
......
......@@ -8,9 +8,10 @@ public class Migrate : TestBase
{
public Migrate(ITestOutputHelper output) : base (output) { }
[Fact]
public void Basic()
{
var fromConfig = new ConfigurationOptions { EndPoints = { { TestConfig.Current.MasterServer, TestConfig.Current.SecurePort } }, Password = TestConfig.Current.SecurePassword };
var fromConfig = new ConfigurationOptions { EndPoints = { { TestConfig.Current.SecureServer, TestConfig.Current.SecurePort } }, Password = TestConfig.Current.SecurePassword };
var toConfig = new ConfigurationOptions { EndPoints = { { TestConfig.Current.MasterServer, TestConfig.Current.MasterPort } } };
using (var from = ConnectionMultiplexer.Connect(fromConfig))
using (var to = ConnectionMultiplexer.Connect(toConfig))
......@@ -18,11 +19,11 @@ public void Basic()
RedisKey key = Me();
var fromDb = from.GetDatabase();
var toDb = to.GetDatabase();
fromDb.KeyDelete(key);
toDb.KeyDelete(key);
fromDb.StringSet(key, "foo");
fromDb.KeyDelete(key, CommandFlags.FireAndForget);
toDb.KeyDelete(key, CommandFlags.FireAndForget);
fromDb.StringSet(key, "foo", flags: CommandFlags.FireAndForget);
var dest = to.GetEndPoints(true).Single();
fromDb.KeyMigrate(key, dest);
fromDb.KeyMigrate(key, dest, flags: CommandFlags.FireAndForget);
Assert.False(fromDb.KeyExists(key));
Assert.True(toDb.KeyExists(key));
string s = toDb.StringGet(key);
......
......@@ -16,22 +16,22 @@ public void AddSortedSetEveryWay()
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.SortedSetAdd(key, "a", 1);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.SortedSetAdd(key, "a", 1, CommandFlags.FireAndForget);
db.SortedSetAdd(key, new[] {
new SortedSetEntry("b", 2) });
new SortedSetEntry("b", 2) }, CommandFlags.FireAndForget);
db.SortedSetAdd(key, new[] {
new SortedSetEntry("c", 3),
new SortedSetEntry("d", 4)});
new SortedSetEntry("d", 4)}, CommandFlags.FireAndForget);
db.SortedSetAdd(key, new[] {
new SortedSetEntry("e", 5),
new SortedSetEntry("f", 6),
new SortedSetEntry("g", 7)});
new SortedSetEntry("g", 7)}, CommandFlags.FireAndForget);
db.SortedSetAdd(key, new[] {
new SortedSetEntry("h", 8),
new SortedSetEntry("i", 9),
new SortedSetEntry("j", 10),
new SortedSetEntry("k", 11)});
new SortedSetEntry("k", 11)}, CommandFlags.FireAndForget);
var vals = db.SortedSetRangeByScoreWithScores(key);
string s = string.Join(",", vals.OrderByDescending(x => x.Score).Select(x => x.Element));
Assert.Equal("k,j,i,h,g,f,e,d,c,b,a", s);
......@@ -48,22 +48,22 @@ public void AddHashEveryWay()
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.HashSet(key, "a", 1);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.HashSet(key, "a", 1, flags: CommandFlags.FireAndForget);
db.HashSet(key, new[] {
new HashEntry("b", 2) });
new HashEntry("b", 2) }, CommandFlags.FireAndForget);
db.HashSet(key, new[] {
new HashEntry("c", 3),
new HashEntry("d", 4)});
new HashEntry("d", 4)}, CommandFlags.FireAndForget);
db.HashSet(key, new[] {
new HashEntry("e", 5),
new HashEntry("f", 6),
new HashEntry("g", 7)});
new HashEntry("g", 7)}, CommandFlags.FireAndForget);
db.HashSet(key, new[] {
new HashEntry("h", 8),
new HashEntry("i", 9),
new HashEntry("j", 10),
new HashEntry("k", 11)});
new HashEntry("k", 11)}, CommandFlags.FireAndForget);
var vals = db.HashGetAll(key);
string s = string.Join(",", vals.OrderByDescending(x => (double)x.Value).Select(x => x.Name));
Assert.Equal("k,j,i,h,g,f,e,d,c,b,a", s);
......@@ -80,12 +80,12 @@ public void AddSetEveryWay()
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.SetAdd(key, "a");
db.SetAdd(key, new RedisValue[] { "b" });
db.SetAdd(key, new RedisValue[] { "c", "d" });
db.SetAdd(key, new RedisValue[] { "e", "f", "g" });
db.SetAdd(key, new RedisValue[] { "h", "i", "j", "k" });
db.KeyDelete(key, CommandFlags.FireAndForget);
db.SetAdd(key, "a", CommandFlags.FireAndForget);
db.SetAdd(key, new RedisValue[] { "b" }, CommandFlags.FireAndForget);
db.SetAdd(key, new RedisValue[] { "c", "d" }, CommandFlags.FireAndForget);
db.SetAdd(key, new RedisValue[] { "e", "f", "g" }, CommandFlags.FireAndForget);
db.SetAdd(key, new RedisValue[] { "h", "i", "j", "k" }, CommandFlags.FireAndForget);
var vals = db.SetMembers(key);
string s = string.Join(",", vals.OrderByDescending(x => x));
......@@ -101,12 +101,12 @@ public void AddSetEveryWayNumbers()
var db = conn.GetDatabase();
RedisKey key = Me();
db.KeyDelete(key);
db.SetAdd(key, "a");
db.SetAdd(key, new RedisValue[] { "1" });
db.SetAdd(key, new RedisValue[] { "11", "2" });
db.SetAdd(key, new RedisValue[] { "10", "3", "1.5" });
db.SetAdd(key, new RedisValue[] { "2.2", "-1", "s", "t" });
db.KeyDelete(key, CommandFlags.FireAndForget);
db.SetAdd(key, "a", CommandFlags.FireAndForget);
db.SetAdd(key, new RedisValue[] { "1" }, CommandFlags.FireAndForget);
db.SetAdd(key, new RedisValue[] { "11", "2" }, CommandFlags.FireAndForget);
db.SetAdd(key, new RedisValue[] { "10", "3", "1.5" }, CommandFlags.FireAndForget);
db.SetAdd(key, new RedisValue[] { "2.2", "-1", "s", "t" }, CommandFlags.FireAndForget);
var vals = db.SetMembers(key);
string s = string.Join(",", vals.OrderByDescending(x => x));
......
......@@ -530,7 +530,7 @@ public async Task PubSubGetAllCorrectOrder_OnMessage_Async()
}
[Fact]
public void TestPublishWithSubscribers()
public async Task TestPublishWithSubscribers()
{
var channel = Me();
using (var muxerA = Create())
......@@ -542,11 +542,10 @@ public void TestPublishWithSubscribers()
var t1 = listenA.SubscribeAsync(channel, delegate { });
var t2 = listenB.SubscribeAsync(channel, delegate { });
listenA.Wait(t1);
listenB.Wait(t2);
await Task.WhenAll(t1, t2).ForAwait();
var pub = conn.GetSubscriber().PublishAsync(channel, "message");
Assert.Equal(2, conn.Wait(pub)); // delivery count
Assert.Equal(2, await pub); // delivery count
}
}
......@@ -565,8 +564,7 @@ public async Task TestMultipleSubscribersGetMessage()
int gotA = 0, gotB = 0;
var tA = listenA.SubscribeAsync(channel, (_, msg) => { if (msg == "message") Interlocked.Increment(ref gotA); });
var tB = listenB.SubscribeAsync(channel, (_, msg) => { if (msg == "message") Interlocked.Increment(ref gotB); });
listenA.Wait(tA);
listenB.Wait(tB);
await Task.WhenAll(tA, tB).ForAwait();
Assert.Equal(2, pub.Publish(channel, "message"));
await AllowReasonableTimeToPublishAndProcess().ForAwait();
Assert.Equal(1, Interlocked.CompareExchange(ref gotA, 0, 0));
......@@ -574,7 +572,7 @@ public async Task TestMultipleSubscribersGetMessage()
// and unsubscibe...
tA = listenA.UnsubscribeAsync(channel);
listenA.Wait(tA);
await tA;
Assert.Equal(1, pub.Publish(channel, "message"));
await AllowReasonableTimeToPublishAndProcess().ForAwait();
Assert.Equal(1, Interlocked.CompareExchange(ref gotA, 0, 0));
......@@ -596,14 +594,14 @@ public async Task Issue38()
var a1 = sub.SubscribeAsync(prefix + "bar", handler);
var b0 = sub.SubscribeAsync(prefix + "f*o", handler);
var b1 = sub.SubscribeAsync(prefix + "b*r", handler);
sub.WaitAll(a0, a1, b0, b1);
await Task.WhenAll(a0, a1, b0, b1).ForAwait();
var c = sub.PublishAsync(prefix + "foo", "foo");
var d = sub.PublishAsync(prefix + "f@o", "f@o");
var e = sub.PublishAsync(prefix + "bar", "bar");
var f = sub.PublishAsync(prefix + "b@r", "b@r");
await Task.WhenAll(c, d, e, f).ForAwait();
pub.WaitAll(c, d, e, f);
long total = c.Result + d.Result + e.Result + f.Result;
await AllowReasonableTimeToPublishAndProcess().ForAwait();
......@@ -629,8 +627,7 @@ public async Task TestPartialSubscriberGetMessage()
var prefix = Me();
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);
listenB.Wait(tB);
await Task.WhenAll(tA, tB).ForAwait();
Assert.Equal(2, pub.Publish(prefix + "channel", "message"));
await AllowReasonableTimeToPublishAndProcess().ForAwait();
Assert.Equal(1, Interlocked.CompareExchange(ref gotA, 0, 0));
......@@ -638,7 +635,7 @@ public async Task TestPartialSubscriberGetMessage()
// and unsubscibe...
tB = listenB.UnsubscribeAsync(prefix + "chann*", null);
listenB.Wait(tB);
await tB;
Assert.Equal(1, pub.Publish(prefix + "channel", "message"));
await AllowReasonableTimeToPublishAndProcess().ForAwait();
Assert.Equal(2, Interlocked.CompareExchange(ref gotA, 0, 0));
......@@ -658,20 +655,20 @@ public async Task TestSubscribeUnsubscribeAndSubscribeAgain()
int x = 0, y = 0;
var t1 = sub.SubscribeAsync(prefix + "abc", delegate { Interlocked.Increment(ref x); });
var t2 = sub.SubscribeAsync(prefix + "ab*", delegate { Interlocked.Increment(ref y); });
sub.WaitAll(t1, t2);
await Task.WhenAll(t1, t2).ForAwait();
pub.Publish(prefix + "abc", "");
await AllowReasonableTimeToPublishAndProcess().ForAwait();
Assert.Equal(1, Volatile.Read(ref x));
Assert.Equal(1, Volatile.Read(ref y));
t1 = sub.UnsubscribeAsync(prefix + "abc", null);
t2 = sub.UnsubscribeAsync(prefix + "ab*", null);
sub.WaitAll(t1, t2);
await Task.WhenAll(t1, t2).ForAwait();
pub.Publish(prefix + "abc", "");
Assert.Equal(1, Volatile.Read(ref x));
Assert.Equal(1, Volatile.Read(ref y));
t1 = sub.SubscribeAsync(prefix + "abc", delegate { Interlocked.Increment(ref x); });
t2 = sub.SubscribeAsync(prefix + "ab*", delegate { Interlocked.Increment(ref y); });
sub.WaitAll(t1, t2);
await Task.WhenAll(t1, t2).ForAwait();
pub.Publish(prefix + "abc", "");
await AllowReasonableTimeToPublishAndProcess().ForAwait();
Assert.Equal(2, Volatile.Read(ref x));
......
......@@ -21,9 +21,9 @@ public void ConnectToSSDB()
using (var conn = ConnectionMultiplexer.Connect(config))
{
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
Assert.True(db.StringGet(key).IsNull);
db.StringSet(key, "abc");
db.StringSet(key, "abc", flags: CommandFlags.FireAndForget);
Assert.Equal("abc", db.StringGet(key));
}
}
......
......@@ -105,7 +105,7 @@ public async Task ConnectToSSLServer(bool useSsl, bool specifyHost)
muxer.ConnectionFailed += OnConnectionFailed;
muxer.InternalError += OnInternalError;
var db = muxer.GetDatabase();
await db.PingAsync();
await db.PingAsync().ForAwait();
using (var file = File.Create("ssl-" + useSsl + "-" + specifyHost + ".zip"))
{
muxer.ExportConfiguration(file);
......@@ -114,13 +114,13 @@ public async Task ConnectToSSLServer(bool useSsl, bool specifyHost)
const int AsyncLoop = 2000;
// perf; async
await db.KeyDeleteAsync(key);
await db.KeyDeleteAsync(key).ForAwait();
var watch = Stopwatch.StartNew();
for (int i = 0; i < AsyncLoop; i++)
{
try
{
await db.StringIncrementAsync(key, flags: CommandFlags.FireAndForget);
await db.StringIncrementAsync(key, flags: CommandFlags.FireAndForget).ForAwait();
}
catch (Exception ex)
{
......@@ -129,7 +129,7 @@ public async Task ConnectToSSLServer(bool useSsl, bool specifyHost)
}
}
// need to do this inside the timer to measure the TTLB
long value = (long)await db.StringGetAsync(key);
long value = (long)await db.StringGetAsync(key).ForAwait();
watch.Stop();
Assert.Equal(AsyncLoop, value);
Log("F&F: {0} INCR, {1:###,##0}ms, {2} ops/s; final value: {3}",
......@@ -173,7 +173,6 @@ public void RedisLabsSSL()
Skip.IfNoConfig(nameof(TestConfig.Config.RedisLabsSslServer), TestConfig.Current.RedisLabsSslServer);
Skip.IfNoConfig(nameof(TestConfig.Config.RedisLabsPfxPath), TestConfig.Current.RedisLabsPfxPath);
var cert = new X509Certificate2(TestConfig.Current.RedisLabsPfxPath, "");
Assert.NotNull(cert);
Writer.WriteLine("Thumbprint: " + cert.Thumbprint);
......@@ -189,10 +188,8 @@ public void RedisLabsSSL()
"subscribe", "unsubscribe", "cluster"
}, false)
};
options.TrustIssuer("redislabs_ca.pem");
options.TrustIssuer("redislabs_ca.pem");
if (!Directory.Exists(Me())) Directory.CreateDirectory(Me());
#if LOGOUTPUT
......@@ -207,10 +204,10 @@ public void RedisLabsSSL()
using (var conn = ConnectionMultiplexer.Connect(options))
{
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
string s = db.StringGet(key);
Assert.Null(s);
db.StringSet(key, "abc");
db.StringSet(key, "abc", flags: CommandFlags.FireAndForget);
s = db.StringGet(key);
Assert.Equal("abc", s);
......@@ -253,7 +250,7 @@ public void RedisLabsEnvironmentVariableClientCertificate(bool setEnv)
"subscribe", "unsubscribe", "cluster"
}, false)
};
if (!Directory.Exists(Me())) Directory.CreateDirectory(Me());
#if LOGOUTPUT
ConnectionMultiplexer.EchoPath = Me();
......@@ -265,7 +262,7 @@ public void RedisLabsEnvironmentVariableClientCertificate(bool setEnv)
if (!setEnv) Assert.True(false, "Could not set environment");
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
string s = db.StringGet(key);
Assert.Null(s);
db.StringSet(key, "abc");
......
......@@ -183,11 +183,11 @@ public void SetScan(bool supported)
{
RedisKey key = Me();
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.SetAdd(key, "a");
db.SetAdd(key, "b");
db.SetAdd(key, "c");
db.SetAdd(key, "a", CommandFlags.FireAndForget);
db.SetAdd(key, "b", CommandFlags.FireAndForget);
db.SetAdd(key, "c", CommandFlags.FireAndForget);
var arr = db.SetScan(key).ToArray();
Assert.Equal(3, arr.Length);
Assert.True(arr.Contains("a"), "a");
......@@ -206,11 +206,11 @@ public void SortedSetScan(bool supported)
{
RedisKey key = Me() + supported;
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.SortedSetAdd(key, "a", 1);
db.SortedSetAdd(key, "b", 2);
db.SortedSetAdd(key, "c", 3);
db.SortedSetAdd(key, "a", 1, CommandFlags.FireAndForget);
db.SortedSetAdd(key, "b", 2, CommandFlags.FireAndForget);
db.SortedSetAdd(key, "c", 3, CommandFlags.FireAndForget);
var arr = db.SortedSetScan(key).ToArray();
Assert.Equal(3, arr.Length);
......@@ -274,11 +274,11 @@ public void HashScan(bool supported)
{
RedisKey key = Me();
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.HashSet(key, "a", "1");
db.HashSet(key, "b", "2");
db.HashSet(key, "c", "3");
db.HashSet(key, "a", "1", flags: CommandFlags.FireAndForget);
db.HashSet(key, "b", "2", flags: CommandFlags.FireAndForget);
db.HashSet(key, "c", "3", flags: CommandFlags.FireAndForget);
var arr = db.HashScan(key).ToArray();
Assert.Equal(3, arr.Length);
......@@ -315,7 +315,7 @@ public void HashScanLarge(int pageSize)
{
RedisKey key = Me() + pageSize;
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
for (int i = 0; i < 2000; i++)
db.HashSet(key, "k" + i, "v" + i, flags: CommandFlags.FireAndForget);
......@@ -342,14 +342,14 @@ public void HashScanThresholds()
private bool GotCursors(ConnectionMultiplexer conn, RedisKey key, int count)
{
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
var entries = new HashEntry[count];
for (var i = 0; i < count; i++)
{
entries[i] = new HashEntry("Item:" + i, i);
}
db.HashSet(key, entries);
db.HashSet(key, entries, CommandFlags.FireAndForget);
var found = false;
var response = db.HashScan(key);
......@@ -375,7 +375,7 @@ public void SetScanLarge(int pageSize)
{
RedisKey key = Me() + pageSize;
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
for (int i = 0; i < 2000; i++)
db.SetAdd(key, "s" + i, flags: CommandFlags.FireAndForget);
......@@ -396,7 +396,7 @@ public void SortedSetScanLarge(int pageSize)
{
RedisKey key = Me() + pageSize;
var db = conn.GetDatabase();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
for (int i = 0; i < 2000; i++)
db.SortedSetAdd(key, "z" + i, i, flags: CommandFlags.FireAndForget);
......
......@@ -2,6 +2,7 @@
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
......@@ -31,7 +32,7 @@ public void ClientScripting()
}
[Fact]
public void BasicScripting()
public async Task BasicScripting()
{
using (var muxer = GetScriptConn())
{
......@@ -40,14 +41,14 @@ public void BasicScripting()
new RedisKey[] { "key1", "key2" }, new RedisValue[] { "first", "second" });
var cache = conn.ScriptEvaluateAsync("return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}",
new RedisKey[] { "key1", "key2" }, new RedisValue[] { "first", "second" });
var results = (string[])conn.Wait(noCache);
var results = (string[])await noCache;
Assert.Equal(4, results.Length);
Assert.Equal("key1", results[0]);
Assert.Equal("key2", results[1]);
Assert.Equal("first", results[2]);
Assert.Equal("second", results[3]);
results = (string[])conn.Wait(cache);
results = (string[])await cache;
Assert.Equal(4, results.Length);
Assert.Equal("key1", results[0]);
Assert.Equal("key2", results[1]);
......@@ -63,14 +64,14 @@ public void KeysScripting()
{
var conn = muxer.GetDatabase();
var key = Me();
conn.StringSet(key, "bar");
conn.StringSet(key, "bar", flags: CommandFlags.FireAndForget);
var result = (string)conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { key }, null);
Assert.Equal("bar", result);
}
}
[Fact]
public void TestRandomThingFromForum()
public async Task TestRandomThingFromForum()
{
const string script = @"local currentVal = tonumber(redis.call('GET', KEYS[1]));
if (currentVal <= 0 ) then return 1 elseif (currentVal - (tonumber(ARGV[1])) < 0 ) then return 0 end;
......@@ -80,22 +81,22 @@ public void TestRandomThingFromForum()
{
var prefix = Me();
var conn = muxer.GetDatabase();
conn.StringSetAsync(prefix + "A", "0");
conn.StringSetAsync(prefix + "B", "5");
conn.StringSetAsync(prefix + "C", "10");
var a = conn.ScriptEvaluateAsync(script, new RedisKey[] { prefix + "A" }, new RedisValue[] { 6 });
var b = conn.ScriptEvaluateAsync(script, new RedisKey[] { prefix + "B" }, new RedisValue[] { 6 });
var c = conn.ScriptEvaluateAsync(script, new RedisKey[] { prefix + "C" }, new RedisValue[] { 6 });
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(0, (long)conn.Wait(b)); // exit code when result would be negative
Assert.Equal(4, (long)conn.Wait(c)); // 10 - 6 = 4
Assert.Equal("0", conn.Wait(vals)[0]);
Assert.Equal("5", conn.Wait(vals)[1]);
Assert.Equal("4", conn.Wait(vals)[2]);
conn.StringSet(prefix + "A", "0", flags: CommandFlags.FireAndForget);
conn.StringSet(prefix + "B", "5", flags: CommandFlags.FireAndForget);
conn.StringSet(prefix + "C", "10", flags: CommandFlags.FireAndForget);
var a = conn.ScriptEvaluateAsync(script, new RedisKey[] { prefix + "A" }, new RedisValue[] { 6 }).ForAwait();
var b = conn.ScriptEvaluateAsync(script, new RedisKey[] { prefix + "B" }, new RedisValue[] { 6 }).ForAwait();
var c = conn.ScriptEvaluateAsync(script, new RedisKey[] { prefix + "C" }, new RedisValue[] { 6 }).ForAwait();
var vals = await conn.StringGetAsync(new RedisKey[] { prefix + "A", prefix + "B", prefix + "C" }).ForAwait();
Assert.Equal(1, (long)await a); // exit code when current val is non-positive
Assert.Equal(0, (long)await b); // exit code when result would be negative
Assert.Equal(4, (long)await c); // 10 - 6 = 4
Assert.Equal("0", vals[0]);
Assert.Equal("5", vals[1]);
Assert.Equal("4", vals[2]);
}
}
......@@ -106,7 +107,7 @@ public void HackyGetPerf()
{
var key = Me();
var conn = muxer.GetDatabase();
conn.StringSetAsync(key + "foo", "bar");
conn.StringSet(key + "foo", "bar", flags: CommandFlags.FireAndForget);
var result = (long)conn.ScriptEvaluate(@"
redis.call('psetex', KEYS[1], 60000, 'timing')
for i = 1,100000 do
......@@ -122,66 +123,66 @@ public void HackyGetPerf()
}
[Fact]
public void MultiIncrWithoutReplies()
public async Task MultiIncrWithoutReplies()
{
using (var muxer = GetScriptConn())
{
var conn = muxer.GetDatabase();
var prefix = Me();
// prime some initial values
conn.KeyDeleteAsync(new RedisKey[] { prefix + "a", prefix + "b", prefix + "c" });
conn.StringIncrementAsync(prefix + "b");
conn.StringIncrementAsync(prefix + "c");
conn.StringIncrementAsync(prefix + "c");
conn.KeyDelete(new RedisKey[] { prefix + "a", prefix + "b", prefix + "c" }, CommandFlags.FireAndForget);
conn.StringIncrement(prefix + "b", flags: CommandFlags.FireAndForget);
conn.StringIncrement(prefix + "c", flags: CommandFlags.FireAndForget);
conn.StringIncrement(prefix + "c", flags: CommandFlags.FireAndForget);
// run the script, passing "a", "b", "c", "c" to
// increment a & b by 1, c twice
var result = conn.ScriptEvaluateAsync(
"for i,key in ipairs(KEYS) do redis.call('incr', key) end",
new RedisKey[] { prefix + "a", prefix + "b", prefix + "c", prefix + "c" }, // <== aka "KEYS" in the script
null); // <== aka "ARGV" in the script
null).ForAwait(); // <== aka "ARGV" in the script
// check the incremented values
var a = conn.StringGetAsync(prefix + "a");
var b = conn.StringGetAsync(prefix + "b");
var c = conn.StringGetAsync(prefix + "c");
Assert.True(conn.Wait(result).IsNull, "result");
Assert.Equal(1, (long)conn.Wait(a));
Assert.Equal(2, (long)conn.Wait(b));
Assert.Equal(4, (long)conn.Wait(c));
var a = conn.StringGetAsync(prefix + "a").ForAwait();
var b = conn.StringGetAsync(prefix + "b").ForAwait();
var c = conn.StringGetAsync(prefix + "c").ForAwait();
Assert.True((await result).IsNull, "result");
Assert.Equal(1, (long)await a);
Assert.Equal(2, (long)await b);
Assert.Equal(4, (long)await c);
}
}
[Fact]
public void MultiIncrByWithoutReplies()
public async Task MultiIncrByWithoutReplies()
{
using (var muxer = GetScriptConn())
{
var conn = muxer.GetDatabase();
var prefix = Me();
// prime some initial values
conn.KeyDeleteAsync(new RedisKey[] { prefix + "a", prefix + "b", prefix + "c" });
conn.StringIncrementAsync(prefix + "b");
conn.StringIncrementAsync(prefix + "c");
conn.StringIncrementAsync(prefix + "c");
conn.KeyDelete(new RedisKey[] { prefix + "a", prefix + "b", prefix + "c" }, CommandFlags.FireAndForget);
conn.StringIncrement(prefix + "b", flags: CommandFlags.FireAndForget);
conn.StringIncrement(prefix + "c", flags: CommandFlags.FireAndForget);
conn.StringIncrement(prefix + "c", flags: CommandFlags.FireAndForget);
//run the script, passing "a", "b", "c" and 1,2,3
// increment a &b by 1, c twice
var result = conn.ScriptEvaluateAsync(
"for i,key in ipairs(KEYS) do redis.call('incrby', key, ARGV[i]) end",
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 }).ForAwait(); // <== aka "ARGV" in the script
// check the incremented values
var a = conn.StringGetAsync(prefix + "a");
var b = conn.StringGetAsync(prefix + "b");
var c = conn.StringGetAsync(prefix + "c");
Assert.True(conn.Wait(result).IsNull, "result");
Assert.Equal(1, (long)conn.Wait(a));
Assert.Equal(2, (long)conn.Wait(b));
Assert.Equal(4, (long)conn.Wait(c));
var a = conn.StringGetAsync(prefix + "a").ForAwait();
var b = conn.StringGetAsync(prefix + "b").ForAwait();
var c = conn.StringGetAsync(prefix + "c").ForAwait();
Assert.True((await result).IsNull, "result");
Assert.Equal(1, (long)await a);
Assert.Equal(2, (long)await b);
Assert.Equal(4, (long)await c);
}
}
......@@ -192,7 +193,7 @@ public void DisableStringInference()
{
var conn = muxer.GetDatabase();
var key = Me();
conn.StringSet(key, "bar");
conn.StringSet(key, "bar", flags: CommandFlags.FireAndForget);
var result = (byte[])conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { key });
Assert.Equal("bar", Encoding.UTF8.GetString(result));
}
......@@ -205,7 +206,7 @@ public void FlushDetection()
{
var conn = muxer.GetDatabase();
var key = Me();
conn.StringSet(key, "bar");
conn.StringSet(key, "bar", flags: CommandFlags.FireAndForget);
var result = (string)conn.ScriptEvaluate("return redis.call('get', KEYS[1])", new RedisKey[] { key }, null);
Assert.Equal("bar", result);
......@@ -270,24 +271,23 @@ public void NonAsciiScripts()
}
[Fact]
public void ScriptThrowsError()
public async Task ScriptThrowsError()
{
Assert.Throws<RedisServerException>(() =>
await Assert.ThrowsAsync<RedisServerException>(async () =>
{
using (var muxer = GetScriptConn())
{
var conn = muxer.GetDatabase();
var result = conn.ScriptEvaluateAsync("return redis.error_reply('oops')", null, null);
try
{
conn.Wait(result);
await conn.ScriptEvaluateAsync("return redis.error_reply('oops')", null, null).ForAwait();
}
catch (AggregateException ex)
{
throw ex.InnerExceptions[0];
}
}
});
}).ForAwait();
}
[Fact]
......@@ -297,7 +297,7 @@ public void ScriptThrowsErrorInsideTransaction()
{
var key = Me();
var conn = muxer.GetDatabase();
conn.KeyDeleteAsync(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
var beforeTran = (string)conn.StringGet(key);
Assert.Null(beforeTran);
var tran = conn.CreateTransaction();
......@@ -307,8 +307,8 @@ public void ScriptThrowsErrorInsideTransaction()
var c = tran.StringIncrementAsync(key);
var complete = tran.ExecuteAsync();
Assert.True(tran.Wait(complete));
Assert.True(a.IsCompleted);
Assert.True(muxer.Wait(complete));
Assert.True(a.IsCompleted, a.Status.ToString());
Assert.True(c.IsCompleted);
Assert.Equal(1L, a.Result);
Assert.Equal(2L, c.Result);
......@@ -325,13 +325,13 @@ public void ScriptThrowsErrorInsideTransaction()
}
[Fact]
public void ChangeDbInScript()
public async Task ChangeDbInScript()
{
using (var muxer = GetScriptConn())
{
var key = Me();
muxer.GetDatabase(1).StringSet(key, "db 1");
muxer.GetDatabase(2).StringSet(key, "db 2");
muxer.GetDatabase(1).StringSet(key, "db 1", flags: CommandFlags.FireAndForget);
muxer.GetDatabase(2).StringSet(key, "db 2", flags: CommandFlags.FireAndForget);
Log("Key: " + key);
var conn = muxer.GetDatabase(2);
......@@ -339,20 +339,20 @@ public void ChangeDbInScript()
return redis.call('get','" + key + "')", null, null);
var getResult = conn.StringGetAsync(key);
Assert.Equal("db 1", (string)conn.Wait(evalResult));
Assert.Equal("db 1", (string)await evalResult);
// now, our connection thought it was in db 2, but the script changed to db 1
Assert.Equal("db 2", conn.Wait(getResult));
Assert.Equal("db 2", await getResult);
}
}
[Fact]
public void ChangeDbInTranScript()
public async Task ChangeDbInTranScript()
{
using (var muxer = GetScriptConn())
{
var key = Me();
muxer.GetDatabase(1).StringSet(key, "db 1");
muxer.GetDatabase(2).StringSet(key, "db 2");
muxer.GetDatabase(1).StringSet(key, "db 1", flags: CommandFlags.FireAndForget);
muxer.GetDatabase(2).StringSet(key, "db 2", flags: CommandFlags.FireAndForget);
var conn = muxer.GetDatabase(2);
var tran = conn.CreateTransaction();
......@@ -361,9 +361,9 @@ public void ChangeDbInTranScript()
var getResult = tran.StringGetAsync(key);
Assert.True(tran.Execute());
Assert.Equal("db 1", (string)conn.Wait(evalResult));
Assert.Equal("db 1", (string)await evalResult);
// now, our connection thought it was in db 2, but the script changed to db 1
Assert.Equal("db 2", conn.Wait(getResult));
Assert.Equal("db 2", await getResult);
}
}
......@@ -376,8 +376,8 @@ public void TestBasicScripting()
RedisValue newId = Guid.NewGuid().ToString();
RedisKey key = Me();
var db = conn.GetDatabase();
db.KeyDelete(key);
db.HashSet(key, "id", 123);
db.KeyDelete(key, CommandFlags.FireAndForget);
db.HashSet(key, "id", 123, flags: CommandFlags.FireAndForget);
var wasSet = (bool)db.ScriptEvaluate("if redis.call('hexists', KEYS[1], 'UniqueId') then return redis.call('hset', KEYS[1], 'UniqueId', ARGV[1]) else return 0 end",
new RedisKey[] { key }, new RedisValue[] { newId });
......@@ -393,7 +393,7 @@ public void TestBasicScripting()
[Theory]
[InlineData(true)]
[InlineData(false)]
public void CheckLoads(bool async)
public async Task CheckLoads(bool async)
{
using (var conn0 = Create(allowAdmin: true))
using (var conn1 = Create(allowAdmin: true))
......@@ -425,17 +425,8 @@ public void CheckLoads(bool async)
if (async)
{
// now: fails the first time
try
{
db.Wait(db.ScriptEvaluateAsync(script));
Assert.True(false, "ScriptEvaluateAsync should fail");
}
catch (AggregateException ex)
{
Assert.Single(ex.InnerExceptions);
Assert.IsType<RedisServerException>(ex.InnerExceptions[0]);
Assert.Equal("NOSCRIPT No matching script. Please use EVAL.", ex.InnerExceptions[0].Message);
}
var ex = await Assert.ThrowsAsync<RedisServerException>(async () => await db.ScriptEvaluateAsync(script).ForAwait()).ForAwait();
Assert.Equal("NOSCRIPT No matching script. Please use EVAL.", ex.Message);
}
else
{
......@@ -472,7 +463,7 @@ public void CompareScriptToDirect()
RedisKey[] keys = new[] { key }; // script takes an array
// run via script
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
CollectGarbage();
var watch = Stopwatch.StartNew();
for (int i = 1; i < LOOP; i++) // the i=1 is to do all-but-one
......@@ -484,7 +475,7 @@ public void CompareScriptToDirect()
TimeSpan scriptTime = watch.Elapsed;
// run via raw op
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
CollectGarbage();
watch = Stopwatch.StartNew();
for (int i = 1; i < LOOP; i++) // the i=1 is to do all-but-one
......@@ -519,14 +510,14 @@ public void TestCallByHash()
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
RedisKey[] keys = { key };
string hexHash = string.Concat(hash.Select(x => x.ToString("X2")));
Assert.Equal("2BAB3B661081DB58BD2341920E0BA7CF5DC77B25", hexHash);
db.ScriptEvaluate(hexHash, keys);
db.ScriptEvaluate(hash, keys);
db.ScriptEvaluate(hexHash, keys, flags: CommandFlags.FireAndForget);
db.ScriptEvaluate(hash, keys, flags: CommandFlags.FireAndForget);
var count = (int)db.StringGet(keys)[0];
Assert.Equal(2, count);
......@@ -595,11 +586,11 @@ public void LuaScriptWithKeys()
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
var p = new { key = (RedisKey)key, value = 123 };
script.Evaluate(db, p);
script.Evaluate(db, p, flags: CommandFlags.FireAndForget);
var val = db.StringGet(key);
Assert.Equal(123, (int)val);
......@@ -627,11 +618,11 @@ public void NoInlineReplacement()
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
var p = new { key };
script.Evaluate(db, p);
script.Evaluate(db, p, flags: CommandFlags.FireAndForget);
var val = db.StringGet(key);
Assert.Equal("hello@example", val);
}
......@@ -710,11 +701,11 @@ public void LoadedLuaScriptWithKeys()
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
var p = new { key = (RedisKey)key, value = 123 };
prepared.Evaluate(db, p);
prepared.Evaluate(db, p, flags: CommandFlags.FireAndForget);
var val = db.StringGet(key);
Assert.Equal(123, (int)val);
......@@ -780,14 +771,14 @@ public void IDatabaseLuaScriptConvenienceMethods()
var script = LuaScript.Prepare(Script);
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.ScriptEvaluate(script, new { key = (RedisKey)key, value = "value" });
db.KeyDelete(key, CommandFlags.FireAndForget);
db.ScriptEvaluate(script, new { key = (RedisKey)key, value = "value" }, flags: CommandFlags.FireAndForget);
var val = db.StringGet(key);
Assert.Equal("value", val);
var prepared = script.Load(conn.GetServer(conn.GetEndPoints()[0]));
db.ScriptEvaluate(prepared, new { key = (RedisKey)(key + "2"), value = "value2" });
db.ScriptEvaluate(prepared, new { key = (RedisKey)(key + "2"), value = "value2" }, flags: CommandFlags.FireAndForget);
var val2 = db.StringGet(key + "2");
Assert.Equal("value2", val2);
}
......@@ -805,11 +796,11 @@ public void IServerLuaScriptConvenienceMethods()
var server = conn.GetServer(conn.GetEndPoints()[0]);
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
var prepared = server.ScriptLoad(script);
db.ScriptEvaluate(prepared, new { key = (RedisKey)key, value = "value3" });
db.ScriptEvaluate(prepared, new { key = (RedisKey)key, value = "value3" }, flags: CommandFlags.FireAndForget);
var val = db.StringGet(key);
Assert.Equal("value3", val);
}
......@@ -844,10 +835,10 @@ public void LuaScriptWithWrappedDatabase()
var db = conn.GetDatabase();
var wrappedDb = KeyspaceIsolation.DatabaseExtensions.WithKeyPrefix(db, "prefix-");
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
var prepared = LuaScript.Prepare(Script);
wrappedDb.ScriptEvaluate(prepared, new { key = (RedisKey)key, value = 123 });
wrappedDb.ScriptEvaluate(prepared, new { key = (RedisKey)key, value = 123 }, flags: CommandFlags.FireAndForget);
var val1 = wrappedDb.StringGet(key);
Assert.Equal(123, (int)val1);
......@@ -870,11 +861,11 @@ public void LoadedLuaScriptWithWrappedDatabase()
var db = conn.GetDatabase();
var wrappedDb = KeyspaceIsolation.DatabaseExtensions.WithKeyPrefix(db, "prefix2-");
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
var server = conn.GetServer(conn.GetEndPoints()[0]);
var prepared = LuaScript.Prepare(Script).Load(server);
wrappedDb.ScriptEvaluate(prepared, new { key = (RedisKey)key, value = 123 });
wrappedDb.ScriptEvaluate(prepared, new { key = (RedisKey)key, value = 123 }, flags: CommandFlags.FireAndForget);
var val1 = wrappedDb.StringGet(key);
Assert.Equal(123, (int)val1);
......
......@@ -19,15 +19,14 @@ public void SScan()
RedisKey key = Me();
var db = conn.GetDatabase();
db.KeyDelete(key);
int totalUnfiltered = 0, totalFiltered = 0;
for (int i = 0; i < 1000; i++)
for (int i = 1; i < 1001; i++)
{
db.SetAdd(key, i);
db.SetAdd(key, i, CommandFlags.FireAndForget);
totalUnfiltered += i;
if (i.ToString().Contains("3")) totalFiltered += i;
}
var unfilteredActual = db.SetScan(key).Select(x => (int)x).Sum();
Assert.Equal(totalUnfiltered, unfilteredActual);
if (server.Features.Scan)
......@@ -47,12 +46,12 @@ public async Task SetRemoveArgTests()
var key = Me();
RedisValue[] values = null;
Assert.Throws<ArgumentNullException>(() => db.SetRemove(key, values, CommandFlags.HighPriority));
await Assert.ThrowsAsync<ArgumentNullException>(async () => await db.SetRemoveAsync(key, values, CommandFlags.HighPriority).ForAwait()).ForAwait();
Assert.Throws<ArgumentNullException>(() => db.SetRemove(key, values));
await Assert.ThrowsAsync<ArgumentNullException>(async () => await db.SetRemoveAsync(key, values).ForAwait()).ForAwait();
values = new RedisValue[0];
Assert.Equal(0, db.SetRemove(key, values, CommandFlags.HighPriority));
Assert.Equal(0, await db.SetRemoveAsync(key, values, CommandFlags.HighPriority).ForAwait());
Assert.Equal(0, db.SetRemove(key, values));
Assert.Equal(0, await db.SetRemoveAsync(key, values).ForAwait());
}
}
......@@ -66,10 +65,10 @@ public void SetPopMulti_Multi()
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
for (int i = 1; i < 11; i++)
{
db.SetAdd(key, i);
db.SetAddAsync(key, i, CommandFlags.FireAndForget);
}
var random = db.SetPop(key);
......@@ -92,10 +91,10 @@ public void SetPopMulti_Single()
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
for (int i = 1; i < 11; i++)
{
db.SetAdd(key, i);
db.SetAdd(key, i, CommandFlags.FireAndForget);
}
var random = db.SetPop(key);
......@@ -121,10 +120,10 @@ public async Task SetPopMulti_Multi_Async()
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
for (int i = 1; i < 11; i++)
{
db.SetAdd(key, i);
db.SetAdd(key, i, CommandFlags.FireAndForget);
}
var random = await db.SetPopAsync(key).ForAwait();
......@@ -148,10 +147,10 @@ public async Task SetPopMulti_Single_Async()
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
for (int i = 1; i < 11; i++)
{
db.SetAdd(key, i);
db.SetAdd(key, i, CommandFlags.FireAndForget);
}
var random = await db.SetPopAsync(key).ForAwait();
......@@ -175,10 +174,10 @@ public async Task SetPopMulti_Zero_Async()
var db = conn.GetDatabase();
var key = Me();
db.KeyDelete(key);
db.KeyDelete(key, CommandFlags.FireAndForget);
for (int i = 1; i < 11; i++)
{
db.SetAdd(key, i);
db.SetAdd(key, i, CommandFlags.FireAndForget);
}
var t = db.SetPopAsync(key, count: 0);
......
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
......@@ -10,19 +11,19 @@ public class Strings : TestBase // https://redis.io/commands#string
public Strings(ITestOutputHelper output) : base(output) { }
[Fact]
public void Append()
public async Task Append()
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var server = GetServer(muxer);
var key = Me();
conn.KeyDelete(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
var l0 = server.Features.StringLength ? conn.StringLengthAsync(key) : null;
var s0 = conn.StringGetAsync(key);
conn.StringSetAsync(key, "abc");
conn.StringSet(key, "abc", flags: CommandFlags.FireAndForget);
var s1 = conn.StringGetAsync(key);
var l1 = server.Features.StringLength ? conn.StringLengthAsync(key) : null;
......@@ -30,51 +31,51 @@ public void Append()
var s3 = conn.StringGetAsync(key);
var l2 = server.Features.StringLength ? conn.StringLengthAsync(key) : null;
Assert.Null((string)conn.Wait(s0));
Assert.Equal("abc", conn.Wait(s1));
Assert.Equal(8, conn.Wait(result));
Assert.Equal("abcdefgh", conn.Wait(s3));
Assert.Null((string)await s0);
Assert.Equal("abc", await s1);
Assert.Equal(8, await result);
Assert.Equal("abcdefgh", await s3);
if (server.Features.StringLength)
{
Assert.Equal(0, conn.Wait(l0));
Assert.Equal(3, conn.Wait(l1));
Assert.Equal(8, conn.Wait(l2));
Assert.Equal(0, await l0);
Assert.Equal(3, await l1);
Assert.Equal(8, await l2);
}
}
}
[Fact]
public void Set()
public async Task Set()
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var key = Me();
conn.KeyDeleteAsync(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
conn.StringSetAsync(key, "abc");
conn.StringSet(key, "abc", flags: CommandFlags.FireAndForget);
var v1 = conn.StringGetAsync(key);
conn.StringSetAsync(key, Encode("def"));
conn.StringSet(key, Encode("def"), flags: CommandFlags.FireAndForget);
var v2 = conn.StringGetAsync(key);
Assert.Equal("abc", conn.Wait(v1));
Assert.Equal("def", Decode(conn.Wait(v2)));
Assert.Equal("abc", await v1);
Assert.Equal("def", Decode(await v2));
}
}
[Fact]
public void SetNotExists()
public async Task SetNotExists()
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var prefix = Me();
conn.KeyDeleteAsync(prefix + "1");
conn.KeyDeleteAsync(prefix + "2");
conn.KeyDeleteAsync(prefix + "3");
conn.StringSetAsync(prefix + "1", "abc");
conn.KeyDelete(prefix + "1", CommandFlags.FireAndForget);
conn.KeyDelete(prefix + "2", CommandFlags.FireAndForget);
conn.KeyDelete(prefix + "3", CommandFlags.FireAndForget);
conn.StringSet(prefix + "1", "abc", flags: CommandFlags.FireAndForget);
var x0 = conn.StringSetAsync(prefix + "1", "def", when: When.NotExists);
var x1 = conn.StringSetAsync(prefix + "1", Encode("def"), when: When.NotExists);
......@@ -85,18 +86,18 @@ public void SetNotExists()
var s2 = conn.StringGetAsync(prefix + "2");
var s3 = conn.StringGetAsync(prefix + "3");
Assert.False(conn.Wait(x0));
Assert.False(conn.Wait(x1));
Assert.True(conn.Wait(x2));
Assert.True(conn.Wait(x3));
Assert.Equal("abc", conn.Wait(s0));
Assert.Equal("def", conn.Wait(s2));
Assert.Equal("def", conn.Wait(s3));
Assert.False(await x0);
Assert.False(await x1);
Assert.True(await x2);
Assert.True(await x3);
Assert.Equal("abc", await s0);
Assert.Equal("def", await s2);
Assert.Equal("def", await s3);
}
}
[Fact]
public void Ranges()
public async Task Ranges()
{
using (var muxer = Create())
{
......@@ -104,28 +105,28 @@ public void Ranges()
var conn = muxer.GetDatabase();
var key = Me();
conn.KeyDeleteAsync(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
conn.StringSetAsync(key, "abcdefghi");
conn.StringSetRangeAsync(key, 2, "xy");
conn.StringSetRangeAsync(key, 4, Encode("z"));
conn.StringSet(key, "abcdefghi", flags: CommandFlags.FireAndForget);
conn.StringSetRange(key, 2, "xy", CommandFlags.FireAndForget);
conn.StringSetRange(key, 4, Encode("z"), CommandFlags.FireAndForget);
var val = conn.StringGetAsync(key);
Assert.Equal("abxyzfghi", conn.Wait(val));
Assert.Equal("abxyzfghi", await val);
}
}
[Fact]
public void IncrDecr()
public async Task IncrDecr()
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var key = Me();
conn.KeyDeleteAsync(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
conn.StringSetAsync(key, "2");
conn.StringSet(key, "2", flags: CommandFlags.FireAndForget);
var v1 = conn.StringIncrementAsync(key);
var v2 = conn.StringIncrementAsync(key, 5);
var v3 = conn.StringIncrementAsync(key, -2);
......@@ -134,27 +135,27 @@ public void IncrDecr()
var v6 = conn.StringDecrementAsync(key, -2);
var s = conn.StringGetAsync(key);
Assert.Equal(3, conn.Wait(v1));
Assert.Equal(8, conn.Wait(v2));
Assert.Equal(6, conn.Wait(v3));
Assert.Equal(5, conn.Wait(v4));
Assert.Equal(0, conn.Wait(v5));
Assert.Equal(2, conn.Wait(v6));
Assert.Equal("2", conn.Wait(s));
Assert.Equal(3, await v1);
Assert.Equal(8, await v2);
Assert.Equal(6, await v3);
Assert.Equal(5, await v4);
Assert.Equal(0, await v5);
Assert.Equal(2, await v6);
Assert.Equal("2", await s);
}
}
[Fact]
public void IncrDecrFloat()
public async Task IncrDecrFloat()
{
using (var muxer = Create())
{
Skip.IfMissingFeature(muxer, nameof(RedisFeatures.IncrementFloat), r => r.IncrementFloat);
var conn = muxer.GetDatabase();
var key = Me();
conn.KeyDelete(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
conn.StringSetAsync(key, "2");
conn.StringSet(key, "2", flags: CommandFlags.FireAndForget);
var v1 = conn.StringIncrementAsync(key, 1.1);
var v2 = conn.StringIncrementAsync(key, 5.0);
var v3 = conn.StringIncrementAsync(key, -2.0);
......@@ -164,36 +165,36 @@ public void IncrDecrFloat()
var s = conn.StringGetAsync(key);
Assert.Equal(3.1, conn.Wait(v1), 5);
Assert.Equal(8.1, conn.Wait(v2), 5);
Assert.Equal(6.1, conn.Wait(v3), 5);
Assert.Equal(5.1, conn.Wait(v4), 5);
Assert.Equal(0.1, conn.Wait(v5), 5);
Assert.Equal(2.1, conn.Wait(v6), 5);
Assert.Equal(2.1, (double)conn.Wait(s), 5);
Assert.Equal(3.1, await v1, 5);
Assert.Equal(8.1, await v2, 5);
Assert.Equal(6.1, await v3, 5);
Assert.Equal(5.1, await v4, 5);
Assert.Equal(0.1, await v5, 5);
Assert.Equal(2.1, await v6, 5);
Assert.Equal(2.1, (double)await s, 5);
}
}
[Fact]
public void GetRange()
public async Task GetRange()
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var key = Me();
conn.KeyDeleteAsync(key);
conn.KeyDelete(key, CommandFlags.FireAndForget);
conn.StringSetAsync(key, "abcdefghi");
conn.StringSet(key, "abcdefghi", flags: CommandFlags.FireAndForget);
var s = conn.StringGetRangeAsync(key, 2, 4);
var b = conn.StringGetRangeAsync(key, 2, 4);
Assert.Equal("cde", conn.Wait(s));
Assert.Equal("cde", Decode(conn.Wait(b)));
Assert.Equal("cde", await s);
Assert.Equal("cde", Decode(await b));
}
}
[Fact]
public void BitCount()
public async Task BitCount()
{
using (var muxer = Create())
{
......@@ -201,19 +202,19 @@ public void BitCount()
var conn = muxer.GetDatabase();
var key = Me();
conn.StringSetAsync(key, "foobar");
conn.StringSet(key, "foobar", flags: CommandFlags.FireAndForget);
var r1 = conn.StringBitCountAsync(key);
var r2 = conn.StringBitCountAsync(key, 0, 0);
var r3 = conn.StringBitCountAsync(key, 1, 1);
Assert.Equal(26, conn.Wait(r1));
Assert.Equal(4, conn.Wait(r2));
Assert.Equal(6, conn.Wait(r3));
Assert.Equal(26, await r1);
Assert.Equal(4, await r2);
Assert.Equal(6, await r3);
}
}
[Fact]
public void BitOp()
public async Task BitOp()
{
using (var muxer = Create())
{
......@@ -223,24 +224,24 @@ public void BitOp()
var key1 = prefix + "1";
var key2 = prefix + "2";
var key3 = prefix + "3";
conn.StringSetAsync(key1, new byte[] { 3 });
conn.StringSetAsync(key2, new byte[] { 6 });
conn.StringSetAsync(key3, new byte[] { 12 });
conn.StringSet(key1, new byte[] { 3 }, flags: CommandFlags.FireAndForget);
conn.StringSet(key2, new byte[] { 6 }, flags: CommandFlags.FireAndForget);
conn.StringSet(key3, new byte[] { 12 }, flags: CommandFlags.FireAndForget);
var len_and = conn.StringBitOperationAsync(Bitwise.And, "and", new RedisKey[] { key1, key2, key3 });
var len_or = conn.StringBitOperationAsync(Bitwise.Or, "or", new RedisKey[] { key1, key2, key3 });
var len_xor = conn.StringBitOperationAsync(Bitwise.Xor, "xor", new RedisKey[] { key1, key2, key3 });
var len_not = conn.StringBitOperationAsync(Bitwise.Not, "not", key1);
Assert.Equal(1, conn.Wait(len_and));
Assert.Equal(1, conn.Wait(len_or));
Assert.Equal(1, conn.Wait(len_xor));
Assert.Equal(1, conn.Wait(len_not));
Assert.Equal(1, await len_and);
Assert.Equal(1, await len_or);
Assert.Equal(1, await len_xor);
Assert.Equal(1, await len_not);
var r_and = ((byte[])conn.Wait(conn.StringGetAsync("and"))).Single();
var r_or = ((byte[])conn.Wait(conn.StringGetAsync("or"))).Single();
var r_xor = ((byte[])conn.Wait(conn.StringGetAsync("xor"))).Single();
var r_not = ((byte[])conn.Wait(conn.StringGetAsync("not"))).Single();
var r_and = ((byte[])(await conn.StringGetAsync("and").ForAwait())).Single();
var r_or = ((byte[])(await conn.StringGetAsync("or").ForAwait())).Single();
var r_xor = ((byte[])(await conn.StringGetAsync("xor").ForAwait())).Single();
var r_not = ((byte[])(await conn.StringGetAsync("not").ForAwait())).Single();
Assert.Equal((byte)(3 & 6 & 12), r_and);
Assert.Equal((byte)(3 | 6 | 12), r_or);
......@@ -250,15 +251,15 @@ public void BitOp()
}
[Fact]
public void RangeString()
public async Task RangeString()
{
using (var muxer = Create())
{
var conn = muxer.GetDatabase();
var key = Me();
conn.StringSetAsync(key, "hello world");
conn.StringSet(key, "hello world", flags: CommandFlags.FireAndForget);
var result = conn.StringGetRangeAsync(key, 2, 6);
Assert.Equal("llo w", conn.Wait(result));
Assert.Equal("llo w", await result);
}
}
......
......@@ -63,7 +63,7 @@ public void Dispose()
#if VERBOSE
protected const int AsyncOpsQty = 100, SyncOpsQty = 10;
#else
protected const int AsyncOpsQty = 100000, SyncOpsQty = 10000;
protected const int AsyncOpsQty = 10000, SyncOpsQty = 10000;
#endif
static TestBase()
......
......@@ -7,7 +7,7 @@ namespace StackExchange.Redis.Tests
{
public class WithKeyPrefixTests : TestBase
{
public WithKeyPrefixTests(ITestOutputHelper output) : base (output) { }
public WithKeyPrefixTests(ITestOutputHelper output) : base(output) { }
[Fact]
public void BlankPrefixYieldsSame_Bytes()
......@@ -34,7 +34,8 @@ public void BlankPrefixYieldsSame_String()
[Fact]
public void NullPrefixIsError_Bytes()
{
Assert.Throws<ArgumentNullException>(() => {
Assert.Throws<ArgumentNullException>(() =>
{
using (var conn = Create())
{
var raw = conn.GetDatabase();
......@@ -46,7 +47,8 @@ public void NullPrefixIsError_Bytes()
[Fact]
public void NullPrefixIsError_String()
{
Assert.Throws<ArgumentNullException>(() => {
Assert.Throws<ArgumentNullException>(() =>
{
using (var conn = Create())
{
var raw = conn.GetDatabase();
......@@ -61,7 +63,8 @@ public void NullPrefixIsError_String()
[InlineData(null)]
public void NullDatabaseIsError(string prefix)
{
Assert.Throws<ArgumentNullException>(() => {
Assert.Throws<ArgumentNullException>(() =>
{
IDatabase raw = null;
var prefixed = raw.WithKeyPrefix(prefix);
});
......@@ -70,7 +73,7 @@ public void NullDatabaseIsError(string prefix)
[Fact]
public void BasicSmokeTest()
{
using(var conn = Create())
using (var conn = Create())
{
var raw = conn.GetDatabase();
......@@ -82,11 +85,11 @@ public void BasicSmokeTest()
string s = Guid.NewGuid().ToString(), t = Guid.NewGuid().ToString();
foo.StringSet(key, s);
foo.StringSet(key, s, flags: CommandFlags.FireAndForget);
var val = (string)foo.StringGet(key);
Assert.Equal(s, val); // fooBasicSmokeTest
foobar.StringSet(key, t);
foobar.StringSet(key, t, flags: CommandFlags.FireAndForget);
val = (string)foobar.StringGet(key);
Assert.Equal(t, val); // foobarBasicSmokeTest
......@@ -104,18 +107,18 @@ public void BasicSmokeTest()
[Fact]
public void ConditionTest()
{
using(var conn = Create())
using (var conn = Create())
{
var raw = conn.GetDatabase();
var prefix = Me() + ":";
var foo = raw.WithKeyPrefix(prefix);
raw.KeyDelete(prefix + "abc");
raw.KeyDelete(prefix + "i");
raw.KeyDelete(prefix + "abc", CommandFlags.FireAndForget);
raw.KeyDelete(prefix + "i", CommandFlags.FireAndForget);
// execute while key exists
raw.StringSet(prefix + "abc", "def");
raw.StringSet(prefix + "abc", "def", flags: CommandFlags.FireAndForget);
var tran = foo.CreateTransaction();
tran.AddCondition(Condition.KeyExists("abc"));
tran.StringIncrementAsync("i");
......@@ -125,7 +128,7 @@ public void ConditionTest()
Assert.Equal(1, i);
// repeat without key
raw.KeyDelete(prefix + "abc");
raw.KeyDelete(prefix + "abc", CommandFlags.FireAndForget);
tran = foo.CreateTransaction();
tran.AddCondition(Condition.KeyExists("abc"));
tran.StringIncrementAsync("i");
......
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