github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/common/ccprovider/targzmetadataprovider_test.go (about)

     1  /*
     2  Copyright State Street Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package ccprovider
     8  
     9  import (
    10  	"archive/tar"
    11  	"bytes"
    12  	"compress/gzip"
    13  	"io"
    14  	"testing"
    15  	"time"
    16  
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  type tarEntry struct {
    21  	name    string
    22  	content []byte
    23  }
    24  
    25  func getCodePackage(code []byte, entries []tarEntry) []byte {
    26  	codePackage := bytes.NewBuffer(nil)
    27  	gw := gzip.NewWriter(codePackage)
    28  	tw := tar.NewWriter(gw)
    29  
    30  	var zeroTime time.Time
    31  	for _, e := range entries {
    32  		tw.WriteHeader(&tar.Header{Name: e.name, Size: int64(len(e.content)), ModTime: zeroTime, AccessTime: zeroTime, ChangeTime: zeroTime})
    33  		tw.Write(e.content)
    34  	}
    35  
    36  	tw.WriteHeader(&tar.Header{Name: "fake-path", Size: int64(len(code)), ModTime: zeroTime, AccessTime: zeroTime, ChangeTime: zeroTime})
    37  	tw.Write(code)
    38  
    39  	tw.Close()
    40  	gw.Close()
    41  
    42  	return codePackage.Bytes()
    43  }
    44  
    45  func getNumEntries(tarbytes []byte) (int, error) {
    46  	b := bytes.NewReader(tarbytes)
    47  	tr := tar.NewReader(b)
    48  
    49  	count := 0
    50  	// For each file in the code package tar,
    51  	// add it to the statedb artifact tar if it has "statedb" in the path
    52  	for {
    53  		_, err := tr.Next()
    54  		if err == io.EOF {
    55  			// We only get here if there are no more entries to scan
    56  			break
    57  		}
    58  
    59  		if err != nil {
    60  			return -1, err
    61  		}
    62  
    63  		count = count + 1
    64  	}
    65  
    66  	return count, nil
    67  }
    68  
    69  func TestNoMetadata(t *testing.T) {
    70  	entries := []tarEntry{{"path/to/a/file", []byte("somdata")}}
    71  	cds := getCodePackage([]byte("cc code"), entries)
    72  	metadata, err := MetadataAsTarEntries(cds)
    73  	require.Nil(t, err)
    74  	require.NotNil(t, metadata)
    75  	count, err := getNumEntries(metadata)
    76  	require.Nil(t, err)
    77  	require.Equal(t, count, 0)
    78  }
    79  
    80  func TestMetadata(t *testing.T) {
    81  	entries := []tarEntry{{"path/to/a/file", []byte("somdata")}, {ccPackageStatedbDir + "/m1", []byte("m1data")}, {ccPackageStatedbDir + "/m2", []byte("m2data")}}
    82  	cds := getCodePackage([]byte("cc code"), entries)
    83  	metadata, err := MetadataAsTarEntries(cds)
    84  	require.Nil(t, err)
    85  	require.NotNil(t, metadata)
    86  	count, err := getNumEntries(metadata)
    87  	require.Nil(t, err)
    88  	require.Equal(t, count, 2)
    89  }