Merge remote branch 'origin/sparc-dev'
[akaros.git] / kern / src / testing.c
index a450fae..544e8c0 100644 (file)
@@ -28,6 +28,7 @@
 #include <pmap.h>
 #include <slab.h>
 #include <kmalloc.h>
+#include <hashtable.h>
 
 #define l1 (available_caches.l1)
 #define l2 (available_caches.l2)
@@ -589,6 +590,7 @@ static void sync_tests(int start_core, int num_threads, int job_num)
        // we want to fake a run, to reenter manager for the next case
        env_t *env = kfs_proc_create(kfs_lookup_path("roslib_null"));
        smp_call_function_single(0, run_env_handler, env, 0);
+       // Note we are still holding references to all the processes
        process_workqueue();
        panic("whoops!\n");
 }
@@ -619,6 +621,7 @@ static void async_tests(int start_core, int num_threads, int job_num)
        // we want to fake a run, to reenter manager for the next case
        env_t *env = kfs_proc_create(kfs_lookup_path("roslib_null"));
        smp_call_function_single(0, run_env_handler, env, 0);
+       // Note we are still holding references to all the processes
        process_workqueue();
        // this all never returns
        panic("whoops!\n");
@@ -711,7 +714,7 @@ void test_hello_world_handler(trapframe_t *tf, void* data)
                trapno, core_id(), tf);
 }
 
-uint32_t print_info_lock = 0;
+spinlock_t print_info_lock = SPINLOCK_INITIALIZER;
 
 void test_print_info_handler(trapframe_t *tf, void* data)
 {
@@ -863,16 +866,17 @@ static void test_single_cache(int iters, size_t size, int align, int flags,
        printk("\n\n\n\n");
 }
 
+void a_ctor(void *buf, size_t size)
+{
+       printk("constructin tests\n");
+}
+void a_dtor(void *buf, size_t size)
+{
+       printk("destructin tests\n");
+}
+
 void test_slab(void)
 {
-       void a_ctor(void *buf, size_t size)
-       {
-               printk("constructin tests\n");
-       }
-       void a_dtor(void *buf, size_t size)
-       {
-               printk("destructin tests\n");
-       }
        test_single_cache(10, 128, 512, 0, 0, 0);
        test_single_cache(10, 128, 4, 0, a_ctor, a_dtor);
        test_single_cache(10, 1024, 16, 0, 0, 0);
@@ -899,3 +903,103 @@ void test_kmalloc(void)
        kfree(bufs[0]);
 }
 
+static size_t test_hash_fn_col(void *k)
+{
+       return (size_t)k % 2; // collisions in slots 0 and 1
+}
+
+void test_hashtable(void)
+{
+       struct test {int x; int y;};
+       struct test tstruct[10];
+
+       struct hashtable *h;
+       int k = 5;
+       struct test *v = &tstruct[0];
+
+       h = create_hashtable(32, __generic_hash, __generic_eq);
+       
+       // test inserting one item, then finding it again
+       printk("Tesing one item, insert, search, and removal\n");
+       if(!hashtable_insert(h, (void*)k, v))
+               printk("Failed to insert to hashtable!\n");
+       v = NULL;
+       if (!(v = hashtable_search(h, (void*)k)))
+               printk("Failed to find in hashtable!\n");
+       if (v != &tstruct[0])
+               printk("Got the wrong item! (got %p, wanted %p)\n", v, &tstruct[0]);
+       v = NULL;
+       if (!(v = hashtable_remove(h, (void*)k)))
+               printk("Failed to remove from hashtable!\n");
+       // shouldn't be able to find it again
+       if ((v = hashtable_search(h, (void*)k)))
+               printk("Should not have been able to find in hashtable!\n");
+       
+       printk("Tesing a bunch of items, insert, search, and removal\n");
+       for (int i = 0; i < 10; i++) {
+               k = i; // vary the key, we don't do KEY collisions
+               if(!hashtable_insert(h, (void*)k, &tstruct[i]))
+                       printk("Failed to insert iter %d to hashtable!\n", i);
+       }
+       // read out the 10 items
+       for (int i = 0; i < 10; i++) {
+               k = i;
+               if (!(v = hashtable_search(h, (void*)k)))
+                       printk("Failed to find in hashtable!\n");
+               if (v != &tstruct[i])
+                       printk("Got the wrong item! (got %p, wanted %p)\n", v, &tstruct[i]);
+       }
+       if (hashtable_count(h) != 10)
+               printk("Wrong accounting of number of elements!\n");
+       // remove the 10 items
+       for (int i = 0; i < 10; i++) {
+               k = i;
+               if (!(v = hashtable_remove(h, (void*)k)))
+                       printk("Failed to remove from hashtable!\n");
+       }
+       // make sure they are all gone
+       for (int i = 0; i < 10; i++) {
+               k = i;
+               if ((v = hashtable_search(h, (void*)k)))
+                       printk("Should not have been able to find in hashtable!\n");
+       }
+       if (hashtable_count(h))
+               printk("Wrong accounting of number of elements!\n");
+       hashtable_destroy(h);
+
+       // same test of a bunch of items, but with collisions.
+       printk("Tesing a bunch of items with collisions, etc.\n");
+       h = create_hashtable(32, test_hash_fn_col, __generic_eq);
+       // insert 10 items
+       for (int i = 0; i < 10; i++) {
+               k = i; // vary the key, we don't do KEY collisions
+               if(!hashtable_insert(h, (void*)k, &tstruct[i]))
+                       printk("Failed to insert iter %d to hashtable!\n", i);
+       }
+       // read out the 10 items
+       for (int i = 0; i < 10; i++) {
+               k = i;
+               if (!(v = hashtable_search(h, (void*)k)))
+                       printk("Failed to find in hashtable!\n");
+               if (v != &tstruct[i])
+                       printk("Got the wrong item! (got %p, wanted %p)\n", v, &tstruct[i]);
+       }
+       if (hashtable_count(h) != 10)
+               printk("Wrong accounting of number of elements!\n");
+       // remove the 10 items
+       for (int i = 0; i < 10; i++) {
+               k = i;
+               if (!(v = hashtable_remove(h, (void*)k)))
+                       printk("Failed to remove from hashtable!\n");
+       }
+       // make sure they are all gone
+       for (int i = 0; i < 10; i++) {
+               k = i;
+               if ((v = hashtable_search(h, (void*)k)))
+                       printk("Should not have been able to find in hashtable!\n");
+       }
+       if (hashtable_count(h))
+               printk("Wrong accounting of number of elements!\n");
+       hashtable_destroy(h);
+}
+