Skip to content

Commit c7bd663

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

6 files changed

+38
-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;
@@ -884,7 +885,7 @@ public void CanDoSCARDCommandsLC()
884885
}
885886

886887
[Test]
887-
public void CanDoSRANDMEMBERWithCountCommandLC()
888+
public unsafe void CanDoSRANDMEMBERWithCountCommandLC()
888889
{
889890
var myset = new HashSet<string> { "one", "two", "three", "four", "five" };
890891

@@ -902,43 +903,31 @@ public void CanDoSRANDMEMBERWithCountCommandLC()
902903
CreateLongSet();
903904

904905
response = lightClientRequest.SendCommand("SRANDMEMBER myset", 1);
905-
var strLen = Encoding.ASCII.GetString(response).Substring(1, 1);
906-
var item = Encoding.ASCII.GetString(response).Substring(4, Int32.Parse(strLen));
906+
var strLen = Encoding.ASCII.GetString(response, 1, 1);
907+
var item = Encoding.ASCII.GetString(response, 4, int.Parse(strLen));
907908
ClassicAssert.IsTrue(myset.Contains(item));
908909

909910
// Get three random members
910911
response = lightClientRequest.SendCommand("SRANDMEMBER myset 3", 3);
911-
TestUtils.AssertEqualUpToExpectedLength("*", response);
912-
913-
var strResponse = Encoding.ASCII.GetString(response);
914-
var arrLenEndIdx = strResponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
915-
ClassicAssert.IsTrue(arrLenEndIdx > 1);
916-
917-
var strArrLen = strResponse.AsSpan().Slice(1, arrLenEndIdx - 1);
918-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out var arrLen));
919-
ClassicAssert.AreEqual(3, arrLen);
912+
TestUtils.AssertEqualUpToExpectedLength("*3\r\n", response);
920913

921914
// Get 6 random members and verify that at least two elements are the same
922915
response = lightClientRequest.SendCommand("SRANDMEMBER myset -6", 6);
923-
var strReponse = Encoding.ASCII.GetString(response);
924-
arrLenEndIdx = strReponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
925-
strArrLen = strReponse.AsSpan().Slice(1, arrLenEndIdx - 1);
926-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out arrLen));
927-
928-
var members = new HashSet<string>();
929-
var repeatedMembers = false;
930-
for (var i = 0; i < arrLen; i++)
916+
TestUtils.AssertEqualUpToExpectedLength("*6\r\n", response);
917+
918+
string[] results;
919+
920+
fixed (byte* p = &response[0])
931921
{
932-
var member = strReponse.Substring(arrLenEndIdx + 2, response.Length - arrLenEndIdx - 5);
933-
if (members.Contains(member))
934-
{
935-
repeatedMembers = true;
936-
break;
937-
}
938-
members.Add(member);
922+
var ptr = p;
923+
ClassicAssert.IsTrue(
924+
RespReadUtils.TryReadStringArrayWithLengthHeader(out results, ref ptr,
925+
p + (TestUtils.MaxLongDigits * 10))
926+
);
939927
}
940928

941-
ClassicAssert.IsTrue(repeatedMembers, "At least two members are repeated.");
929+
ClassicAssert.IsTrue(results.Distinct().Count() != results.Length,
930+
"At least two members are repeated.");
942931
}
943932

944933
[Test]
@@ -973,31 +962,15 @@ public void CanDoSPOPWithCountCommandLC()
973962

974963
var lightClientRequest = TestUtils.CreateRequest();
975964
var response = lightClientRequest.SendCommand("SPOP myset 3", 3);
976-
TestUtils.AssertEqualUpToExpectedLength("*", response);
977-
978-
var strResponse = Encoding.ASCII.GetString(response);
979-
var arrLenEndIdx = strResponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
980-
ClassicAssert.IsTrue(arrLenEndIdx > 1);
981-
982-
var strArrLen = strResponse.AsSpan().Slice(1, arrLenEndIdx - 1);
983-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out var arrLen));
984-
ClassicAssert.AreEqual(3, arrLen);
965+
TestUtils.AssertEqualUpToExpectedLength("*3\r\n", response);
985966

986967
response = lightClientRequest.SendCommands("SCARD myset", "PING", 1, 1);
987968
var expectedResponse = ":2\r\n+PONG\r\n";
988969
TestUtils.AssertEqualUpToExpectedLength(expectedResponse, response);
989970

990971
// Test for popping set until empty
991972
response = lightClientRequest.SendCommand("SPOP myset 2", 2);
992-
TestUtils.AssertEqualUpToExpectedLength("*", response);
993-
994-
strResponse = Encoding.ASCII.GetString(response);
995-
arrLenEndIdx = strResponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
996-
ClassicAssert.IsTrue(arrLenEndIdx > 1);
997-
998-
strArrLen = strResponse.AsSpan().Slice(1, arrLenEndIdx - 1);
999-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out arrLen));
1000-
ClassicAssert.AreEqual(2, arrLen);
973+
TestUtils.AssertEqualUpToExpectedLength("*2\r\n", response);
1001974
}
1002975

1003976
[Test]
@@ -1008,15 +981,7 @@ public void CanDoSPOPWithMoreCountThanSetSizeCommandLC()
1008981
var lightClientRequest = TestUtils.CreateRequest();
1009982

