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  }