5#include <winpr/wtypes.h>
6#include <winpr/cmdline.h>
11static bool run(
const char* name,
int argc,
char* argv[],
bool expectSuccess,
const char* compare)
15 printf(
"[%s] running test...\n", name);
17 char* res = CommandLineToCommaSeparatedValues(argc, argv);
21 (void)fprintf(stderr,
"[%s] CSV expected success, but failed\n", name);
22 return !expectSuccess;
27 if (strcmp(compare, res) != 0)
29 (void)fprintf(stderr,
"[%s] CSV compare fail:\ngot : %s\nexpect: %s\n", name, res,
32 return !expectSuccess;
39 char** ares = CommandLineParseCommaSeparatedValues(res, &count);
41 if (count == WINPR_ASSERTING_INT_CAST(
size_t, argc))
45 for (
size_t x = 0; x < count; x++)
47 const char* argvx = argv[x];
48 const char* aresx = ares[x];
50 if (strcmp(argvx, aresx) != 0)
52 (void)fprintf(stderr,
"[%s] ARGV compare fail:\ngot : %s\nexpect: %s\n", name,
59 CommandLineParserFree(ares);
62 return rc == expectSuccess;
65static void TestCaseFree(
int argc,
char** argv)
70 for (
int i = 0; i < argc; i++)
77static void usage(
const char* file)
80 (void)fprintf(stderr,
"Failed to parse test case '%s'\n", file);
82 "Test cases for TestCommandLineToCommaSeparatedValues should be JSON files\n");
83 (void)fprintf(stderr,
"placed in the folder '%s'\n", TEST_SOURCE_DIR);
84 (void)fprintf(stderr,
"with '.json' (case sensitive) as extension.\n");
85 (void)fprintf(stderr,
"\n");
86 (void)fprintf(stderr,
"The JSON should be of the following format:\n");
87 (void)fprintf(stderr,
"\n");
88 (void)fprintf(stderr,
"{\n");
89 (void)fprintf(stderr,
"\t\"expectSuccess\": true,\n");
90 (void)fprintf(stderr,
"{\t\"csv\": \"\\\"string1\\\",\\\"string2\\\",...\"\n");
91 (void)fprintf(stderr,
"\t\"argv\": [ \"string1\", \"string2\", null, \"string3\" ]\n");
92 (void)fprintf(stderr,
"}\n");
95WINPR_ATTR_MALLOC(TestCaseFree, 2)
96static
char** getTestcase(const
char* path, const
char* filename,
int* pargc,
bool* pexpectSuccess,
100 WINPR_ASSERT(filename);
102 WINPR_ASSERT(pexpectSuccess);
104 BOOL success = FALSE;
106 char** argv =
nullptr;
107 char* fpath = GetCombinedPath(path, filename);
110 (void)fprintf(stderr,
"GetCombinedPath(%s, %s) failed\n", path, filename);
118 (void)fprintf(stderr,
"WINPR_JSON_ParseFromFile(%s) failed\n", fpath);
127 (void)fprintf(stderr,
"WINPR_JSON_IsObject() failed\n");
139 (void)fprintf(stderr,
"WINPR_JSON_GetStringValue(csv) failed\n");
142 *compare = _strdup(str);
145 (void)fprintf(stderr,
"_strdup(csv[%s]) failed\n", str);
156 (void)fprintf(stderr,
"WINPR_JSON_GetObjectItem(expectSuccess) failed\n");
166 (void)fprintf(stderr,
"WINPR_JSON_IsArray(argv) failed\n");
173 (void)fprintf(stderr,
"WINPR_JSON_GetArraySize(argv) == 0\n");
177 argv = (
char**)calloc(len,
sizeof(
char*));
180 (void)fprintf(stderr,
"calloc(%" PRIuz
", sizeof(char*)) failed\n", len);
184 argc = WINPR_ASSERTING_INT_CAST(
int, len);
185 for (
size_t x = 0; x < len; x++)
193 (void)fprintf(stderr,
"WINPR_JSON_IsString(%" PRIuz
") failed", x);
199 argv[x] = _strdup(str);
202 (void)fprintf(stderr,
"WINPR_JSON_GetStringValue(%s) _strdup() failed", str);
217 TestCaseFree(argc, argv);
221static int runJsonTests(
void)
223 char testdir[MAX_PATH] = WINPR_C_ARRAY_INIT;
224 (void)_snprintf(testdir,
sizeof(testdir),
"cmdline-tests%c*.json",
225 PathGetSeparatorA(PATH_STYLE_NATIVE));
227 char* path = GetCombinedPath(TEST_SOURCE_DIR, testdir);
232 HANDLE hFind = FindFirstFileA(path, &FindData);
234 path = GetCombinedPath(TEST_SOURCE_DIR,
"cmdline-tests");
238 if (hFind == INVALID_HANDLE_VALUE)
240 printf(
"FindFirstFile failure: %s (INVALID_HANDLE_VALUE -1)\n", path);
246 char* compare =
nullptr;
248 bool expectSuccess =
false;
249 char** argv = getTestcase(path, FindData.cFileName, &argc, &expectSuccess, &compare);
253 (void)fprintf(stderr,
"Test case '%s/%s': could not be parsed, aborting!\n", path,
258 rc = run(FindData.cFileName, argc, argv, expectSuccess, compare);
259 TestCaseFree(argc, argv);
263 (void)fprintf(stderr,
"Test case '%s/%s': test run failed, aborting!\n", path,
267 }
while (FindNextFileA(hFind, &FindData));
277int TestCommandLineToCommaSeparatedValues(
int argc,
char* argv[])
280 return run(
"from-commandline", argc, argv,
true,
nullptr);
282 return runJsonTests();
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsNull(const WINPR_JSON *item)
Check if JSON item is Null.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsBool(const WINPR_JSON *item)
Check if JSON item is of type BOOL.
WINPR_ATTR_NODISCARD WINPR_API size_t WINPR_JSON_GetArraySize(const WINPR_JSON *array)
Get the number of arrayitems from an array.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsTrue(const WINPR_JSON *item)
Check if JSON item is BOOL value True.
WINPR_API WINPR_JSON * WINPR_JSON_ParseFromFile(const char *filename)
Parse a JSON string read from a file filename.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_GetObjectItem(const WINPR_JSON *object, const char *string)
Return a pointer to an JSON object item.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsString(const WINPR_JSON *item)
Check if JSON item is of type String.
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_GetArrayItem(const WINPR_JSON *array, size_t index)
Return a pointer to an item in the array.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsArray(const WINPR_JSON *item)
Check if JSON item is of type Array.
WINPR_ATTR_NODISCARD WINPR_API BOOL WINPR_JSON_IsObject(const WINPR_JSON *item)
Check if JSON item is of type Object.
WINPR_API void WINPR_JSON_Delete(WINPR_JSON *item)
Delete a WinPR JSON wrapper object.
WINPR_ATTR_NODISCARD WINPR_API const char * WINPR_JSON_GetStringValue(WINPR_JSON *item)
Return the String value of a JSON item.