package gnarlring import "testing" func TestRecursiveTreeDepth1(t *testing.T) { tree := BuildRecursiveTree(1) if tree.Root == nil { t.Fatal("root is nil") } if len(tree.Levels) != 2 { t.Fatalf("levels = %d, want 2", len(tree.Levels)) } if len(tree.Levels[1]) != N { t.Fatalf("leaves = %d, want %d", len(tree.Levels[1]), N) } // Root should have N children. if tree.Root.Children == nil || tree.Root.Children.Count != N { t.Fatal("root children not fully populated") } // Sign and verify root. msg := []byte("depth-1 test") sig := tree.SignRoot(msg) if sig == nil { t.Fatal("SignRoot returned nil") } if !tree.VerifyRoot(msg, sig) { t.Fatal("root verification failed") } } func TestRecursiveTreeDepth2(t *testing.T) { if testing.Short() { t.Skip("depth-2 tree has 757 nodes, each needs LLL keygen (~3.3s) = ~2500s") } // Depth 2: root (1) + level-1 coordinators (27) + leaves (729) = 757 nodes. // Each keygen is ~3.3s. This test would run for ~2500s. // Only run with -timeout high enough. tree := BuildRecursiveTree(2) if tree.Root == nil { t.Fatal("root is nil") } if len(tree.Levels) != 3 { t.Fatalf("levels = %d, want 3", len(tree.Levels)) } // Level 1: 27 coordinators. if len(tree.Levels[1]) != N { t.Fatalf("level-1 nodes = %d, want %d", len(tree.Levels[1]), N) } // Level 2: 729 leaves. if len(tree.Levels[2]) != N*N { t.Fatalf("leaves = %d, want %d", len(tree.Levels[2]), N*N) } } func TestLeafNode(t *testing.T) { n := NewLeafNode() if n.PK == nil || n.SK == nil { t.Fatal("leaf node missing keys") } if n.Children != nil { t.Fatal("leaf should not have children") } } func TestInternalNode(t *testing.T) { n := NewInternalNode() if n.PK == nil || n.SK == nil { t.Fatal("internal node missing keys") } if n.Children == nil { t.Fatal("internal node should have children") } if n.Children == nil { t.Fatal("internal node needs Children") } // Add a child. childPK, _ := NTRUKeyGen() if !n.AddChild(0, childPK, nil) { t.Fatal("AddChild failed") } if n.AddChild(0, childPK, nil) { t.Fatal("AddChild should reject duplicate") } }