https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ae8c9a1fa2246b2d5b2c583da413183c51e79b40

commit ae8c9a1fa2246b2d5b2c583da413183c51e79b40
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Thu Jan 2 21:09:32 2020 +0100
Commit:     Hermès Bélusca-Maïto <[email protected]>
CommitDate: Thu Jan 2 21:11:27 2020 +0100

    [NTDLL_APITEST] Add a test for RtlValidateUnicodeString().
---
 modules/rostests/apitests/ntdll/CMakeLists.txt     |   1 +
 .../apitests/ntdll/RtlValidateUnicodeString.c      | 105 +++++++++++++++++++++
 modules/rostests/apitests/ntdll/testlist.c         |   2 +
 3 files changed, 108 insertions(+)

diff --git a/modules/rostests/apitests/ntdll/CMakeLists.txt 
b/modules/rostests/apitests/ntdll/CMakeLists.txt
index 0cce35587ed..64b147bdeec 100644
--- a/modules/rostests/apitests/ntdll/CMakeLists.txt
+++ b/modules/rostests/apitests/ntdll/CMakeLists.txt
@@ -65,6 +65,7 @@ list(APPEND SOURCE
     RtlReAllocateHeap.c
     RtlUnicodeStringToAnsiString.c
     RtlUpcaseUnicodeStringToCountedOemString.c
+    RtlValidateUnicodeString.c
     StackOverflow.c
     SystemInfo.c
     Timer.c
diff --git a/modules/rostests/apitests/ntdll/RtlValidateUnicodeString.c 
b/modules/rostests/apitests/ntdll/RtlValidateUnicodeString.c
new file mode 100644
index 00000000000..8c900613d0e
--- /dev/null
+++ b/modules/rostests/apitests/ntdll/RtlValidateUnicodeString.c
@@ -0,0 +1,105 @@
+/*
+ * PROJECT:     ReactOS API Tests
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE:     Test for RtlValidateUnicodeString
+ * COPYRIGHT:   Copyright 2020 Hermes Belusca-Maito
+ */
+
+#include "precomp.h"
+
+START_TEST(RtlValidateUnicodeString)
+{
+    NTSTATUS Status;
+    UNICODE_STRING String;
+    UNICODE_STRING ValidString = RTL_CONSTANT_STRING(L"My Wild String!");
+
+    /* Start with a valid Unicode string */
+    String = ValidString;
+
+    /* Non-zero flags are unsupported! */
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(1, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(0xdeadbeef, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+    /* Empty string is allowed. Test also the flags. */
+    RtlInitEmptyUnicodeString(&String, NULL, 0);
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(1, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(0xdeadbeef, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+    // With a non-NULL but empty buffer, and zero lengths.
+    String.Buffer = L"";
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(1, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(0xdeadbeef, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+    // With a non-NULL but empty buffer, and zero Length, non-zero 
MaximumLength.
+    String.Buffer = L"";
+    String.Length = 0;
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(1, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(0xdeadbeef, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+    /* NULL pointer is also allowed! Test also the flags. */
+    Status = RtlValidateUnicodeString(0, NULL);
+    ok(Status == STATUS_SUCCESS, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(1, NULL);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+    Status = RtlValidateUnicodeString(0xdeadbeef, NULL);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+
+    /*
+     * Now test invalid strings.
+     */
+
+    // NULL buffer but non-zero lengths.
+    String = ValidString;
+    String.Buffer = NULL;
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+    // NULL buffer, zero Length, non-zero MaximumLength.
+    String = ValidString;
+    String.Buffer = NULL;
+    String.Length = 0;
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+    // NULL buffer, non-zero Length, zero MaximumLength.
+    String = ValidString;
+    String.Buffer = NULL;
+    String.MaximumLength = 0;
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+    // Non-NULL buffer, non-zero Length, zero MaximumLength.
+    String = ValidString;
+    String.MaximumLength = 0;
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+    /* Non-NULL buffer, odd lengths */
+
+    String = ValidString;
+    String.Length--; // Length was already >= 2 so it remains > 0.
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+
+    String = ValidString;
+    String.MaximumLength--; // MaximumLength was already >= 2 so it remains > 
0.
+    Status = RtlValidateUnicodeString(0, &String);
+    ok(Status == STATUS_INVALID_PARAMETER, "Status = 0x%lx\n", Status);
+}
diff --git a/modules/rostests/apitests/ntdll/testlist.c 
b/modules/rostests/apitests/ntdll/testlist.c
index 9359f36808b..7624c3c23af 100644
--- a/modules/rostests/apitests/ntdll/testlist.c
+++ b/modules/rostests/apitests/ntdll/testlist.c
@@ -64,6 +64,7 @@ extern void func_RtlQueryTimeZoneInformation(void);
 extern void func_RtlReAllocateHeap(void);
 extern void func_RtlUnicodeStringToAnsiString(void);
 extern void func_RtlUpcaseUnicodeStringToCountedOemString(void);
+extern void func_RtlValidateUnicodeString(void);
 extern void func_StackOverflow(void);
 extern void func_TimerResolution(void);
 
@@ -130,6 +131,7 @@ const struct test winetest_testlist[] =
     { "RtlReAllocateHeap",              func_RtlReAllocateHeap },
     { "RtlUnicodeStringToAnsiString",   func_RtlUnicodeStringToAnsiString },
     { "RtlUpcaseUnicodeStringToCountedOemString", 
func_RtlUpcaseUnicodeStringToCountedOemString },
+    { "RtlValidateUnicodeString",       func_RtlValidateUnicodeString },
     { "StackOverflow",                  func_StackOverflow },
     { "TimerResolution",                func_TimerResolution },
 

Reply via email to