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