diff --git a/.github/cluster.env b/.github/cluster.env new file mode 100644 index 00000000..0d2a2906 --- /dev/null +++ b/.github/cluster.env @@ -0,0 +1,2 @@ +REDIS_CLUSTER=127.0.0.1:16379 +NUM_REDIS_CLUSTER_NODES=6 \ No newline at end of file diff --git a/.github/docker-compose.yml b/.github/docker-compose.yml new file mode 100644 index 00000000..d56217a5 --- /dev/null +++ b/.github/docker-compose.yml @@ -0,0 +1,30 @@ +--- +version: "3.8" +services: + + redis-stack-7.2.0-RC3: + image: redis/redis-stack-server:7.2.0-RC3 + ports: ["6379:6379"] + + redis-stack-6.2.6: + image: redis/redis-stack-server:6.2.6-v9 + ports: ["6379:6379"] + + redis-stack-edge: + image: redis/redis-stack-server:edge + ports: ["6379:6379"] + + redis-stack-cluster: + container_name: redis-cluster + build: + context: . + dockerfile: dockers/Dockerfile.cluster + ports: + - 16379:16379 + - 16380:16380 + - 16381:16381 + - 16382:16382 + - 16383:16383 + - 16384:16384 + volumes: + - "./dockers/cluster.redis.conf:/redis.conf:ro" \ No newline at end of file diff --git a/.github/dockers/Dockerfile.cluster b/.github/dockers/Dockerfile.cluster new file mode 100644 index 00000000..3a0d7341 --- /dev/null +++ b/.github/dockers/Dockerfile.cluster @@ -0,0 +1,7 @@ +FROM redis/redis-stack-server:edge as rss + +COPY dockers/create_cluster.sh /create_cluster.sh +RUN ls -R /opt/redis-stack +RUN chmod a+x /create_cluster.sh + +ENTRYPOINT [ "/create_cluster.sh"] diff --git a/.github/dockers/cluster.redis.conf b/.github/dockers/cluster.redis.conf new file mode 100644 index 00000000..d4de46fb --- /dev/null +++ b/.github/dockers/cluster.redis.conf @@ -0,0 +1,8 @@ +protected-mode no +enable-debug-command yes +loadmodule /opt/redis-stack/lib/redisearch.so +loadmodule /opt/redis-stack/lib/redisgraph.so +loadmodule /opt/redis-stack/lib/redistimeseries.so +loadmodule /opt/redis-stack/lib/rejson.so +loadmodule /opt/redis-stack/lib/redisbloom.so +loadmodule /opt/redis-stack/lib/redisgears.so v8-plugin-path /opt/redis-stack/lib/libredisgears_v8_plugin.so diff --git a/.github/dockers/create_cluster.sh b/.github/dockers/create_cluster.sh new file mode 100644 index 00000000..da9a0cb6 --- /dev/null +++ b/.github/dockers/create_cluster.sh @@ -0,0 +1,47 @@ +#! /bin/bash + +mkdir -p /nodes +touch /nodes/nodemap +if [ -z ${START_PORT} ]; then + START_PORT=16379 +fi +if [ -z ${END_PORT} ]; then + END_PORT=16384 +fi +if [ ! -z "$3" ]; then + START_PORT=$2 + START_PORT=$3 +fi +echo "STARTING: ${START_PORT}" +echo "ENDING: ${END_PORT}" + +for PORT in `seq ${START_PORT} ${END_PORT}`; do + mkdir -p /nodes/$PORT + if [[ -e /redis.conf ]]; then + cp /redis.conf /nodes/$PORT/redis.conf + else + touch /nodes/$PORT/redis.conf + fi + cat << EOF >> /nodes/$PORT/redis.conf +port ${PORT} +cluster-enabled yes +daemonize yes +logfile /redis.log +dir /nodes/$PORT +EOF + + set -x + /opt/redis-stack/bin/redis-server /nodes/$PORT/redis.conf + sleep 1 + if [ $? -ne 0 ]; then + echo "Redis failed to start, exiting." + continue + fi + echo 127.0.0.1:$PORT >> /nodes/nodemap +done +if [ -z "${REDIS_PASSWORD}" ]; then + echo yes | /opt/redis-stack/bin/redis-cli --cluster create `seq -f 127.0.0.1:%g ${START_PORT} ${END_PORT}` --cluster-replicas 1 +else + echo yes | opt/redis-stack/bin/redis-cli -a ${REDIS_PASSWORD} --cluster create `seq -f 127.0.0.1:%g ${START_PORT} ${END_PORT}` --cluster-replicas 1 +fi +tail -f /redis.log diff --git a/.github/standalone.env b/.github/standalone.env new file mode 100644 index 00000000..e0cfd098 --- /dev/null +++ b/.github/standalone.env @@ -0,0 +1 @@ +REDIS=localhost:6379 \ No newline at end of file diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 02e9f818..c715948c 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -12,61 +12,65 @@ on: - cron: "0 1 * * *" jobs: - build_and_Test: - name: Test [redis-stack ${{matrix.redis-stack-version}}] - runs-on: ubuntu-latest + dotnet_6_cluster: + name: .NET 6 on [redis-stack cluster] + uses: ./.github/workflows/reusable.yml + with: + redis_stack_type: cluster + dotnet_version: 6.0.x + clr_version: net6.0 + dotenv_file: .github/cluster.env + secrets: inherit + + dotnet_6: + name: .NET 6 on [redis-stack ${{matrix.redis-stack-type}}] + uses: ./.github/workflows/reusable.yml strategy: fail-fast: false + max-parallel: 5 matrix: - redis-stack-version: ["6.2.6-v9", "7.2.0-RC3", "edge"] - env: - USER_NAME: ${{ secrets.USER_NAME }} - PASSWORD: ${{ secrets.PASSWORD }} - ENDPOINT: ${{ secrets.ENDPOINT }} - REDIS_VERSION: ${{ matrix.redis-stack-version }} - steps: - - uses: actions/checkout@v3 - - name: .NET Core 6 - uses: actions/setup-dotnet@v2 - with: - dotnet-version: '6.0.x' - - name: .NET Core 7 - uses: actions/setup-dotnet@v2 - with: - dotnet-version: '7.0.x' - - name: run redis-stack-server docker - run: docker run -p 6379:6379 -d redis/redis-stack-server:${{matrix.redis-stack-version}} - - name: Restore dependencies - run: dotnet restore - - name: Build - run: dotnet build --no-restore /p:ContinuousIntegrationBuild=true - - name: Test - run: | - echo "${{secrets.REDIS_CA_PEM}}" > tests/NRedisStack.Tests/bin/Debug/net6.0/redis_ca.pem - echo "${{secrets.REDIS_USER_CRT}}" > tests/NRedisStack.Tests/bin/Debug/net6.0/redis_user.crt - echo "${{secrets.REDIS_USER_PRIVATE_KEY}}" > tests/NRedisStack.Tests/bin/Debug/net6.0/redis_user_private.key - ls -R - dotnet test -f net6.0 --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover - - name: Test - run: | - echo "${{secrets.REDIS_CA_PEM}}" > tests/NRedisStack.Tests/bin/Debug/net7.0/redis_ca.pem - echo "${{secrets.REDIS_USER_CRT}}" > tests/NRedisStack.Tests/bin/Debug/net7.0/redis_user.crt - echo "${{secrets.REDIS_USER_PRIVATE_KEY}}" > tests/NRedisStack.Tests/bin/Debug/net7.0/redis_user_private.key - ls -R - dotnet test -f net7.0 --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover - - name: Codecov - uses: codecov/codecov-action@v3 - with: - token: ${{secrets.CODECOV_TOKEN}} - verbose: true - - name: Build - run: dotnet pack -c Release + redis-stack-type: ['edge', '6.2.6', '7.2.0-RC3'] + with: + redis_stack_type: ${{matrix.redis-stack-type}} + dotnet_version: 6.0.x + clr_version: net6.0 + dotenv_file: .github/standalone.env + secrets: inherit + + dotnet_7_cluster: + name: .NET 7 on [redis-stack cluster] + uses: ./.github/workflows/reusable.yml + with: + redis_stack_type: cluster + dotnet_version: 7.0.x + clr_version: net7.0 + dotenv_file: .github/cluster.env + secrets: inherit + + dotnet_7: + name: .NET 7 on [redis-stack ${{matrix.redis-stack-type}}] + uses: ./.github/workflows/reusable.yml + strategy: + fail-fast: false + max-parallel: 5 + matrix: + redis-stack-type: ['edge', '6.2.6', '7.2.0-RC3'] + with: + redis_stack_type: ${{matrix.redis-stack-type}} + dotnet_version: 7.0.x + clr_version: net7.0 + dotenv_file: .github/standalone.env + secrets: inherit build_and_test_windows: name: Windows Test ${{matrix.redis-stack-version}} runs-on: windows-latest + strategy: + fail-fast: false + matrix: + redis-stack-version: ['6.2.6-v9', '7.2.0-RC3'] env: - redis_stack_version: 6.2.6-v7 + redis_stack_version: ${{matrix.redis-stack-version}} USER_NAME: ${{ secrets.USER_NAME }} PASSWORD: ${{ secrets.PASSWORD }} ENDPOINT: ${{ secrets.ENDPOINT }} diff --git a/.github/workflows/reusable.yml b/.github/workflows/reusable.yml new file mode 100644 index 00000000..0d1a63ac --- /dev/null +++ b/.github/workflows/reusable.yml @@ -0,0 +1,72 @@ +name: Build and Test +on: + workflow_call: + inputs: + + redis_stack_type: + required: true + type: string + + dotnet_version: + required: true + type: string + + clr_version: + required: true + type: string + + dotenv_file: + required: true + type: string +jobs: + + build_and_test: + name: Test + runs-on: ubuntu-latest + + env: + USER_NAME: ${{ secrets.USER_NAME }} + PASSWORD: ${{ secrets.PASSWORD }} + ENDPOINT: ${{ secrets.ENDPOINT }} + steps: + + - uses: actions/checkout@v3 + + - name: .NET Core 6 + uses: actions/setup-dotnet@v2 + with: + dotnet-version: '6.0.x' + + - name: .NET Core 7 + uses: actions/setup-dotnet@v2 + with: + dotnet-version: '7.0.x' + + - name: run redis-stack-server docker + working-directory: .github + run: docker-compose up -d redis-stack-${{inputs.redis_stack_type}} + + - name: set variables in dotenv + uses: c-py/action-dotenv-to-setenv@v2 + with: + env-file: ${{inputs.dotenv_file}} + + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --no-restore /p:ContinuousIntegrationBuild=true + - name: Test + run: | + echo "${{secrets.REDIS_CA_PEM}}" > tests/NRedisStack.Tests/bin/Debug/net6.0/redis_ca.pem + echo "${{secrets.REDIS_USER_CRT}}" > tests/NRedisStack.Tests/bin/Debug/net6.0/redis_user.crt + echo "${{secrets.REDIS_USER_PRIVATE_KEY}}" > tests/NRedisStack.Tests/bin/Debug/net6.0/redis_user_private.key + ls -R + dotnet test -f ${{inputs.clr_version}} --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover + - name: Codecov + uses: codecov/codecov-action@v3 + with: + token: ${{secrets.CODECOV_TOKEN}} + verbose: true + - name: Build + run: dotnet pack -c Release + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e3b2a3ba..9eaade76 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -112,6 +112,15 @@ e.g: ```bash dotnet test --environment="REDIS=172.17.0.1:6379" ``` + +To run your tests against an oss cluster: +```bash +dotnet test --environment "REDIS_CLUSTER=" --environment "NUM_REDIS_CLUSTER_NODES=" +``` +e.g. : +```bash +dotnet test --environment "REDIS_CLUSTER=127.0.0.1:16379" --environment "NUM_REDIS_CLUSTER_NODES=6" +``` ## How to Report a Bug ### Security Vulnerabilities diff --git a/src/NRedisStack/Auxiliary.cs b/src/NRedisStack/Auxiliary.cs index 2dcde416..75f1fd5d 100644 --- a/src/NRedisStack/Auxiliary.cs +++ b/src/NRedisStack/Auxiliary.cs @@ -35,5 +35,53 @@ public async static Task ExecuteAsync(this IDatabaseAsync db, Seria { return await db.ExecuteAsync(command.Command, command.Args); } + + public static List ExecuteBroadcast(this IDatabaseAsync db, string command) + => db.ExecuteBroadcast(new SerializedCommand(command)); + + public static List ExecuteBroadcast(this IDatabaseAsync db, SerializedCommand command) + { + var redis = db.Multiplexer; + var endpoints = redis.GetEndPoints(); + var results = new List(endpoints.Length); + + foreach (var endPoint in endpoints) + { + var server = redis.GetServer(endPoint); + + if (server.IsReplica) + { + continue; // Skip replica nodes + } + // Send your command to the master node + + results.Add(server.Multiplexer.GetDatabase().Execute(command)); + } + return results; + } + + public async static Task> ExecuteBroadcastAsync(this IDatabaseAsync db, string command) + => await db.ExecuteBroadcastAsync(new SerializedCommand(command)); + + public async static Task> ExecuteBroadcastAsync(this IDatabaseAsync db, SerializedCommand command) + { + var redis = db.Multiplexer; + var endpoints = redis.GetEndPoints(); + var results = new List(endpoints.Length); + + foreach (var endPoint in endpoints) + { + var server = redis.GetServer(endPoint); + + if (server.IsReplica) + { + continue; // Skip replica nodes + } + // Send your command to the master node + + results.Add(await server.Multiplexer.GetDatabase().ExecuteAsync(command)); + } + return results; + } } } \ No newline at end of file diff --git a/tests/Doc/Doc.csproj b/tests/Doc/Doc.csproj index 56fdeec0..0958f541 100644 --- a/tests/Doc/Doc.csproj +++ b/tests/Doc/Doc.csproj @@ -20,5 +20,6 @@ + \ No newline at end of file diff --git a/tests/Doc/HashExample.cs b/tests/Doc/HashExample.cs index 913d3a0a..309d0374 100644 --- a/tests/Doc/HashExample.cs +++ b/tests/Doc/HashExample.cs @@ -1,5 +1,6 @@ // EXAMPLE: hash_tutorial // HIDE_START +using NRedisStack.Tests; using StackExchange.Redis; //REMOVE_START @@ -8,7 +9,7 @@ namespace NRedisStack.Doc; //REMOVE_END public class HashExample { - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void run() { var muxer = ConnectionMultiplexer.Connect("localhost:6379"); diff --git a/tests/Doc/SearchQuickstartExample.cs b/tests/Doc/SearchQuickstartExample.cs index 142ab1b1..7ced7c4f 100644 --- a/tests/Doc/SearchQuickstartExample.cs +++ b/tests/Doc/SearchQuickstartExample.cs @@ -3,6 +3,7 @@ using NRedisStack.Search; using NRedisStack.Search.Aggregation; using NRedisStack.Search.Literals.Enums; +using NRedisStack.Tests; using StackExchange.Redis; // REMOVE_START @@ -11,7 +12,7 @@ namespace NRedisStack.Doc; // REMOVE_END public class SearchQuickstartExample { - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void run() { // STEP_START connect @@ -21,7 +22,7 @@ public void run() var json = db.JSON(); // STEP_END - // REMOVE_START + // REMOVE_START try { ft.DropIndex("idx:bicycle"); @@ -41,7 +42,7 @@ public void run() "for the smallest of tikes! This is the tiniest " + "kids’ pedal bike on the market available without" + " a coaster brake, the Jigger is the vehicle of " + - "choice for the rare tenacious little rider " + + "choice for the rare tenacious little rider " + "raring to go.", Condition = "used" }; diff --git a/tests/Doc/SetGetExample.cs b/tests/Doc/SetGetExample.cs index 6b381de0..9f92fa35 100644 --- a/tests/Doc/SetGetExample.cs +++ b/tests/Doc/SetGetExample.cs @@ -1,6 +1,7 @@ // EXAMPLE: set_and_get // HIDE_START using System; +using NRedisStack.Tests; using StackExchange.Redis; //REMOVE_START @@ -9,7 +10,7 @@ namespace NRedisStack.Doc; //REMOVE_END public class SetGetExample { - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void run() { var redis = ConnectionMultiplexer.Connect("localhost:6379"); @@ -17,7 +18,7 @@ public void run() //HIDE_END bool status = db.StringSet("bike:1", "Process 134"); - + if (status) Console.WriteLine("Successfully added a bike."); diff --git a/tests/NRedisStack.Tests/AbstractNRedisStackTest.cs b/tests/NRedisStack.Tests/AbstractNRedisStackTest.cs index b84d259a..3de0168b 100644 --- a/tests/NRedisStack.Tests/AbstractNRedisStackTest.cs +++ b/tests/NRedisStack.Tests/AbstractNRedisStackTest.cs @@ -43,10 +43,16 @@ protected internal static List ReverseData(List Task.CompletedTask; + public void Dispose() + { + redisFixture.Redis.GetDatabase().ExecuteBroadcast("FLUSHALL"); + } + public async Task DisposeAsync() { var redis = redisFixture.Redis.GetDatabase(); - await redis.KeyDeleteAsync(keyNames.Select(i => (RedisKey)i).ToArray()); + // await redis.KeyDeleteAsync(keyNames.Select(i => (RedisKey)i).ToArray()); + await redis.ExecuteBroadcastAsync("FLUSHALL"); } } } \ No newline at end of file diff --git a/tests/NRedisStack.Tests/Bloom/BloomTests.cs b/tests/NRedisStack.Tests/Bloom/BloomTests.cs index b4909b55..2198f03b 100644 --- a/tests/NRedisStack.Tests/Bloom/BloomTests.cs +++ b/tests/NRedisStack.Tests/Bloom/BloomTests.cs @@ -9,11 +9,6 @@ public class BloomTests : AbstractNRedisStackTest, IDisposable private readonly string key = "BLOOM_TESTS"; public BloomTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - [Fact] public void TestReserveBasic() { diff --git a/tests/NRedisStack.Tests/CountMinSketch/CmsTests.cs b/tests/NRedisStack.Tests/CountMinSketch/CmsTests.cs index 3929764e..816b0385 100644 --- a/tests/NRedisStack.Tests/CountMinSketch/CmsTests.cs +++ b/tests/NRedisStack.Tests/CountMinSketch/CmsTests.cs @@ -9,10 +9,6 @@ public class CmsTests : AbstractNRedisStackTest, IDisposable private readonly string key = "CMS_TESTS"; public CmsTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } [Fact] public void TestInitByDim() @@ -215,7 +211,7 @@ public async Task TestQueryAsync() Assert.Equal(new long[] { 10, 15 }, resp); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMerge() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -264,7 +260,7 @@ public void TestMerge() } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMergeAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/CuckooFilter/CuckooTests.cs b/tests/NRedisStack.Tests/CuckooFilter/CuckooTests.cs index 685b5276..2cc62157 100644 --- a/tests/NRedisStack.Tests/CuckooFilter/CuckooTests.cs +++ b/tests/NRedisStack.Tests/CuckooFilter/CuckooTests.cs @@ -9,11 +9,6 @@ public class CuckooTests : AbstractNRedisStackTest, IDisposable private readonly string key = "CUCKOO_TESTS"; public CuckooTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - [Fact] public void TestReserveBasic() { diff --git a/tests/NRedisStack.Tests/Examples/ExampleTests.cs b/tests/NRedisStack.Tests/Examples/ExampleTests.cs index 49f98060..de9a6971 100644 --- a/tests/NRedisStack.Tests/Examples/ExampleTests.cs +++ b/tests/NRedisStack.Tests/Examples/ExampleTests.cs @@ -26,12 +26,7 @@ public ExampleTests(RedisFixture redisFixture, ITestOutputHelper testOutputHelpe this.testOutputHelper = testOutputHelper; } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void HSETandSearch() { // Connect to the Redis server @@ -132,7 +127,7 @@ public void PipelineExample() Assert.Equal(expected, result.ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task JsonWithSearchPipeline() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -176,7 +171,7 @@ public async Task JsonWithSearchPipeline() // Assert.Equal("person:01", firstPerson?.Id); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task PipelineWithAsync() { // Connect to the Redis server @@ -234,7 +229,7 @@ public async Task PipelineWithAsync() Assert.Equal("temp:JLM", respons[0].key); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TransactionExample() { // Connect to the Redis server @@ -278,7 +273,7 @@ public async Task TransactionExample() Assert.Equal("[1200]", totalAmtOfShachar.Result.ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestJsonConvert() { // ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); @@ -960,7 +955,7 @@ public void AdvancedJsonExamplesTest() Assert.Equal(expected, res.ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void BasicQueryOperationsTest() { // ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); @@ -1120,7 +1115,7 @@ public void BasicQueryOperationsTest() Assert.Equal(expected, res[0].ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void AdvancedQueryOperationsTest() { // ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); diff --git a/tests/NRedisStack.Tests/Gears/GearsTests.cs b/tests/NRedisStack.Tests/Gears/GearsTests.cs index 1cad0b15..16074dbf 100644 --- a/tests/NRedisStack.Tests/Gears/GearsTests.cs +++ b/tests/NRedisStack.Tests/Gears/GearsTests.cs @@ -5,29 +5,25 @@ namespace NRedisStack.Tests.Gears; public class GearsTests : AbstractNRedisStackTest, IDisposable { - private readonly string key = "BLOOM_TESTS"; + private readonly string key = "GEARS_TESTS"; public GearsTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - - - [SkipIfRedisVersion(Comparison.LessThan, "7.1.242")] + [SkipIfRedis(Comparison.LessThan, "7.1.242")] public void TestTFunctionLoadDelete() { IDatabase db = redisFixture.Redis.GetDatabase(); + db.ExecuteBroadcast("REDISGEARS_2.REFRESHCLUSTER"); db.Execute("FLUSHALL"); Assert.True(db.TFunctionLoad(GenerateLibCode("lib"))); Assert.True(db.TFunctionDelete("lib")); } - [SkipIfRedisVersion(Comparison.LessThan, "7.1.242")] + [SkipIfRedis(Comparison.LessThan, "7.1.242")] public async Task TestTFunctionLoadDeleteAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); + db.ExecuteBroadcast("REDISGEARS_2.REFRESHCLUSTER"); db.Execute("FLUSHALL"); TryDeleteLib(db, "lib", "lib1", "lib2", "lib3"); @@ -35,10 +31,11 @@ public async Task TestTFunctionLoadDeleteAsync() Assert.True(await db.TFunctionDeleteAsync("lib")); } - [SkipIfRedisVersion(Comparison.LessThan, "7.1.242")] + [SkipIfRedis(Comparison.LessThan, "7.1.242")] public void TestTFunctionList() { IDatabase db = redisFixture.Redis.GetDatabase(); + db.ExecuteBroadcast("REDISGEARS_2.REFRESHCLUSTER"); db.Execute("FLUSHALL"); TryDeleteLib(db, "lib", "lib1", "lib2", "lib3"); @@ -66,10 +63,11 @@ public void TestTFunctionList() Assert.True(db.TFunctionDelete("lib3")); } - [SkipIfRedisVersion(Comparison.LessThan, "7.1.242")] + [SkipIfRedis(Comparison.LessThan, "7.1.242")] public async Task TestTFunctionListAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); + db.ExecuteBroadcast("REDISGEARS_2.REFRESHCLUSTER"); db.Execute("FLUSHALL"); TryDeleteLib(db, "lib", "lib1", "lib2", "lib3"); @@ -95,10 +93,11 @@ public async Task TestTFunctionListAsync() Assert.True(await db.TFunctionDeleteAsync("lib3")); } - [SkipIfRedisVersion(Comparison.LessThan, "7.1.242")] + [SkipIfRedis(Comparison.LessThan, "7.1.242")] public void TestTFCall() { IDatabase db = redisFixture.Redis.GetDatabase(); + db.ExecuteBroadcast("REDISGEARS_2.REFRESHCLUSTER"); db.Execute("FLUSHALL"); TryDeleteLib(db, "lib", "lib1", "lib2", "lib3"); @@ -109,10 +108,11 @@ public void TestTFCall() Assert.True(db.TFunctionDelete("lib")); } - [SkipIfRedisVersion(Comparison.LessThan, "7.1.242")] + [SkipIfRedis(Comparison.LessThan, "7.1.242")] public async Task TestTFCallAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); + db.ExecuteBroadcast("REDISGEARS_2.REFRESHCLUSTER"); db.Execute("FLUSHALL"); TryDeleteLib(db, "lib", "lib1", "lib2", "lib3"); @@ -123,7 +123,7 @@ public async Task TestTFCallAsync() Assert.True(await db.TFunctionDeleteAsync("lib")); } - [SkipIfRedisVersion(Comparison.LessThan, "7.1.242")] + [SkipIfRedis(Comparison.LessThan, "7.1.242")] public void TestGearsCommandBuilder() { // TFunctionLoad: @@ -187,12 +187,14 @@ public void TestGearsCommandBuilder() private static void TryDeleteLib(IDatabase db, params string[] libNames) { - try + foreach (var libName in libNames) { - foreach(var libName in libNames) - db.TFunctionDelete(libName); + try + { + db.ExecuteBroadcast(GearsCommandBuilder.TFunctionDelete(libName)); + } + catch (RedisServerException) { } // ignore } - catch (RedisServerException) { } } private static string GenerateLibCode(string libName) diff --git a/tests/NRedisStack.Tests/Graph/GraphTests.cs b/tests/NRedisStack.Tests/Graph/GraphTests.cs index 05df345f..28a742cf 100644 --- a/tests/NRedisStack.Tests/Graph/GraphTests.cs +++ b/tests/NRedisStack.Tests/Graph/GraphTests.cs @@ -11,14 +11,9 @@ public class GraphTests : AbstractNRedisStackTest, IDisposable private readonly string key = "GRAPH_TESTS"; public GraphTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - #region SyncTests - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestReserveBasic() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -26,7 +21,7 @@ public void TestReserveBasic() var graph = db.GRAPH(); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestCreateNode() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -49,7 +44,7 @@ public void TestCreateNode() graph.Delete("social"); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestCreateLabeledNode() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -70,7 +65,7 @@ public void TestCreateLabeledNode() // Assert.False(resultSet..iterator().MoveNext()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestConnectNodes() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -97,7 +92,7 @@ public void TestConnectNodes() Assert.Equal(0, resultSet.Count); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestDeleteNodes() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -144,7 +139,7 @@ public void TestDeleteNodes() // Assert.False(deleteResult.iterator().MoveNext()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestDeleteRelationship() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -174,7 +169,7 @@ public void TestDeleteRelationship() // Assert.False(deleteResult.iterator().MoveNext()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestIndex() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -201,7 +196,7 @@ public void TestIndex() Assert.Equal(1, deleteExistingIndexResult.Statistics.IndicesDeleted); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestHeader() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -232,7 +227,7 @@ public void TestHeader() Assert.Equal("a.age", schemaNames[2]); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestRecord() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -357,7 +352,7 @@ public void TestRecord() } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestAdditionToProcedures() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -437,7 +432,7 @@ record = iterator.Current; Assert.Equal(expectedEdge.ToString(), record.Values[1].ToString()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestEscapedQuery() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -456,7 +451,7 @@ public void TestEscapedQuery() Assert.NotNull(graph.Query("social", "MATCH (n) where n.s1='S\"' RETURN n")); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestArraySupport() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -556,7 +551,7 @@ record = iterator.Current; } } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestPath() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -608,7 +603,7 @@ public void TestPath() } } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestNullGraphEntities() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -662,7 +657,7 @@ record = resultSet.Skip(1).First(); Assert.Null(record.Values[0]); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void Test64BitNumber() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -680,7 +675,7 @@ public void Test64BitNumber() } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestCachedExecution() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -711,7 +706,7 @@ public void TestCachedExecution() Assert.True(resultSet.Statistics.CachedExecution); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestMapDataType() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -741,7 +736,7 @@ public void TestMapDataType() Assert.Equal((object)expected, actual); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestGeoPointLatLon() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -755,7 +750,7 @@ public void TestGeoPointLatLon() AssertTestGeoPoint(graph); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestGeoPointLonLat() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -784,7 +779,7 @@ private void AssertTestGeoPoint(IGraphCommands graph) Assert.Equal((object)(point), property); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestPoint() { var point = new Point(30.27822306, -97.75134723); @@ -796,7 +791,7 @@ public void TestPoint() Assert.Throws(() => new Point(new List { 1, 2, 3 })); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void timeoutArgument() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -810,7 +805,7 @@ public void timeoutArgument() Assert.Equal(100l, (long)r.Values[0]); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestCachedExecutionReadOnly() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -843,7 +838,7 @@ public void TestCachedExecutionReadOnly() Assert.True(resultSet.Statistics.CachedExecution); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestSimpleReadOnly() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -858,7 +853,7 @@ public void TestSimpleReadOnly() Assert.Equal("30", r.Values[0].ToString()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestProfile() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -876,7 +871,7 @@ public void TestProfile() } } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestExplain() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -894,7 +889,7 @@ public void TestExplain() } } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestSlowlog() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -909,7 +904,7 @@ public void TestSlowlog() slowlogs.ForEach(sl => sl.ForEach(s => Assert.NotNull(s))); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestList() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -922,7 +917,7 @@ public void TestList() Assert.Equal(new List() { "social" }, graph.List()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestConfig() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -942,7 +937,7 @@ public void TestConfig() graph.ConfigSet(name, existingValue != null ? existingValue.ToString() : -1); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestModulePrefixs() { IDatabase db1 = redisFixture.Redis.GetDatabase(); @@ -954,7 +949,7 @@ public void TestModulePrefixs() Assert.NotEqual(graph1.GetHashCode(), graph2.GetHashCode()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestCallProcedureDbLabels() { var db = redisFixture.Redis.GetDatabase(); @@ -975,7 +970,7 @@ public void TestCallProcedureDbLabels() Assert.Single(labels1); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestCallProcedureReadOnly() { var db = redisFixture.Redis.GetDatabase(); @@ -1001,7 +996,7 @@ public void TestCallProcedureReadOnly() #region AsyncTests - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestReserveBasicAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1009,7 +1004,7 @@ public async Task TestReserveBasicAsync() var graph = db.GRAPH(); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestCreateNodeAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1032,7 +1027,7 @@ public async Task TestCreateNodeAsync() await graph.DeleteAsync("social"); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestCreateLabeledNodeAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1053,7 +1048,7 @@ public async Task TestCreateLabeledNodeAsync() // Assert.False(resultSet..iterator().MoveNext()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestConnectNodesAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1081,7 +1076,7 @@ public async Task TestConnectNodesAsync() // Assert.False(resultSet.GetEnumerator().MoveNext()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestDeleteNodesAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1128,7 +1123,7 @@ public async Task TestDeleteNodesAsync() // Assert.False(deleteResult.iterator().MoveNext()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestDeleteRelationshipAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1158,7 +1153,7 @@ public async Task TestDeleteRelationshipAsync() // Assert.False(deleteResult.iterator().MoveNext()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestIndexAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1185,7 +1180,7 @@ public async Task TestIndexAsync() Assert.Equal(1, deleteExistingIndexResult.Statistics.IndicesDeleted); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestHeaderAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1216,7 +1211,7 @@ public async Task TestHeaderAsync() Assert.Equal("a.age", schemaNames[2]); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestRecordAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1343,7 +1338,7 @@ await graph.QueryAsync("social", "MATCH (a:person), (b:person) WHERE (a.name = ' } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestAdditionToProceduresAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1423,7 +1418,7 @@ record = iterator.Current; Assert.Equal(expectedEdge.ToString(), record.Values[1].ToString()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestEscapedQueryAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1442,7 +1437,7 @@ public async Task TestEscapedQueryAsync() Assert.NotNull(await graph.QueryAsync("social", "MATCH (n) where n.s1='S\"' RETURN n")); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestArraySupportAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1542,7 +1537,7 @@ record = iterator.Current; } } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestPathAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1594,7 +1589,7 @@ public async Task TestPathAsync() } } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestNullGraphEntitiesAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1648,7 +1643,7 @@ record = resultSet.Skip(1).First(); Assert.Null(record.Values[0]); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task Test64bitnumberAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1666,7 +1661,7 @@ public async Task Test64bitnumberAsync() } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestCachedExecutionAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1697,7 +1692,7 @@ public async Task TestCachedExecutionAsync() Assert.True(resultSet.Statistics.CachedExecution); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestMapDataTypeAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1727,7 +1722,7 @@ public async Task TestMapDataTypeAsync() Assert.Equal((object)expected, actual); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestGeoPointLatLonAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1741,7 +1736,7 @@ public async Task TestGeoPointLatLonAsync() AssertTestGeoPoint(graph); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestGeoPointLonLatAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1769,7 +1764,7 @@ private async Task AssertTestGeoPointAsync(GraphCommands graph) Assert.Equal((object)(new Point(30.27822306, -97.75134723)), property); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task timeoutArgumentAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1783,7 +1778,7 @@ public async Task timeoutArgumentAsync() Assert.Equal(100l, (long)r.Values[0]); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestCachedExecutionReadOnlyAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1816,7 +1811,7 @@ public async Task TestCachedExecutionReadOnlyAsync() Assert.True(resultSet.Statistics.CachedExecution); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestSimpleReadOnlyAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1831,7 +1826,7 @@ public async Task TestSimpleReadOnlyAsync() Assert.Equal("30", r.Values[0].ToString()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestProfileAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1849,7 +1844,7 @@ public async Task TestProfileAsync() } } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestExplainAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1867,7 +1862,7 @@ public async Task TestExplainAsync() } } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestSlowlogAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1882,7 +1877,7 @@ public async Task TestSlowlogAsync() slowlogs.ForEach(sl => sl.ForEach(s => Assert.NotNull(s))); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestListAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1895,7 +1890,7 @@ public async Task TestListAsync() Assert.Equal(new List() { "social" }, await graph.ListAsync()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestConfigAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1915,7 +1910,7 @@ public async Task TestConfigAsync() await graph.ConfigSetAsync(name, existingValue != null ? existingValue.ToString() : -1); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestModulePrefixsAsync() { IDatabase db1 = redisFixture.Redis.GetDatabase(); @@ -1927,7 +1922,7 @@ public async Task TestModulePrefixsAsync() Assert.NotEqual(graph1.GetHashCode(), graph2.GetHashCode()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestCallProcedureDbLabelsAsync() { var db = redisFixture.Redis.GetDatabase(); @@ -1948,7 +1943,7 @@ public async Task TestCallProcedureDbLabelsAsync() Assert.Single(labels1); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestCallProcedureReadOnlyAsync() { var db = redisFixture.Redis.GetDatabase(); @@ -1970,7 +1965,7 @@ public async Task TestCallProcedureReadOnlyAsync() await Assert.ThrowsAsync(() => graph.CallProcedureAsync(graphName, "db.idx.fulltext.createNodeIndex", procedureArgs, ProcedureMode.Read)); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestParseInfinity() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1984,7 +1979,7 @@ public void TestParseInfinity() Assert.Equal(double.PositiveInfinity, r.Values[0]); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestEqualsAndToString() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2061,7 +2056,7 @@ public void TestEqualsAndToString() Assert.Equal(expectedPathString, pathString); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public void TestPrepareQuery() { const string return1Query = "RETURN 1"; diff --git a/tests/NRedisStack.Tests/Json/JsonTests.cs b/tests/NRedisStack.Tests/Json/JsonTests.cs index 2fd6f74b..94ee6afe 100644 --- a/tests/NRedisStack.Tests/Json/JsonTests.cs +++ b/tests/NRedisStack.Tests/Json/JsonTests.cs @@ -722,7 +722,7 @@ public async Task GetAsync() Assert.Equal(35, people[1]!.Age); } - [SkipIfRedisVersion("7.1.242")] + [SkipIfRedis(Is.OSSCluster, Comparison.LessThan, "7.1.242")] public void MSet() { var commands = new JsonCommands(redisFixture.Redis.GetDatabase()); @@ -746,7 +746,7 @@ public void MSet() Assert.Throws(() => commands.MSet(new KeyPathValue[0])); } - [SkipIfRedisVersion("7.1.242")] + [SkipIfRedis(Is.OSSCluster, Comparison.LessThan, "7.1.242")] public async Task MSetAsync() { var commands = new JsonCommands(redisFixture.Redis.GetDatabase()); @@ -769,7 +769,7 @@ await commands.MSetAsync(values) await Assert.ThrowsAsync(async () => await commands.MSetAsync(new KeyPathValue[0])); } - [SkipIfRedisVersion("7.1.242")] + [SkipIfRedis("7.1.242")] public void Merge() { // Create a connection to Redis @@ -788,7 +788,7 @@ public void Merge() Assert.Equal("{\"person\":{\"name\":\"John Doe\",\"phone\":\"123-456-7890\",\"address\":{\"home\":\"123 Main Street\",\"work\":\"Redis office\"}}}", commands.Get("test_merge").ToString()); } - [SkipIfRedisVersion("7.1.242")] + [SkipIfRedis("7.1.242")] public async Task MergeAsync() { // Create a connection to Redis @@ -807,7 +807,7 @@ public async Task MergeAsync() Assert.Equal("{\"person\":{\"name\":\"John Doe\",\"phone\":\"123-456-7890\",\"address\":{\"home\":\"123 Main Street\",\"work\":\"Redis office\"}}}", (await commands.GetAsync("test_merge")).ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void MGet() { var commands = new JsonCommands(redisFixture.Redis.GetDatabase()); @@ -822,7 +822,7 @@ public void MGet() Assert.Equal("[\"world\"]", result[1].ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task MGetAsync() { var commands = new JsonCommandsAsync(redisFixture.Redis.GetDatabase()); diff --git a/tests/NRedisStack.Tests/PipelineTests.cs b/tests/NRedisStack.Tests/PipelineTests.cs index 0100faad..f6285371 100644 --- a/tests/NRedisStack.Tests/PipelineTests.cs +++ b/tests/NRedisStack.Tests/PipelineTests.cs @@ -11,12 +11,7 @@ public class PipelineTests : AbstractNRedisStackTest, IDisposable private readonly string key = "PIPELINE_TESTS"; public PipelineTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Is.OSSCluster, Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestModulsPipeline() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -67,7 +62,7 @@ public async Task TestModulsPipeline() Assert.NotNull(db.TOPK().Info("topk-key")); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestModulsPipelineWithotGraph() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -114,7 +109,7 @@ public async Task TestModulsPipelineWithotGraph() Assert.NotNull(db.TOPK().Info("topk-key")); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestBloomPipeline() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/RedisFixture.cs b/tests/NRedisStack.Tests/RedisFixture.cs index f971d04f..98ea4689 100644 --- a/tests/NRedisStack.Tests/RedisFixture.cs +++ b/tests/NRedisStack.Tests/RedisFixture.cs @@ -1,14 +1,46 @@ +using System.Net; +using Org.BouncyCastle.Tls; using StackExchange.Redis; namespace NRedisStack.Tests { public class RedisFixture : IDisposable { + // Set the enviroment variable to specify your own alternet host and port: + string redisStandalone = Environment.GetEnvironmentVariable("REDIS") ?? "localhost:6379"; + string? redisCluster = Environment.GetEnvironmentVariable("REDIS_CLUSTER"); + string? numRedisClusterNodesEnv = Environment.GetEnvironmentVariable("NUM_REDIS_CLUSTER_NODES"); + public bool isOSSCluster = false; + public RedisFixture() { - // Set the enviroment variable to specify your own alternet host and port: - var redisConnectionString = Environment.GetEnvironmentVariable("REDIS") ?? "localhost:6379"; - Redis = ConnectionMultiplexer.Connect(redisConnectionString); + // Redis Cluster + if (redisCluster != null && numRedisClusterNodesEnv != null) + { + // Split to host and port + string[] parts = redisCluster!.Split(':'); + string host = parts[0]; + int startPort = int.Parse(parts[1]); + + var endpoints = new EndPointCollection(); + int numRedisClusterNodes = int.Parse(numRedisClusterNodesEnv!); + for (int i = 0; i < numRedisClusterNodes; i++) + { + endpoints.Add(host, startPort + i); + } + + + ConfigurationOptions clusterConfig = new ConfigurationOptions + { + EndPoints = endpoints + }; + isOSSCluster = true; + Redis = ConnectionMultiplexer.Connect(clusterConfig); + } + + // Redis Standalone + else + Redis = ConnectionMultiplexer.Connect($"{redisStandalone}"); } public void Dispose() diff --git a/tests/NRedisStack.Tests/Search/SearchTests.cs b/tests/NRedisStack.Tests/Search/SearchTests.cs index fe471c4b..bb769b2e 100644 --- a/tests/NRedisStack.Tests/Search/SearchTests.cs +++ b/tests/NRedisStack.Tests/Search/SearchTests.cs @@ -15,11 +15,6 @@ public class SearchTests : AbstractNRedisStackTest, IDisposable private readonly string index = "TEST_INDEX"; public SearchTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(index); - } - private void AddDocument(IDatabase db, Document doc) { string key = doc.Id; @@ -149,7 +144,7 @@ public async Task TestAggregationRequestTimeoutAsync() Assert.Equal(2, res.TotalResults); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestAggregations() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -190,7 +185,7 @@ public void TestAggregations() Assert.Equal(10, r2.GetLong("sum")); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestAggregationsAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -232,7 +227,7 @@ public async Task TestAggregationsAsync() } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestAggregationsLoad() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -260,7 +255,7 @@ public void TestAggregationsLoad() Assert.Equal(res[0]["t2"], "world"); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestAggregationsLoadAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -411,7 +406,7 @@ public async Task TestAggregationRequestParamsWithDefaultDialectAsync() AggregationRequest r = new AggregationRequest("$name") .GroupBy("@name", Reducers.Sum("@count").As("sum")) .Params(parameters); // From documentation - To use PARAMS, DIALECT must be set to 2 - // which is the default as we set in the constructor (FT(2)) + // which is the default as we set in the constructor (FT(2)) AggregationResult res = await ft.AggregateAsync(index, r); Assert.Equal(1, res.TotalResults); @@ -431,7 +426,7 @@ public void TestDefaultDialectError() Assert.Throws(() => db.FT(0)); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestAlias() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -460,7 +455,7 @@ public void TestAlias() Assert.Throws(() => ft.AliasDel("ALIAS2")); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestAliasAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -489,7 +484,7 @@ public async Task TestAliasAsync() await Assert.ThrowsAsync(async () => await ft.AliasDelAsync("ALIAS2")); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestApplyAndFilterAggregations() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -533,7 +528,7 @@ public void TestApplyAndFilterAggregations() Assert.Equal(67.5, r2.GetDouble("avgscore"), 0); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestCreate() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -565,7 +560,7 @@ public void TestCreate() Assert.Equal(0, res3.TotalResults); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestCreateAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -591,7 +586,7 @@ public async Task TestCreateAsync() Assert.Equal(0, res3.TotalResults); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void CreateNoParams() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -619,7 +614,7 @@ public void CreateNoParams() Assert.Equal(0, res3.TotalResults); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task CreateNoParamsAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -647,7 +642,7 @@ public async Task CreateNoParamsAsync() Assert.Equal(0, res3.TotalResults); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void CreateWithFieldNames() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -679,7 +674,7 @@ public void CreateWithFieldNames() Assert.Equal(1, nonAttribute.TotalResults); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task CreateWithFieldNamesAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -711,7 +706,7 @@ public async Task CreateWithFieldNamesAsync() Assert.Equal(1, nonAttribute.TotalResults); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void AlterAdd() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -775,7 +770,7 @@ public void AlterAdd() Assert.Equal(4, info.CursorStats.Count); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task AlterAddAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -837,7 +832,7 @@ public async Task AlterAddAsync() Assert.Equal(4, info.CursorStats.Count); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestConfig() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -848,7 +843,7 @@ public void TestConfig() Assert.Equal("100", configMap["TIMEOUT"].ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestConfigAsnyc() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -859,7 +854,7 @@ public async Task TestConfigAsnyc() Assert.Equal("100", configMap["TIMEOUT"].ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void configOnTimeout() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -871,7 +866,7 @@ public void configOnTimeout() try { ft.ConfigSet("ON_TIMEOUT", "null"); } catch (RedisServerException) { } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task configOnTimeoutAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -883,7 +878,7 @@ public async Task configOnTimeoutAsync() try { ft.ConfigSet("ON_TIMEOUT", "null"); } catch (RedisServerException) { } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestDialectConfig() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -905,7 +900,7 @@ public void TestDialectConfig() Assert.True(ft.ConfigSet("DEFAULT_DIALECT", "1")); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestDialectConfigAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -927,7 +922,7 @@ public async Task TestDialectConfigAsync() Assert.True(ft.ConfigSet("DEFAULT_DIALECT", "1")); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestCursor() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -989,7 +984,7 @@ public async Task TestCursor() catch (RedisException) { } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestCursorAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1051,7 +1046,7 @@ public async Task TestCursorAsync() catch (RedisException) { } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestAggregationGroupBy() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1159,7 +1154,7 @@ public void TestAggregationGroupBy() } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestDictionary() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1178,7 +1173,7 @@ public void TestDictionary() Assert.Equal(ft.DictDump("dict").Length, 0); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestDropIndex() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1211,7 +1206,7 @@ public void TestDropIndex() Assert.Equal("100", db.Execute("DBSIZE").ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestDropIndexAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1244,7 +1239,7 @@ public async Task TestDropIndexAsync() Assert.Equal("100", db.Execute("DBSIZE").ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void dropIndexDD() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1270,7 +1265,7 @@ public void dropIndexDD() Assert.Equal("0", db.Execute("DBSIZE").ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task dropIndexDDAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1296,7 +1291,7 @@ public async Task dropIndexDDAsync() Assert.Equal("0", db.Execute("DBSIZE").ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestDictionaryAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1507,7 +1502,7 @@ public void TestModulePrefixs() Assert.NotEqual(ft1.GetHashCode(), ft2.GetHashCode()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task GetTagFieldSyncAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1565,7 +1560,7 @@ public async Task GetTagFieldSyncAsync() Assert.Equal(SyncRes[i++].ToString(), "yellow"); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestGetTagFieldWithNonDefaultSeparatorSyncAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1692,7 +1687,7 @@ public void TestFTCreateParamsCommandBuilderNoStopwords() Assert.Equal("FT.CREATE", builedCommand.Command.ToString()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestFilters() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1742,7 +1737,7 @@ public void TestFilters() Assert.Equal("doc1", res1.Documents[0].Id); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestFiltersAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -1926,7 +1921,7 @@ public void TestQueryCommandBuilderReturnField() Assert.Equal(0, res.Documents.Count()); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestQueryCommandBuilderScore() { // TODO: write better test for scores and payloads @@ -2001,7 +1996,7 @@ public void TestFieldsCommandBuilder() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestLimit() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2021,7 +2016,7 @@ public void TestLimit() Assert.Equal(res.GetResults()[0]["t1"].ToString(), "a"); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestLimitAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2093,7 +2088,7 @@ public async Task TestVectorCount_Issue70() Assert.Equal(expected.Count(), actual.Args.Length); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void VectorSimilaritySearch() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2136,7 +2131,7 @@ public void VectorSimilaritySearch() Assert.Equal("{\"vector\":[2,2,2,2]}", jsonRes![0]); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void QueryingVectorFields() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2184,7 +2179,7 @@ public async Task TestVectorFieldJson_Issue102Async() Assert.True(await ft.CreateAsync("my_index", new FTCreateParams().On(IndexDataType.JSON), schema)); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestQueryAddParam_DefaultDialect() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2203,7 +2198,7 @@ public void TestQueryAddParam_DefaultDialect() Assert.Equal(2, res.TotalResults); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestQueryAddParam_DefaultDialectAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2222,7 +2217,7 @@ public async Task TestQueryAddParam_DefaultDialectAsync() Assert.Equal(2, res.TotalResults); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestQueryParamsWithParams_DefaultDialect() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2290,7 +2285,7 @@ public async Task TestBasicSpellCheckAsync() Assert.Equal(2, reply["name"]["name2"]); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestCrossTermDictionary() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2314,7 +2309,7 @@ public void TestCrossTermDictionary() .ExcludeTerm("slang"))); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestCrossTermDictionaryAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2386,7 +2381,7 @@ public async Task TestDialectBoundAsync() await Assert.ThrowsAsync(async () => await ft.SpellCheckAsync(index, "name", new FTSpellCheckParams().Dialect(0))); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestQueryParamsWithParams_DefaultDialectAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -2651,7 +2646,7 @@ public void TestProfileSearch() var profile = ft.ProfileSearch(index, new Query("foo")); // Iterators profile={Type=TEXT, Time=0.0, Term=foo, Counter=1, Size=1} profile.Item2["Iterators profile"].ToDictionary(); - var iteratorsProfile = profile.Item2["Iterators profile"].ToDictionary(); + var iteratorsProfile = profile.Item2["Iterators profile"].ToDictionary(); Assert.Equal("TEXT", iteratorsProfile["Type"].ToString()); Assert.Equal("foo", iteratorsProfile["Term"].ToString()); Assert.Equal("1", iteratorsProfile["Counter"].ToString()); @@ -2675,7 +2670,7 @@ public async Task TestProfileSearchAsync() var profile = await ft.ProfileSearchAsync(index, new Query("foo")); // Iterators profile={Type=TEXT, Time=0.0, Term=foo, Counter=1, Size=1} profile.Item2["Iterators profile"].ToDictionary(); - var iteratorsProfile = profile.Item2["Iterators profile"].ToDictionary(); + var iteratorsProfile = profile.Item2["Iterators profile"].ToDictionary(); Assert.Equal("TEXT", iteratorsProfile["Type"].ToString()); Assert.Equal("foo", iteratorsProfile["Term"].ToString()); Assert.Equal("1", iteratorsProfile["Counter"].ToString()); @@ -2690,9 +2685,9 @@ public void TestProfile() db.Execute("FLUSHALL"); var ft = db.FT(); - ft.Create(index, new Schema().AddTextField("t")); // Calling FT.CREATR without FTCreateParams - db.HashSet("1", "t", "hello"); - db.HashSet("2", "t", "world"); + ft.Create(index, new Schema().AddTextField("t")); // Calling FT.CREATR without FTCreateParams + db.HashSet("1", "t", "hello"); + db.HashSet("2", "t", "world"); // check using Query var q = new Query("hello|world").SetNoContent(); @@ -2700,15 +2695,15 @@ public void TestProfile() var searchRes = profileSearch.Item1; var searchDet = profileSearch.Item2; - Assert.Equal(searchDet.Count , 5); - Assert.Equal(searchRes.Documents.Count , 2); + Assert.Equal(searchDet.Count, 5); + Assert.Equal(searchRes.Documents.Count, 2); // check using AggregationRequest var aggReq = new AggregationRequest("*").Load(FieldName.Of("t")).Apply("startswith(@t, 'hel')", "prefix"); var profileAggregate = ft.ProfileAggregate(index, aggReq); - var aggregateRes  = profileAggregate.Item1; + var aggregateRes = profileAggregate.Item1; var aggregateDet = profileAggregate.Item2; - Assert.Equal(aggregateDet.Count , 5); + Assert.Equal(aggregateDet.Count, 5); Assert.Equal(aggregateRes.TotalResults, 1); } @@ -2719,9 +2714,9 @@ public async Task TestProfileAsync() db.Execute("FLUSHALL"); var ft = db.FT(); - await ft.CreateAsync(index, new Schema().AddTextField("t")); // Calling FT.CREATR without FTCreateParams - db.HashSet("1", "t", "hello"); - db.HashSet("2", "t", "world"); + await ft.CreateAsync(index, new Schema().AddTextField("t")); // Calling FT.CREATR without FTCreateParams + db.HashSet("1", "t", "hello"); + db.HashSet("2", "t", "world"); // check using Query var q = new Query("hello|world").SetNoContent(); @@ -2729,15 +2724,15 @@ public async Task TestProfileAsync() var searchRes = profileSearch.Item1; var searchDet = profileSearch.Item2; - Assert.Equal(searchDet.Count , 5); - Assert.Equal(searchRes.Documents.Count , 2); + Assert.Equal(searchDet.Count, 5); + Assert.Equal(searchRes.Documents.Count, 2); // check using AggregationRequest var aggReq = new AggregationRequest("*").Load(FieldName.Of("t")).Apply("startswith(@t, 'hel')", "prefix"); var profileAggregate = await ft.ProfileAggregateAsync(index, aggReq); - var aggregateRes  = profileAggregate.Item1; + var aggregateRes = profileAggregate.Item1; var aggregateDet = profileAggregate.Item2; - Assert.Equal(aggregateDet.Count , 5); + Assert.Equal(aggregateDet.Count, 5); Assert.Equal(aggregateRes.TotalResults, 1); } @@ -2753,7 +2748,7 @@ public void TestProfileCommandBuilder() Assert.Equal(new object[] { "index", "AGGREGATE", "LIMITED", "QUERY", "*" }, aggregate.Args); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void Issue175() { ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379"); diff --git a/tests/NRedisStack.Tests/SkipIfRedisAttribute.cs b/tests/NRedisStack.Tests/SkipIfRedisAttribute.cs new file mode 100644 index 00000000..2b7e0741 --- /dev/null +++ b/tests/NRedisStack.Tests/SkipIfRedisAttribute.cs @@ -0,0 +1,107 @@ +using Xunit; + +namespace NRedisStack.Tests; +public enum Comparison +{ + LessThan, + GreaterThanOrEqual, +} + +public enum Is +{ + Standalone, + OSSCluster +} + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] +public class SkipIfRedisAttribute : FactAttribute +{ + private readonly string _targetVersion; + private readonly Comparison _comparison; + private readonly Is? _is = null; + private readonly string DefaultRedisConnectionString = Environment.GetEnvironmentVariable("REDIS") ?? "localhost:6379"; + + public SkipIfRedisAttribute( + Is _is, + Comparison comparison = Comparison.LessThan, + string targetVersion = "0.0.0") + { + this._is = _is; + _comparison = comparison; + _targetVersion = targetVersion; + } + + public SkipIfRedisAttribute(string targetVersion) // defaults to LessThan + { + _comparison = Comparison.LessThan; + _targetVersion = targetVersion; + } + + public SkipIfRedisAttribute(Comparison comparison, string targetVersion) + { + _comparison = comparison; + _targetVersion = targetVersion; + } + + public override string? Skip + { + get + { + string skipReason = ""; + bool skipped = false; + using (RedisFixture redisFixture = new RedisFixture()) + { + + // Cluster check + if (_is != null) + { + switch (_is) + { + case Is.OSSCluster: + if (redisFixture.isOSSCluster) + { + skipReason = skipReason + " Redis server is OSS cluster."; + skipped = true; + } + break; + + case Is.Standalone: + if (!redisFixture.isOSSCluster) + { + skipReason = skipReason + " Redis server is not OSS cluster."; + skipped = true; + } + break; + } + } + // Version check (if Is.Standalone/Is.Cluster is set then ) + + var serverVersion = redisFixture.Redis.GetServer(redisFixture.Redis.GetEndPoints()[0]).Version; + var targetVersion = new Version(_targetVersion); + int comparisonResult = serverVersion.CompareTo(targetVersion); + + switch (_comparison) + { + case Comparison.LessThan: + if (comparisonResult < 0) + { + skipReason = skipReason + $" Redis server version ({serverVersion}) is less than {_targetVersion}."; + skipped = true; + } + break; + case Comparison.GreaterThanOrEqual: + if (comparisonResult >= 0) + { + skipReason = skipReason + $" Redis server version ({serverVersion}) is greater than or equal to {_targetVersion}."; + skipped = true; + } + break; + } + } + + if (skipped) + return "Test skipped, because:" + skipReason; + return null; + } + } +} \ No newline at end of file diff --git a/tests/NRedisStack.Tests/SkipIfRedisVersionAttribute.cs b/tests/NRedisStack.Tests/SkipIfRedisVersionAttribute.cs deleted file mode 100644 index 6d19bc2c..00000000 --- a/tests/NRedisStack.Tests/SkipIfRedisVersionAttribute.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Xunit; -using StackExchange.Redis; - -public enum Comparison -{ - LessThan, - GreaterThanOrEqual, -} - -[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] -public class SkipIfRedisVersionAttribute : FactAttribute -{ - private readonly string _targetVersion; - private readonly Comparison _comparison; - private readonly string DefaultRedisConnectionString = Environment.GetEnvironmentVariable("REDIS") ?? "localhost:6379"; - - public SkipIfRedisVersionAttribute(string targetVersion) // defaults to LessThan - { - _comparison = Comparison.LessThan; - _targetVersion = targetVersion; - } - - public SkipIfRedisVersionAttribute(Comparison comparison, string targetVersion) - { - _comparison = comparison; - _targetVersion = targetVersion; - } - - public override string Skip - { - get - { - using (var connection = ConnectionMultiplexer.Connect(DefaultRedisConnectionString)) - { - var serverVersion = connection.GetServer(connection.GetEndPoints()[0]).Version; - var targetVersion = new Version(_targetVersion); - int comparisonResult = serverVersion.CompareTo(targetVersion); - - switch (_comparison) - { - case Comparison.LessThan: - if (comparisonResult < 0) - return $"Test skipped because Redis server version ({serverVersion}) is less than {_targetVersion}."; - break; - case Comparison.GreaterThanOrEqual: - if (comparisonResult >= 0) - return $"Test skipped because Redis server version ({serverVersion}) is greater than or equal to {_targetVersion}."; - break; - } - - return null; - } - } - } -} \ No newline at end of file diff --git a/tests/NRedisStack.Tests/Tdigest/TdigestTests.cs b/tests/NRedisStack.Tests/Tdigest/TdigestTests.cs index c5a47cd8..c7bb507c 100644 --- a/tests/NRedisStack.Tests/Tdigest/TdigestTests.cs +++ b/tests/NRedisStack.Tests/Tdigest/TdigestTests.cs @@ -9,11 +9,6 @@ public class TdigestTests : AbstractNRedisStackTest, IDisposable private readonly string key = "TDIGEST_TESTS"; public TdigestTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - private void AssertMergedUnmergedNodes(ITdigestCommands tdigest, string key, int mergedNodes, int unmergedNodes) { var info = tdigest.Info(key); @@ -370,7 +365,7 @@ public async Task TestAddAsync() AssertMergedUnmergedNodes(tdigest, "tdadd", 0, 5); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMerge() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -393,7 +388,7 @@ public void TestMerge() } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMergeAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -416,7 +411,7 @@ public async Task TestMergeAsync() AssertMergedUnmergedNodes(tdigest, "td2", 3, 2); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void MergeMultiAndParams() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -437,7 +432,7 @@ public void MergeMultiAndParams() Assert.Equal(50, tdigest.Info("to").Compression); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task MergeMultiAndParamsAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestAdd.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestAdd.cs index 31c6450a..6a4e0e80 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestAdd.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestAdd.cs @@ -11,11 +11,6 @@ public class TestAdd : AbstractNRedisStackTest, IDisposable public TestAdd(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - [Fact] public void TestAddNotExistingTimeSeries() { diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestAlter.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestAlter.cs index 7a37562b..af66cc42 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestAlter.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestAlter.cs @@ -12,11 +12,6 @@ public class TestAlter : AbstractNRedisStackTest, IDisposable public TestAlter(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - [Fact] public void TestAlterRetentionTime() { diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestCreate.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestCreate.cs index 7f7bfb19..9d7b2cc2 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestCreate.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestCreate.cs @@ -12,11 +12,6 @@ public class TestCreate : AbstractNRedisStackTest, IDisposable public TestCreate(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - [Fact] public void TestCreateOK() { diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestDecrBy.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestDecrBy.cs index 3b84174b..c6afa19e 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestDecrBy.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestDecrBy.cs @@ -11,11 +11,6 @@ public class TestDecrBy : AbstractNRedisStackTest, IDisposable public TestDecrBy(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - [Fact] public void TestDefaultDecrBy() { diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestDel.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestDel.cs index d779052c..42c22a75 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestDel.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestDel.cs @@ -12,11 +12,6 @@ public class TestDel : AbstractNRedisStackTest, IDisposable public TestDel(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - private List CreateData(ITimeSeriesCommands ts, int timeBucket) //TODO: check this { var tuples = new List(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestGet.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestGet.cs index 5fee7e96..dd5f9d39 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestGet.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestGet.cs @@ -12,11 +12,6 @@ public class TestGet : AbstractNRedisStackTest, IDisposable public TestGet(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - [Fact] public void TestGetNotExists() { diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestIncrBy.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestIncrBy.cs index c31794fe..f46db56f 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestIncrBy.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestIncrBy.cs @@ -11,11 +11,6 @@ public class TestIncrBy : AbstractNRedisStackTest, IDisposable public TestIncrBy(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - [Fact] public void TestDefaultIncrBy() { diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMADD.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMADD.cs index e2a22064..cba16e34 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMADD.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMADD.cs @@ -13,15 +13,7 @@ public class TestMADD : AbstractNRedisStackTest, IDisposable public TestMADD(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - foreach (string key in keys) - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - } - - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestStarMADD() { @@ -50,7 +42,7 @@ public void TestStarMADD() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestSuccessfulMADD() { @@ -80,7 +72,7 @@ public void TestSuccessfulMADD() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestOverrideMADD() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMAddAsync.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMAddAsync.cs index 5d5ce9c5..78ef509b 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMAddAsync.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMAddAsync.cs @@ -11,7 +11,7 @@ public class TestMAddAsync : AbstractNRedisStackTest public TestMAddAsync(RedisFixture redisFixture) : base(redisFixture) { } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestStarMADD() { var keys = CreateKeyNames(2); @@ -43,7 +43,7 @@ public async Task TestStarMADD() } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestSuccessfulMAdd() { var keys = CreateKeyNames(2); @@ -73,7 +73,7 @@ public async Task TestSuccessfulMAdd() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestOverrideMAdd() { var keys = CreateKeyNames(2); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMGet.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMGet.cs index 658bd242..ae313418 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMGet.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMGet.cs @@ -12,15 +12,7 @@ public class TestMGet : AbstractNRedisStackTest, IDisposable public TestMGet(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - foreach (string key in keys) - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - } - - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMGetQuery() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -47,7 +39,7 @@ public void TestMGetQuery() } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMGetQueryWithLabels() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -74,7 +66,7 @@ public void TestMGetQueryWithLabels() Assert.Equal(labels2, results[1].labels); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMGetQuerySelectedLabels() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMGetAsync.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMGetAsync.cs index 0057eab8..4fe94e37 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMGetAsync.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMGetAsync.cs @@ -8,7 +8,7 @@ public class TestMGetAsync : AbstractNRedisStackTest { public TestMGetAsync(RedisFixture redisFixture) : base(redisFixture) { } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMGetQuery() { var keys = CreateKeyNames(2); @@ -64,7 +64,7 @@ public async Task TestMGetQueryWithLabels() Assert.Equal(labels2, results[1].labels); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMGetQuerySelectedLabelsAsync() { var keys = CreateKeyNames(2); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRange.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRange.cs index dfbb079c..cbec11ba 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRange.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRange.cs @@ -12,14 +12,6 @@ public class TestMRange : AbstractNRedisStackTest, IDisposable public TestMRange(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - foreach (string key in keys) - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - } - private List CreateData(ITimeSeriesCommands ts, int timeBucket) { var tuples = new List(); @@ -36,7 +28,7 @@ private List CreateData(ITimeSeriesCommands ts, int timeBucket) return tuples; } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestSimpleMRange() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -59,7 +51,7 @@ public void TestSimpleMRange() Assert.Equal(tuples, results[i].values); } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRangeWithLabels() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -83,7 +75,7 @@ public void TestMRangeWithLabels() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRangeSelectLabels() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -112,7 +104,7 @@ public void TestMRangeSelectLabels() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRangeFilter() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -129,7 +121,7 @@ public void TestMRangeFilter() Assert.Equal(tuples, results[0].values); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRangeCount() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -154,7 +146,7 @@ public void TestMRangeCount() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRangeAggregation() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -178,7 +170,7 @@ public void TestMRangeAggregation() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRangeAlign() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -237,7 +229,7 @@ public void TestMissingTimeBucket() Assert.Equal("RANGE Aggregation should have timeBucket value", ex.Message); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRangeGroupby() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -263,7 +255,7 @@ public void TestMRangeGroupby() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRangeReduce() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -288,7 +280,7 @@ public void TestMRangeReduce() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRangeFilterBy() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRangeAsync.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRangeAsync.cs index 175ffd68..dd212aef 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRangeAsync.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRangeAsync.cs @@ -27,7 +27,7 @@ private async Task> CreateData(TimeSeriesCommands ts, stri return tuples; } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestSimpleMRange() { var keys = CreateKeyNames(2); @@ -51,7 +51,7 @@ public async Task TestSimpleMRange() Assert.Equal(tuples, results[i].values); } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeWithLabels() { var keys = CreateKeyNames(2); @@ -76,7 +76,7 @@ public async Task TestMRangeWithLabels() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeSelectLabels() { var keys = CreateKeyNames(2); @@ -110,7 +110,7 @@ await ts.MRangeAsync("-", "+", } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeFilter() { var keys = CreateKeyNames(2); @@ -128,7 +128,7 @@ public async Task TestMRangeFilter() Assert.Equal(tuples, results[0].values); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeCount() { var keys = CreateKeyNames(2); @@ -154,7 +154,7 @@ public async Task TestMRangeCount() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeAggregation() { var keys = CreateKeyNames(2); @@ -179,7 +179,7 @@ public async Task TestMRangeAggregation() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeAlign() { var keys = CreateKeyNames(2); @@ -203,7 +203,7 @@ public async Task TestMRangeAlign() Assert.Equal(expected[0], results[0].values[0]); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMissingFilter() { var keys = CreateKeyNames(2); @@ -222,7 +222,7 @@ public async Task TestMissingFilter() Assert.Equal("There should be at least one filter on MRANGE/MREVRANGE", ex.Message); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMissingTimeBucket() { var keys = CreateKeyNames(2); @@ -245,7 +245,7 @@ await ts.MRangeAsync("-", "+", }); Assert.Equal("RANGE Aggregation should have timeBucket value", ex.Message); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeGroupby() { var keys = CreateKeyNames(2); @@ -272,7 +272,7 @@ public async Task TestMRangeGroupby() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeReduce() { var keys = CreateKeyNames(2); @@ -298,7 +298,7 @@ public async Task TestMRangeReduce() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeFilterBy() { var keys = CreateKeyNames(2); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRevRange.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRevRange.cs index afd31cfe..aa3a76fd 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRevRange.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRevRange.cs @@ -27,7 +27,7 @@ private List CreateData(ITimeSeriesCommands ts, string[] keys, return tuples; } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestSimpleMRevRange() { var keys = CreateKeyNames(2); @@ -52,7 +52,7 @@ public void TestSimpleMRevRange() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRevRangeWithLabels() { var keys = CreateKeyNames(2); @@ -78,7 +78,7 @@ public void TestMRevRangeWithLabels() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRevRangeSelectLabels() { var keys = CreateKeyNames(2); @@ -103,7 +103,7 @@ public void TestMRevRangeSelectLabels() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRevRangeFilter() { var keys = CreateKeyNames(2); @@ -121,7 +121,7 @@ public void TestMRevRangeFilter() Assert.Equal(ReverseData(tuples), results[0].values); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRevRangeCount() { var keys = CreateKeyNames(2); @@ -147,7 +147,7 @@ public void TestMRevRangeCount() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRevRangeAggregation() { var keys = CreateKeyNames(2); @@ -172,7 +172,7 @@ public void TestMRevRangeAggregation() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRevRangeAlign() { var keys = CreateKeyNames(2); @@ -196,7 +196,7 @@ public void TestMRevRangeAlign() Assert.Equal(expected[0], results[0].values[0]); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMissingFilter() { var keys = CreateKeyNames(2); @@ -215,7 +215,7 @@ public void TestMissingFilter() Assert.Equal("There should be at least one filter on MRANGE/MREVRANGE", ex.Message); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMissingTimeBucket() { var keys = CreateKeyNames(2); @@ -234,7 +234,7 @@ public void TestMissingTimeBucket() Assert.Equal("RANGE Aggregation should have timeBucket value", ex.Message); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRevRangeGroupby() { var keys = CreateKeyNames(2); @@ -261,7 +261,7 @@ public void TestMRevRangeGroupby() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRevRangeReduce() { var keys = CreateKeyNames(2); @@ -288,7 +288,7 @@ public void TestMRevRangeReduce() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestMRevRangeFilterBy() { var keys = CreateKeyNames(2); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRevRangeAsync.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRevRangeAsync.cs index 5c30b3e7..34a4c554 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRevRangeAsync.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestMRevRangeAsync.cs @@ -27,7 +27,7 @@ private async Task> CreateData(TimeSeriesCommands ts, stri return tuples; } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestSimpleMRevRange() { var keys = CreateKeyNames(2); @@ -52,7 +52,7 @@ public async Task TestSimpleMRevRange() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRevRangeWithLabels() { var keys = CreateKeyNames(2); @@ -77,7 +77,7 @@ public async Task TestMRevRangeWithLabels() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRevRangeSelectLabels() { var keys = CreateKeyNames(2); @@ -102,7 +102,7 @@ public async Task TestMRevRangeSelectLabels() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRevRangeFilter() { var keys = CreateKeyNames(2); @@ -120,7 +120,7 @@ public async Task TestMRevRangeFilter() Assert.Equal(ReverseData(tuples), results[0].values); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRevRangeCount() { var keys = CreateKeyNames(2); @@ -146,7 +146,7 @@ public async Task TestMRevRangeCount() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRangeAggregation() { var keys = CreateKeyNames(2); @@ -171,7 +171,7 @@ public async Task TestMRangeAggregation() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRevRangeAlign() { var keys = CreateKeyNames(2); @@ -195,7 +195,7 @@ public async Task TestMRevRangeAlign() Assert.Equal(expected[0], results[0].values[0]); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMissingFilter() { var keys = CreateKeyNames(2); @@ -214,7 +214,7 @@ public async Task TestMissingFilter() Assert.Equal("There should be at least one filter on MRANGE/MREVRANGE", ex.Message); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMissingTimeBucket() { var keys = CreateKeyNames(2); @@ -238,7 +238,7 @@ await ts.MRevRangeAsync("-", "+", Assert.Equal("RANGE Aggregation should have timeBucket value", ex.Message); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRevRangeGroupby() { var keys = CreateKeyNames(2); @@ -265,7 +265,7 @@ public async Task TestMRevRangeGroupby() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRevRangeReduce() { var keys = CreateKeyNames(2); @@ -292,7 +292,7 @@ public async Task TestMRevRangeReduce() } } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestMRevRangeFilterBy() { var keys = CreateKeyNames(2); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestQueryIndex.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestQueryIndex.cs index ac7fbb75..dd82f55e 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestQueryIndex.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestQueryIndex.cs @@ -10,15 +10,7 @@ public class TestQueryIndex : AbstractNRedisStackTest, IDisposable public TestQueryIndex(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - foreach (var key in keys) - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - } - - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestTSQueryIndex() { var db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestQueryIndexAsync.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestQueryIndexAsync.cs index 2fe89e8f..0e1be023 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestQueryIndexAsync.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestQueryIndexAsync.cs @@ -8,7 +8,7 @@ public class TestQueryIndexAsync : AbstractNRedisStackTest { public TestQueryIndexAsync(RedisFixture redisFixture) : base(redisFixture) { } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestTSQueryIndex() { var keys = CreateKeyNames(2); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRange.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRange.cs index f831ddb0..ba9af54b 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRange.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRange.cs @@ -12,11 +12,6 @@ public class TestRange : AbstractNRedisStackTest, IDisposable public TestRange(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - private List CreateData(ITimeSeriesCommands ts, int timeBucket) { var tuples = new List(); @@ -130,7 +125,7 @@ public void TestFilterBy() Assert.Equal(tuples.GetRange(2, 1), res); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void latest() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -165,7 +160,7 @@ public void latest() Assert.Equal(new List() { latest, compact }, ts.RevRange("ts2", 0, 10, true)); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestAlignTimestamp() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRangeAsync.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRangeAsync.cs index 67a1c009..186bb25b 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRangeAsync.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRangeAsync.cs @@ -129,7 +129,7 @@ public async Task TestFilterBy() Assert.Equal(tuples.GetRange(2, 1), res); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestLatestAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -164,7 +164,7 @@ public async Task TestLatestAsync() Assert.Equal(new List() { latest, compact }, await ts.RevRangeAsync("ts2", 0, 10, true)); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestAlignTimestampAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRules.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRules.cs index c8c4779f..fe30f5cd 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRules.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRules.cs @@ -32,16 +32,7 @@ public TestRules(RedisFixture redisFixture) : base(redisFixture) }; } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(srcKey); - foreach (var key in destKeys.Values) - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - } - - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestRulesAdditionDeletion() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -104,7 +95,7 @@ public void TestNonExisitingDestinaion() Assert.Equal("ERR TSDB: compaction rule does not exist", ex.Message); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public void TestAlignTimestamp() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRulesAsync.cs b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRulesAsync.cs index 3e2c5e91..e024bec8 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRulesAsync.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TestAPI/TestRulesAsync.cs @@ -10,7 +10,7 @@ public class TestRulesAsync : AbstractNRedisStackTest { public TestRulesAsync(RedisFixture redisFixture) : base(redisFixture) { } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestRulesAdditionDeletion() { var key = CreateKeyName(); @@ -88,7 +88,7 @@ public async Task TestNonExisitingDestinaion() Assert.Equal("ERR TSDB: compaction rule does not exist", ex.Message); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestAlignTimestampAsync() { IDatabase db = redisFixture.Redis.GetDatabase(); diff --git a/tests/NRedisStack.Tests/TimeSeries/TimeSeriesTests.cs b/tests/NRedisStack.Tests/TimeSeries/TimeSeriesTests.cs index 7e8b568a..6874fa83 100644 --- a/tests/NRedisStack.Tests/TimeSeries/TimeSeriesTests.cs +++ b/tests/NRedisStack.Tests/TimeSeries/TimeSeriesTests.cs @@ -10,11 +10,6 @@ public class TimeSeriesTests : AbstractNRedisStackTest, IDisposable private readonly string key = "TIME_SERIES_TESTS"; public TimeSeriesTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - // [Fact] // public void TestCreateOK() // { diff --git a/tests/NRedisStack.Tests/TopK/TopKTests.cs b/tests/NRedisStack.Tests/TopK/TopKTests.cs index f51e4f9f..cb5714e1 100644 --- a/tests/NRedisStack.Tests/TopK/TopKTests.cs +++ b/tests/NRedisStack.Tests/TopK/TopKTests.cs @@ -9,10 +9,6 @@ public class TopKTests : AbstractNRedisStackTest, IDisposable private readonly string key = "TOPK_TESTS"; public TopKTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } [Fact] public void CreateTopKFilter() @@ -21,30 +17,31 @@ public void CreateTopKFilter() db.Execute("FLUSHALL"); var topk = db.TOPK(); - topk.Reserve("aaa", 30, 2000, 7, 0.925); + //db.KeyDelete(key, CommandFlags.FireAndForget); + topk.Reserve(key, 30, 2000, 7, 0.925); - var res = topk.Add("aaa", "bb", "cc"); + var res = topk.Add(key, "bb", "cc"); Assert.True(res[0].IsNull && res[1].IsNull); - Assert.Equal(topk.Query("aaa", "bb", "gg", "cc"), new bool[] { true, false, true }); - Assert.False(topk.Query("aaa", "notExists")); + Assert.Equal(topk.Query(key, "bb", "gg", "cc"), new bool[] { true, false, true }); + Assert.False(topk.Query(key, "notExists")); - Assert.Equal(topk.Count("aaa", "bb", "gg", "cc"), new long[] { 1, 0, 1 }); + Assert.Equal(topk.Count(key, "bb", "gg", "cc"), new long[] { 1, 0, 1 }); - var res2 = topk.List("aaa"); + var res2 = topk.List(key); Assert.Equal(res2[0].ToString(), "bb"); Assert.Equal(res2[1].ToString(), "cc"); var tuple = new Tuple("ff", 10); - var del = topk.IncrBy("aaa", tuple); - Assert.True(topk.IncrBy("aaa", tuple)[0].IsNull); + var del = topk.IncrBy(key, tuple); + Assert.True(topk.IncrBy(key, tuple)[0].IsNull); - res2 = topk.List("aaa"); + res2 = topk.List(key); Assert.Equal(res2[0].ToString(), "ff"); Assert.Equal(res2[1].ToString(), "bb"); Assert.Equal(res2[2].ToString(), "cc"); - var info = topk.Info("aaa"); + var info = topk.Info(key); Assert.Equal(info.Decay, 0.925); Assert.Equal(info.Depth, 7); Assert.Equal(info.K, 30); @@ -58,29 +55,29 @@ public async Task CreateTopKFilterAsync() db.Execute("FLUSHALL"); var topk = db.TOPK(); - await topk.ReserveAsync("aaa", 30, 2000, 7, 0.925); + await topk.ReserveAsync(key, 30, 2000, 7, 0.925); - var res = await topk.AddAsync("aaa", "bb", "cc"); + var res = await topk.AddAsync(key, "bb", "cc"); Assert.True(res[0].IsNull && res[1].IsNull); - Assert.Equal(await topk.QueryAsync("aaa", "bb", "gg", "cc"), new bool[] { true, false, true }); - Assert.False(await topk.QueryAsync("aaa", "notExists")); + Assert.Equal(await topk.QueryAsync(key, "bb", "gg", "cc"), new bool[] { true, false, true }); + Assert.False(await topk.QueryAsync(key, "notExists")); - Assert.Equal(await topk.CountAsync("aaa", "bb", "gg", "cc"), new long[] { 1, 0, 1 }); + Assert.Equal(await topk.CountAsync(key, "bb", "gg", "cc"), new long[] { 1, 0, 1 }); - var res2 = await topk.ListAsync("aaa"); + var res2 = await topk.ListAsync(key); Assert.Equal(res2[0].ToString(), "bb"); Assert.Equal(res2[1].ToString(), "cc"); var tuple = new Tuple("ff", 10); - Assert.True((await topk.IncrByAsync("aaa", tuple))[0].IsNull); + Assert.True((await topk.IncrByAsync(key, tuple))[0].IsNull); - res2 = await topk.ListAsync("aaa"); + res2 = await topk.ListAsync(key); Assert.Equal(res2[0].ToString(), "ff"); Assert.Equal(res2[1].ToString(), "bb"); Assert.Equal(res2[2].ToString(), "cc"); - var info = await topk.InfoAsync("aaa"); + var info = await topk.InfoAsync(key); Assert.Equal(info.Decay, 0.925); Assert.Equal(info.Depth, 7); Assert.Equal(info.K, 30); diff --git a/tests/NRedisStack.Tests/TransactionsTests.cs b/tests/NRedisStack.Tests/TransactionsTests.cs index 26f3d8aa..db893206 100644 --- a/tests/NRedisStack.Tests/TransactionsTests.cs +++ b/tests/NRedisStack.Tests/TransactionsTests.cs @@ -11,11 +11,6 @@ public class TransactionTests : AbstractNRedisStackTest, IDisposable private readonly string key = "TRX_TESTS"; public TransactionTests(RedisFixture redisFixture) : base(redisFixture) { } - public void Dispose() - { - redisFixture.Redis.GetDatabase().KeyDelete(key); - } - [Fact] public async Task TestJsonTransaction() { @@ -32,7 +27,7 @@ public async Task TestJsonTransaction() Assert.Equal("{\"Name\":\"Shachar\",\"Age\":23}", getResponse.Result.ToString()); } - [SkipIfRedisVersion(Comparison.GreaterThanOrEqual, "7.1.242")] + [SkipIfRedis(Comparison.GreaterThanOrEqual, "7.1.242")] public async Task TestModulsTransaction() { IDatabase db = redisFixture.Redis.GetDatabase(); @@ -83,7 +78,7 @@ public async Task TestModulsTransaction() Assert.NotNull(db.TOPK().Info("topk-key")); } - [Fact] + [SkipIfRedis(Is.OSSCluster)] public async Task TestModulsTransactionWithoutGraph() { IDatabase db = redisFixture.Redis.GetDatabase();