github.com/0chain/gosdk@v1.17.11/core/util/fixed_merkle_tree_test.go (about)

     1  package util
     2  
     3  import (
     4  	"math/rand"
     5  	"testing"
     6  
     7  	"fmt"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  const (
    13  	KB = 1024
    14  )
    15  
    16  func TestFixedMerkleTreeWrite(t *testing.T) {
    17  	for i := 0; i < 100; i++ {
    18  		var n int64
    19  		for {
    20  			n = rand.Int63n(KB * KB)
    21  			if n != 0 {
    22  				break
    23  			}
    24  		}
    25  
    26  		t.Run(fmt.Sprintf("Fmt test with dataSize: %d", n), func(t *testing.T) {
    27  
    28  			b := make([]byte, n)
    29  			rand.Read(b) //nolint
    30  
    31  			leaves := make([]Hashable, FixedMerkleLeaves)
    32  			for i := 0; i < len(leaves); i++ {
    33  				leaves[i] = getNewLeaf()
    34  			}
    35  
    36  			for i := 0; i < len(b); i += MaxMerkleLeavesSize {
    37  				leafCount := 0
    38  				endInd := i + MaxMerkleLeavesSize
    39  				if endInd > len(b) {
    40  					endInd = len(b)
    41  				}
    42  
    43  				d := b[i:endInd]
    44  				for j := 0; j < len(d); j += MerkleChunkSize {
    45  					endInd := j + MerkleChunkSize
    46  					if endInd > len(d) {
    47  						endInd = len(d)
    48  					}
    49  
    50  					_, err := leaves[leafCount].Write(d[j:endInd])
    51  					require.NoError(t, err)
    52  					leafCount++
    53  				}
    54  			}
    55  
    56  			mt := MerkleTree{}
    57  			mt.ComputeTree(leaves)
    58  
    59  			root := mt.GetRoot()
    60  
    61  			ft := NewFixedMerkleTree()
    62  			_, err := ft.Write(b)
    63  			require.NoError(t, err)
    64  			err = ft.Finalize()
    65  			require.NoError(t, err)
    66  
    67  			root1 := ft.GetMerkleRoot()
    68  			require.Equal(t, root, root1)
    69  		})
    70  	}
    71  }