Skip to content

Commit 0eab7d4

Browse files
committed
Fix CanDoSRANDMEMBERWithCountCommandLC test
Fix remaining Encoding.ASCII.GetString usages.
1 parent d609b01 commit 0eab7d4

6 files changed

+39
-71
lines changed

test/Garnet.test/GarnetServerConfigTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,7 @@ public async Task MultiTcpSocketTest()
784784
var hostname = TestUtils.GetHostName();
785785
var addresses = Dns.GetHostAddresses(hostname);
786786
addresses = [.. addresses, IPAddress.IPv6Loopback, IPAddress.Loopback];
787+
addresses = [.. addresses.Distinct()];
787788

788789
var endpoints = addresses.Select(address => new IPEndPoint(address, TestUtils.TestPort)).ToArray();
789790
var server = TestUtils.CreateGarnetServer(TestUtils.MethodTestDir, endpoints: endpoints);

test/Garnet.test/RespBlockingCollectionTests.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Licensed under the MIT license.
33

44
using System;
5-
using System.Text;
65
using System.Threading;
76
using System.Threading.Tasks;
87
using Garnet.server;
@@ -444,8 +443,7 @@ public async Task BasicBzmpopWithExpireItemsTest(string mode)
444443
using var lcr = TestUtils.CreateRequest();
445444
var response = lcr.SendCommand($"BZMPOP 1 1 {key} {mode}");
446445
var expectedResponse = "$-1\r\n";
447-
var actualValue = Encoding.ASCII.GetString(response).Substring(0, expectedResponse.Length);
448-
ClassicAssert.AreEqual(expectedResponse, actualValue);
446+
TestUtils.AssertEqualUpToExpectedLength(expectedResponse, response);
449447
}
450448

451449
[Test]
@@ -551,8 +549,7 @@ public async Task BasicBzpopMinMaxWithExpireItemsTest(string command)
551549
using var lcr = TestUtils.CreateRequest();
552550
var response = lcr.SendCommand($"{command} {key} 1");
553551
var expectedResponse = "$-1\r\n";
554-
var actualValue = Encoding.ASCII.GetString(response).Substring(0, expectedResponse.Length);
555-
ClassicAssert.AreEqual(expectedResponse, actualValue);
552+
TestUtils.AssertEqualUpToExpectedLength(expectedResponse, response);
556553
}
557554

558555
[Test]

test/Garnet.test/RespSetTest.cs

Lines changed: 20 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Linq;
77
using System.Text;
88
using System.Threading.Tasks;
9+
using Garnet.common;
910
using Garnet.server;
1011
using NUnit.Framework;
1112
using NUnit.Framework.Legacy;
@@ -1007,7 +1008,7 @@ public void CanDoSCARDCommandsLC()
10071008
}
10081009

10091010
[Test]
1010-
public void CanDoSRANDMEMBERWithCountCommandLC()
1011+
public unsafe void CanDoSRANDMEMBERWithCountCommandLC()
10111012
{
10121013
var myset = new HashSet<string> { "one", "two", "three", "four", "five" };
10131014

@@ -1025,43 +1026,31 @@ public void CanDoSRANDMEMBERWithCountCommandLC()
10251026
CreateLongSet();
10261027

10271028
response = lightClientRequest.SendCommand("SRANDMEMBER myset", 1);
1028-
var strLen = Encoding.ASCII.GetString(response).Substring(1, 1);
1029-
var item = Encoding.ASCII.GetString(response).Substring(4, Int32.Parse(strLen));
1029+
var strLen = Encoding.ASCII.GetString(response, 1, 1);
1030+
var item = Encoding.ASCII.GetString(response, 4, int.Parse(strLen));
10301031
ClassicAssert.IsTrue(myset.Contains(item));
10311032

10321033
// Get three random members
10331034
response = lightClientRequest.SendCommand("SRANDMEMBER myset 3", 3);
1034-
TestUtils.AssertEqualUpToExpectedLength("*", response);
1035-
1036-
var strResponse = Encoding.ASCII.GetString(response);
1037-
var arrLenEndIdx = strResponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
1038-
ClassicAssert.IsTrue(arrLenEndIdx > 1);
1039-
1040-
var strArrLen = strResponse.AsSpan().Slice(1, arrLenEndIdx - 1);
1041-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out var arrLen));
1042-
ClassicAssert.AreEqual(3, arrLen);
1035+
TestUtils.AssertEqualUpToExpectedLength("*3\r\n", response);
10431036

