Reactos
at master 170 lines 4.6 kB view raw
1/* 2 * PROJECT: ReactOS API tests 3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+) 4 * PURPOSE: Tests for wscript.exe 5 * COPYRIGHT: Whindmar Saksit (whindsaks@proton.me) 6 */ 7 8#include <apitest.h> 9#include <windows.h> 10#include <shlwapi.h> 11#include <stdio.h> 12 13#define MYGUID "{898AC78E-BFC7-41FF-937D-EDD01E666707}" 14 15static DWORD getregdw(HKEY hKey, LPCSTR sub, LPCSTR name, DWORD *out, DWORD defval) 16{ 17 LRESULT e; 18 DWORD size = sizeof(*out); 19 *out = 0; 20 e = SHGetValueA(hKey, sub, name, NULL, out, &size); 21 if (e) 22 *out = defval; 23 return e; 24} 25 26static BOOL makestringfile(LPWSTR path, SIZE_T cchpath, LPCSTR ext, LPCSTR string, const BYTE *map) 27{ 28 UINT cch = GetTempPathW(cchpath, path); 29 UINT16 i = 0; 30 if (!cch || cch > cchpath) 31 return FALSE; 32 while (++i) 33 { 34 HANDLE hFile; 35 if (_snwprintf(path + cch, cchpath - cch, L"~%u.%hs", i, ext ? ext : "tmp") >= cchpath - cch) 36 return FALSE; 37 hFile = CreateFileW(path, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_NEW, 0, NULL); 38 if (hFile != INVALID_HANDLE_VALUE) 39 { 40 BOOL succ = TRUE; 41 for (; *string && succ; ++string) 42 { 43 BYTE ch = *string; 44 DWORD j; 45 for (j = 0; map && map[j + 0]; j += 2) 46 { 47 if (ch == map[j + 0]) 48 ch = map[j + 1]; 49 } 50 succ = WriteFile(hFile, &ch, 1, &j, NULL); 51 } 52 CloseHandle(hFile); 53 return succ; 54 } 55 } 56 return FALSE; 57} 58 59static DWORD runscriptfile(LPCWSTR path, LPCWSTR engine) 60{ 61 STARTUPINFOW si; 62 PROCESS_INFORMATION pi; 63 LPCWSTR exe = engine ? engine : L"wscript.exe"; 64 WCHAR cmd[MAX_PATH * 2]; 65 66 if (_snwprintf(cmd, _countof(cmd), L"\"%s\" //nologo \"%s\"", exe, path) >= _countof(cmd)) 67 return ERROR_BUFFER_OVERFLOW; 68 ZeroMemory(&si, sizeof(si)); 69 si.cb = sizeof(si); 70 if (CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) 71 { 72 DWORD code = ERROR_INTERNAL_ERROR; 73 WaitForSingleObject(pi.hProcess, INFINITE); 74 GetExitCodeProcess(pi.hProcess, &code); 75 CloseHandle(pi.hProcess); 76 CloseHandle(pi.hThread); 77 return code; 78 } 79 return GetLastError(); 80} 81 82static DWORD runscript(LPCSTR ext, LPCSTR script, const BYTE *map) 83{ 84 DWORD code; 85 WCHAR file[MAX_PATH]; 86 if (!makestringfile(file, _countof(file), ext, script, map)) 87 { 88 skip("Unable to create script\n"); 89 return ERROR_FILE_NOT_FOUND; 90 } 91 code = runscriptfile(file, NULL); 92 DeleteFileW(file); 93 return code; 94} 95 96static void test_defaultscriptisjs(void) 97{ 98 LPCSTR script = "" 99 "<job>" 100 "<script>" /* No language attribute should default to Javascript */ 101 "var x = 42;" 102 "WScript.Quit(x);" 103 "</script>" 104 "</job>"; 105 106 ok(runscript("wsf", script, NULL) == 42, "Script failed\n"); 107} 108 109static void test_simplevb(void) 110{ 111 LPCSTR script = "" 112 "<job>" 113 "<script language=\"VBScript\">" 114 "Dim x\n" 115 "x = 42\n" 116 "WScript.Quit x\n" 117 "</script>" 118 "</job>"; 119 120 ok(runscript("wsf", script, NULL) == 42, "Script failed\n"); 121} 122 123static void test_defpackagejob(void) 124{ 125 LPCSTR script = "" 126 "<package>" 127 "<job id=\"PickMePlease\">" 128 "<script language=\"VBScript\">" 129 "WScript.Quit 42" 130 "</script>" 131 "</job>" 132 "<job id=\"DontExecuteMe\">" 133 "<script language=\"VBScript\">" 134 "WScript.Quit 33" 135 "</script>" 136 "</job>" 137 "</package>"; 138 139 ok(runscript("wsf", script, NULL) == 42, "Script failed\n"); 140} 141 142static void test_objecttag(void) 143{ 144 DWORD dw; 145 static const BYTE map[] = { '#', '\"', '$', '\\', 0, 0 }; 146 LPCSTR script = "" 147 "<job>" 148 "<object id=#ws1# clsid=#{72C24DD5-D70A-438B-8A42-98424B88AFB8}# />" 149 "<script language=#JScript#>" 150 "var dontcare = ws1.ExpandEnvironmentStrings(#SystemRoot#);" 151 "var p = #HKCU/Software/" MYGUID "#.replace(/$//g,'$$');" 152 "ws2.RegWrite(p, 42, #REG_DWORD#);" 153 "</script>" 154 "<object id=#ws2# progid=#WScript.Shell# />" /* Placing the object tag after the script just for fun */ 155 "</job>"; 156 157 ok(runscript("wsf", script, map) == 0, "Script failed\n"); 158 159 getregdw(HKEY_CURRENT_USER, "Software", MYGUID, &dw, 0); 160 ok(dw == 42, "Value does not match\n"); 161 SHDeleteValueA(HKEY_CURRENT_USER, "Software", MYGUID); 162} 163 164START_TEST(wsf) 165{ 166 test_defaultscriptisjs(); 167 test_simplevb(); 168 test_defpackagejob(); 169 test_objecttag(); 170}