From 84bdf81526f37c6f99b240119c03aa92c476c360 Mon Sep 17 00:00:00 2001 From: dudu Date: Sun, 10 Aug 2025 14:37:38 +0800 Subject: [PATCH] fix: replace EndPoint with IPEndPoint Stats result uses EndPoint as key --- sample/SampleWebApp/appsettings.json | 4 + .../Configuration/EndPointExtensions.cs | 1 + .../Memcached/DefaultServerPool.cs | 4 +- src/Enyim.Caching/Memcached/PooledSocket.cs | 4 +- .../Protocol/Binary/BinaryResponse.cs | 8 +- .../Protocol/Binary/StatsOperation.cs | 10 +- .../MemcachedClienStatsTests.cs | 21 ++++ .../MemcachedClientRemoveTests.cs | 50 +++++----- .../MemcachedClientStoreTests.cs | 99 +++++++++---------- .../MemcachedClientTestsBase.cs | 4 +- .../HomeControllerTests.cs | 1 - 11 files changed, 109 insertions(+), 97 deletions(-) create mode 100644 test/Enyim.Caching.Tests/MemcachedClienStatsTests.cs diff --git a/sample/SampleWebApp/appsettings.json b/sample/SampleWebApp/appsettings.json index e9529843..289c7468 100644 --- a/sample/SampleWebApp/appsettings.json +++ b/sample/SampleWebApp/appsettings.json @@ -1,6 +1,10 @@ { "enyimMemcached": { "Servers": [ + { + "Address": "memcached", + "Port": 11211 + }, { "Address": "memcached", "Port": 11211 diff --git a/src/Enyim.Caching/Configuration/EndPointExtensions.cs b/src/Enyim.Caching/Configuration/EndPointExtensions.cs index 2c7ccc18..291f991a 100644 --- a/src/Enyim.Caching/Configuration/EndPointExtensions.cs +++ b/src/Enyim.Caching/Configuration/EndPointExtensions.cs @@ -4,6 +4,7 @@ using System.Net.Sockets; namespace Enyim.Caching.Configuration; + public static class EndPointExtensions { public static IPEndPoint GetIPEndPoint(this EndPoint endpoint, bool useIPv6) diff --git a/src/Enyim.Caching/Memcached/DefaultServerPool.cs b/src/Enyim.Caching/Memcached/DefaultServerPool.cs index 9c73e078..2a6c8b07 100644 --- a/src/Enyim.Caching/Memcached/DefaultServerPool.cs +++ b/src/Enyim.Caching/Memcached/DefaultServerPool.cs @@ -219,9 +219,9 @@ void IServerPool.Start() { _allNodes = _configuration.Servers.Select(ep => { - var node = CreateNode(ep); + var ipEndPoint = ep.GetIPEndPoint(_configuration.UseIPv6); + var node = CreateNode(ipEndPoint); node.Failed += NodeFail; - return node; }).ToArray(); diff --git a/src/Enyim.Caching/Memcached/PooledSocket.cs b/src/Enyim.Caching/Memcached/PooledSocket.cs index 0949c376..b047dd9c 100755 --- a/src/Enyim.Caching/Memcached/PooledSocket.cs +++ b/src/Enyim.Caching/Memcached/PooledSocket.cs @@ -479,9 +479,9 @@ public void Read(byte[] buffer, int offset, int count) { try { - int currentRead = (_useSslStream + int currentRead = _useSslStream ? _sslStream.Read(buffer, offset, shouldRead) - : _inputStream.Read(buffer, offset, shouldRead)); + : _inputStream.Read(buffer, offset, shouldRead); if (currentRead == count) break; if (currentRead < 1) diff --git a/src/Enyim.Caching/Memcached/Protocol/Binary/BinaryResponse.cs b/src/Enyim.Caching/Memcached/Protocol/Binary/BinaryResponse.cs index 38cef74e..deeff771 100644 --- a/src/Enyim.Caching/Memcached/Protocol/Binary/BinaryResponse.cs +++ b/src/Enyim.Caching/Memcached/Protocol/Binary/BinaryResponse.cs @@ -1,6 +1,5 @@ using System; using System.Text; -using System.Diagnostics; using System.Threading.Tasks; namespace Enyim.Caching.Memcached.Protocol.Binary @@ -43,8 +42,7 @@ public string GetStatusMessage() { return Data.Array == null ? null - : (responseMessage - ?? (responseMessage = Encoding.ASCII.GetString(Data.Array, Data.Offset, Data.Count))); + : (responseMessage ??= Encoding.ASCII.GetString(Data.Array, Data.Offset, Data.Count)); } public unsafe bool Read(PooledSocket socket) @@ -57,9 +55,7 @@ public unsafe bool Read(PooledSocket socket) var header = new byte[HeaderLength]; socket.Read(header, 0, header.Length); - int dataLength, extraLength; - - DeserializeHeader(header, out dataLength, out extraLength); + DeserializeHeader(header, out int dataLength, out int extraLength); if (dataLength > 0) { diff --git a/src/Enyim.Caching/Memcached/Protocol/Binary/StatsOperation.cs b/src/Enyim.Caching/Memcached/Protocol/Binary/StatsOperation.cs index 1b720352..357ef9ab 100644 --- a/src/Enyim.Caching/Memcached/Protocol/Binary/StatsOperation.cs +++ b/src/Enyim.Caching/Memcached/Protocol/Binary/StatsOperation.cs @@ -1,17 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Net; -using System.Text; -using System.Threading.Tasks; using Enyim.Caching.Memcached.Results; using Enyim.Caching.Memcached.Results.Extensions; +using System.Collections.Generic; +using System.Threading.Tasks; namespace Enyim.Caching.Memcached.Protocol.Binary { public class StatsOperation : BinaryOperation, IStatsOperation { - private static readonly ILog _log = LogManager.GetLogger(typeof(StatsOperation)); - private readonly string _type; private Dictionary _result; @@ -42,7 +37,6 @@ protected internal override IOperationResult ReadResponse(PooledSocket socket) var data = response.Data; var key = BinaryConverter.DecodeKey(data.Array, data.Offset, response.KeyLength); var value = BinaryConverter.DecodeKey(data.Array, data.Offset + response.KeyLength, data.Count - response.KeyLength); - serverData[key] = value; } diff --git a/test/Enyim.Caching.Tests/MemcachedClienStatsTests.cs b/test/Enyim.Caching.Tests/MemcachedClienStatsTests.cs new file mode 100644 index 00000000..1932e231 --- /dev/null +++ b/test/Enyim.Caching.Tests/MemcachedClienStatsTests.cs @@ -0,0 +1,21 @@ +using Enyim.Caching.Configuration; +using System; +using System.Net; +using Xunit; + +namespace Enyim.Caching.Tests +{ + public class MemcachedClientStatsTests : MemcachedClientTestsBase + { + [Fact] + public void When_Getting_Uptime_Is_Successful() + { + var uptime = _client.Stats().GetUptime(new DnsEndPoint(_memcachedHost, _memcachedPort)); + Assert.True(uptime > TimeSpan.Zero); + + var ipEndPoint = new DnsEndPoint(_memcachedHost, _memcachedPort).GetIPEndPoint(false); + uptime = _client.Stats().GetUptime(ipEndPoint); + Assert.True(uptime > TimeSpan.Zero); + } + } +} diff --git a/test/Enyim.Caching.Tests/MemcachedClientRemoveTests.cs b/test/Enyim.Caching.Tests/MemcachedClientRemoveTests.cs index 600416f6..29828c19 100644 --- a/test/Enyim.Caching.Tests/MemcachedClientRemoveTests.cs +++ b/test/Enyim.Caching.Tests/MemcachedClientRemoveTests.cs @@ -1,35 +1,31 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xunit; +using Xunit; namespace Enyim.Caching.Tests { - public class MemcachedClientRemoveTests : MemcachedClientTestsBase - { - [Fact] - public void When_Removing_A_Valid_Key_Result_Is_Successful() - { - var key = GetUniqueKey("remove"); - var storeResult = Store(key: key); - StoreAssertPass(storeResult); + public class MemcachedClientRemoveTests : MemcachedClientTestsBase + { + [Fact] + public void When_Removing_A_Valid_Key_Result_Is_Successful() + { + var key = GetUniqueKey("remove"); + var storeResult = Store(key: key); + StoreAssertPass(storeResult); - var removeResult = _client.ExecuteRemove(key); - Assert.True(removeResult.Success, "Success was false"); - Assert.True((removeResult.StatusCode ?? 0) == 0, "StatusCode was neither null nor 0"); + var removeResult = _client.ExecuteRemove(key); + Assert.True(removeResult.Success, "Success was false"); + Assert.True((removeResult.StatusCode ?? 0) == 0, "StatusCode was neither null nor 0"); - var getResult = _client.ExecuteGet(key); - GetAssertFail(getResult); - } + var getResult = _client.ExecuteGet(key); + GetAssertFail(getResult); + } - [Fact] - public void When_Removing_An_Invalid_Key_Result_Is_Not_Successful() - { - var key = GetUniqueKey("remove"); + [Fact] + public void When_Removing_An_Invalid_Key_Result_Is_Not_Successful() + { + var key = GetUniqueKey("remove"); - var removeResult = _client.ExecuteRemove(key); - Assert.False(removeResult.Success, "Success was true"); - } - } + var removeResult = _client.ExecuteRemove(key); + Assert.False(removeResult.Success, "Success was true"); + } + } } diff --git a/test/Enyim.Caching.Tests/MemcachedClientStoreTests.cs b/test/Enyim.Caching.Tests/MemcachedClientStoreTests.cs index 836ee300..3f9c26c2 100644 --- a/test/Enyim.Caching.Tests/MemcachedClientStoreTests.cs +++ b/test/Enyim.Caching.Tests/MemcachedClientStoreTests.cs @@ -9,67 +9,66 @@ namespace Enyim.Caching.Tests { - public class MemcachedClientStoreTests : MemcachedClientTestsBase - { + public class MemcachedClientStoreTests : MemcachedClientTestsBase + { + [Fact] + public void When_Storing_Item_With_New_Key_And_StoreMode_Add_Result_Is_Successful() + { + var result = Store(StoreMode.Add); + StoreAssertPass(result); - [Fact] - public void When_Storing_Item_With_New_Key_And_StoreMode_Add_Result_Is_Successful() - { - var result = Store(StoreMode.Add); - StoreAssertPass(result); + } - } + [Fact] + public void When_Storing_Item_With_Existing_Key_And_StoreMode_Add_Result_Is_Not_Successful() + { + var key = GetUniqueKey("store"); + var result = Store(StoreMode.Add, key); + StoreAssertPass(result); - [Fact] - public void When_Storing_Item_With_Existing_Key_And_StoreMode_Add_Result_Is_Not_Successful() - { - var key = GetUniqueKey("store"); - var result = Store(StoreMode.Add, key); - StoreAssertPass(result); + result = Store(StoreMode.Add, key); + StoreAssertFail(result); + } - result = Store(StoreMode.Add, key); - StoreAssertFail(result); - } + [Fact] + public void When_Storing_Item_With_New_Key_And_StoreMode_Replace_Result_Is_Not_Successful() + { + var result = Store(StoreMode.Replace); + Assert.Equal((int)StatusCodeEnums.NotFound, result.StatusCode); + StoreAssertFail(result); - [Fact] - public void When_Storing_Item_With_New_Key_And_StoreMode_Replace_Result_Is_Not_Successful() - { - var result = Store(StoreMode.Replace); - Assert.Equal((int)StatusCodeEnums.NotFound, result.StatusCode); - StoreAssertFail(result); + } - } + [Fact] + public void When_Storing_Item_With_Existing_Key_And_StoreMode_Replace_Result_Is_Successful() + { + var key = GetUniqueKey("store"); + var result = Store(StoreMode.Add, key); + StoreAssertPass(result); - [Fact] - public void When_Storing_Item_With_Existing_Key_And_StoreMode_Replace_Result_Is_Successful() - { - var key = GetUniqueKey("store"); - var result = Store(StoreMode.Add, key); - StoreAssertPass(result); + result = Store(StoreMode.Replace, key); + StoreAssertPass(result); + } - result = Store(StoreMode.Replace, key); - StoreAssertPass(result); - } + [Fact] + public void When_Storing_Item_With_New_Key_And_StoreMode_Set_Result_Is_Successful() + { + var result = Store(StoreMode.Set); + StoreAssertPass(result); - [Fact] - public void When_Storing_Item_With_New_Key_And_StoreMode_Set_Result_Is_Successful() - { - var result = Store(StoreMode.Set); - StoreAssertPass(result); + } - } + [Fact] + public void When_Storing_Item_With_Existing_Key_And_StoreMode_Set_Result_Is_Successful() + { + var key = GetUniqueKey("store"); + var result = Store(StoreMode.Add, key); + StoreAssertPass(result); - [Fact] - public void When_Storing_Item_With_Existing_Key_And_StoreMode_Set_Result_Is_Successful() - { - var key = GetUniqueKey("store"); - var result = Store(StoreMode.Add, key); - StoreAssertPass(result); - - result = Store(StoreMode.Set, key); - StoreAssertPass(result); - } - } + result = Store(StoreMode.Set, key); + StoreAssertPass(result); + } + } } #region [ License information ] diff --git a/test/Enyim.Caching.Tests/MemcachedClientTestsBase.cs b/test/Enyim.Caching.Tests/MemcachedClientTestsBase.cs index 181de628..006b5c55 100644 --- a/test/Enyim.Caching.Tests/MemcachedClientTestsBase.cs +++ b/test/Enyim.Caching.Tests/MemcachedClientTestsBase.cs @@ -16,6 +16,8 @@ namespace Enyim.Caching.Tests { public abstract class MemcachedClientTestsBase { + protected static readonly string _memcachedHost = "memcached"; + protected static readonly int _memcachedPort = 11211; protected MemcachedClient _client; public MemcachedClientTestsBase(Action onAddEnyimMemcached = null) @@ -23,7 +25,7 @@ public MemcachedClientTestsBase(Action onAddEnyimMemcach IServiceCollection services = new ServiceCollection(); services.AddEnyimMemcached(options => { - options.AddServer("memcached", 11211); + options.AddServer(_memcachedHost, _memcachedPort); onAddEnyimMemcached?.Invoke(options); options.Transcoder = nameof(MessagePackTranscoder); }); diff --git a/test/SampleWebApp.IntegrationTests/HomeControllerTests.cs b/test/SampleWebApp.IntegrationTests/HomeControllerTests.cs index b67c8d80..20e86957 100644 --- a/test/SampleWebApp.IntegrationTests/HomeControllerTests.cs +++ b/test/SampleWebApp.IntegrationTests/HomeControllerTests.cs @@ -53,7 +53,6 @@ public async Task Get_uptime_test() var response = await httpClient.GetAsync("/home/uptime"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var uptime = await response.Content.ReadFromJsonAsync(); - Console.WriteLine("uptime: " + uptime); Assert.True(uptime > TimeSpan.Zero); } }