10441037
// Get 6 random members and verify that at least two elements are the same
10451038
response = lightClientRequest.SendCommand("SRANDMEMBER myset -6", 6);
1046-
var strReponse = Encoding.ASCII.GetString(response);
1047-
arrLenEndIdx = strReponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
1048-
strArrLen = strReponse.AsSpan().Slice(1, arrLenEndIdx - 1);
1049-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out arrLen));
1050-
1051-
var members = new HashSet<string>();
1052-
var repeatedMembers = false;
1053-
for (var i = 0; i < arrLen; i++)
1039+
TestUtils.AssertEqualUpToExpectedLength("*6\r\n", response);
1040+
1041+
string[] results;
1042+
1043+
fixed (byte* p = &response[0])
10541044
{
1055-
var member = strReponse.Substring(arrLenEndIdx + 2, response.Length - arrLenEndIdx - 5);
1056-
if (members.Contains(member))
1057-
{
1058-
repeatedMembers = true;
1059-
break;
1060-
}
1061-
members.Add(member);
1045+
var ptr = p;
1046+
ClassicAssert.IsTrue(
1047+
RespReadUtils.TryReadStringArrayWithLengthHeader(out results, ref ptr,
1048+
p + (Garnet.common.NumUtils.MaximumFormatInt64Length * 10))
1049+
);
10621050
}
10631051

1064-
ClassicAssert.IsTrue(repeatedMembers, "At least two members are repeated.");
1052+
ClassicAssert.IsTrue(results.Distinct().Count() != results.Length,
1053+
"At least two members are repeated.");
10651054
}
10661055

10671056
[Test]
@@ -1096,31 +1085,15 @@ public void CanDoSPOPWithCountCommandLC()
10961085

10971086
var lightClientRequest = TestUtils.CreateRequest();
10981087
var response = lightClientRequest.SendCommand("SPOP myset 3", 3);
1099-
TestUtils.AssertEqualUpToExpectedLength("*", response);
1100-
1101-
var strResponse = Encoding.ASCII.GetString(response);
1102-
var arrLenEndIdx = strResponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
1103-
ClassicAssert.IsTrue(arrLenEndIdx > 1);
1104-
1105-
var strArrLen = strResponse.AsSpan().Slice(1, arrLenEndIdx - 1);
1106-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out var arrLen));
1107-
ClassicAssert.AreEqual(3, arrLen);
1088+
TestUtils.AssertEqualUpToExpectedLength("*3\r\n", response);
11081089

11091090
response = lightClientRequest.SendCommands("SCARD myset", "PING", 1, 1);
11101091
var expectedResponse = ":2\r\n+PONG\r\n";
11111092
TestUtils.AssertEqualUpToExpectedLength(expectedResponse, response);
11121093

11131094
// Test for popping set until empty
11141095
response = lightClientRequest.SendCommand("SPOP myset 2", 2);
1115-
TestUtils.AssertEqualUpToExpectedLength("*", response);
1116-
1117-
strResponse = Encoding.ASCII.GetString(response);
1118-
arrLenEndIdx = strResponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
1119-
ClassicAssert.IsTrue(arrLenEndIdx > 1);
1120-
1121-
strArrLen = strResponse.AsSpan().Slice(1, arrLenEndIdx - 1);
1122-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out arrLen));
1123-
ClassicAssert.AreEqual(2, arrLen);
1096+
TestUtils.AssertEqualUpToExpectedLength("*2\r\n", response);
11241097
}
11251098

11261099
[Test]
@@ -1131,15 +1104,7 @@ public void CanDoSPOPWithMoreCountThanSetSizeCommandLC()
11311104
var lightClientRequest = TestUtils.CreateRequest();
11321105

11331106
var response = lightClientRequest.SendCommand("SPOP myset 10", 5);
1134-
TestUtils.AssertEqualUpToExpectedLength("*", response);
1135-
1136-
var strResponse = Encoding.ASCII.GetString(response);
1137-
var arrLenEndIdx = strResponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
1138-
ClassicAssert.IsTrue(arrLenEndIdx > 1);
1139-
1140-
var strArrLen = strResponse.AsSpan().Slice(1, arrLenEndIdx - 1);
1141-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out var arrLen));
1142-
ClassicAssert.IsTrue(arrLen == 5);
1107+
TestUtils.AssertEqualUpToExpectedLength("*5\r\n", response);
11431108

11441109
var lightClientRequest2 = TestUtils.CreateRequest();
11451110
response = lightClientRequest2.SendCommand("SADD myset one");

test/Garnet.test/RespSortedSetTests.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4208,15 +4208,16 @@ public void CanUseZRandMember(int bytesSent)
42084208
_ = lightClientRequest.SendCommand("ZADD dadi 1 uno 2 due 3 tre 4 quattro 5 cinque 6 six 7 sept 8 huit 9 nough 10 dis");
42094209