1010983
var response = lightClientRequest.SendCommand("SPOP myset 10", 5);
1011-
TestUtils.AssertEqualUpToExpectedLength("*", response);
1012-
1013-
var strResponse = Encoding.ASCII.GetString(response);
1014-
var arrLenEndIdx = strResponse.IndexOf("\r\n", StringComparison.InvariantCultureIgnoreCase);
1015-
ClassicAssert.IsTrue(arrLenEndIdx > 1);
1016-
1017-
var strArrLen = strResponse.AsSpan().Slice(1, arrLenEndIdx - 1);
1018-
ClassicAssert.IsTrue(int.TryParse(strArrLen, out var arrLen));
1019-
ClassicAssert.IsTrue(arrLen == 5);
984+
TestUtils.AssertEqualUpToExpectedLength("*5\r\n", response);
1020985

1021986
var lightClientRequest2 = TestUtils.CreateRequest();
1022987
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
@@ -4046,15 +4046,16 @@ public void CanUseZRandMember(int bytesSent)
40464046
_ = lightClientRequest.SendCommand("ZADD dadi 1 uno 2 due 3 tre 4 quattro 5 cinque 6 six 7 sept 8 huit 9 nough 10 dis");
40474047

40484048
// ZRANDMEMBER
4049-
var s = Encoding.ASCII.GetString(lightClientRequest.SendCommandChunks("ZRANDMEMBER dadi", bytesSent));
4050-
int startIndexField = s.IndexOf('\n') + 1;
4051-
int endIndexField = s.IndexOf('\n', startIndexField) - 1;
4052-
string memberValue = s.Substring(startIndexField, endIndexField - startIndexField);
4049+
var response = lightClientRequest.SendCommandChunks("ZRANDMEMBER dadi", bytesSent);
4050+
var s = Encoding.ASCII.GetString(response, 0, TestUtils.MaxLongDigits);
4051+
var startIndexField = s.IndexOf('\n') + 1;
4052+
var endIndexField = s.IndexOf('\n', startIndexField) - 1;
4053+
var memberValue = s.Substring(startIndexField, endIndexField - startIndexField);
40534054
var foundInSet = ("uno due tre quattro cinque six sept huit nough dis").IndexOf(memberValue, StringComparison.InvariantCultureIgnoreCase);
40544055
ClassicAssert.IsTrue(foundInSet >= 0);
40554056

40564057
// ZRANDMEMBER count
4057-
var response = lightClientRequest.SendCommandChunks("ZRANDMEMBER dadi 5", bytesSent, 6);
4058+
response = lightClientRequest.SendCommandChunks("ZRANDMEMBER dadi 5", bytesSent, 6);
40584059
var expectedResponse = "*5\r\n"; // 5 values
40594060
TestUtils.AssertEqualUpToExpectedLength(expectedResponse, response);
40604061

test/Garnet.test/RespTests.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4958,17 +4958,18 @@ 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, TestUtils.MaxLongDigits * 2);
49624962
var clientId = clientIdResponse.Substring(1, clientIdResponse.IndexOf("\r\n") - 1);
4963+
var isError = false;
49634964
Task blockingTask = null;
4964-
bool isError = false;
4965+
49654966
if (clientType == "BLOCKING")
49664967
{
49674968
blockingTask = taskFactory.StartNew(() =>
49684969
{
49694970
var startTime = Stopwatch.GetTimestamp();
49704971
var response = blockingClient.SendCommand("BLMPOP 10 1 keyA LEFT");
4971-
if (Encoding.ASCII.GetString(response).Substring(0, "-UNBLOCKED".Length) == "-UNBLOCKED")
4972+
if (Encoding.ASCII.GetString(response, 0, "-UNBLOCKED".Length) == "-UNBLOCKED")
49724973
{
49734974
isError = true;
49744975
}
@@ -5019,14 +5020,15 @@ public async Task MultipleClientsUnblockAndAddTest(int numberOfItems)
50195020

50205021
// Start blocking client
50215022
using var blockingClient = TestUtils.CreateRequest();
5022-
var clientIdResponse = Encoding.ASCII.GetString(blockingClient.SendCommand("CLIENT ID"));
5023+
var clientIdResponse = Encoding.ASCII.GetString(blockingClient.SendCommand("CLIENT ID"), 0, TestUtils.MaxLongDigits * 2);
50235024
var clientId = clientIdResponse.Substring(1, clientIdResponse.IndexOf("\r\n") - 1);
5025+
ClassicAssert.IsTrue(long.TryParse(clientId, out _));
50245026

50255027
string blockingResult = null;
50265028
var blockingTask = Task.Run(() =>
50275029
{
50285030
var response = blockingClient.SendCommand($"BLMPOP 10 1 {key} LEFT COUNT 30");
5029-
blockingResult = Encoding.ASCII.GetString(response);
5031+
blockingResult = Encoding.ASCII.GetString(response, 0, TestUtils.MaxLongDigits * (numberOfItems + 1));
50305032
});
50315033

50325034
// Wait for client to enter blocking state

test/Garnet.test/TestUtils.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,13 @@ internal static class TestUtils
7575
/// </summary>
7676
public static EndPoint EndPoint = new IPEndPoint(IPAddress.Loopback, TestPort);
7777

78+
public static readonly int MaxLongDigits = Garnet.common.NumUtils.CountDigits(long.MaxValue) + 2;
79+
7880
/// <summary>
7981
/// Whether to use a test progress logger
8082
/// </summary>
8183
static readonly bool useTestLogger = false;
8284

83-
private static int procId = Process.GetCurrentProcess().Id;
8485
internal static string CustomRespCommandInfoJsonPath = "CustomRespCommandsInfo.json";
8586
internal static string CustomRespCommandDocsJsonPath = "CustomRespCommandsDocs.json";
8687

0 commit comments

Comments
 (0)