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