# -*- Autotest -*-
AT_BANNER([kernel oops parser])
AT_TESTFUN([koops_extract_version],
[[
#include "libabrt.h"
#include "koops-test.h"
int run_test(const struct test_struct *test)
{
FILE *fp = xfopen_ro(test->filename);
fprintf(stderr, "%s\t", test->filename);
char *line;
char *version;
while ((line = xmalloc_fgetline(fp)) != NULL)
{
version = koops_extract_version(line);
free(line);
if (version && !strcmp(version, test->expected_results))
break;
free(version);
version = NULL;
}
if (version)
log_warning("version %s", version);
else
log_warning("version was not found");
free(version);
fclose(fp);
return version == NULL;
}
int main(void)
{
/* tests run in abrt/tests/testsuite.dir/X, where X is test number */
struct test_struct test[] = {
{ EXAMPLE_PFX"/cut_here.right", "2.6.32-19.el6.x86_64" },
{ EXAMPLE_PFX"/oops-kernel-3.x.x", "3.0.0-3.fc16.i686.PAE" },
{ EXAMPLE_PFX"/koops-tainted-g", "3.1.0-0.rc9.git0.0.fc16.x86_64"},
};
int ret = 0;
for (int i = 0 ; i < ARRAY_SIZE(test); ++i)
ret |= run_test(&test[i]);
return ret;
}
]])
AT_TESTFUN([koops_tainted_short],
[[
#include "libabrt.h"
#include "koops-test.h"
enum {
TEST_TAINTED,
TEST_NOT_TAINTED
};
int run_test(const struct test_struct *test, int flags)
{
char *koops_bt = fread_full(test->filename);
char *tnt = kernel_tainted_short(koops_bt);
free(koops_bt);
int ret = 0;
switch (flags) {
case TEST_NOT_TAINTED:
if (tnt)
{
log_warning("%s '%s'", test->filename, tnt);
ret = 1;
}
break;
case TEST_TAINTED:
if (!tnt)
{
log_warning("%s", test->filename);
ret = 1;
}
else if (strcmp(tnt, test->expected_results) != 0)
{
log_warning("%s '%s'", test->filename, tnt);
ret = 1;
}
};
free(tnt);
return ret;
}
int main(void)
{
/* tests run in abrt/tests/testsuite.dir/X, where X is test number */
struct test_struct not_tainted[] = {
{ EXAMPLE_PFX"/oops1.right", NULL},
{ EXAMPLE_PFX"/koops-tainted-spaces", NULL},
};
struct test_struct tainted[] = {
{ EXAMPLE_PFX"/koops-tainted-g", "G"},
{ EXAMPLE_PFX"/koops-tainted-bg1", "GB" },
{ EXAMPLE_PFX"/oops-same-as-oops4.right", "P" },
{ EXAMPLE_PFX"/koops-tainted-insane", "ABCDEFGHIJKLMNOPQRSTUVWXYZ" },
};
log_warning("test not tainted");
int ret = 0;
for (int i = 0; i < ARRAY_SIZE(not_tainted); ++i)
ret |= run_test(¬_tainted[i], TEST_NOT_TAINTED);
log_warning("test tainted");
for (int i = 0; i < ARRAY_SIZE(tainted); ++i)
ret |= run_test(&tainted[i], TEST_TAINTED);
return ret;
}
]])
AT_TESTFUN([koops_hash_improve],
[[
#include "libabrt.h"
#include "koops-test.h"
int run_test(const struct test_struct *test)
{
char *oops1 = fread_full(test->filename);
char *oops2 = fread_full(test->expected_results);
char hash_oops1[SHA1_RESULT_LEN*2 + 1];
koops_hash_str(hash_oops1, oops1);
free(oops1);
char hash_oops2[SHA1_RESULT_LEN*2 + 1];
koops_hash_str(hash_oops2, oops2);
free(oops2);
if (!strcmp(hash_oops1, hash_oops2))
return 0;
log_warning("'%s' != '%s'", hash_oops1, hash_oops2);
return 1;
}
int main(void)
{
struct test_struct all_same_hashes[] = {
{ EXAMPLE_PFX"/oops4.right", EXAMPLE_PFX"/oops-same-as-oops4.right" },
{ EXAMPLE_PFX"/hash-gen-oops6.right", EXAMPLE_PFX"/hash-gen-same-as-oops6.right" },
{ EXAMPLE_PFX"/hash-gen-short-oops.right", EXAMPLE_PFX"/hash-gen-short-oops.right" },
{ EXAMPLE_PFX"/nmi_oops_hash.test", EXAMPLE_PFX"/nmi_oops_hash.right" },
};
g_verbose = 4;
int ret = 0;
for (int i = 0; i < ARRAY_SIZE(all_same_hashes); ++i)
ret |= run_test(&all_same_hashes[i]);
return ret;
}
]])
AT_TESTFUN([koops_parser_sanity],
[[
#include "libabrt.h"
#include "koops-test.h"
int run_test(const struct test_struct *test)
{
char *oops_test = fread_full(test->filename);
char *oops_test_bck = oops_test;
char *oops_expected = fread_full(test->expected_results);
char *oops_expected_bck = oops_expected;
if (strncmp(oops_expected, "abrt-dump-oops: Found oopses:",
strlen("abrt-dump-oops: Found oopses:")) == 0) {
/* Skip "abrt-dump-oops: Found oopses: N"
* and next line (which should be empty)
*/
oops_expected = strchr(oops_expected, '\n') + 1;
oops_expected = strchr(oops_expected, '\n') + 1;
if (strncmp(oops_expected, "Version: ",
strlen("Version: ")) == 0)
oops_expected += strlen("Version: ");
}
/* for testing purpose, I will record only one koops */
GList *oops_list = NULL;
koops_extract_oopses(&oops_list, oops_test, strlen(oops_test));
int result = !(oops_list && !strcmp((char *)oops_list->data, oops_expected));
if (result)
log_warning("Obtained:\n'%s'\nExpected:\n'%s'", (char *)oops_list->data, oops_expected);
g_list_free_full(oops_list, free);
free(oops_expected_bck);
free(oops_test_bck);
return result;
}
int main(void)
{
struct test_struct all_same_hashes[] = {
{ EXAMPLE_PFX"/oops-with-jiffies.test", EXAMPLE_PFX"/oops-with-jiffies.right" },
{ EXAMPLE_PFX"/oops_recursive_locking1.test", EXAMPLE_PFX"/oops_recursive_locking1.right"},
{ EXAMPLE_PFX"/nmi_oops.test", EXAMPLE_PFX"/nmi_oops.right"},
{ EXAMPLE_PFX"/oops10_s390x.test", EXAMPLE_PFX"/oops10_s390x.right"},
{ EXAMPLE_PFX"/kernel_panic_oom.test", EXAMPLE_PFX"/kernel_panic_oom.right"},
{ EXAMPLE_PFX"/debug_messages.test", EXAMPLE_PFX"/debug_messages.right"},
};
int ret = 0;
for (int i = 0; i < ARRAY_SIZE(all_same_hashes); ++i)
ret |= run_test(&all_same_hashes[i]);
return ret;
}
]])