github.com/leonlxy/hyperledger@v1.0.0-alpha.0.20170427033203-34922035d248/core/common/ccprovider/sigcdspackage_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  	"os"
    22  	"testing"
    23  
    24  	"github.com/hyperledger/fabric/core/common/ccpackage"
    25  	"github.com/hyperledger/fabric/protos/common"
    26  	pb "github.com/hyperledger/fabric/protos/peer"
    27  	"github.com/hyperledger/fabric/protos/utils"
    28  )
    29  
    30  func processSignedCDS(cds *pb.ChaincodeDeploymentSpec, policy *common.SignaturePolicyEnvelope, tofs bool) (*SignedCDSPackage, []byte, *ChaincodeData, error) {
    31  	env, err := ccpackage.OwnerCreateSignedCCDepSpec(cds, policy, nil)
    32  	if err != nil {
    33  		return nil, nil, nil, fmt.Errorf("could not create package %s", err)
    34  	}
    35  
    36  	b := utils.MarshalOrPanic(env)
    37  
    38  	ccpack := &SignedCDSPackage{}
    39  	cd, err := ccpack.InitFromBuffer(b)
    40  	if err != nil {
    41  		return nil, nil, nil, fmt.Errorf("error owner creating package %s", err)
    42  	}
    43  
    44  	if tofs {
    45  		if err = ccpack.PutChaincodeToFS(); err != nil {
    46  			return nil, nil, nil, fmt.Errorf("error putting package on the FS %s", err)
    47  		}
    48  	}
    49  
    50  	return ccpack, b, cd, nil
    51  }
    52  
    53  func TestPutSigCDSCC(t *testing.T) {
    54  	ccdir := setupccdir()
    55  	defer os.RemoveAll(ccdir)
    56  
    57  	cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")}
    58  
    59  	ccpack, _, cd, err := processSignedCDS(cds, &common.SignaturePolicyEnvelope{Version: 1}, true)
    60  	if err != nil {
    61  		t.Fatalf("cannot create package %s", err)
    62  		return
    63  	}
    64  
    65  	if err = ccpack.ValidateCC(cd); err != nil {
    66  		t.Fatalf("error validating package %s", err)
    67  		return
    68  	}
    69  }
    70  
    71  func TestPutSignedCDSErrorPaths(t *testing.T) {
    72  	ccdir := setupccdir()
    73  	defer os.RemoveAll(ccdir)
    74  
    75  	cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")}
    76  
    77  	ccpack, b, _, err := processSignedCDS(cds, &common.SignaturePolicyEnvelope{Version: 1}, true)
    78  	if err != nil {
    79  		t.Fatalf("cannot create package %s", err)
    80  		return
    81  	}
    82  
    83  	//validate with invalid name
    84  	if err = ccpack.ValidateCC(&ChaincodeData{Name: "invalname", Version: "0"}); err == nil {
    85  		t.Fatalf("expected error validating package")
    86  		return
    87  	}
    88  
    89  	//remove the buffer
    90  	ccpack.buf = nil
    91  	if err = ccpack.PutChaincodeToFS(); err == nil {
    92  		t.Fatalf("expected error putting package on the FS")
    93  		return
    94  	}
    95  
    96  	//put back  the buffer but remove the depspec
    97  	ccpack.buf = b
    98  	savDepSpec := ccpack.sDepSpec
    99  	ccpack.sDepSpec = nil
   100  	if err = ccpack.PutChaincodeToFS(); err == nil {
   101  		t.Fatalf("expected error putting package on the FS")
   102  		return
   103  	}
   104  
   105  	//put back dep spec
   106  	ccpack.sDepSpec = savDepSpec
   107  
   108  	//...but remove the chaincode directory
   109  	os.RemoveAll(ccdir)
   110  	if err = ccpack.PutChaincodeToFS(); err == nil {
   111  		t.Fatalf("expected error putting package on the FS")
   112  		return
   113  	}
   114  }
   115  
   116  func TestSigCDSGetCCPackage(t *testing.T) {
   117  	cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")}
   118  
   119  	env, err := ccpackage.OwnerCreateSignedCCDepSpec(cds, &common.SignaturePolicyEnvelope{Version: 1}, nil)
   120  	if err != nil {
   121  		t.Fatalf("cannot create package")
   122  		return
   123  	}
   124  
   125  	b := utils.MarshalOrPanic(env)
   126  
   127  	ccpack, err := GetCCPackage(b)
   128  	if err != nil {
   129  		t.Fatalf("failed to get CCPackage %s", err)
   130  		return
   131  	}
   132  
   133  	cccdspack, ok := ccpack.(*CDSPackage)
   134  	if ok || cccdspack != nil {
   135  		t.Fatalf("expected CDSPackage type cast to fail but succeeded")
   136  		return
   137  	}
   138  
   139  	ccsignedcdspack, ok := ccpack.(*SignedCDSPackage)
   140  	if !ok || ccsignedcdspack == nil {
   141  		t.Fatalf("failed to get Signed CDS CCPackage")
   142  		return
   143  	}
   144  
   145  	cds2 := ccsignedcdspack.GetDepSpec()
   146  	if cds2 == nil {
   147  		t.Fatalf("nil dep spec in Signed CDS CCPackage")
   148  		return
   149  	}
   150  
   151  	if cds2.ChaincodeSpec.ChaincodeId.Name != cds.ChaincodeSpec.ChaincodeId.Name || cds2.ChaincodeSpec.ChaincodeId.Version != cds.ChaincodeSpec.ChaincodeId.Version {
   152  		t.Fatalf("dep spec in Signed CDS CCPackage does not match %v != %v", cds, cds2)
   153  		return
   154  	}
   155  }
   156  
   157  func TestInvalidSigCDSGetCCPackage(t *testing.T) {
   158  	cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("code")}
   159  
   160  	b := utils.MarshalOrPanic(cds)
   161  
   162  	ccpack, err := GetCCPackage(b)
   163  	if err != nil {
   164  		t.Fatalf("failed to get CCPackage %s", err)
   165  		return
   166  	}
   167  
   168  	ccsignedcdspack, ok := ccpack.(*SignedCDSPackage)
   169  	if ok || ccsignedcdspack != nil {
   170  		t.Fatalf("expected failure to get Signed CDS CCPackage but succeeded")
   171  		return
   172  	}
   173  }
   174  
   175  //switch the chaincodes on the FS and validate
   176  func TestSignedCDSSwitchChaincodes(t *testing.T) {
   177  	ccdir := setupccdir()
   178  	defer os.RemoveAll(ccdir)
   179  
   180  	//someone modifyed the code on the FS with "badcode"
   181  	cds := &pb.ChaincodeDeploymentSpec{ChaincodeSpec: &pb.ChaincodeSpec{Type: 1, ChaincodeId: &pb.ChaincodeID{Name: "testcc", Version: "0"}, Input: &pb.ChaincodeInput{Args: [][]byte{[]byte("")}}}, CodePackage: []byte("badcode")}
   182  
   183  	//write the bad code to the fs
   184  	badccpack, _, _, err := processSignedCDS(cds, &common.SignaturePolicyEnvelope{Version: 1}, true)
   185  	if err != nil {
   186  		t.Fatalf("error putting CDS to FS %s", err)
   187  		return
   188  	}
   189  
   190  	//mimic the good code ChaincodeData from the instantiate...
   191  	cds.CodePackage = []byte("goodcode")
   192  
   193  	//...and generate the CD for it (don't overwrite the bad code)
   194  	_, _, goodcd, err := processSignedCDS(cds, &common.SignaturePolicyEnvelope{Version: 1}, false)
   195  	if err != nil {
   196  		t.Fatalf("error putting CDS to FS %s", err)
   197  		return
   198  	}
   199  
   200  	if err = badccpack.ValidateCC(goodcd); err == nil {
   201  		t.Fatalf("expected goodcd to fail against bad package but succeeded!")
   202  		return
   203  	}
   204  }