github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/core/common/ccprovider/cdspackage_test.go (about)

     1  /*
     2  Copyright IBM Corp. 2017 All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  		 http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package ccprovider
    18  
    19  import (
    20  	"fmt"
    21  	"io/ioutil"
    22  	"os"
    23  	"testing"
    24  
    25  	pb "github.com/hyperledger/fabric/protos/peer"
    26  	"github.com/hyperledger/fabric/protos/utils"
    27  	"github.com/stretchr/testify/assert"
    28  )
    29  
    30  func setupccdir() string {
    31  	tempDir, err := ioutil.TempDir("/tmp", "ccprovidertest")
    32  	if err != nil {
    33  		panic(err)
    34  	}
    35  	SetChaincodesPath(tempDir)
    36  	return tempDir
    37  }
    38  
    39  func processCDS(cds *pb.ChaincodeDeploymentSpec, tofs bool) (*CDSPackage, []byte, *ChaincodeData, error) {
    40  	b := utils.MarshalOrPanic(cds)
    41  
    42  	ccpack := &CDSPackage{}
    43  	cd, err := ccpack.InitFromBuffer(b)
    44  	if err != nil {
    45  		return nil, nil, nil, fmt.Errorf("error owner creating package %s", err)
    46  	}
    47  
    48  	if tofs {
    49  		if err = ccpack.PutChaincodeToFS(); err != nil {
    50  			return nil, nil, nil, fmt.Errorf("error putting package on the FS %s", err)
    51  		}
    52  	}
    53  
    54  	return ccpack, b, cd, nil
    55  }
    56  
    57  func TestPutCDSCC(t *testing.T) {
    58  	ccdir := setupccdir()
    59  	defer os.RemoveAll(ccdir)
    60  
    61  	cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")}
    62  
    63  	ccpack, _, cd, err := processCDS(cds, true)
    64  	if err != nil {
    65  		t.Fatalf("error putting CDS to FS %s", err)
    66  		return
    67  	}
    68  
    69  	if err = ccpack.ValidateCC(cd); err != nil {
    70  		t.Fatalf("error validating package %s", err)
    71  		return
    72  	}
    73  }
    74  
    75  func TestPutCDSErrorPaths(t *testing.T) {
    76  	ccdir := setupccdir()
    77  	defer os.RemoveAll(ccdir)
    78  
    79  	cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"},
    80  		Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")}
    81  
    82  	ccpack, b, _, err := processCDS(cds, true)
    83  	if err != nil {
    84  		t.Fatalf("error putting CDS to FS %s", err)
    85  		return
    86  	}
    87  
    88  	//validate with invalid name
    89  	if err = ccpack.ValidateCC(&ChaincodeData{Name: "invalname", Version: "0"}); err == nil {
    90  		t.Fatalf("expected error validating package")
    91  		return
    92  	}
    93  	//remove the buffer
    94  	ccpack.buf = nil
    95  	if err = ccpack.PutChaincodeToFS(); err == nil {
    96  		t.Fatalf("expected error putting package on the FS")
    97  		return
    98  	}
    99  
   100  	//put back  the buffer but remove the depspec
   101  	ccpack.buf = b
   102  	savDepSpec := ccpack.depSpec
   103  	ccpack.depSpec = nil
   104  	if err = ccpack.PutChaincodeToFS(); err == nil {
   105  		t.Fatalf("expected error putting package on the FS")
   106  		return
   107  	}
   108  
   109  	//put back dep spec
   110  	ccpack.depSpec = savDepSpec
   111  
   112  	//...but remove the chaincode directory
   113  	os.RemoveAll(ccdir)
   114  	if err = ccpack.PutChaincodeToFS(); err == nil {
   115  		t.Fatalf("expected error putting package on the FS")
   116  		return
   117  	}
   118  }
   119  
   120  func TestCDSGetCCPackage(t *testing.T) {
   121  	cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")}
   122  
   123  	b := utils.MarshalOrPanic(cds)
   124  
   125  	ccpack, err := GetCCPackage(b)
   126  	if err != nil {
   127  		t.Fatalf("failed to get CDS CCPackage %s", err)
   128  		return
   129  	}
   130  
   131  	cccdspack, ok := ccpack.(*CDSPackage)
   132  	if !ok || cccdspack == nil {
   133  		t.Fatalf("failed to get CDS CCPackage")
   134  		return
   135  	}
   136  
   137  	cds2 := cccdspack.GetDepSpec()
   138  	if cds2 == nil {
   139  		t.Fatalf("nil dep spec in CDS CCPackage")
   140  		return
   141  	}
   142  
   143  	if cds2.ChaincodeSpec.ChaincodeId.Name != cds.ChaincodeSpec.ChaincodeId.Name || cds2.ChaincodeSpec.ChaincodeId.Version != cds.ChaincodeSpec.ChaincodeId.Version {
   144  		t.Fatalf("dep spec in CDS CCPackage does not match %v != %v", cds, cds2)
   145  		return
   146  	}
   147  }
   148  
   149  //switch the chaincodes on the FS and validate
   150  func TestCDSSwitchChaincodes(t *testing.T) {
   151  	ccdir := setupccdir()
   152  	defer os.RemoveAll(ccdir)
   153  
   154  	//someone modified the code on the FS with "badcode"
   155  	cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("badcode")}
   156  
   157  	//write the bad code to the fs
   158  	badccpack, _, _, err := processCDS(cds, true)
   159  	if err != nil {
   160  		t.Fatalf("error putting CDS to FS %s", err)
   161  		return
   162  	}
   163  
   164  	//mimic the good code ChaincodeData from the instantiate...
   165  	cds.CodePackage = []byte("goodcode")
   166  
   167  	//...and generate the CD for it (don't overwrite the bad code)
   168  	_, _, goodcd, err := processCDS(cds, false)
   169  	if err != nil {
   170  		t.Fatalf("error putting CDS to FS %s", err)
   171  		return
   172  	}
   173  
   174  	if err = badccpack.ValidateCC(goodcd); err == nil {
   175  		t.Fatalf("expected goodcd to fail against bad package but succeeded!")
   176  		return
   177  	}
   178  }
   179  
   180  func TestPutChaincodeToFSErrorPaths(t *testing.T) {
   181  	ccpack := &CDSPackage{}
   182  	err := ccpack.PutChaincodeToFS()
   183  	assert.Error(t, err)
   184  	assert.Contains(t, err.Error(), "uninitialized package", "Unexpected error returned")
   185  
   186  	ccpack.buf = []byte("hello")
   187  	err = ccpack.PutChaincodeToFS()
   188  	assert.Error(t, err)
   189  	assert.Contains(t, err.Error(), "id cannot be nil if buf is not nil", "Unexpected error returned")
   190  
   191  	ccpack.id = []byte("cc123")
   192  	err = ccpack.PutChaincodeToFS()
   193  	assert.Error(t, err)
   194  	assert.Contains(t, err.Error(), "depspec cannot be nil if buf is not nil", "Unexpected error returned")
   195  
   196  	ccpack.depSpec = &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"},
   197  		Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")}
   198  	err = ccpack.PutChaincodeToFS()
   199  	assert.Error(t, err)
   200  	assert.Contains(t, err.Error(), "nil data", "Unexpected error returned")
   201  
   202  	ccpack.data = &CDSData{}
   203  	err = ccpack.PutChaincodeToFS()
   204  	assert.Error(t, err)
   205  	assert.Contains(t, err.Error(), "nil data bytes", "Unexpected error returned")
   206  }
   207  
   208  func TestValidateCCErrorPaths(t *testing.T) {
   209  	cpack := &CDSPackage{}
   210  	ccdata := &ChaincodeData{}
   211  	err := cpack.ValidateCC(ccdata)
   212  	assert.Error(t, err)
   213  	assert.Contains(t, err.Error(), "uninitialized package", "Unexpected error returned")
   214  
   215  	cpack.depSpec = &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"},
   216  		Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")}
   217  	err = cpack.ValidateCC(ccdata)
   218  	assert.Error(t, err)
   219  	assert.Contains(t, err.Error(), "nil data", "Unexpected error returned")
   220  }