recursive_test.go raw
1 package gnarlring
2
3 import "testing"
4
5 func TestRecursiveTreeDepth1(t *testing.T) {
6 tree := BuildRecursiveTree(1)
7
8 if tree.Root == nil {
9 t.Fatal("root is nil")
10 }
11 if len(tree.Levels) != 2 {
12 t.Fatalf("levels = %d, want 2", len(tree.Levels))
13 }
14 if len(tree.Levels[1]) != N {
15 t.Fatalf("leaves = %d, want %d", len(tree.Levels[1]), N)
16 }
17
18 // Root should have N children.
19 if tree.Root.Children == nil || tree.Root.Children.Count != N {
20 t.Fatal("root children not fully populated")
21 }
22
23 // Sign and verify root.
24 msg := []byte("depth-1 test")
25 sig := tree.SignRoot(msg)
26 if sig == nil {
27 t.Fatal("SignRoot returned nil")
28 }
29 if !tree.VerifyRoot(msg, sig) {
30 t.Fatal("root verification failed")
31 }
32 }
33
34 func TestRecursiveTreeDepth2(t *testing.T) {
35 if testing.Short() {
36 t.Skip("depth-2 tree has 757 nodes, each needs LLL keygen (~3.3s) = ~2500s")
37 }
38
39 // Depth 2: root (1) + level-1 coordinators (27) + leaves (729) = 757 nodes.
40 // Each keygen is ~3.3s. This test would run for ~2500s.
41 // Only run with -timeout high enough.
42 tree := BuildRecursiveTree(2)
43
44 if tree.Root == nil {
45 t.Fatal("root is nil")
46 }
47 if len(tree.Levels) != 3 {
48 t.Fatalf("levels = %d, want 3", len(tree.Levels))
49 }
50 // Level 1: 27 coordinators.
51 if len(tree.Levels[1]) != N {
52 t.Fatalf("level-1 nodes = %d, want %d", len(tree.Levels[1]), N)
53 }
54 // Level 2: 729 leaves.
55 if len(tree.Levels[2]) != N*N {
56 t.Fatalf("leaves = %d, want %d", len(tree.Levels[2]), N*N)
57 }
58 }
59
60 func TestLeafNode(t *testing.T) {
61 n := NewLeafNode()
62 if n.PK == nil || n.SK == nil {
63 t.Fatal("leaf node missing keys")
64 }
65 if n.Children != nil {
66 t.Fatal("leaf should not have children")
67 }
68 }
69
70 func TestInternalNode(t *testing.T) {
71 n := NewInternalNode()
72 if n.PK == nil || n.SK == nil {
73 t.Fatal("internal node missing keys")
74 }
75 if n.Children == nil {
76 t.Fatal("internal node should have children")
77 }
78 if n.Children == nil {
79 t.Fatal("internal node needs Children")
80 }
81
82 // Add a child.
83 childPK, _ := NTRUKeyGen()
84 if !n.AddChild(0, childPK, nil) {
85 t.Fatal("AddChild failed")
86 }
87 if n.AddChild(0, childPK, nil) {
88 t.Fatal("AddChild should reject duplicate")
89 }
90 }
91