tests: Remove trietest's dependence on cprintf.
authorGabe Black <gabeblack@google.com>
Thu, 30 Nov 2017 01:58:59 +0000 (17:58 -0800)
committerGabe Black <gabeblack@google.com>
Mon, 4 Dec 2017 23:09:47 +0000 (23:09 +0000)
Dumping the structure of the tries being constructed was useful for
debugging when the trie data structure was being developed, but the
output can't be automatically verified easily, and what's considered
correct depends on the specific implementation of the trie itself.

To make some of the earlier tests more meaningful, additional lookups
were added which verified that the correct values were returned when
the nodes of the trie were in particular arrangements.

Change-Id: Ib464ad1804d13fe40882da2190d7bf452da83818
Reviewed-on: https://gem5-review.googlesource.com/6223
Reviewed-by: Brandon Potter <Brandon.Potter@amd.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/base/trie.hh
src/unittest/trietest.cc

index e6b2881ab14fe9fd24038a72c63b704b5614d0cf..1d110b4e11c9ac03a8eace47dc45df928236e1a8 100644 (file)
@@ -185,6 +185,10 @@ class Trie
     Handle
     insert(Key key, unsigned width, Value *val)
     {
+        // We use NULL value pointers to mark internal nodes of the trie, so
+        // we don't allow inserting them as real values.
+        assert(val);
+
         // Build a mask which masks off all the bits we don't care about.
         Key new_mask = ~(Key)0;
         if (width < MaxBits)
index 7abef4ce1b36fbd02f80806dee9cf37cc356123b..12d434fe6c815cfb91704781b1f416d303ed6b8d 100644 (file)
@@ -30,7 +30,6 @@
 
 #include <iostream>
 
-#include "base/cprintf.hh"
 #include "base/trie.hh"
 #include "base/types.hh"
 #include "unittest/unittest.hh"
@@ -54,33 +53,33 @@ main()
     // Create an empty Ptr and verify it's data pointer is NULL.
     setCase("An empty trie.");
     TestTrie trie1;
-    trie1.dump("Empty");
-    cprintf("\n\n");
+    EXPECT_EQ(trie1.lookup(0x123456701234567), NULL);
 
     setCase("A single entry.");
     trie1.insert(0x0123456789abcdef, 40, ptr(1));
-    trie1.dump("One entry");
-    cprintf("\n\n");
+    EXPECT_EQ(trie1.lookup(0x123456701234567), NULL);
+    EXPECT_EQ(trie1.lookup(0x123456789ab0000), ptr(1));
 
     setCase("Two entries, one on the way to the other.");
     TestTrie trie2;
     trie2.insert(0x0123456789abcdef, 40, ptr(1));
     trie2.insert(0x0123456789abcdef, 36, ptr(2));
-    trie2.dump("Two entries inline v1");
-    cprintf("\n\n");
+    EXPECT_EQ(trie2.lookup(0x123456700000000), NULL);
+    EXPECT_EQ(trie2.lookup(0x123456789ab0000), ptr(2));
 
     TestTrie trie3;
     trie3.insert(0x0123456789abcdef, 36, ptr(2));
     trie3.insert(0x0123456789abcdef, 40, ptr(1));
-    trie3.dump("Two entries inline v2");
-    cprintf("\n\n");
+    EXPECT_EQ(trie3.lookup(0x123456700000000), NULL);
+    EXPECT_EQ(trie3.lookup(0x123456789ab0000), ptr(2));
 
     setCase("Two entries on different paths.");
     TestTrie trie4;
     trie4.insert(0x0123456789abcdef, 40, ptr(2));
     trie4.insert(0x0123456776543210, 40, ptr(1));
-    trie4.dump("Two split entries");
-    cprintf("\n\n");
+    EXPECT_EQ(trie4.lookup(0x0123456789000000), ptr(2));
+    EXPECT_EQ(trie4.lookup(0x0123456776000000), ptr(1));
+    EXPECT_EQ(trie4.lookup(0x0123456700000000), NULL);
 
     setCase("Skipping past an entry but not two.");
     TestTrie trie5;
@@ -88,8 +87,6 @@ main()
     trie5.insert(0x0123000000000000, 40, ptr(1));
     trie5.insert(0x0123456780000000, 40, ptr(3));
     trie5.insert(0x0123456700000000, 40, ptr(2));
-    trie5.dump("Complex insertion");
-    cprintf("\n\n");
 
     setCase("Looking things up.");
     EXPECT_EQ(trie5.lookup(0x0123000000000000), ptr(1));
@@ -105,8 +102,6 @@ main()
     trie6.insert(0x0123456780000000, 40, ptr(3));
     node1 = trie6.insert(0x0123456700000000, 40, ptr(2));
     node2 = trie6.insert(0x0123456700000000, 32, ptr(10));
-    trie6.dump("Fill before removal");
-    cprintf("\n\n");
 
     EXPECT_EQ(trie6.lookup(0x0123000000000000), ptr(1));
     EXPECT_EQ(trie6.lookup(0x0123456700000000), ptr(10));
@@ -114,8 +109,6 @@ main()
     EXPECT_EQ(trie6.lookup(0x0123456789000000), ptr(10));
 
     trie6.remove(node2);
-    trie6.dump("One node removed");
-    cprintf("\n\n");
 
     EXPECT_EQ(trie6.lookup(0x0123000000000000), ptr(1));
     EXPECT_EQ(trie6.lookup(0x0123456700000000), ptr(2));
@@ -123,8 +116,6 @@ main()
     EXPECT_EQ(trie6.lookup(0x0123456789000000), ptr(4));
 
     trie6.remove(node1);
-    trie6.dump("Two nodes removed");
-    cprintf("\n\n");
 
     EXPECT_EQ(trie6.lookup(0x0123000000000000), ptr(1));
     EXPECT_EQ(trie6.lookup(0x0123456700000000), NULL);