github.com/dusk-network/dusk-crypto@v0.1.3/merkletree/merkletree_test.go (about) 1 package merkletree 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 "testing" 8 9 "github.com/dusk-network/dusk-crypto/hash" 10 ) 11 12 type TestPayload struct { 13 x string 14 } 15 16 func (t TestPayload) CalculateHash() ([]byte, error) { 17 return hash.Sha3256([]byte(t.x)) 18 } 19 20 /* 21 bellaHash := byte[]{ 22 123, 84, 169, 215, 192, 54, 108, 20, 6, 245, 41, 14, 121, 178, 145, 55, 94, 238, 113, 30, 4, 1, 80, 41, 151, 97, 73, 228, 46, 101, 217, 66 23 } 24 25 ciaoHash := byte[]{ 26 240, 108, 25, 222, 241, 183, 15, 22, 31, 89, 41, 192, 69, 200, 232, 63, 131, 145, 226, 85, 237, 211, 110, 40, 176, 99, 27, 26, 82, 181, 47, 28 27 } 28 29 bellaCiaoHash := byte[]{ 30 51, 101, 184, 162, 4, 3, 146, 102, 116, 250, 26, 17, 70, 19, 161, 207, 164, 139, 77, 55, 143, 221, 170, 91, 220, 236, 149, 89, 207, 220, 250, 249 31 } 32 33 ndoHash := byte[]{ 34 203, 213, 36, 240, 52, 96, 20, 37, 47, 174, 66, 155, 188, 249, 99, 254, 216, 245, 165, 217, 193, 27, 204, 39, 172, 133, 239, 199, 83, 79, 49, 46 35 } 36 37 scappiHash = byte[]{ 38 232, 252, 180, 188, 159, 124, 78, 237, 220, 96, 87, 100, 81, 105, 86, 36, 64, 130, 228, 6, 8, 122, 165, 167, 51, 238, 125, 227, 52, 106, 150, 28 39 } 40 41 ndoScappiHash = byte[]{ 42 235, 234, 254, 120, 164, 234, 222, 167, 17, 96, 71, 221, 85, 107, 106, 107, 26, 168, 214, 157, 164, 163, 180, 172, 35, 22, 255, 202, 186, 152, 212, 52 43 } 44 45 root = byte[]{ 46 88, 206, 79, 67, 184, 243, 45, 145, 95, 208, 173, 187, 93, 119, 173, 216, 206, 250, 233, 54, 65, 0, 166, 185, 102, 156, 49, 227, 107, 3, 178, 119 47 } 48 */ 49 50 type Fixture struct { 51 Payloads []Payload 52 ExpectedHash []byte 53 } 54 55 var testTable = []Fixture{ 56 { 57 Payloads: []Payload{ 58 TestPayload{ 59 x: "Bella", 60 }, 61 TestPayload{ 62 x: "Ciao", 63 }, 64 TestPayload{ 65 x: "Ndo", 66 }, 67 TestPayload{ 68 x: "Scappi", 69 }, 70 }, 71 ExpectedHash: []byte{ 72 88, 206, 79, 67, 184, 243, 45, 145, 95, 208, 173, 187, 93, 119, 173, 216, 206, 250, 233, 54, 65, 0, 166, 185, 102, 156, 49, 227, 107, 3, 178, 119, 73 }, 74 }, 75 76 { 77 Payloads: []Payload{ 78 TestPayload{ 79 x: "Hello", 80 }, 81 TestPayload{ 82 x: "Hi", 83 }, 84 TestPayload{ 85 x: "Hey", 86 }, 87 TestPayload{ 88 x: "Hola", 89 }, 90 }, 91 ExpectedHash: []byte{ 92 32, 188, 172, 153, 245, 171, 51, 156, 161, 201, 80, 58, 155, 97, 1, 79, 86, 175, 244, 91, 137, 105, 238, 155, 233, 126, 112, 151, 195, 101, 37, 220, 93 }, 94 }, 95 } 96 97 type uTest func(t *Tree, fixture Fixture, index int) error 98 99 func injectTest(t *testing.T, u uTest) { 100 for i := 0; i < len(testTable); i++ { 101 currentFixture := testTable[i] 102 103 tree, err := NewTree(testTable[i].Payloads) 104 if err != nil { 105 t.Error("unexpected error: ", err) 106 } 107 108 if err := u(tree, currentFixture, i); err != nil { 109 t.Errorf(err.Error()) 110 } 111 112 } 113 } 114 115 var newTreeTest = func(tree *Tree, f Fixture, i int) error { 116 eh := f.ExpectedHash 117 root := tree.MerkleRoot 118 119 if bytes.Compare(root, eh) != 0 { 120 return fmt.Errorf("expecting hash %v but got %v", eh, root) 121 } 122 return nil 123 } 124 125 var merkleRootTest = func(tree *Tree, f Fixture, i int) error { 126 root := tree.MerkleRoot 127 if bytes.Compare(root, f.ExpectedHash) != 0 { 128 return fmt.Errorf("expecting hash %v but got %v", f.ExpectedHash, root) 129 } 130 return nil 131 } 132 133 var rebuildTreeTest = func(tree *Tree, f Fixture, i int) error { 134 root := tree.MerkleRoot 135 if err := tree.RebuildTree(); err != nil { 136 return err 137 } 138 139 if bytes.Compare(root, f.ExpectedHash) != 0 { 140 return fmt.Errorf("expecting hash %v but got %v", f.ExpectedHash, root) 141 } 142 return nil 143 } 144 145 var verifyTree = func(tree *Tree, f Fixture, i int) error { 146 147 v1, err := VerifyTree(tree) 148 if err != nil { 149 return err 150 } 151 152 if !v1 { 153 return errors.New("expected tree to be valid") 154 } 155 156 tree.Root.Hash = []byte{1} 157 tree.MerkleRoot = []byte{1} 158 159 v2, err := VerifyTree(tree) 160 if err != nil { 161 return err 162 } 163 164 if v2 { 165 return errors.New("expected tree to be invalid") 166 } 167 return nil 168 } 169 170 var verifyContent = func(tree *Tree, f Fixture, i int) error { 171 172 for _, payload := range f.Payloads { 173 v, err := tree.VerifyContent(payload) 174 if err != nil { 175 return err 176 } 177 if !v { 178 return fmt.Errorf("encountered invalid payload %s", payload) 179 } 180 } 181 182 v, err := tree.VerifyContent(TestPayload{x: "NotInTestTable"}) 183 if err != nil { 184 return err 185 } 186 187 if v { 188 return errors.New("verification should have failed") 189 } 190 191 return nil 192 } 193 194 func TestMerkleTree_RebuildWithPayload(t *testing.T) { 195 for i := 0; i < len(testTable)-1; i++ { 196 tree, err := NewTree(testTable[i].Payloads) 197 if err != nil { 198 t.Error("unexpected error: ", err) 199 } 200 err = tree.RebuildTreeUsing(testTable[i+1].Payloads) 201 if err != nil { 202 t.Error("unexpected error: ", err) 203 } 204 if bytes.Compare(tree.MerkleRoot, testTable[i+1].ExpectedHash) != 0 { 205 t.Errorf("expected hash equal to %v got %v", testTable[i+1].ExpectedHash, tree.MerkleRoot) 206 } 207 } 208 } 209 210 func TestSuite(t *testing.T) { 211 injectTest(t, newTreeTest) 212 injectTest(t, merkleRootTest) 213 injectTest(t, rebuildTreeTest) 214 t.Run("Rebuilding the MerkleTree with the payload yields the same MerkleTree", TestMerkleTree_RebuildWithPayload) 215 injectTest(t, verifyTree) 216 injectTest(t, verifyContent) 217 }