summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/test.c108
1 files changed, 107 insertions, 1 deletions
diff --git a/test/test.c b/test/test.c
index f4e4846..bdce05b 100644
--- a/test/test.c
+++ b/test/test.c
@@ -18,6 +18,9 @@
#define TEST_FILE_PATH "./test.json"
#define LOG_FILE_PATH "./osfp_test.log"
+#define OSFP_OS_CLASS_MERGED_MAX (OSFP_OS_CLASS_MAX - 2)
+#define EntryWidth 8
+
unsigned char *data_file_path = DATA_FILE_PATH;
unsigned char *db_file_path;
unsigned char *test_file_path;
@@ -29,6 +32,101 @@ FILE *log_file_ptr;
unsigned int debug_enable;
+//enum osfp_os_class_id {
+// OSFP_OS_CLASS_UNKNOWN, // 未知
+// OSFP_OS_CLASS_WINDOWS, // Windows
+// OSFP_OS_CLASS_LINUX, // Linux
+// OSFP_OS_CLASS_MAC_OS, // Mac OS
+// OSFP_OS_CLASS_IOS, // iOS
+// OSFP_OS_CLASS_ANDROID, // Android
+// OSFP_OS_CLASS_OTHERS, // 其他
+// OSFP_OS_CLASS_MAX,
+//};
+// merged classes: unknown 0 windows-like 1 unix-like 2 apple-like 3 others 4
+
+unsigned int testresult[OSFP_OS_CLASS_MAX][OSFP_OS_CLASS_MAX] = {0};
+unsigned int testresult_merged[OSFP_OS_CLASS_MERGED_MAX][OSFP_OS_CLASS_MERGED_MAX] = {0};
+
+static const char *class_to_merged_name(unsigned int class)
+{
+ switch (class) {
+ case 0:
+ return "Unknown";
+ case 1:
+ return "Windows-Like";
+ case 2:
+ return "Unix-Like";
+ case 3:
+ return "Apple-Like";
+ case 4:
+ return "Others";
+ }
+ return NULL;
+}
+static unsigned int class_to_merged_class(unsigned int class)
+{
+ switch (class) {
+ case OSFP_OS_CLASS_UNKNOWN:
+ return 0;
+ case OSFP_OS_CLASS_WINDOWS:
+ return 1;
+ case OSFP_OS_CLASS_LINUX:
+ return 2;
+ case OSFP_OS_CLASS_MAC_OS:
+ return 3;
+ case OSFP_OS_CLASS_IOS:
+ return 3;
+ case OSFP_OS_CLASS_ANDROID:
+ return 2;
+ case OSFP_OS_CLASS_OTHERS:
+ return 4;
+ }
+ return 0;
+}
+
+static void testresult_class_merge()
+{
+ int i,j;
+ for (i = 0; i < OSFP_OS_CLASS_MAX; i++) {
+ for (j = 0; j < OSFP_OS_CLASS_MAX; j++) {
+ testresult_merged[class_to_merged_class(i)][class_to_merged_class(j)] += testresult[i][j];
+ }
+ }
+}
+
+static void print_confusion_matrix(unsigned int *result, unsigned int os_class_max, const char *(*get_name)(unsigned int))
+{
+ int i,j;
+ int matched = 0, missed = 0;
+
+ for (i = 0; i < os_class_max; i++) {
+ printf("%*s(%c)", EntryWidth-3, " ", 'a' + i);
+ }
+ printf(" <-" " classified as" "\n");
+
+ for (i = 0; i < os_class_max; i++) {
+ printf("%*.*s", EntryWidth, EntryWidth-2, "----------");
+ }
+
+ printf("\n");
+
+
+ for (i = 0; i < os_class_max; i++) {
+ for (j = 0; j < os_class_max; j++) {
+ if (i == j) {
+ matched += *(result + os_class_max * i + j);
+ } else {
+ missed += *(result + os_class_max * i + j);
+ }
+ printf(" %*d", EntryWidth-1, *(result + os_class_max * i + j));
+ }
+ printf(" (%c): " "class" " %s\n", 'a' + i, get_name(i));
+ }
+
+ printf("miss rate: %u%%\n", 100 * missed / (matched + missed));
+}
+
+
void test_data_prepare()
{
char *file_buffer;
@@ -129,6 +227,8 @@ void test_miss_rate()
continue;
}
+ testresult[result->likely_os_class][os_class]++;
+
if (os_class == result->likely_os_class) {
verified_count++;
osfp_result_free(result);
@@ -161,7 +261,13 @@ void test_miss_rate()
printf("total %u, failed %u, pass %u, wrong %u, other %u, unknown %u\n",
fingerprint_count, identify_failed_count, verified_count, wrong_count, other_count, unknown_count);
- printf("miss rate: %d%%\n", 100 - (verified_count * 100 / fingerprint_count));
+ //printf("miss rate: %d%%\n", 100 - (verified_count * 100 / fingerprint_count));
+
+ testresult_class_merge();
+
+ print_confusion_matrix((unsigned int *)testresult, OSFP_OS_CLASS_MAX, osfp_os_class_id_to_name);
+
+ print_confusion_matrix((unsigned int *)testresult_merged, OSFP_OS_CLASS_MERGED_MAX, class_to_merged_name);
printf("details in: %s\n", LOG_FILE_PATH);