summaryrefslogtreecommitdiff
path: root/testing/fulltests/unit-tests/T003copy_nword_clib.c
diff options
context:
space:
mode:
Diffstat (limited to 'testing/fulltests/unit-tests/T003copy_nword_clib.c')
-rw-r--r--testing/fulltests/unit-tests/T003copy_nword_clib.c142
1 files changed, 142 insertions, 0 deletions
diff --git a/testing/fulltests/unit-tests/T003copy_nword_clib.c b/testing/fulltests/unit-tests/T003copy_nword_clib.c
new file mode 100644
index 0000000..7d67ed0
--- /dev/null
+++ b/testing/fulltests/unit-tests/T003copy_nword_clib.c
@@ -0,0 +1,142 @@
+/* HEADER Testing copy_nword */
+
+#define ASSERT1(cond) \
+ do { \
+ ++__test_counter; \
+ if ((cond)) \
+ printf("ok %d\n", __test_counter); \
+ else { \
+ printf("not ok %d - %d: %s failed\n", \
+ __test_counter, __LINE__, #cond); \
+ } \
+ } while (0)
+
+#define ASSERT2(cond, on_error) \
+ do { \
+ ++__test_counter; \
+ if ((cond)) \
+ printf("ok %d\n", __test_counter); \
+ else { \
+ printf("not ok %d - %d: %s failed, ", \
+ __test_counter, __LINE__, #cond); \
+ printf on_error ; \
+ } \
+ } while (0)
+
+{
+ /* A quoted string */
+ char input[] = "\"The red rose\"";
+ char output[sizeof(input)] = "";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "The red rose") == 0,
+ ("output = >%s<\n", output));
+ ASSERT1(run == NULL);
+}
+
+{
+ /* Escaped quotes */
+ char input[] = "\\\"The red rose\\\"";
+ char output[sizeof(input)] = "";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "\"The") == 0, ("output = >%s<\n", output));
+ ASSERT2(run == input + 6,
+ ("run = input + %" NETSNMP_PRIz "d\n", run - input));
+ run = copy_nword(run, output, sizeof(output));
+ ASSERT2(strcmp(output, "red") == 0, ("output = >%s<\n", output));
+ ASSERT2(run == input + 10,
+ ("run = input + %" NETSNMP_PRIz "d\n", run - input));
+ run = copy_nword(run, output, sizeof(output));
+ ASSERT2(strcmp(output, "rose\"") == 0, ("output = >%s<\n", output));
+ ASSERT1(run == NULL);
+}
+
+{
+ /* Unterminated "-quote */
+ char input[] = "\"The";
+ char output[sizeof(input)] = "";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "The") == 0, ("output = >%s<\n", output));
+ ASSERT1(run == NULL);
+}
+
+{
+ /* Unterminated '-quote */
+ char input[] = "\'The";
+ char output[sizeof(input)] = "";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "The") == 0, ("output = >%s<\n", output));
+ ASSERT1(run == NULL);
+}
+
+{
+ /* Extract from NULL */
+ char output[10] = "";
+ char* run = NULL;
+ run = copy_nword(run, output, sizeof(output));
+ ASSERT1(run == NULL);
+}
+
+{
+ /* Extract to NULL */
+ char input[] = "The red rose";
+ char* output = NULL;
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT1(run == NULL);
+}
+
+{
+ /* Long token */
+ char input[] = "\"Very long token that overflows the buffer\" foo";
+ char output[10] = "";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "Very long") == 0, ("output = >%s<\n", output));
+ ASSERT2(run == input + 44,
+ ("run = input + %" NETSNMP_PRIz "d\n", run - input));
+}
+
+{
+ /* Quoted end of string / embedded \0 */
+ char input[] = "The\\\0red rose";
+ char output[sizeof(input)] = "";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "The\\") == 0, ("output = >%s<\n", output));
+ ASSERT1(run == NULL);
+}
+
+{
+ /* Empty string */
+ char input[] = "";
+ char output[sizeof(input) + 1] = "X";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "") == 0, ("output = >%s<\n", output));
+ ASSERT2(run == NULL, ("run = >%s<\n", run));
+}
+
+{
+ /* Whitespace string */
+ char input[] = " \t ";
+ char output[sizeof(input)] = "X";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "") == 0, ("output = >%s<\n", output));
+ ASSERT2(run == NULL, ("run = >%s<\n", run));
+}
+
+{
+ /* Quote, no whitespace after */
+ char input[] = "\"The\"red rose";
+ char output[sizeof(input)] = "";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "The") == 0, ("output = >%s<\n", output));
+ ASSERT2(run == input + 5,
+ ("run = input + %" NETSNMP_PRIz "d\n", run - input));
+}
+
+{
+ /* Quote, no whitespace before */
+ char input[] = "The\"red\" rose";
+ char output[sizeof(input)] = "";
+ char* run = copy_nword(input, output, sizeof(output));
+ ASSERT2(strcmp(output, "The\"red\"") == 0, ("output = >%s<\n", output));
+ ASSERT2(run == input + 9,
+ ("run = input + %" NETSNMP_PRIz "d\n", run - input));
+}