42104210
// ZRANDMEMBER
4211-
var s = Encoding.ASCII.GetString(lightClientRequest.SendCommandChunks("ZRANDMEMBER dadi", bytesSent));
4212-
int startIndexField = s.IndexOf('\n') + 1;
4213-
int endIndexField = s.IndexOf('\n', startIndexField) - 1;
4214-
string memberValue = s.Substring(startIndexField, endIndexField - startIndexField);
4211+
var response = lightClientRequest.SendCommandChunks("ZRANDMEMBER dadi", bytesSent);
4212+
var s = Encoding.ASCII.GetString(response, 0, Garnet.common.NumUtils.MaximumFormatInt64Length);
4213+
var startIndexField = s.IndexOf('\n') + 1;
4214+
var endIndexField = s.IndexOf('\n', startIndexField) - 1;
4215+
var memberValue = s.Substring(startIndexField, endIndexField - startIndexField);
42154216
var foundInSet = ("uno due tre quattro cinque six sept huit nough dis").IndexOf(memberValue, StringComparison.InvariantCultureIgnoreCase);
42164217
ClassicAssert.IsTrue(foundInSet >= 0);
42174218

42184219
// ZRANDMEMBER count
4219-
var response = lightClientRequest.SendCommandChunks("ZRANDMEMBER dadi 5", bytesSent, 6);
4220+
response = lightClientRequest.SendCommandChunks("ZRANDMEMBER dadi 5", bytesSent, 6);
42204221
var expectedResponse = "*5\r\n"; // 5 values
42214222
TestUtils.AssertEqualUpToExpectedLength(expectedResponse, response);
42224223

test/Garnet.test/RespTests.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4958,17 +4958,19 @@ public async Task ClientUnblockBasicTest(string clientType, string mode, bool ex
49584958

49594959
// Start blocking client
49604960
using var blockingClient = TestUtils.CreateRequest();
4961-
var clientIdResponse = Encoding.ASCII.GetString(blockingClient.SendCommand("CLIENT ID"));
4961+
var clientIdResponse = Encoding.ASCII.GetString(blockingClient.SendCommand("CLIENT ID"), 0,
4962+
Garnet.common.NumUtils.MaximumFormatInt64Length * 2);
49624963
var clientId = clientIdResponse.Substring(1, clientIdResponse.IndexOf("\r\n") - 1);
4964+
var isError = false;
49634965
Task blockingTask = null;
4964-
bool isError = false;
4966+
49654967
if (clientType == "BLOCKING")
49664968
{
49674969
blockingTask = taskFactory.StartNew(() =>
49684970
{
49694971
var startTime = Stopwatch.GetTimestamp();
49704972
var response = blockingClient.SendCommand("BLMPOP 10 1 keyA LEFT");
4971-
if (Encoding.ASCII.GetString(response).Substring(0, "-UNBLOCKED".Length) == "-UNBLOCKED")
4973+
if (Encoding.ASCII.GetString(response, 0, "-UNBLOCKED".Length) == "-UNBLOCKED")
49724974
{
49734975
isError = true;
49744976
}
@@ -5019,14 +5021,17 @@ public async Task MultipleClientsUnblockAndAddTest(int numberOfItems)
50195021

50205022
// Start blocking client
50215023
using var blockingClient = TestUtils.CreateRequest();
5022-
var clientIdResponse = Encoding.ASCII.GetString(blockingClient.SendCommand("CLIENT ID"));
5024+
var clientIdResponse = Encoding.ASCII.GetString(blockingClient.SendCommand("CLIENT ID"), 0,
5025+
Garnet.common.NumUtils.MaximumFormatInt64Length * 2);
50235026
var clientId = clientIdResponse.Substring(1, clientIdResponse.IndexOf("\r\n") - 1);
5027+
ClassicAssert.IsTrue(long.TryParse(clientId, out _));
50245028

50255029
string blockingResult = null;
50265030
var blockingTask = Task.Run(() =>
50275031
{
50285032
var response = blockingClient.SendCommand($"BLMPOP 10 1 {key} LEFT COUNT 30");
5029-
blockingResult = Encoding.ASCII.GetString(response);
5033+
blockingResult = Encoding.ASCII.GetString(response, 0,
5034+
Garnet.common.NumUtils.MaximumFormatInt64Length * (numberOfItems + 1));
50305035
});
50315036

50325037
// Wait for client to enter blocking state

test/Garnet.test/TestUtils.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ internal static class TestUtils
8080
/// </summary>
8181
static readonly bool useTestLogger = false;
8282

83-
private static int procId = Process.GetCurrentProcess().Id;
8483
internal static string CustomRespCommandInfoJsonPath = "CustomRespCommandsInfo.json";
8584
internal static string CustomRespCommandDocsJsonPath = "CustomRespCommandsDocs.json";
8685

0 commit comments

Comments
 (0)