/* HEADER Testing snmp_enum */

#define CONFIG_TYPE "snmp-enum-unit-test"
#define STRING1 "life, and everything"
#define STRING2 "restaurant at the end of the universe"
#define STRING3 "label3"
#define LONG_STRING "a-string-of-255-characters-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"

#define STORE_AND_COMPARE(maj, min, s)                                  \
    {                                                                   \
        FILE *fp;                                                       \
        int read = 0;                                                   \
        char *p, contents[4096];                                        \
                                                                        \
        se_store_list(maj, min, CONFIG_TYPE);                           \
        fp = fopen(tmp_persist_file, "r");                              \
        if (fp) {                                                       \
            read = fread(contents, 1, sizeof(contents) - 1, fp);        \
            fclose(fp);                                                 \
        }                                                               \
        contents[read > 0 ? read : 0] = '\0';                           \
        for (p = contents; *p; ++p)                                     \
            if (*p == '\n')                                             \
                *p = '|';                                               \
        OKF(strcmp(contents, (s)) == 0,                                 \
            ("stored list %s <> %s", (s), contents));                   \
        remove(tmp_persist_file);                                       \
    }

char tmp_persist_file[256];
char *se_find_result;

sprintf(tmp_persist_file, "/tmp/snmp-enum-unit-test-%d", getpid());
netsnmp_setenv("SNMP_PERSISTENT_FILE", tmp_persist_file, 1);

init_snmp_enum("snmp");

STORE_AND_COMPARE(1, 1, "enum 1:1|");

se_add_pair(1, 1, strdup("hi"), 1);

STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi|");

se_add_pair(1, 1, strdup("there"), 2);

STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi 2:there|");

se_add_pair(1, 1, strdup(LONG_STRING), 3);
se_add_pair(1, 1, strdup(LONG_STRING), 4);
se_add_pair(1, 1, strdup(LONG_STRING), 5);
se_add_pair(1, 1, strdup(LONG_STRING), 6);
se_add_pair(1, 1, strdup(LONG_STRING), 7);
se_add_pair(1, 1, strdup(LONG_STRING), 8);
se_add_pair(1, 1, strdup(LONG_STRING), 9);

STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi 2:there 3:" LONG_STRING " 4:" LONG_STRING
                 " 5:" LONG_STRING " 6:" LONG_STRING " 7:" LONG_STRING
                 " 8:" LONG_STRING " 9:" LONG_STRING "|");

se_add_pair(1, 1, strdup(LONG_STRING), 10);

STORE_AND_COMPARE(1, 1, "enum 1:1 1:hi 2:there 3:" LONG_STRING " 4:" LONG_STRING
                 " 5:" LONG_STRING " 6:" LONG_STRING " 7:" LONG_STRING
                 " 8:" LONG_STRING " 9:" LONG_STRING "|"
                 "enum 1:1 10:" LONG_STRING "|");

OK(se_find_value(1, 1, "hi") == 1,
   "lookup by number #1 should be the proper string");
OK(strcmp(se_find_label(1, 1, 2), "there") == 0,
   "lookup by string #1 should be the proper number");


se_add_pair_to_slist("testing", strdup(STRING1), 42);
se_add_pair_to_slist("testing", strdup(STRING2), 2);
se_add_pair_to_slist("testing", strdup(STRING3), 2);
    
OK(se_find_value_in_slist("testing", STRING1) == 42,
   "lookup by number should be the proper string");
OK(strcmp(se_find_label_in_slist("testing", 2), STRING2) == 0,
   "lookup by string should be the proper number");

se_clear_slist("testing");


se_read_conf("enum",
             NETSNMP_REMOVE_CONST(char *, "2:3 1:apple 2:pear 3:kiwifruit"));
OK(se_find_list(2, 3), "list (2, 3) should be present");
if (se_find_list(2, 3)) {
  OK(se_find_value(2, 3, "kiwifruit") == 3,
     "lookup by string should return the proper value")
  se_find_result = se_find_label(2, 3, 2);
  OK(se_find_result && strcmp(se_find_result, "pear") == 0,
     "lookup by label should return the proper string")
}

se_read_conf("enum",
             NETSNMP_REMOVE_CONST(char *, "fruit 1:apple 2:pear 3:kiwifruit"));
OK(se_find_value_in_slist("fruit", "kiwifruit") == 3,
   "lookup by string should return the proper value");
se_find_result = se_find_label_in_slist("fruit", 2);
OK(se_find_result && strcmp(se_find_result, "pear") == 0,
   "lookup by value should return the proper string");

clear_snmp_enum();
unregister_all_config_handlers();
