[KERNEL32_APITEST] Improve SetComputerNameExW testcase (#1661)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Mon, 17 Jun 2019 11:33:31 +0000 (20:33 +0900)
committerGitHub <noreply@github.com>
Mon, 17 Jun 2019 11:33:31 +0000 (20:33 +0900)
Improve SetComputerNameExW testcase to check invalid characters. CORE-16122

modules/rostests/apitests/kernel32/SetComputerNameExW.c

index 89ba264..1b631da 100644 (file)
@@ -37,31 +37,16 @@ static HKEY OpenComputerNameKey(void)
     return NULL;
 }
 
-START_TEST(SetComputerNameExW)
+static void DoTestComputerName(HKEY hKeyHN, HKEY hKeyCN, LPCWSTR pszNewName, BOOL bValid)
 {
-    static const WCHAR szNewName[] = L"SRVROSTEST";
     LONG Error;
     BOOL ret;
-    HKEY hKeyHN, hKeyCN;
     DWORD cbData;
     WCHAR szNVHostNameOld[MAX_PATH], szNVHostNameNew[MAX_PATH];
     WCHAR szHostNameOld[MAX_PATH], szHostNameNew[MAX_PATH];
     WCHAR szComputerNameOld[MAX_PATH], szComputerNameNew[MAX_PATH];
 
-    /* Open keys */
-    hKeyHN = OpenHostNameKey();
-    ok(hKeyHN != NULL, "hKeyHN is NULL\n");
-    hKeyCN = OpenComputerNameKey();
-    ok(hKeyCN != NULL, "hKeyCN is NULL\n");
-    if (!hKeyHN || !hKeyCN)
-    {
-        if (hKeyHN)
-            RegCloseKey(hKeyHN);
-        if (hKeyCN)
-            RegCloseKey(hKeyCN);
-        skip("Unable to open keys. Missing Admin rights?\n");
-        return;
-    }
+    trace("Testing '%S':\n", pszNewName);
 
     /* Get Old NV Hostname */
     szNVHostNameOld[0] = UNICODE_NULL;
@@ -85,35 +70,62 @@ START_TEST(SetComputerNameExW)
     ok(szComputerNameOld[0], "szComputerNameOld is empty\n");
 
     /* Change the value */
-    ret = SetComputerNameExW(ComputerNamePhysicalDnsHostname, szNewName);
-    ok_int(ret, TRUE);
+    SetLastError(0xDEADFACE);
+    ret = SetComputerNameExW(ComputerNamePhysicalDnsHostname, pszNewName);
+    ok_int(ret, bValid);
+    Error = GetLastError();
+    if (bValid)
+        ok_long(Error, ERROR_SUCCESS);
+    else
+        ok_long(Error, ERROR_INVALID_PARAMETER);
 
     /* Get New NV Hostname */
     szNVHostNameNew[0] = UNICODE_NULL;
     cbData = sizeof(szNVHostNameNew);
     Error = RegQueryValueExW(hKeyHN, L"NV Hostname", NULL, NULL, (LPBYTE)szNVHostNameNew, &cbData);
     ok_long(Error, ERROR_SUCCESS);
-    ok(szNVHostNameNew[0], "szNVHostNameNew is empty\n");
-    ok(lstrcmpW(szNVHostNameNew, szNewName) == 0,
-       "szNVHostNameNew '%S' should be szNewName '%S'\n", szNVHostNameNew, szNewName);
+    if (bValid)
+    {
+        ok(szNVHostNameNew[0], "szNVHostNameNew is empty\n");
+        ok(lstrcmpW(szNVHostNameNew, pszNewName) == 0,
+           "szNVHostNameNew '%S' should be pszNewName '%S'\n", szNVHostNameNew, pszNewName);
+    }
 
     /* Get New Hostname */
     szHostNameNew[0] = UNICODE_NULL;
     cbData = sizeof(szHostNameNew);
     Error = RegQueryValueExW(hKeyHN, L"Hostname", NULL, NULL, (LPBYTE)szHostNameNew, &cbData);
     ok_long(Error, ERROR_SUCCESS);
-    ok(szHostNameNew[0], "szHostNameNew is empty\n");
-    ok(lstrcmpW(szHostNameNew, szHostNameOld) == 0,
-       "szHostNameNew '%S' should be szHostNameOld '%S'\n", szHostNameNew, szHostNameOld);
+    if (bValid)
+    {
+        ok(szHostNameNew[0], "szHostNameNew is empty\n");
+        ok(lstrcmpW(szHostNameNew, szHostNameOld) == 0,
+           "szHostNameNew '%S' should be szHostNameOld '%S'\n", szHostNameNew, szHostNameOld);
+    }
 
     /* Get New Computer Name */
     szComputerNameNew[0] = UNICODE_NULL;
     cbData = sizeof(szComputerNameNew);
     Error = RegQueryValueExW(hKeyCN, L"ComputerName", NULL, NULL, (LPBYTE)szComputerNameNew, &cbData);
     ok_long(Error, ERROR_SUCCESS);
-    ok(szComputerNameNew[0], "szComputerNameNew is empty\n");
-    ok(lstrcmpW(szComputerNameNew, szNewName) == 0,
-       "szComputerNameNew '%S' should be szNewName '%S'\n", szComputerNameNew, szNewName);
+    if (bValid)
+    {
+        ok(szComputerNameNew[0], "szComputerNameNew is empty\n");
+        if (lstrlenW(pszNewName) > MAX_COMPUTERNAME_LENGTH)
+        {
+            WCHAR szTruncatedNewName[MAX_COMPUTERNAME_LENGTH + 1];
+            lstrcpynW(szTruncatedNewName, pszNewName, ARRAYSIZE(szTruncatedNewName));
+            ok(lstrcmpiW(szComputerNameNew, szTruncatedNewName) == 0,
+               "szComputerNameNew '%S' should be szTruncatedNewName '%S'\n",
+               szComputerNameNew, szTruncatedNewName);
+        }
+        else
+        {
+            ok(lstrcmpiW(szComputerNameNew, pszNewName) == 0,
+               "szComputerNameNew '%S' should be pszNewName '%S'\n",
+               szComputerNameNew, pszNewName);
+        }
+    }
 
     /* Restore the registry values */
     cbData = (lstrlenW(szNVHostNameOld) + 1) * sizeof(WCHAR);
@@ -127,6 +139,139 @@ START_TEST(SetComputerNameExW)
     cbData = (lstrlenW(szComputerNameOld) + 1) * sizeof(WCHAR);
     Error = RegSetValueExW(hKeyCN, L"ComputerName", 0, REG_SZ, (LPBYTE)szComputerNameOld, cbData);
     ok_long(Error, ERROR_SUCCESS);
+}
+
+START_TEST(SetComputerNameExW)
+{
+    HKEY hKeyHN, hKeyCN;
+    static const WCHAR ValidSymbols[] = L"-_";
+    static const WCHAR InvalidSymbols[] = L"\"/\\[]:|<>+=;,?";
+    WCHAR szName[32];
+    INT i, cchValidSymbols, cchInvalidSymbols;
+    LONG Error;
+
+    /* Open keys */
+    hKeyHN = OpenHostNameKey();
+    ok(hKeyHN != NULL, "hKeyHN is NULL\n");
+    hKeyCN = OpenComputerNameKey();
+    ok(hKeyCN != NULL, "hKeyCN is NULL\n");
+    if (!hKeyHN || !hKeyCN)
+    {
+        if (hKeyHN)
+            RegCloseKey(hKeyHN);
+        if (hKeyCN)
+            RegCloseKey(hKeyCN);
+        skip("Unable to open keys. Missing Admin rights?\n");
+        return;
+    }
+
+    cchValidSymbols = lstrlenW(ValidSymbols);
+    cchInvalidSymbols = lstrlenW(InvalidSymbols);
+
+    /* Test names */
+
+    DoTestComputerName(hKeyHN, hKeyCN, L"SRVROSTEST", TRUE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"SrvRosTest", TRUE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, L"", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"a", TRUE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"A", TRUE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"1", FALSE);   // numeric-only
+    DoTestComputerName(hKeyHN, hKeyCN, L"@", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L".", FALSE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, L" ", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"\t", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"\b", FALSE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, L" a", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L" A", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L" 1", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"\ta", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"\tA", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"\t1", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"\ba", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"\bA", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"\b1", FALSE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, L"a ", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"A ", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"1 ", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"a\t", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"A\t", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"1\t", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"a\b", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"A\b", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"1\b", FALSE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, L"a c", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"A C", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"1 c", FALSE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, L"a\tc", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"A\tC", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"1\tc", FALSE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, L"a\bc", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"A\bC", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"1\bc", FALSE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, ValidSymbols, TRUE);
+    DoTestComputerName(hKeyHN, hKeyCN, InvalidSymbols, FALSE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, L"123456", FALSE);   // numeric-only
+    DoTestComputerName(hKeyHN, hKeyCN, L"123.456", FALSE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"123X456", TRUE);
+    DoTestComputerName(hKeyHN, hKeyCN, L"123X.456", FALSE);
+
+    DoTestComputerName(hKeyHN, hKeyCN, L"ThisIsLongLongComputerName", TRUE);
+
+    for (i = 0; i < cchValidSymbols; ++i)
+    {
+        szName[0] = ValidSymbols[i];
+        szName[1] = UNICODE_NULL;
+        DoTestComputerName(hKeyHN, hKeyCN, szName, TRUE);
+    }
+
+    for (i = 0; i < cchValidSymbols; ++i)
+    {
+        szName[0] = L'a';
+        szName[1] = ValidSymbols[i];
+        szName[2] = UNICODE_NULL;
+        DoTestComputerName(hKeyHN, hKeyCN, szName, TRUE);
+    }
+
+    for (i = 0; i < cchValidSymbols; ++i)
+    {
+        szName[0] = L'A';
+        szName[1] = ValidSymbols[i];
+        szName[2] = UNICODE_NULL;
+        DoTestComputerName(hKeyHN, hKeyCN, szName, TRUE);
+    }
+
+    for (i = 0; i < cchValidSymbols; ++i)
+    {
+        szName[0] = L'1';
+        szName[1] = ValidSymbols[i];
+        szName[2] = UNICODE_NULL;
+        DoTestComputerName(hKeyHN, hKeyCN, szName, TRUE);
+    }
+
+    for (i = 0; i < cchInvalidSymbols; ++i)
+    {
+        szName[0] = L'A';
+        szName[1] = InvalidSymbols[i];
+        szName[2] = UNICODE_NULL;
+        DoTestComputerName(hKeyHN, hKeyCN, szName, FALSE);
+    }
+
+    for (i = 0; i < cchInvalidSymbols; ++i)
+    {
+        szName[0] = L'1';
+        szName[1] = InvalidSymbols[i];
+        szName[2] = UNICODE_NULL;
+        DoTestComputerName(hKeyHN, hKeyCN, szName, FALSE);
+    }
 
     /* Close keys */
     Error = RegCloseKey(hKeyHN);