/* HEADER Testing read_config_read_octet_string_const(). */ struct read_config_testcase { /* * inputs */ const char *(*pf) (const char * readfrom, u_char ** str, size_t * len); const char *readfrom; size_t obuf_len; /* * expected outputs */ size_t expected_offset; const u_char *expected_output; size_t expected_len; }; static const u_char obuf1[] = { 1, 0, 2 }; static const u_char obuf2[] = { 'a', 'b', 'c', 0 }; static const struct read_config_testcase test_input[] = { { &read_config_read_octet_string_const, "", 1, -1, NULL, 0 }, { &read_config_read_octet_string_const, "0x0", 1, -1, NULL, 1 }, { &read_config_read_octet_string_const, "0x0 0", 1, -1, NULL, 1 }, { &read_config_read_octet_string_const, "0x010002", 1, -1, NULL, 0 }, { &read_config_read_octet_string_const, "0x010002", 2, -1, NULL, 0 }, { &read_config_read_octet_string_const, "0x010002", 3, -1, obuf1, 0 }, { &read_config_read_octet_string_const, "0x010002", 4, -1, obuf1, 3 }, { &read_config_read_octet_string_const, "0x010002 0", 4, 9, obuf1, 3 }, { &read_config_read_octet_string_const, "0x010002", 0, -1, obuf1, 3 }, { &read_config_read_octet_string_const, "abc", 1, -1, NULL, 0 }, { &read_config_read_octet_string_const, "abc z", 1, 4, NULL, 0 }, { &read_config_read_octet_string_const, "abc", 2, -1, NULL, 1 }, { &read_config_read_octet_string_const, "abc", 3, -1, obuf2, 2 }, { &read_config_read_octet_string_const, "abc", 4, -1, obuf2, 3 }, { &read_config_read_octet_string_const, "abc z", 4, 4, obuf2, 3 }, { &read_config_read_octet_string_const, "abc", 0, -1, obuf2, 3 }, }; unsigned int i, j, ok; for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) { const struct read_config_testcase *const p = &test_input[i]; size_t len = p->obuf_len; u_char *str = len > 0 ? malloc(len) : NULL; const char *result; size_t offset; fflush(stdout); result = (p->pf) (p->readfrom, &str, &len); offset = result ? result - p->readfrom : -1; OKF(offset == p->expected_offset, ("test %d: expected offset %" NETSNMP_PRIz "d, got offset %" NETSNMP_PRIz "d", i, p->expected_offset, offset)); if (offset == p->expected_offset) { OKF(len == p->expected_len, ("test %d: expected length %" NETSNMP_PRIz "d, got length %" NETSNMP_PRIz "d", i, p->expected_len, len)); if (len == p->expected_len) { ok = len < 0 || !p->expected_output || memcmp(str, p->expected_output, len) == 0 || p->expected_output[len] != 0; OKF(ok, ("test %d: output buffer mismatch", i)); if (!ok) { printf("Expected: "); for (j = 0; j < p->expected_len; ++j) printf("%02x ", p->expected_output[j]); printf("\nActual: "); for (j = 0; j < len; ++j) printf("%02x ", str[j]); printf("\n"); } } } if (str) free(str); }