1 /* $OpenBSD: test_strdelim.c,v 1.2 2021/05/21 03:59:01 djm Exp $ */ 2 /* 3 * Regress test for misc strdelim() and co 4 * 5 * Placed in the public domain. 6 */ 7 8 #include <sys/types.h> 9 #include <sys/param.h> 10 #include <stdio.h> 11 #include <stdint.h> 12 #include <stdlib.h> 13 #include <string.h> 14 15 #include "test_helper.h" 16 17 #include "log.h" 18 #include "misc.h" 19 #include "xmalloc.h" 20 21 void test_strdelim(void); 22 23 void 24 test_strdelim(void) 25 { 26 char *orig, *str, *cp; 27 28 #define START_STRING(x) orig = str = xstrdup(x) 29 #define DONE_STRING() free(orig) 30 31 TEST_START("empty"); 32 START_STRING(""); 33 cp = strdelim(&str); 34 ASSERT_STRING_EQ(cp, ""); /* XXX arguable */ 35 cp = strdelim(&str); 36 ASSERT_PTR_EQ(cp, NULL); 37 DONE_STRING(); 38 TEST_DONE(); 39 40 TEST_START("whitespace"); 41 START_STRING(" "); 42 cp = strdelim(&str); 43 ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */ 44 ASSERT_STRING_EQ(str, ""); 45 DONE_STRING(); 46 TEST_DONE(); 47 48 TEST_START("trivial"); 49 START_STRING("blob"); 50 cp = strdelim(&str); 51 ASSERT_STRING_EQ(cp, "blob"); 52 cp = strdelim(&str); 53 ASSERT_PTR_EQ(cp, NULL); 54 ASSERT_PTR_EQ(str, NULL); 55 DONE_STRING(); 56 TEST_DONE(); 57 58 TEST_START("trivial whitespace"); 59 START_STRING("blob "); 60 cp = strdelim(&str); 61 ASSERT_STRING_EQ(cp, "blob"); 62 ASSERT_STRING_EQ(str, ""); 63 cp = strdelim(&str); 64 ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */ 65 ASSERT_PTR_EQ(str, NULL); 66 DONE_STRING(); 67 TEST_DONE(); 68 69 TEST_START("multi"); 70 START_STRING("blob1 blob2"); 71 cp = strdelim(&str); 72 ASSERT_STRING_EQ(cp, "blob1"); 73 ASSERT_STRING_EQ(str, "blob2"); 74 cp = strdelim(&str); 75 ASSERT_STRING_EQ(cp, "blob2"); 76 ASSERT_PTR_EQ(str, NULL); 77 cp = strdelim(&str); 78 ASSERT_PTR_EQ(cp, NULL); 79 DONE_STRING(); 80 TEST_DONE(); 81 82 TEST_START("multi whitespace"); 83 START_STRING("blob1 blob2 "); 84 cp = strdelim(&str); 85 ASSERT_STRING_EQ(cp, "blob1"); 86 ASSERT_STRING_EQ(str, "blob2 "); 87 cp = strdelim(&str); 88 ASSERT_STRING_EQ(cp, "blob2"); 89 cp = strdelim(&str); 90 ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */ 91 ASSERT_PTR_EQ(str, NULL); 92 DONE_STRING(); 93 TEST_DONE(); 94 95 TEST_START("multi equals"); 96 START_STRING("blob1=blob2"); 97 cp = strdelim(&str); 98 ASSERT_STRING_EQ(cp, "blob1"); 99 ASSERT_STRING_EQ(str, "blob2"); 100 cp = strdelim(&str); 101 ASSERT_STRING_EQ(cp, "blob2"); 102 ASSERT_PTR_EQ(str, NULL); 103 cp = strdelim(&str); 104 ASSERT_PTR_EQ(cp, NULL); 105 DONE_STRING(); 106 TEST_DONE(); 107 108 TEST_START("multi too many equals"); 109 START_STRING("blob1==blob2"); 110 cp = strdelim(&str); 111 ASSERT_STRING_EQ(cp, "blob1"); /* XXX better returning NULL early */ 112 ASSERT_STRING_EQ(str, "=blob2"); 113 cp = strdelim(&str); 114 ASSERT_STRING_EQ(cp, ""); 115 ASSERT_STRING_EQ(str, "blob2"); 116 cp = strdelim(&str); 117 ASSERT_STRING_EQ(cp, "blob2"); /* XXX should (but can't) reject */ 118 ASSERT_PTR_EQ(str, NULL); 119 DONE_STRING(); 120 TEST_DONE(); 121 122 TEST_START("multi equals strdelimw"); 123 START_STRING("blob1=blob2"); 124 cp = strdelimw(&str); 125 ASSERT_STRING_EQ(cp, "blob1=blob2"); 126 ASSERT_PTR_EQ(str, NULL); 127 cp = strdelimw(&str); 128 ASSERT_PTR_EQ(cp, NULL); 129 DONE_STRING(); 130 TEST_DONE(); 131 132 TEST_START("quoted"); 133 START_STRING("\"blob\""); 134 cp = strdelim(&str); 135 ASSERT_STRING_EQ(cp, "blob"); 136 cp = strdelim(&str); 137 ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */ 138 ASSERT_PTR_EQ(str, NULL); 139 DONE_STRING(); 140 TEST_DONE(); 141 142 TEST_START("quoted multi"); 143 START_STRING("\"blob1\" blob2"); 144 cp = strdelim(&str); 145 ASSERT_STRING_EQ(cp, "blob1"); 146 ASSERT_STRING_EQ(str, "blob2"); 147 cp = strdelim(&str); 148 ASSERT_STRING_EQ(cp, "blob2"); 149 ASSERT_PTR_EQ(str, NULL); 150 cp = strdelim(&str); 151 ASSERT_PTR_EQ(cp, NULL); 152 DONE_STRING(); 153 TEST_DONE(); 154 155 TEST_START("quoted multi reverse"); 156 START_STRING("blob1 \"blob2\""); 157 cp = strdelim(&str); 158 ASSERT_STRING_EQ(cp, "blob1"); 159 ASSERT_STRING_EQ(str, "\"blob2\""); 160 cp = strdelim(&str); 161 ASSERT_STRING_EQ(cp, "blob2"); 162 ASSERT_STRING_EQ(str, ""); 163 cp = strdelim(&str); 164 ASSERT_STRING_EQ(cp, ""); /* XXX better as NULL */ 165 ASSERT_PTR_EQ(str, NULL); 166 DONE_STRING(); 167 TEST_DONE(); 168 169 TEST_START("quoted multi middle"); 170 START_STRING("blob1 \"blob2\" blob3"); 171 cp = strdelim(&str); 172 ASSERT_STRING_EQ(cp, "blob1"); 173 cp = strdelim(&str); 174 ASSERT_STRING_EQ(cp, "blob2"); 175 cp = strdelim(&str); 176 ASSERT_STRING_EQ(cp, "blob3"); 177 cp = strdelim(&str); 178 ASSERT_PTR_EQ(cp, NULL); 179 DONE_STRING(); 180 TEST_DONE(); 181 182 TEST_START("badquote"); 183 START_STRING("\"blob"); 184 cp = strdelim(&str); 185 ASSERT_PTR_EQ(cp, NULL); 186 DONE_STRING(); 187 TEST_DONE(); 188 189 TEST_START("oops quote"); 190 START_STRING("\"blob\\\""); 191 cp = strdelim(&str); 192 ASSERT_STRING_EQ(cp, "blob\\"); /* XXX wrong */ 193 cp = strdelim(&str); 194 ASSERT_STRING_EQ(cp, ""); 195 DONE_STRING(); 196 TEST_DONE(); 197 198 } 199