From 86fa2e0ffbbedfe16ea99a0896e58b3b10383566 Mon Sep 17 00:00:00 2001 From: SuddyN Date: Tue, 13 May 2025 10:42:10 -0400 Subject: [PATCH 1/8] define AddHybridCacheTestClient --- .../packages.linux-x64.lock.json | 24 +++++++++++++++++++ .../packages.osx-arm64.lock.json | 24 +++++++++++++++++++ .../packages.win-x64.lock.json | 24 +++++++++++++++++++ test/TestUtils/NatsTestExtensions.cs | 12 ++++++++++ test/TestUtils/TestUtils.csproj | 1 + test/TestUtils/packages.linux-x64.lock.json | 24 +++++++++++++++++++ test/TestUtils/packages.osx-arm64.lock.json | 24 +++++++++++++++++++ test/TestUtils/packages.win-x64.lock.json | 24 +++++++++++++++++++ test/UnitTests/packages.linux-x64.lock.json | 24 +++++++++++++++++++ test/UnitTests/packages.osx-arm64.lock.json | 24 +++++++++++++++++++ test/UnitTests/packages.win-x64.lock.json | 24 +++++++++++++++++++ util/PerfTest/packages.linux-x64.lock.json | 24 +++++++++++++++++++ util/PerfTest/packages.osx-arm64.lock.json | 24 +++++++++++++++++++ util/PerfTest/packages.win-x64.lock.json | 24 +++++++++++++++++++ 14 files changed, 301 insertions(+) diff --git a/test/IntegrationTests/packages.linux-x64.lock.json b/test/IntegrationTests/packages.linux-x64.lock.json index 5813dfd..987977f 100644 --- a/test/IntegrationTests/packages.linux-x64.lock.json +++ b/test/IntegrationTests/packages.linux-x64.lock.json @@ -317,6 +317,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", "resolved": "9.4.0", @@ -1074,6 +1097,7 @@ "type": "Project", "dependencies": { "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/IntegrationTests/packages.osx-arm64.lock.json b/test/IntegrationTests/packages.osx-arm64.lock.json index 4d0c6d1..16bcfb7 100644 --- a/test/IntegrationTests/packages.osx-arm64.lock.json +++ b/test/IntegrationTests/packages.osx-arm64.lock.json @@ -317,6 +317,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", "resolved": "9.4.0", @@ -1074,6 +1097,7 @@ "type": "Project", "dependencies": { "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/IntegrationTests/packages.win-x64.lock.json b/test/IntegrationTests/packages.win-x64.lock.json index 6f21006..d7512b1 100644 --- a/test/IntegrationTests/packages.win-x64.lock.json +++ b/test/IntegrationTests/packages.win-x64.lock.json @@ -317,6 +317,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", "resolved": "9.4.0", @@ -1074,6 +1097,7 @@ "type": "Project", "dependencies": { "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/TestUtils/NatsTestExtensions.cs b/test/TestUtils/NatsTestExtensions.cs index 46fea13..4fd2ee0 100644 --- a/test/TestUtils/NatsTestExtensions.cs +++ b/test/TestUtils/NatsTestExtensions.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using NATS.Client.Core; using NATS.Client.Hosting; +using Microsoft.Extensions.Caching.Hybrid; namespace CodeCargo.Nats.DistributedCache.TestUtils; @@ -13,4 +14,15 @@ options with Url = natsConnectionString, RequestReplyMode = NatsRequestReplyMode.Direct, }); + + public static IServiceCollection AddHybridCacheTestClient(this IServiceCollection services, NatsOpts options) + { + // (Optional) Add HybridCache + var hybridCacheServices = services.AddHybridCache(); + + // (Optional) Use NATS Serializer for HybridCache + hybridCacheServices.AddSerializerFactory( + options.SerializerRegistry.ToHybridCacheSerializerFactory()); + return services; + } } diff --git a/test/TestUtils/TestUtils.csproj b/test/TestUtils/TestUtils.csproj index 4af9535..0c13076 100644 --- a/test/TestUtils/TestUtils.csproj +++ b/test/TestUtils/TestUtils.csproj @@ -5,6 +5,7 @@ + diff --git a/test/TestUtils/packages.linux-x64.lock.json b/test/TestUtils/packages.linux-x64.lock.json index c41655f..7890c9e 100644 --- a/test/TestUtils/packages.linux-x64.lock.json +++ b/test/TestUtils/packages.linux-x64.lock.json @@ -2,6 +2,18 @@ "version": 1, "dependencies": { "net8.0": { + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[9.4.0, )", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, "Microsoft.Extensions.Logging": { "type": "Direct", "requested": "[9.0.4, )", @@ -66,6 +78,18 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", "resolved": "8.0.0", diff --git a/test/TestUtils/packages.osx-arm64.lock.json b/test/TestUtils/packages.osx-arm64.lock.json index c41655f..7890c9e 100644 --- a/test/TestUtils/packages.osx-arm64.lock.json +++ b/test/TestUtils/packages.osx-arm64.lock.json @@ -2,6 +2,18 @@ "version": 1, "dependencies": { "net8.0": { + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[9.4.0, )", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, "Microsoft.Extensions.Logging": { "type": "Direct", "requested": "[9.0.4, )", @@ -66,6 +78,18 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", "resolved": "8.0.0", diff --git a/test/TestUtils/packages.win-x64.lock.json b/test/TestUtils/packages.win-x64.lock.json index c41655f..7890c9e 100644 --- a/test/TestUtils/packages.win-x64.lock.json +++ b/test/TestUtils/packages.win-x64.lock.json @@ -2,6 +2,18 @@ "version": 1, "dependencies": { "net8.0": { + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[9.4.0, )", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, "Microsoft.Extensions.Logging": { "type": "Direct", "requested": "[9.0.4, )", @@ -66,6 +78,18 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", "resolved": "8.0.0", diff --git a/test/UnitTests/packages.linux-x64.lock.json b/test/UnitTests/packages.linux-x64.lock.json index 5e11b64..2d24c70 100644 --- a/test/UnitTests/packages.linux-x64.lock.json +++ b/test/UnitTests/packages.linux-x64.lock.json @@ -73,6 +73,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", "resolved": "8.0.0", @@ -382,6 +405,7 @@ "type": "Project", "dependencies": { "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/UnitTests/packages.osx-arm64.lock.json b/test/UnitTests/packages.osx-arm64.lock.json index 5e11b64..2d24c70 100644 --- a/test/UnitTests/packages.osx-arm64.lock.json +++ b/test/UnitTests/packages.osx-arm64.lock.json @@ -73,6 +73,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", "resolved": "8.0.0", @@ -382,6 +405,7 @@ "type": "Project", "dependencies": { "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/UnitTests/packages.win-x64.lock.json b/test/UnitTests/packages.win-x64.lock.json index 5e11b64..2d24c70 100644 --- a/test/UnitTests/packages.win-x64.lock.json +++ b/test/UnitTests/packages.win-x64.lock.json @@ -73,6 +73,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", "resolved": "8.0.0", @@ -382,6 +405,7 @@ "type": "Project", "dependencies": { "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/util/PerfTest/packages.linux-x64.lock.json b/util/PerfTest/packages.linux-x64.lock.json index 346ec48..babef24 100644 --- a/util/PerfTest/packages.linux-x64.lock.json +++ b/util/PerfTest/packages.linux-x64.lock.json @@ -301,6 +301,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", "resolved": "9.4.0", @@ -966,6 +989,7 @@ "type": "Project", "dependencies": { "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/util/PerfTest/packages.osx-arm64.lock.json b/util/PerfTest/packages.osx-arm64.lock.json index cc3d194..0b0278b 100644 --- a/util/PerfTest/packages.osx-arm64.lock.json +++ b/util/PerfTest/packages.osx-arm64.lock.json @@ -301,6 +301,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", "resolved": "9.4.0", @@ -966,6 +989,7 @@ "type": "Project", "dependencies": { "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/util/PerfTest/packages.win-x64.lock.json b/util/PerfTest/packages.win-x64.lock.json index 0e84cdf..55d0a36 100644 --- a/util/PerfTest/packages.win-x64.lock.json +++ b/util/PerfTest/packages.win-x64.lock.json @@ -301,6 +301,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", "resolved": "9.4.0", @@ -966,6 +989,7 @@ "type": "Project", "dependencies": { "CodeCargo.Nats.DistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", From 4b46785d3d1aa595e862baa75e1e4f242df66f4f Mon Sep 17 00:00:00 2001 From: SuddyN Date: Tue, 13 May 2025 13:26:22 -0400 Subject: [PATCH 2/8] implement hybridcache integration test --- .../Cache/HybridCacheSetAndRemoveTests.cs | 47 +++++++++++++++++++ test/IntegrationTests/TestBase.cs | 9 ++++ test/TestUtils/NatsTestExtensions.cs | 7 ++- 3 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs diff --git a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs new file mode 100644 index 0000000..33e3aaa --- /dev/null +++ b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs @@ -0,0 +1,47 @@ +using System.Text; +using Microsoft.Extensions.Caching.Hybrid; +using NATS.Client.KeyValueStore; +using NATS.Net; + +namespace CodeCargo.Nats.DistributedCache.IntegrationTests.Cache; + +public class HybridCacheGetSetRemoveTests(NatsIntegrationFixture fixture) : TestBase(fixture) +{ + [Fact] + public async Task HybridCacheGetSetRemoveTest() + { + // Arrange + var key = MethodKey(); + var value = Encoding.UTF8.GetBytes($"test-value-{Guid.NewGuid()}"); + var options = new HybridCacheEntryOptions + { + Expiration = TimeSpan.FromMinutes(10) + }; + + // Assert - Verify the value is not stored in NATS KV store + var kvStore = await NatsConnection.CreateKeyValueStoreContext().GetStoreAsync("cache"); + await Assert.ThrowsAsync(async () => await kvStore.GetEntryAsync(key)); + + // Act + await HybridCache.SetAsync(key, value, options); + + // Assert - Verify the value is stored in NATS KV store + var kvEntry = await kvStore.GetEntryAsync(key); + Assert.NotNull(kvEntry.Value); + + // Assert - Verify the value is retreivable from hybrid cache + var result = await HybridCache.GetOrCreateAsync(key, async ct => await Task.FromResult(Array.Empty())); + Assert.NotEmpty(result); + Assert.Equal(value, result); + + // Act + await HybridCache.RemoveAsync(key); + + // Assert - Verify the value is not stored in NATS KV store + await Assert.ThrowsAsync(async () => await kvStore.GetEntryAsync(key)); + + // Assert - Verify the value is not retreivable from hybrid cache + result = await HybridCache.GetOrCreateAsync(key, async ct => await Task.FromResult(Array.Empty())); + Assert.Empty(result); + } +} diff --git a/test/IntegrationTests/TestBase.cs b/test/IntegrationTests/TestBase.cs index e57d265..a20255a 100644 --- a/test/IntegrationTests/TestBase.cs +++ b/test/IntegrationTests/TestBase.cs @@ -1,9 +1,12 @@ using System.Runtime.CompilerServices; +using CodeCargo.Nats.DistributedCache.TestUtils; using CodeCargo.Nats.DistributedCache.TestUtils.Services.Logging; using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Caching.Hybrid; using Microsoft.Extensions.Logging; using NATS.Client.Core; using NATS.Client.JetStream.Models; +using NATS.Client.KeyValueStore; using NATS.Net; namespace CodeCargo.Nats.DistributedCache.IntegrationTests; @@ -41,6 +44,7 @@ protected TestBase(NatsIntegrationFixture fixture) // Add the cache services.AddNatsDistributedCache(options => options.BucketName = "cache"); + services.AddHybridCacheTestClient(); // Build service provider ServiceProvider = services.BuildServiceProvider(); @@ -61,6 +65,11 @@ protected TestBase(NatsIntegrationFixture fixture) /// protected IDistributedCache Cache => ServiceProvider.GetRequiredService(); + /// + /// Gets the cache from the service provider + /// + protected HybridCache HybridCache => ServiceProvider.GetRequiredService(); + /// /// Purge stream before test run /// diff --git a/test/TestUtils/NatsTestExtensions.cs b/test/TestUtils/NatsTestExtensions.cs index 4fd2ee0..25828f6 100644 --- a/test/TestUtils/NatsTestExtensions.cs +++ b/test/TestUtils/NatsTestExtensions.cs @@ -1,7 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using NATS.Client.Core; using NATS.Client.Hosting; -using Microsoft.Extensions.Caching.Hybrid; namespace CodeCargo.Nats.DistributedCache.TestUtils; @@ -15,14 +14,14 @@ options with RequestReplyMode = NatsRequestReplyMode.Direct, }); - public static IServiceCollection AddHybridCacheTestClient(this IServiceCollection services, NatsOpts options) + public static IServiceCollection AddHybridCacheTestClient(this IServiceCollection services) { // (Optional) Add HybridCache var hybridCacheServices = services.AddHybridCache(); // (Optional) Use NATS Serializer for HybridCache - hybridCacheServices.AddSerializerFactory( - options.SerializerRegistry.ToHybridCacheSerializerFactory()); + // hybridCacheServices.AddSerializerFactory( + // options.SerializerRegistry.ToHybridCacheSerializerFactory()); return services; } } From 0762d9e55230f5b43ecd645776001082c5e4640e Mon Sep 17 00:00:00 2001 From: SuddyN Date: Tue, 13 May 2025 13:38:04 -0400 Subject: [PATCH 3/8] clean up NatsTestExtensions --- test/TestUtils/NatsTestExtensions.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/TestUtils/NatsTestExtensions.cs b/test/TestUtils/NatsTestExtensions.cs index 25828f6..f486080 100644 --- a/test/TestUtils/NatsTestExtensions.cs +++ b/test/TestUtils/NatsTestExtensions.cs @@ -16,12 +16,13 @@ options with public static IServiceCollection AddHybridCacheTestClient(this IServiceCollection services) { - // (Optional) Add HybridCache + // Add HybridCache var hybridCacheServices = services.AddHybridCache(); - // (Optional) Use NATS Serializer for HybridCache - // hybridCacheServices.AddSerializerFactory( - // options.SerializerRegistry.ToHybridCacheSerializerFactory()); + // Use NATS Serializer for HybridCache + var natsOpts = NatsOpts.Default; + hybridCacheServices.AddSerializerFactory( + natsOpts.SerializerRegistry.ToHybridCacheSerializerFactory()); return services; } } From f4892b640cef958b263a4ddd9f17111e585bd708 Mon Sep 17 00:00:00 2001 From: SuddyN Date: Tue, 13 May 2025 16:34:24 -0400 Subject: [PATCH 4/8] check serialize primitives --- .../Cache/HybridCacheSetAndRemoveTests.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs index 33e3aaa..a8e251a 100644 --- a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs +++ b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs @@ -44,4 +44,27 @@ public async Task HybridCacheGetSetRemoveTest() result = await HybridCache.GetOrCreateAsync(key, async ct => await Task.FromResult(Array.Empty())); Assert.Empty(result); } + + [Fact] + public async Task HybridCacheSerializesDateTime() + { + // Arrange + var key = MethodKey(); + var now = DateTime.UtcNow; + + var options = new HybridCacheEntryOptions + { + Expiration = TimeSpan.FromMinutes(10) + }; + + // Act - Store the complex object in the cache + await HybridCache.SetAsync(key, now, options); + + // Assert - Retrieve the object and verify it matches + var retrieved = await HybridCache.GetOrCreateAsync(key, async ct => await Task.FromResult(DateTime.UnixEpoch)); + Assert.Equal(now, retrieved); + + // Cleanup + await HybridCache.RemoveAsync(key); + } } From f4b369950b0049d7b32520b548a57ce6dae40f21 Mon Sep 17 00:00:00 2001 From: SuddyN Date: Thu, 15 May 2025 13:44:59 -0400 Subject: [PATCH 5/8] check serialized value in NATS KV bucket --- src/NatsDistributedCache/NatsCache.cs | 13 ++++---- .../Cache/HybridCacheSetAndRemoveTests.cs | 30 +++++++++++++++---- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/NatsDistributedCache/NatsCache.cs b/src/NatsDistributedCache/NatsCache.cs index dc84cdf..57f1c53 100644 --- a/src/NatsDistributedCache/NatsCache.cs +++ b/src/NatsDistributedCache/NatsCache.cs @@ -25,6 +25,14 @@ public class CacheEntry public byte[]? Data { get; set; } } +/// +/// JsonSerializerContext for CacheEntry +/// +[JsonSerializable(typeof(CacheEntry))] +public partial class CacheEntryJsonContext : JsonSerializerContext +{ +} + /// /// Distributed cache implementation using NATS Key-Value Store. /// @@ -364,8 +372,3 @@ await kvStore.DeleteAsync(GetPrefixedKey(key), natsKvDeleteOpts, cancellationTok .ConfigureAwait(false); } } - -[JsonSerializable(typeof(CacheEntry))] -internal partial class CacheEntryJsonContext : JsonSerializerContext -{ -} diff --git a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs index a8e251a..0975f40 100644 --- a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs +++ b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs @@ -1,5 +1,8 @@ +using System.Buffers; +using System.Globalization; using System.Text; using Microsoft.Extensions.Caching.Hybrid; +using NATS.Client.Core; using NATS.Client.KeyValueStore; using NATS.Net; @@ -29,7 +32,7 @@ public async Task HybridCacheGetSetRemoveTest() var kvEntry = await kvStore.GetEntryAsync(key); Assert.NotNull(kvEntry.Value); - // Assert - Verify the value is retreivable from hybrid cache + // Assert - Verify the value is retrievable from hybrid cache var result = await HybridCache.GetOrCreateAsync(key, async ct => await Task.FromResult(Array.Empty())); Assert.NotEmpty(result); Assert.Equal(value, result); @@ -40,7 +43,7 @@ public async Task HybridCacheGetSetRemoveTest() // Assert - Verify the value is not stored in NATS KV store await Assert.ThrowsAsync(async () => await kvStore.GetEntryAsync(key)); - // Assert - Verify the value is not retreivable from hybrid cache + // Assert - Verify the value is not retrievable from hybrid cache result = await HybridCache.GetOrCreateAsync(key, async ct => await Task.FromResult(Array.Empty())); Assert.Empty(result); } @@ -50,7 +53,8 @@ public async Task HybridCacheSerializesDateTime() { // Arrange var key = MethodKey(); - var now = DateTime.UtcNow; + const string invariant = "2025-05-15T17:18:58.7503097Z"; + var date = DateTime.Parse(invariant, CultureInfo.InvariantCulture); var options = new HybridCacheEntryOptions { @@ -58,11 +62,25 @@ public async Task HybridCacheSerializesDateTime() }; // Act - Store the complex object in the cache - await HybridCache.SetAsync(key, now, options); + await HybridCache.SetAsync(key, date, options); - // Assert - Retrieve the object and verify it matches + // Assert - date is serialized as expected + var writer = new ArrayBufferWriter(); + new NatsUtf8PrimitivesSerializer().Serialize(writer, date); + var serializedBytes = writer.WrittenSpan.ToArray(); + + var kvStore = await NatsConnection.CreateKeyValueStoreContext().GetStoreAsync("cache"); + NatsJsonContextSerializer cacheEntrySerializer = new(CacheEntryJsonContext.Default); + var kvEntry = await kvStore.GetEntryAsync(key, serializer: cacheEntrySerializer); + Assert.NotNull(kvEntry.Value?.Data); + + // HybridCache adds additional data to the front of the serialized value, so we're matching only the relevant data + var length = serializedBytes.Length; + Assert.Equal(serializedBytes[^length], kvEntry.Value.Data[^length]); + + // Assert - date is deserialized as expected var retrieved = await HybridCache.GetOrCreateAsync(key, async ct => await Task.FromResult(DateTime.UnixEpoch)); - Assert.Equal(now, retrieved); + Assert.Equal(date, retrieved); // Cleanup await HybridCache.RemoveAsync(key); From 3869458a3ffd338bd5d616265afde5bb7118918f Mon Sep 17 00:00:00 2001 From: SuddyN Date: Thu, 15 May 2025 14:05:32 -0400 Subject: [PATCH 6/8] use Assert.Equivalent --- test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs index 0975f40..7fce294 100644 --- a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs +++ b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs @@ -76,7 +76,7 @@ public async Task HybridCacheSerializesDateTime() // HybridCache adds additional data to the front of the serialized value, so we're matching only the relevant data var length = serializedBytes.Length; - Assert.Equal(serializedBytes[^length], kvEntry.Value.Data[^length]); + Assert.Equivalent(serializedBytes[^length], kvEntry.Value.Data[^length], strict: true); // Assert - date is deserialized as expected var retrieved = await HybridCache.GetOrCreateAsync(key, async ct => await Task.FromResult(DateTime.UnixEpoch)); From 8188689eefe03f31f93c13495d7437bf5f81422e Mon Sep 17 00:00:00 2001 From: SuddyN Date: Thu, 15 May 2025 14:28:09 -0400 Subject: [PATCH 7/8] rewrite assert --- .../IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs index 7fce294..ee08993 100644 --- a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs +++ b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs @@ -5,6 +5,7 @@ using NATS.Client.Core; using NATS.Client.KeyValueStore; using NATS.Net; +using StreamJsonRpc; namespace CodeCargo.Nats.DistributedCache.IntegrationTests.Cache; @@ -67,16 +68,16 @@ public async Task HybridCacheSerializesDateTime() // Assert - date is serialized as expected var writer = new ArrayBufferWriter(); new NatsUtf8PrimitivesSerializer().Serialize(writer, date); - var serializedBytes = writer.WrittenSpan.ToArray(); + var serializedDateString = Encoding.UTF8.GetString(writer.WrittenSpan.ToArray()); var kvStore = await NatsConnection.CreateKeyValueStoreContext().GetStoreAsync("cache"); NatsJsonContextSerializer cacheEntrySerializer = new(CacheEntryJsonContext.Default); var kvEntry = await kvStore.GetEntryAsync(key, serializer: cacheEntrySerializer); Assert.NotNull(kvEntry.Value?.Data); + var storedDateString = Encoding.UTF8.GetString(kvEntry.Value.Data); // HybridCache adds additional data to the front of the serialized value, so we're matching only the relevant data - var length = serializedBytes.Length; - Assert.Equivalent(serializedBytes[^length], kvEntry.Value.Data[^length], strict: true); + Assert.Contains(serializedDateString, storedDateString); // Assert - date is deserialized as expected var retrieved = await HybridCache.GetOrCreateAsync(key, async ct => await Task.FromResult(DateTime.UnixEpoch)); From e479045d0f76b64b64c4a7c5012c094e893ee856 Mon Sep 17 00:00:00 2001 From: SuddyN Date: Thu, 15 May 2025 14:41:01 -0400 Subject: [PATCH 8/8] UTF8 -> ASCII --- test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs index ee08993..6c1e792 100644 --- a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs +++ b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs @@ -68,13 +68,13 @@ public async Task HybridCacheSerializesDateTime() // Assert - date is serialized as expected var writer = new ArrayBufferWriter(); new NatsUtf8PrimitivesSerializer().Serialize(writer, date); - var serializedDateString = Encoding.UTF8.GetString(writer.WrittenSpan.ToArray()); + var serializedDateString = Encoding.ASCII.GetString(writer.WrittenSpan.ToArray()); var kvStore = await NatsConnection.CreateKeyValueStoreContext().GetStoreAsync("cache"); NatsJsonContextSerializer cacheEntrySerializer = new(CacheEntryJsonContext.Default); var kvEntry = await kvStore.GetEntryAsync(key, serializer: cacheEntrySerializer); Assert.NotNull(kvEntry.Value?.Data); - var storedDateString = Encoding.UTF8.GetString(kvEntry.Value.Data); + var storedDateString = Encoding.ASCII.GetString(kvEntry.Value.Data); // HybridCache adds additional data to the front of the serialized value, so we're matching only the relevant data Assert.Contains(serializedDateString, storedDateString);