1 #!/bin/bash 2 3 JSON_SCRIPT=tests.json 4 JSON_SCRIPT_BIN=${TEST_JSON_SCRIPT=:-./json_script-example} 5 FILE_STDOUT=tests.stdout 6 FILE_STDERR=tests.stderr 7 FILE_EXPECTED=tests.expected 8 9 call_json_script() { 10 #export LD_PRELOAD=../libjson_script.so 11 $JSON_SCRIPT_BIN "$@" "$JSON_SCRIPT" >"$FILE_STDOUT" 2>"$FILE_STDERR" 12 } 13 14 assertStdioEquals() { 15 local expected="$1" 16 local file_stdio="$2" 17 18 echo "$expected" >"$FILE_EXPECTED" 19 if [ -z "$expected" ]; then 20 # we are expecting empty output, but we deliberately added a newline 21 # with echo above, so adding another echo to compensate for that 22 echo >>"$file_stdio" 23 fi 24 diff -up "$FILE_EXPECTED" "$file_stdio" >/dev/null 2>&1 || { 25 cat >&2 <<EOF 26 |--- expecting 27 $expected< 28 |--- actual 29 $(cat $file_stdio)< 30 |--- END 31 EOF 32 exit 1 33 } 34 } 35 36 assertStdoutEquals() { 37 assertStdioEquals "$1" "$FILE_STDOUT" 38 } 39 40 assertStderrEquals() { 41 assertStdioEquals "$1" "$FILE_STDERR" 42 } 43 44 test_bad_json() { 45 cat >"$JSON_SCRIPT" <<-EOF 46 [ 47 [ ] 48 [ ] 49 ] 50 EOF 51 call_json_script 52 assertStderrEquals "load JSON data from $JSON_SCRIPT failed." 53 } 54 55 test_expr_eq() { 56 cat >"$JSON_SCRIPT" <<-EOF 57 [ 58 [ "if", 59 [ "eq", "VAR", "foo" ], 60 [ "echo", "bar" ], 61 [ "echo", "baz" ] 62 ] 63 ] 64 EOF 65 call_json_script "VAR=foo" 66 assertStdoutEquals "echo bar" 67 call_json_script "VAR=xxx" 68 assertStdoutEquals "echo baz" 69 } 70 71 test_expr_has() { 72 cat >"$JSON_SCRIPT" <<-EOF 73 [ 74 [ "if", 75 [ "has", "VAR" ], 76 [ "echo", "bar" ], 77 [ "echo", "baz" ] 78 ] 79 ] 80 EOF 81 call_json_script "VAR=foo" 82 assertStdoutEquals "echo bar" 83 call_json_script 84 assertStdoutEquals "echo baz" 85 } 86 87 test_expr_regex_single() { 88 cat >"$JSON_SCRIPT" <<-EOF 89 [ 90 [ "if", 91 [ "regex", "VAR", ".ell." ], 92 [ "echo", "bar" ], 93 [ "echo", "baz" ] 94 ] 95 ] 96 EOF 97 call_json_script "VAR=hello" 98 assertStdoutEquals "echo bar" 99 call_json_script "VAR=.ell." 100 assertStdoutEquals "echo bar" 101 call_json_script 102 assertStdoutEquals "echo baz" 103 call_json_script "VAR=" 104 assertStdoutEquals "echo baz" 105 call_json_script "VAR=hell" 106 assertStdoutEquals "echo baz" 107 } 108 109 test_expr_regex_multi() { 110 cat >"$JSON_SCRIPT" <<-EOF 111 [ 112 [ "if", 113 [ "regex", "VAR", [ ".ell.", "w.rld" ] ], 114 [ "echo", "bar" ], 115 [ "echo", "baz" ] 116 ] 117 ] 118 EOF 119 call_json_script "VAR=hello" 120 assertStdoutEquals "echo bar" 121 call_json_script "VAR=world" 122 assertStdoutEquals "echo bar" 123 call_json_script "VAR=.ell." 124 assertStdoutEquals "echo bar" 125 call_json_script "VAR=w.rld" 126 assertStdoutEquals "echo bar" 127 call_json_script 128 assertStdoutEquals "echo baz" 129 call_json_script "VAR=" 130 assertStdoutEquals "echo baz" 131 call_json_script "VAR=hell" 132 assertStdoutEquals "echo baz" 133 } 134 135 test_expr_not() { 136 cat >"$JSON_SCRIPT" <<-EOF 137 [ 138 [ "if", 139 [ "not", [ "has", "VAR" ] ], 140 [ "echo", "bar" ], 141 [ "echo", "baz" ] 142 ] 143 ] 144 EOF 145 call_json_script "VAR=foo" 146 assertStdoutEquals "echo baz" 147 call_json_script 148 assertStdoutEquals "echo bar" 149 } 150 151 test_expr_and() { 152 cat >"$JSON_SCRIPT" <<-EOF 153 [ 154 [ "if", 155 [ "and", [ "eq", "EQVAR", "eqval" ], 156 [ "regex", "REGEXVAR", "regex..." ] 157 ], 158 [ "echo", "bar" ], 159 [ "echo", "baz" ] 160 ] 161 ] 162 EOF 163 call_json_script "EQVAR=eqval" "REGEXVAR=regexval" 164 assertStdoutEquals "echo bar" 165 call_json_script "EQVAR=foo" 166 assertStdoutEquals "echo baz" 167 call_json_script "REGEXVAR=regex***" 168 assertStdoutEquals "echo baz" 169 call_json_script 170 assertStdoutEquals "echo baz" 171 } 172 173 test_expr_or() { 174 cat >"$JSON_SCRIPT" <<-EOF 175 [ 176 [ "if", 177 [ "or", [ "not", [ "eq", "EQVAR", "eqval" ] ], 178 [ "regex", "REGEXVAR", [ "regexva.[0-9]", "regexva.[a-z]" ] ] 179 ], 180 [ "echo", "bar" ], 181 [ "echo", "baz" ] 182 ] 183 ] 184 EOF 185 call_json_script "EQVAR=eqval" "REGEXVAR=regexval1" 186 assertStdoutEquals "echo bar" 187 call_json_script "EQVAR=neq" "REGEXVAR=sxc" 188 assertStdoutEquals "echo bar" 189 call_json_script "REGEXVAR=sxc" 190 assertStdoutEquals "echo bar" 191 call_json_script "EQVAR=foo" 192 assertStdoutEquals "echo bar" 193 call_json_script 194 assertStdoutEquals "echo bar" 195 call_json_script "EQVAR=eqval" "REGEXVAR=regexval" 196 assertStdoutEquals "echo baz" 197 } 198 199 test_expr_isdir() { 200 cat >"$JSON_SCRIPT" <<-EOF 201 [ 202 [ "if", 203 [ "isdir", "%VAR%" ], 204 [ "echo", "bar" ], 205 [ "echo", "baz" ] 206 ] 207 ] 208 EOF 209 call_json_script "VAR=/" 210 assertStdoutEquals "echo bar" 211 call_json_script "VAR=$(mktemp -u)" 212 assertStdoutEquals "echo baz" 213 call_json_script 214 assertStdoutEquals "echo baz" 215 } 216 217 test_cmd_case() { 218 cat >"$JSON_SCRIPT" <<-EOF 219 [ 220 [ "case", "CASEVAR", { 221 "0": [ "echo", "foo" ], 222 "1": [ 223 [ "echo", "bar" ], 224 [ "echo", "baz" ] 225 ], 226 "%VAR%": [ "echo", "quz" ] 227 } ] 228 ] 229 EOF 230 call_json_script "CASEVAR=0" 231 assertStdoutEquals "echo foo" 232 call_json_script "CASEVAR=1" 233 assertStdoutEquals "echo bar 234 echo baz" 235 call_json_script "CASEVAR=%VAR%" 236 assertStdoutEquals "echo quz" 237 call_json_script "CASEVAR=" 238 assertStdoutEquals "" 239 call_json_script 240 assertStdoutEquals "" 241 call_json_script "CASEVAR=xxx" "VAR=xxx" 242 assertStdoutEquals "" 243 } 244 245 test_cmd_if() { 246 cat >"$JSON_SCRIPT" <<-EOF 247 [ 248 [ "if", 249 [ "eq", "VAR", "foo" ], 250 [ "echo", "bar" ], 251 [ "echo", "baz" ] 252 ] 253 ] 254 EOF 255 call_json_script "VAR=foo" 256 assertStdoutEquals "echo bar" 257 call_json_script "VAR=xxx" 258 assertStdoutEquals "echo baz" 259 } 260 261 test_cmd_cb() { 262 cat >"$JSON_SCRIPT" <<-EOF 263 [ 264 [ "exec", "%VAR%", "/%VAS%%%/" ] 265 ] 266 EOF 267 call_json_script 268 assertStdoutEquals "exec /%/" 269 call_json_script "VAR=" 270 assertStdoutEquals "exec /%/" 271 call_json_script "VAR=qux" "VAS=3" 272 assertStdoutEquals "exec qux /3%/" 273 } 274 275 test_cmd_return() { 276 cat >"$JSON_SCRIPT" <<-EOF 277 [ 278 [ "heh", "%HEHVAR%" ], 279 [ "%VAR%", "%VAR%" ], 280 [ "return" ], 281 [ "exec_non_reachable", "Arghhh" ] 282 ] 283 EOF 284 call_json_script "HEHVAR=dude" "VAR=ow" 285 assertStdoutEquals "heh dude 286 %VAR% ow" 287 } 288 289 test_jshn_append_no_leading_space() { 290 JSON_PREFIX="${JSON_PREFIX:-}" 291 . ../../sh/jshn.sh 292 293 # Test appending to empty variable - should not have leading space 294 var='' 295 _jshn_append var 'foo' 296 assertEquals "foo" "$var" 297 298 # Test appending to non-empty variable - should have space separator 299 var='bar' 300 _jshn_append var 'foo' 301 assertEquals "bar foo" "$var" 302 303 # Test multiple appends to empty variable 304 var='' 305 _jshn_append var 'first' 306 _jshn_append var 'second' 307 assertEquals "first second" "$var" 308 } 309 310 test_jshn_dump() { 311 JSON_PREFIX="${JSON_PREFIX:-}" 312 . ../../sh/jshn.sh 313 314 set +u 315 316 json_init 317 318 assertEquals '{ }' "$(json_dump)" 319 320 set -u 321 } 322 323 test_jshn_add_string() { 324 JSON_PREFIX="${JSON_PREFIX:-}" 325 . ../../sh/jshn.sh 326 327 set +u 328 329 json_init 330 331 json_add_string "name" "joe" 332 333 assertEquals '{ "name": "joe" }' "$(json_dump)" 334 335 set -u 336 } 337 338 test_jshn_add_int() { 339 JSON_PREFIX="${JSON_PREFIX:-}" 340 . ../../sh/jshn.sh 341 342 set +u 343 344 json_init 345 346 json_add_int "number" 1 347 348 assertEquals '{ "number": 1 }' "$(json_dump)" 349 350 set -u 351 } 352 353 test_jshn_add_boolean() { 354 JSON_PREFIX="${JSON_PREFIX:-}" 355 . ../../sh/jshn.sh 356 357 set +u 358 359 json_init 360 361 json_add_boolean "done" false 362 363 assertEquals '{ "done": false }' "$(json_dump)" 364 365 set -u 366 } 367 368 test_jshn_add_double() { 369 JSON_PREFIX="${JSON_PREFIX:-}" 370 . ../../sh/jshn.sh 371 372 set +u 373 374 json_init 375 376 json_add_double "power" 1.605 377 378 assertEquals '{ "power": 1.605 }' "$(json_dump)" 379 380 set -u 381 } 382 383 test_jshn_add_null() { 384 JSON_PREFIX="${JSON_PREFIX:-}" 385 . ../../sh/jshn.sh 386 387 set +u 388 389 json_init 390 391 json_add_null "reference" 392 393 assertEquals '{ "reference": null }' "$(json_dump)" 394 395 set -u 396 } 397 398 test_jshn_add_object() { 399 JSON_PREFIX="${JSON_PREFIX:-}" 400 . ../../sh/jshn.sh 401 402 set +u 403 404 json_init 405 406 json_add_object "inventory" 407 408 json_add_int "apples" 61 409 json_add_int "pears" 42 410 json_add_int "melons" 5 411 412 json_close_object # inventory 413 414 assertEquals '{ "inventory": { "apples": 61, "pears": 42, "melons": 5 } }' "$(json_dump)" 415 416 set -u 417 } 418 419 test_jshn_add_array() { 420 JSON_PREFIX="${JSON_PREFIX:-}" 421 . ../../sh/jshn.sh 422 423 set +u 424 425 json_init 426 427 json_add_array "interfaces" 428 429 json_add_string "" "eth0" 430 json_add_string "" "eth1" 431 json_add_string "" "eth2" 432 433 json_close_array # interfaces 434 435 assertEquals '{ "interfaces": [ "eth0", "eth1", "eth2" ] }' "$(json_dump)" 436 437 set -u 438 } 439 440 test_jshn_add_multi() { 441 JSON_PREFIX="${JSON_PREFIX:-}" 442 . ../../sh/jshn.sh 443 444 set +u 445 446 json_init 447 448 json_add_fields "name:string=joe" "age:int=42" "veteran:boolean=false" 449 450 assertEquals '{ "name": "joe", "age": 42, "veteran": false }' "$(json_dump)" 451 452 set -u 453 } 454 455 test_jshn_append_via_json_script() { 456 JSON_PREFIX="${JSON_PREFIX:-}" 457 . ../../sh/jshn.sh 458 459 # __SHUNIT_SHELL_FLAGS='u' results in 'line 6: JSON_UNSET: unbound variable' in json_cleanup() 460 set +u 461 462 # Test appending first key to empty variable without leading space 463 json_init 464 json_add_string "first" "value1" 465 json_get_keys keys 466 assertEquals "first" "$keys" 467 468 # Test appending second key should maintain no leading space on first key 469 json_add_string "second" "value2" 470 json_get_keys keys 471 assertEquals "first second" "$keys" 472 set -u 473 } 474 475 test_jshn_get_index() { 476 JSON_PREFIX="${JSON_PREFIX:-}" 477 . ../../sh/jshn.sh 478 479 set +u 480 481 local index 482 483 json_init 484 485 json_add_object "DHCP4" 486 487 json_add_array "networks" 488 489 json_add_object "" 490 json_get_index index 491 json_add_int "id" 1 492 json_add_string "subnet" "192.168.1.0/24" 493 json_close_object 494 495 json_add_object "" 496 json_add_int "id" 2 497 json_add_string "subnet" "192.168.2.0/24" 498 json_close_object 499 500 json_select "$index" # revisit first anonymous object 501 json_add_int "valid-lifetime" 3600 502 json_select .. # pop back into array 503 504 json_close_array # networks 505 506 json_close_object # DHCP4 507 508 assertEquals '{ "DHCP4": { "networks": [ { "id": 1, "subnet": "192.168.1.0\/24", "valid-lifetime": 3600 }, { "id": 2, "subnet": "192.168.2.0\/24" } ] } }' "$(json_dump)" 509 510 set -u 511 } 512 513 . ./shunit2/shunit2
This page was automatically generated by LXR 0.3.1. • OpenWrt