github.com/myafeier/fabric@v1.0.1-0.20170722181825-3a4b1f2bce86/core/scc/vscc/validator_onevalidsignature_test.go (about)

     1  /*
     2  Copyright IBM Corp. 2016 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  package vscc
    17  
    18  import (
    19  	"testing"
    20  
    21  	"fmt"
    22  	"os"
    23  
    24  	"archive/tar"
    25  	"compress/gzip"
    26  
    27  	"bytes"
    28  
    29  	"github.com/golang/protobuf/proto"
    30  	"github.com/hyperledger/fabric/common/cauthdsl"
    31  	lm "github.com/hyperledger/fabric/common/mocks/ledger"
    32  	"github.com/hyperledger/fabric/common/mocks/scc"
    33  	"github.com/hyperledger/fabric/common/util"
    34  	"github.com/hyperledger/fabric/core/chaincode/shim"
    35  	"github.com/hyperledger/fabric/core/common/ccpackage"
    36  	"github.com/hyperledger/fabric/core/common/ccprovider"
    37  	"github.com/hyperledger/fabric/core/common/sysccprovider"
    38  	cutils "github.com/hyperledger/fabric/core/container/util"
    39  	"github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/rwsetutil"
    40  	per "github.com/hyperledger/fabric/core/peer"
    41  	"github.com/hyperledger/fabric/core/policy"
    42  	"github.com/hyperledger/fabric/core/scc/lscc"
    43  	"github.com/hyperledger/fabric/msp"
    44  	mspmgmt "github.com/hyperledger/fabric/msp/mgmt"
    45  	"github.com/hyperledger/fabric/msp/mgmt/testtools"
    46  	"github.com/hyperledger/fabric/protos/common"
    47  	mspproto "github.com/hyperledger/fabric/protos/msp"
    48  	"github.com/hyperledger/fabric/protos/peer"
    49  	"github.com/hyperledger/fabric/protos/utils"
    50  	"github.com/stretchr/testify/assert"
    51  )
    52  
    53  func createTx(endorsedByDuplicatedIdentity bool) (*common.Envelope, error) {
    54  	ccid := &peer.ChaincodeID{Name: "foo", Version: "v1"}
    55  	cis := &peer.ChaincodeInvocationSpec{ChaincodeSpec: &peer.ChaincodeSpec{ChaincodeId: ccid}}
    56  
    57  	prop, _, err := utils.CreateProposalFromCIS(common.HeaderType_ENDORSER_TRANSACTION, util.GetTestChainID(), cis, sid)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	presp, err := utils.CreateProposalResponse(prop.Header, prop.Payload, &peer.Response{Status: 200}, []byte("res"), nil, ccid, nil, id)
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  
    67  	var env *common.Envelope
    68  	if endorsedByDuplicatedIdentity {
    69  		env, err = utils.CreateSignedTx(prop, id, presp, presp)
    70  	} else {
    71  		env, err = utils.CreateSignedTx(prop, id, presp)
    72  	}
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  	return env, err
    77  }
    78  
    79  func processSignedCDS(cds *peer.ChaincodeDeploymentSpec, policy *common.SignaturePolicyEnvelope) ([]byte, error) {
    80  	env, err := ccpackage.OwnerCreateSignedCCDepSpec(cds, policy, nil)
    81  	if err != nil {
    82  		return nil, fmt.Errorf("could not create package %s", err)
    83  	}
    84  
    85  	b := utils.MarshalOrPanic(env)
    86  
    87  	ccpack := &ccprovider.SignedCDSPackage{}
    88  	cd, err := ccpack.InitFromBuffer(b)
    89  	if err != nil {
    90  		return nil, fmt.Errorf("error owner creating package %s", err)
    91  	}
    92  
    93  	if err = ccpack.PutChaincodeToFS(); err != nil {
    94  		return nil, fmt.Errorf("error putting package on the FS %s", err)
    95  	}
    96  
    97  	cd.InstantiationPolicy = utils.MarshalOrPanic(policy)
    98  
    99  	return utils.MarshalOrPanic(cd), nil
   100  }
   101  
   102  func constructDeploymentSpec(name string, path string, version string, initArgs [][]byte, createFS bool) (*peer.ChaincodeDeploymentSpec, error) {
   103  	spec := &peer.ChaincodeSpec{Type: 1, ChaincodeId: &peer.ChaincodeID{Name: name, Path: path, Version: version}, Input: &peer.ChaincodeInput{Args: initArgs}}
   104  
   105  	codePackageBytes := bytes.NewBuffer(nil)
   106  	gz := gzip.NewWriter(codePackageBytes)
   107  	tw := tar.NewWriter(gz)
   108  
   109  	err := cutils.WriteBytesToPackage("src/garbage.go", []byte(name+path+version), tw)
   110  	if err != nil {
   111  		return nil, err
   112  	}
   113  
   114  	tw.Close()
   115  	gz.Close()
   116  
   117  	chaincodeDeploymentSpec := &peer.ChaincodeDeploymentSpec{ChaincodeSpec: spec, CodePackage: codePackageBytes.Bytes()}
   118  
   119  	if createFS {
   120  		err := ccprovider.PutChaincodeIntoFS(chaincodeDeploymentSpec)
   121  		if err != nil {
   122  			return nil, err
   123  		}
   124  	}
   125  
   126  	return chaincodeDeploymentSpec, nil
   127  }
   128  
   129  func createCCDataRWset(nameK, nameV, version string, policy []byte) ([]byte, error) {
   130  	cd := &ccprovider.ChaincodeData{
   131  		Name:                nameV,
   132  		Version:             version,
   133  		InstantiationPolicy: policy,
   134  	}
   135  
   136  	cdbytes := utils.MarshalOrPanic(cd)
   137  
   138  	rwsetBuilder := rwsetutil.NewRWSetBuilder()
   139  	rwsetBuilder.AddToWriteSet("lscc", nameK, cdbytes)
   140  	rwset := rwsetBuilder.GetTxReadWriteSet()
   141  	return rwset.ToProtoBytes()
   142  }
   143  
   144  func createLSCCTx(ccname, ccver, f string, res []byte) (*common.Envelope, error) {
   145  	return createLSCCTxPutCds(ccname, ccver, f, res, nil, true)
   146  }
   147  
   148  func createLSCCTxPutCds(ccname, ccver, f string, res, cdsbytes []byte, putcds bool) (*common.Envelope, error) {
   149  	cds := &peer.ChaincodeDeploymentSpec{
   150  		ChaincodeSpec: &peer.ChaincodeSpec{
   151  			ChaincodeId: &peer.ChaincodeID{
   152  				Name:    ccname,
   153  				Version: ccver,
   154  			},
   155  			Type: peer.ChaincodeSpec_GOLANG,
   156  		},
   157  	}
   158  
   159  	cdsBytes, err := proto.Marshal(cds)
   160  	if err != nil {
   161  		return nil, err
   162  	}
   163  
   164  	var cis *peer.ChaincodeInvocationSpec
   165  	if putcds {
   166  		if cdsbytes != nil {
   167  			cdsBytes = cdsbytes
   168  		}
   169  		cis = &peer.ChaincodeInvocationSpec{
   170  			ChaincodeSpec: &peer.ChaincodeSpec{
   171  				ChaincodeId: &peer.ChaincodeID{Name: "lscc"},
   172  				Input: &peer.ChaincodeInput{
   173  					Args: [][]byte{[]byte(f), []byte("barf"), cdsBytes},
   174  				},
   175  				Type: peer.ChaincodeSpec_GOLANG,
   176  			},
   177  		}
   178  	} else {
   179  		cis = &peer.ChaincodeInvocationSpec{
   180  			ChaincodeSpec: &peer.ChaincodeSpec{
   181  				ChaincodeId: &peer.ChaincodeID{Name: "lscc"},
   182  				Input: &peer.ChaincodeInput{
   183  					Args: [][]byte{[]byte(f), []byte("barf")},
   184  				},
   185  				Type: peer.ChaincodeSpec_GOLANG,
   186  			},
   187  		}
   188  	}
   189  
   190  	prop, _, err := utils.CreateProposalFromCIS(common.HeaderType_ENDORSER_TRANSACTION, util.GetTestChainID(), cis, sid)
   191  	if err != nil {
   192  		return nil, err
   193  	}
   194  
   195  	ccid := &peer.ChaincodeID{Name: ccname, Version: ccver}
   196  
   197  	presp, err := utils.CreateProposalResponse(prop.Header, prop.Payload, &peer.Response{Status: 200}, res, nil, ccid, nil, id)
   198  	if err != nil {
   199  		return nil, err
   200  	}
   201  
   202  	return utils.CreateSignedTx(prop, id, presp)
   203  }
   204  
   205  func TestInit(t *testing.T) {
   206  	v := new(ValidatorOneValidSignature)
   207  	stub := shim.NewMockStub("validatoronevalidsignature", v)
   208  
   209  	if res := stub.MockInit("1", nil); res.Status != shim.OK {
   210  		t.Fatalf("vscc init failed with %s", res.Message)
   211  	}
   212  }
   213  
   214  func getSignedByMSPMemberPolicy(mspID string) ([]byte, error) {
   215  	p := cauthdsl.SignedByMspMember(mspID)
   216  
   217  	b, err := utils.Marshal(p)
   218  	if err != nil {
   219  		return nil, fmt.Errorf("Could not marshal policy, err %s", err)
   220  	}
   221  
   222  	return b, err
   223  }
   224  
   225  func getSignedByOneMemberTwicePolicy(mspID string) ([]byte, error) {
   226  	principal := &mspproto.MSPPrincipal{
   227  		PrincipalClassification: mspproto.MSPPrincipal_ROLE,
   228  		Principal:               utils.MarshalOrPanic(&mspproto.MSPRole{Role: mspproto.MSPRole_MEMBER, MspIdentifier: mspID})}
   229  
   230  	p := &common.SignaturePolicyEnvelope{
   231  		Version:    0,
   232  		Rule:       cauthdsl.NOutOf(2, []*common.SignaturePolicy{cauthdsl.SignedBy(0), cauthdsl.SignedBy(0)}),
   233  		Identities: []*mspproto.MSPPrincipal{principal},
   234  	}
   235  	b, err := utils.Marshal(p)
   236  	if err != nil {
   237  		return nil, fmt.Errorf("Could not marshal policy, err %s", err)
   238  	}
   239  
   240  	return b, err
   241  }
   242  
   243  func getSignedByMSPAdminPolicy(mspID string) ([]byte, error) {
   244  	p := cauthdsl.SignedByMspAdmin(mspID)
   245  
   246  	b, err := utils.Marshal(p)
   247  	if err != nil {
   248  		return nil, fmt.Errorf("Could not marshal policy, err %s", err)
   249  	}
   250  
   251  	return b, err
   252  }
   253  
   254  func TestInvoke(t *testing.T) {
   255  	v := new(ValidatorOneValidSignature)
   256  	stub := shim.NewMockStub("validatoronevalidsignature", v)
   257  
   258  	// Failed path: Invalid arguments
   259  	args := [][]byte{[]byte("dv")}
   260  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   261  		t.Fatalf("vscc invoke should have failed")
   262  	}
   263  
   264  	// not enough args
   265  	args = [][]byte{[]byte("dv"), []byte("tx")}
   266  	args[1] = nil
   267  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   268  		t.Fatalf("vscc invoke should have failed")
   269  	}
   270  
   271  	// nil args
   272  	args = [][]byte{nil, nil, nil}
   273  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   274  		t.Fatalf("vscc invoke should have failed")
   275  	}
   276  
   277  	// nil args
   278  	args = [][]byte{[]byte("a"), []byte("a"), nil}
   279  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   280  		t.Fatalf("vscc invoke should have failed")
   281  	}
   282  
   283  	// broken Envelope
   284  	args = [][]byte{[]byte("a"), []byte("a"), []byte("a")}
   285  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   286  		t.Fatalf("vscc invoke should have failed")
   287  	}
   288  
   289  	// (still) broken Envelope
   290  	args = [][]byte{[]byte("a"), utils.MarshalOrPanic(&common.Envelope{Payload: []byte("barf")}), []byte("a")}
   291  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   292  		t.Fatalf("vscc invoke should have failed")
   293  	}
   294  
   295  	// (still) broken Envelope
   296  	b := utils.MarshalOrPanic(&common.Envelope{Payload: utils.MarshalOrPanic(&common.Payload{Header: &common.Header{ChannelHeader: []byte("barf")}})})
   297  	args = [][]byte{[]byte("a"), b, []byte("a")}
   298  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   299  		t.Fatalf("vscc invoke should have failed")
   300  	}
   301  
   302  	tx, err := createTx(false)
   303  	if err != nil {
   304  		t.Fatalf("createTx returned err %s", err)
   305  	}
   306  
   307  	envBytes, err := utils.GetBytesEnvelope(tx)
   308  	if err != nil {
   309  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   310  	}
   311  
   312  	// broken policy
   313  	args = [][]byte{[]byte("dv"), envBytes, []byte("barf")}
   314  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   315  		t.Fatalf("vscc invoke should have failed")
   316  	}
   317  
   318  	policy, err := getSignedByMSPMemberPolicy(mspid)
   319  	if err != nil {
   320  		t.Fatalf("failed getting policy, err %s", err)
   321  	}
   322  
   323  	// broken type
   324  	b = utils.MarshalOrPanic(&common.Envelope{Payload: utils.MarshalOrPanic(&common.Payload{Header: &common.Header{ChannelHeader: utils.MarshalOrPanic(&common.ChannelHeader{Type: int32(common.HeaderType_ORDERER_TRANSACTION)})}})})
   325  	args = [][]byte{[]byte("dv"), b, policy}
   326  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   327  		t.Fatalf("vscc invoke should have failed")
   328  	}
   329  
   330  	// broken tx payload
   331  	b = utils.MarshalOrPanic(&common.Envelope{Payload: utils.MarshalOrPanic(&common.Payload{Header: &common.Header{ChannelHeader: utils.MarshalOrPanic(&common.ChannelHeader{Type: int32(common.HeaderType_ORDERER_TRANSACTION)})}})})
   332  	args = [][]byte{[]byte("dv"), b, policy}
   333  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   334  		t.Fatalf("vscc invoke should have failed")
   335  	}
   336  
   337  	// good path: signed by the right MSP
   338  	args = [][]byte{[]byte("dv"), envBytes, policy}
   339  	res := stub.MockInvoke("1", args)
   340  	if res.Status != shim.OK {
   341  		t.Fatalf("vscc invoke returned err %s", err)
   342  	}
   343  
   344  	// bad path: signed by the wrong MSP
   345  	policy, err = getSignedByMSPMemberPolicy("barf")
   346  	if err != nil {
   347  		t.Fatalf("failed getting policy, err %s", err)
   348  	}
   349  
   350  	args = [][]byte{[]byte("dv"), envBytes, policy}
   351  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   352  		t.Fatalf("vscc invoke should have failed")
   353  	}
   354  
   355  	// bad path: signed by duplicated MSP identity
   356  	policy, err = getSignedByOneMemberTwicePolicy(mspid)
   357  	if err != nil {
   358  		t.Fatalf("failed getting policy, err %s", err)
   359  	}
   360  	tx, err = createTx(true)
   361  	if err != nil {
   362  		t.Fatalf("createTx returned err %s", err)
   363  	}
   364  	envBytes, err = utils.GetBytesEnvelope(tx)
   365  	if err != nil {
   366  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   367  	}
   368  	args = [][]byte{[]byte("dv"), envBytes, policy}
   369  	if res := stub.MockInvoke("1", args); res.Status == shim.OK || res.Message != DUPLICATED_IDENTITY_ERROR {
   370  		t.Fatalf("vscc invoke should have failed due to policy evaluation failure caused by duplicated identity")
   371  	}
   372  }
   373  
   374  func TestInvalidFunction(t *testing.T) {
   375  	v := new(ValidatorOneValidSignature)
   376  	stub := shim.NewMockStub("validatoronevalidsignature", v)
   377  
   378  	lccc := new(lscc.LifeCycleSysCC)
   379  	stublccc := shim.NewMockStub("lscc", lccc)
   380  
   381  	State := make(map[string]map[string][]byte)
   382  	State["lscc"] = stublccc.State
   383  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
   384  	stub.MockPeerChaincode("lscc", stublccc)
   385  
   386  	r1 := stub.MockInit("1", [][]byte{})
   387  	if r1.Status != shim.OK {
   388  		fmt.Println("Init failed", string(r1.Message))
   389  		t.FailNow()
   390  	}
   391  
   392  	r := stublccc.MockInit("1", [][]byte{})
   393  	if r.Status != shim.OK {
   394  		fmt.Println("Init failed", string(r.Message))
   395  		t.FailNow()
   396  	}
   397  
   398  	ccname := "mycc"
   399  	ccver := "1"
   400  
   401  	res, err := createCCDataRWset(ccname, ccname, ccver, nil)
   402  	assert.NoError(t, err)
   403  
   404  	tx, err := createLSCCTx(ccname, ccver, lscc.GETCCDATA, res)
   405  	if err != nil {
   406  		t.Fatalf("createTx returned err %s", err)
   407  	}
   408  
   409  	envBytes, err := utils.GetBytesEnvelope(tx)
   410  	if err != nil {
   411  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   412  	}
   413  
   414  	// good path: signed by the right MSP
   415  	policy, err := getSignedByMSPMemberPolicy(mspid)
   416  	if err != nil {
   417  		t.Fatalf("failed getting policy, err %s", err)
   418  	}
   419  
   420  	args := [][]byte{[]byte("dv"), envBytes, policy}
   421  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   422  		t.Fatalf("vscc invoke should have failed")
   423  	}
   424  }
   425  
   426  func TestRWSetTooBig(t *testing.T) {
   427  	v := new(ValidatorOneValidSignature)
   428  	stub := shim.NewMockStub("validatoronevalidsignature", v)
   429  
   430  	lccc := new(lscc.LifeCycleSysCC)
   431  	stublccc := shim.NewMockStub("lscc", lccc)
   432  
   433  	State := make(map[string]map[string][]byte)
   434  	State["lscc"] = stublccc.State
   435  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
   436  	stub.MockPeerChaincode("lscc", stublccc)
   437  
   438  	r1 := stub.MockInit("1", [][]byte{})
   439  	if r1.Status != shim.OK {
   440  		fmt.Println("Init failed", string(r1.Message))
   441  		t.FailNow()
   442  	}
   443  
   444  	r := stublccc.MockInit("1", [][]byte{})
   445  	if r.Status != shim.OK {
   446  		fmt.Println("Init failed", string(r.Message))
   447  		t.FailNow()
   448  	}
   449  
   450  	ccname := "mycc"
   451  	ccver := "1"
   452  
   453  	cd := &ccprovider.ChaincodeData{
   454  		Name:                ccname,
   455  		Version:             ccver,
   456  		InstantiationPolicy: nil,
   457  	}
   458  
   459  	cdbytes := utils.MarshalOrPanic(cd)
   460  
   461  	rwsetBuilder := rwsetutil.NewRWSetBuilder()
   462  	rwsetBuilder.AddToWriteSet("lscc", ccname, cdbytes)
   463  	rwsetBuilder.AddToWriteSet("lscc", "spurious", []byte("spurious"))
   464  	rwset := rwsetBuilder.GetTxReadWriteSet()
   465  	res, err := rwset.ToProtoBytes()
   466  	assert.NoError(t, err)
   467  
   468  	tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
   469  	if err != nil {
   470  		t.Fatalf("createTx returned err %s", err)
   471  	}
   472  
   473  	envBytes, err := utils.GetBytesEnvelope(tx)
   474  	if err != nil {
   475  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   476  	}
   477  
   478  	// good path: signed by the right MSP
   479  	policy, err := getSignedByMSPMemberPolicy(mspid)
   480  	if err != nil {
   481  		t.Fatalf("failed getting policy, err %s", err)
   482  	}
   483  
   484  	args := [][]byte{[]byte("dv"), envBytes, policy}
   485  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   486  		t.Fatalf("vscc invoke should have failed")
   487  	}
   488  }
   489  
   490  func TestValidateDeployFail(t *testing.T) {
   491  	v := new(ValidatorOneValidSignature)
   492  	stub := shim.NewMockStub("validatoronevalidsignature", v)
   493  
   494  	lccc := new(lscc.LifeCycleSysCC)
   495  	stublccc := shim.NewMockStub("lscc", lccc)
   496  
   497  	State := make(map[string]map[string][]byte)
   498  	State["lscc"] = stublccc.State
   499  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
   500  	stub.MockPeerChaincode("lscc", stublccc)
   501  
   502  	r1 := stub.MockInit("1", [][]byte{})
   503  	if r1.Status != shim.OK {
   504  		fmt.Println("Init failed", string(r1.Message))
   505  		t.FailNow()
   506  	}
   507  
   508  	r := stublccc.MockInit("1", [][]byte{})
   509  	if r.Status != shim.OK {
   510  		fmt.Println("Init failed", string(r.Message))
   511  		t.FailNow()
   512  	}
   513  
   514  	ccname := "mycc"
   515  	ccver := "1"
   516  
   517  	/*********************/
   518  	/* test no write set */
   519  	/*********************/
   520  
   521  	tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, nil)
   522  	if err != nil {
   523  		t.Fatalf("createTx returned err %s", err)
   524  	}
   525  
   526  	envBytes, err := utils.GetBytesEnvelope(tx)
   527  	if err != nil {
   528  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   529  	}
   530  
   531  	// good path: signed by the right MSP
   532  	policy, err := getSignedByMSPMemberPolicy(mspid)
   533  	if err != nil {
   534  		t.Fatalf("failed getting policy, err %s", err)
   535  	}
   536  
   537  	args := [][]byte{[]byte("dv"), envBytes, policy}
   538  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   539  		t.Fatalf("vscc invoke should have failed")
   540  	}
   541  
   542  	/************************/
   543  	/* test bogus write set */
   544  	/************************/
   545  
   546  	rwsetBuilder := rwsetutil.NewRWSetBuilder()
   547  	rwsetBuilder.AddToWriteSet("lscc", ccname, []byte("barf"))
   548  	rwset := rwsetBuilder.GetTxReadWriteSet()
   549  	resBogus, err := rwset.ToProtoBytes()
   550  	assert.NoError(t, err)
   551  
   552  	tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, resBogus)
   553  	if err != nil {
   554  		t.Fatalf("createTx returned err %s", err)
   555  	}
   556  
   557  	envBytes, err = utils.GetBytesEnvelope(tx)
   558  	if err != nil {
   559  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   560  	}
   561  
   562  	// good path: signed by the right MSP
   563  	policy, err = getSignedByMSPMemberPolicy(mspid)
   564  	if err != nil {
   565  		t.Fatalf("failed getting policy, err %s", err)
   566  	}
   567  
   568  	args = [][]byte{[]byte("dv"), envBytes, policy}
   569  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   570  		t.Fatalf("vscc invoke should have failed")
   571  	}
   572  
   573  	/**********************/
   574  	/* test bad LSCC args */
   575  	/**********************/
   576  
   577  	res, err := createCCDataRWset(ccname, ccname, ccver, nil)
   578  	assert.NoError(t, err)
   579  
   580  	tx, err = createLSCCTxPutCds(ccname, ccver, lscc.DEPLOY, res, nil, false)
   581  	if err != nil {
   582  		t.Fatalf("createTx returned err %s", err)
   583  	}
   584  
   585  	envBytes, err = utils.GetBytesEnvelope(tx)
   586  	if err != nil {
   587  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   588  	}
   589  
   590  	// good path: signed by the right MSP
   591  	policy, err = getSignedByMSPMemberPolicy(mspid)
   592  	if err != nil {
   593  		t.Fatalf("failed getting policy, err %s", err)
   594  	}
   595  
   596  	args = [][]byte{[]byte("dv"), envBytes, policy}
   597  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   598  		t.Fatalf("vscc invoke should have failed")
   599  	}
   600  
   601  	/**********************/
   602  	/* test bad LSCC args */
   603  	/**********************/
   604  
   605  	res, err = createCCDataRWset(ccname, ccname, ccver, nil)
   606  	assert.NoError(t, err)
   607  
   608  	tx, err = createLSCCTxPutCds(ccname, ccver, lscc.DEPLOY, res, []byte("barf"), true)
   609  	if err != nil {
   610  		t.Fatalf("createTx returned err %s", err)
   611  	}
   612  
   613  	envBytes, err = utils.GetBytesEnvelope(tx)
   614  	if err != nil {
   615  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   616  	}
   617  
   618  	// good path: signed by the right MSP
   619  	policy, err = getSignedByMSPMemberPolicy(mspid)
   620  	if err != nil {
   621  		t.Fatalf("failed getting policy, err %s", err)
   622  	}
   623  
   624  	args = [][]byte{[]byte("dv"), envBytes, policy}
   625  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   626  		t.Fatalf("vscc invoke should have failed")
   627  	}
   628  
   629  	/***********************/
   630  	/* test bad cc version */
   631  	/***********************/
   632  
   633  	res, err = createCCDataRWset(ccname, ccname, ccver+".1", nil)
   634  	assert.NoError(t, err)
   635  
   636  	tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
   637  	if err != nil {
   638  		t.Fatalf("createTx returned err %s", err)
   639  	}
   640  
   641  	envBytes, err = utils.GetBytesEnvelope(tx)
   642  	if err != nil {
   643  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   644  	}
   645  
   646  	// good path: signed by the right MSP
   647  	policy, err = getSignedByMSPMemberPolicy(mspid)
   648  	if err != nil {
   649  		t.Fatalf("failed getting policy, err %s", err)
   650  	}
   651  
   652  	args = [][]byte{[]byte("dv"), envBytes, policy}
   653  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   654  		t.Fatalf("vscc invoke should have failed")
   655  	}
   656  
   657  	/*************/
   658  	/* bad rwset */
   659  	/*************/
   660  
   661  	tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, []byte("barf"))
   662  	if err != nil {
   663  		t.Fatalf("createTx returned err %s", err)
   664  	}
   665  
   666  	envBytes, err = utils.GetBytesEnvelope(tx)
   667  	if err != nil {
   668  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   669  	}
   670  
   671  	// good path: signed by the right MSP
   672  	policy, err = getSignedByMSPMemberPolicy(mspid)
   673  	if err != nil {
   674  		t.Fatalf("failed getting policy, err %s", err)
   675  	}
   676  
   677  	args = [][]byte{[]byte("dv"), envBytes, policy}
   678  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   679  		t.Fatalf("vscc invoke should have failed")
   680  	}
   681  
   682  	/********************/
   683  	/* test bad cc name */
   684  	/********************/
   685  
   686  	res, err = createCCDataRWset(ccname+".badbad", ccname, ccver, nil)
   687  	assert.NoError(t, err)
   688  
   689  	tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
   690  	if err != nil {
   691  		t.Fatalf("createTx returned err %s", err)
   692  	}
   693  
   694  	envBytes, err = utils.GetBytesEnvelope(tx)
   695  	if err != nil {
   696  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   697  	}
   698  
   699  	policy, err = getSignedByMSPMemberPolicy(mspid)
   700  	if err != nil {
   701  		t.Fatalf("failed getting policy, err %s", err)
   702  	}
   703  
   704  	args = [][]byte{[]byte("dv"), envBytes, policy}
   705  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   706  		t.Fatalf("vscc invoke should have failed")
   707  	}
   708  
   709  	/**********************/
   710  	/* test bad cc name 2 */
   711  	/**********************/
   712  
   713  	res, err = createCCDataRWset(ccname, ccname+".badbad", ccver, nil)
   714  	assert.NoError(t, err)
   715  
   716  	tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
   717  	if err != nil {
   718  		t.Fatalf("createTx returned err %s", err)
   719  	}
   720  
   721  	envBytes, err = utils.GetBytesEnvelope(tx)
   722  	if err != nil {
   723  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   724  	}
   725  
   726  	policy, err = getSignedByMSPMemberPolicy(mspid)
   727  	if err != nil {
   728  		t.Fatalf("failed getting policy, err %s", err)
   729  	}
   730  
   731  	args = [][]byte{[]byte("dv"), envBytes, policy}
   732  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   733  		t.Fatalf("vscc invoke should have failed")
   734  	}
   735  
   736  	/************************/
   737  	/* test suprious writes */
   738  	/************************/
   739  
   740  	cd := &ccprovider.ChaincodeData{
   741  		Name:                ccname,
   742  		Version:             ccver,
   743  		InstantiationPolicy: nil,
   744  	}
   745  
   746  	cdbytes := utils.MarshalOrPanic(cd)
   747  	rwsetBuilder = rwsetutil.NewRWSetBuilder()
   748  	rwsetBuilder.AddToWriteSet("lscc", ccname, cdbytes)
   749  	rwsetBuilder.AddToWriteSet("bogusbogus", "key", []byte("val"))
   750  	rwset = rwsetBuilder.GetTxReadWriteSet()
   751  	res, err = rwset.ToProtoBytes()
   752  	assert.NoError(t, err)
   753  
   754  	tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
   755  	if err != nil {
   756  		t.Fatalf("createTx returned err %s", err)
   757  	}
   758  
   759  	envBytes, err = utils.GetBytesEnvelope(tx)
   760  	if err != nil {
   761  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   762  	}
   763  
   764  	policy, err = getSignedByMSPMemberPolicy(mspid)
   765  	if err != nil {
   766  		t.Fatalf("failed getting policy, err %s", err)
   767  	}
   768  
   769  	args = [][]byte{[]byte("dv"), envBytes, policy}
   770  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   771  		t.Fatalf("vscc invoke should have failed")
   772  	}
   773  }
   774  
   775  func TestAlreadyDeployed(t *testing.T) {
   776  	v := new(ValidatorOneValidSignature)
   777  	stub := shim.NewMockStub("validatoronevalidsignature", v)
   778  
   779  	lccc := new(lscc.LifeCycleSysCC)
   780  	stublccc := shim.NewMockStub("lscc", lccc)
   781  
   782  	State := make(map[string]map[string][]byte)
   783  	State["lscc"] = stublccc.State
   784  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
   785  	stub.MockPeerChaincode("lscc", stublccc)
   786  
   787  	r1 := stub.MockInit("1", [][]byte{})
   788  	if r1.Status != shim.OK {
   789  		fmt.Println("Init failed", string(r1.Message))
   790  		t.FailNow()
   791  	}
   792  
   793  	r := stublccc.MockInit("1", [][]byte{})
   794  	if r.Status != shim.OK {
   795  		fmt.Println("Init failed", string(r.Message))
   796  		t.FailNow()
   797  	}
   798  
   799  	ccname := "mycc"
   800  	ccver := "1"
   801  	path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"
   802  
   803  	ppath := lccctestpath + "/" + ccname + "." + ccver
   804  
   805  	os.Remove(ppath)
   806  
   807  	cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, true)
   808  	if err != nil {
   809  		fmt.Printf("%s\n", err)
   810  		t.FailNow()
   811  	}
   812  	defer os.Remove(ppath)
   813  	var b []byte
   814  	if b, err = proto.Marshal(cds); err != nil || b == nil {
   815  		t.FailNow()
   816  	}
   817  
   818  	sProp2, _ := utils.MockSignedEndorserProposal2OrPanic(chainId, &peer.ChaincodeSpec{}, id)
   819  	args := [][]byte{[]byte("deploy"), []byte(ccname), b}
   820  	if res := stublccc.MockInvokeWithSignedProposal("1", args, sProp2); res.Status != shim.OK {
   821  		fmt.Printf("%#v\n", res)
   822  		t.FailNow()
   823  	}
   824  
   825  	simresres, err := createCCDataRWset(ccname, ccname, ccver, nil)
   826  	assert.NoError(t, err)
   827  
   828  	tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, simresres)
   829  	if err != nil {
   830  		t.Fatalf("createTx returned err %s", err)
   831  	}
   832  
   833  	envBytes, err := utils.GetBytesEnvelope(tx)
   834  	if err != nil {
   835  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   836  	}
   837  
   838  	// good path: signed by the right MSP
   839  	policy, err := getSignedByMSPMemberPolicy(mspid)
   840  	if err != nil {
   841  		t.Fatalf("failed getting policy, err %s", err)
   842  	}
   843  
   844  	args = [][]byte{[]byte("dv"), envBytes, policy}
   845  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   846  		t.Fatalf("vscc invocation should have failed")
   847  	}
   848  }
   849  
   850  func TestValidateDeployNoLedger(t *testing.T) {
   851  	v := new(ValidatorOneValidSignature)
   852  	stub := shim.NewMockStub("validatoronevalidsignature", v)
   853  
   854  	lccc := new(lscc.LifeCycleSysCC)
   855  	stublccc := shim.NewMockStub("lscc", lccc)
   856  
   857  	State := make(map[string]map[string][]byte)
   858  	State["lscc"] = stublccc.State
   859  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{QErr: fmt.Errorf("Simulated error")})
   860  	stub.MockPeerChaincode("lscc", stublccc)
   861  
   862  	r1 := stub.MockInit("1", [][]byte{})
   863  	if r1.Status != shim.OK {
   864  		fmt.Println("Init failed", string(r1.Message))
   865  		t.FailNow()
   866  	}
   867  
   868  	r := stublccc.MockInit("1", [][]byte{})
   869  	if r.Status != shim.OK {
   870  		fmt.Println("Init failed", string(r.Message))
   871  		t.FailNow()
   872  	}
   873  
   874  	ccname := "mycc"
   875  	ccver := "1"
   876  
   877  	defaultPolicy, err := getSignedByMSPAdminPolicy(mspid)
   878  	assert.NoError(t, err)
   879  	res, err := createCCDataRWset(ccname, ccname, ccver, defaultPolicy)
   880  	assert.NoError(t, err)
   881  
   882  	tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
   883  	if err != nil {
   884  		t.Fatalf("createTx returned err %s", err)
   885  	}
   886  
   887  	envBytes, err := utils.GetBytesEnvelope(tx)
   888  	if err != nil {
   889  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   890  	}
   891  
   892  	// good path: signed by the right MSP
   893  	policy, err := getSignedByMSPMemberPolicy(mspid)
   894  	if err != nil {
   895  		t.Fatalf("failed getting policy, err %s", err)
   896  	}
   897  
   898  	args := [][]byte{[]byte("dv"), envBytes, policy}
   899  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
   900  		t.Fatalf("vscc invoke should have failed")
   901  	}
   902  }
   903  
   904  func TestValidateDeployOK(t *testing.T) {
   905  	v := new(ValidatorOneValidSignature)
   906  	stub := shim.NewMockStub("validatoronevalidsignature", v)
   907  
   908  	lccc := new(lscc.LifeCycleSysCC)
   909  	stublccc := shim.NewMockStub("lscc", lccc)
   910  
   911  	State := make(map[string]map[string][]byte)
   912  	State["lscc"] = stublccc.State
   913  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
   914  	stub.MockPeerChaincode("lscc", stublccc)
   915  
   916  	r1 := stub.MockInit("1", [][]byte{})
   917  	if r1.Status != shim.OK {
   918  		fmt.Println("Init failed", string(r1.Message))
   919  		t.FailNow()
   920  	}
   921  
   922  	r := stublccc.MockInit("1", [][]byte{})
   923  	if r.Status != shim.OK {
   924  		fmt.Println("Init failed", string(r.Message))
   925  		t.FailNow()
   926  	}
   927  
   928  	ccname := "mycc"
   929  	ccver := "1"
   930  
   931  	defaultPolicy, err := getSignedByMSPAdminPolicy(mspid)
   932  	assert.NoError(t, err)
   933  	res, err := createCCDataRWset(ccname, ccname, ccver, defaultPolicy)
   934  	assert.NoError(t, err)
   935  
   936  	tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
   937  	if err != nil {
   938  		t.Fatalf("createTx returned err %s", err)
   939  	}
   940  
   941  	envBytes, err := utils.GetBytesEnvelope(tx)
   942  	if err != nil {
   943  		t.Fatalf("GetBytesEnvelope returned err %s", err)
   944  	}
   945  
   946  	// good path: signed by the right MSP
   947  	policy, err := getSignedByMSPMemberPolicy(mspid)
   948  	if err != nil {
   949  		t.Fatalf("failed getting policy, err %s", err)
   950  	}
   951  
   952  	args := [][]byte{[]byte("dv"), envBytes, policy}
   953  	if res := stub.MockInvoke("1", args); res.Status != shim.OK {
   954  		t.Fatalf("vscc invoke returned err %s", res.Message)
   955  	}
   956  }
   957  
   958  func TestValidateDeployWithPolicies(t *testing.T) {
   959  	v := new(ValidatorOneValidSignature)
   960  	stub := shim.NewMockStub("validatoronevalidsignature", v)
   961  
   962  	lccc := new(lscc.LifeCycleSysCC)
   963  	stublccc := shim.NewMockStub("lscc", lccc)
   964  
   965  	State := make(map[string]map[string][]byte)
   966  	State["lscc"] = stublccc.State
   967  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
   968  	stub.MockPeerChaincode("lscc", stublccc)
   969  
   970  	r1 := stub.MockInit("1", [][]byte{})
   971  	if r1.Status != shim.OK {
   972  		fmt.Println("Init failed", string(r1.Message))
   973  		t.FailNow()
   974  	}
   975  
   976  	r := stublccc.MockInit("1", [][]byte{})
   977  	if r.Status != shim.OK {
   978  		fmt.Println("Init failed", string(r.Message))
   979  		t.FailNow()
   980  	}
   981  
   982  	ccname := "mycc"
   983  	ccver := "1"
   984  
   985  	/*********************************************/
   986  	/* test 1: success with an accept-all policy */
   987  	/*********************************************/
   988  
   989  	res, err := createCCDataRWset(ccname, ccname, ccver, cauthdsl.MarshaledAcceptAllPolicy)
   990  	assert.NoError(t, err)
   991  
   992  	tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
   993  	if err != nil {
   994  		t.Fatalf("createTx returned err %s", err)
   995  	}
   996  
   997  	envBytes, err := utils.GetBytesEnvelope(tx)
   998  	if err != nil {
   999  		t.Fatalf("GetBytesEnvelope returned err %s", err)
  1000  	}
  1001  
  1002  	// good path: signed by the right MSP
  1003  	policy, err := getSignedByMSPMemberPolicy(mspid)
  1004  	if err != nil {
  1005  		t.Fatalf("failed getting policy, err %s", err)
  1006  	}
  1007  
  1008  	args := [][]byte{[]byte("dv"), envBytes, policy}
  1009  	if res := stub.MockInvoke("1", args); res.Status != shim.OK {
  1010  		t.Fatalf("vscc invoke returned err %s", res.Message)
  1011  	}
  1012  
  1013  	/********************************************/
  1014  	/* test 2: failure with a reject-all policy */
  1015  	/********************************************/
  1016  
  1017  	res, err = createCCDataRWset(ccname, ccname, ccver, cauthdsl.MarshaledRejectAllPolicy)
  1018  	assert.NoError(t, err)
  1019  
  1020  	tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
  1021  	if err != nil {
  1022  		t.Fatalf("createTx returned err %s", err)
  1023  	}
  1024  
  1025  	envBytes, err = utils.GetBytesEnvelope(tx)
  1026  	if err != nil {
  1027  		t.Fatalf("GetBytesEnvelope returned err %s", err)
  1028  	}
  1029  
  1030  	// good path: signed by the right MSP
  1031  	policy, err = getSignedByMSPMemberPolicy(mspid)
  1032  	if err != nil {
  1033  		t.Fatalf("failed getting policy, err %s", err)
  1034  	}
  1035  
  1036  	args = [][]byte{[]byte("dv"), envBytes, policy}
  1037  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
  1038  		t.Fatalf("vscc invoke should have failed")
  1039  	}
  1040  }
  1041  
  1042  func TestInvalidUpgrade(t *testing.T) {
  1043  	v := new(ValidatorOneValidSignature)
  1044  	stub := shim.NewMockStub("validatoronevalidsignature", v)
  1045  
  1046  	lccc := new(lscc.LifeCycleSysCC)
  1047  	stublccc := shim.NewMockStub("lscc", lccc)
  1048  
  1049  	State := make(map[string]map[string][]byte)
  1050  	State["lscc"] = stublccc.State
  1051  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
  1052  	stub.MockPeerChaincode("lscc", stublccc)
  1053  
  1054  	r1 := stub.MockInit("1", [][]byte{})
  1055  	if r1.Status != shim.OK {
  1056  		fmt.Println("Init failed", string(r1.Message))
  1057  		t.FailNow()
  1058  	}
  1059  
  1060  	r := stublccc.MockInit("1", [][]byte{})
  1061  	if r.Status != shim.OK {
  1062  		fmt.Println("Init failed", string(r.Message))
  1063  		t.FailNow()
  1064  	}
  1065  
  1066  	ccname := "mycc"
  1067  	ccver := "2"
  1068  
  1069  	simresres, err := createCCDataRWset(ccname, ccname, ccver, nil)
  1070  	assert.NoError(t, err)
  1071  
  1072  	tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres)
  1073  	if err != nil {
  1074  		t.Fatalf("createTx returned err %s", err)
  1075  	}
  1076  
  1077  	envBytes, err := utils.GetBytesEnvelope(tx)
  1078  	if err != nil {
  1079  		t.Fatalf("GetBytesEnvelope returned err %s", err)
  1080  	}
  1081  
  1082  	// good path: signed by the right MSP
  1083  	policy, err := getSignedByMSPMemberPolicy(mspid)
  1084  	if err != nil {
  1085  		t.Fatalf("failed getting policy, err %s", err)
  1086  	}
  1087  
  1088  	args := [][]byte{[]byte("dv"), envBytes, policy}
  1089  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
  1090  		t.Fatalf("vscc invocation should have failed")
  1091  	}
  1092  }
  1093  
  1094  func TestValidateUpgradeOK(t *testing.T) {
  1095  	v := new(ValidatorOneValidSignature)
  1096  	stub := shim.NewMockStub("validatoronevalidsignature", v)
  1097  
  1098  	lccc := new(lscc.LifeCycleSysCC)
  1099  	stublccc := shim.NewMockStub("lscc", lccc)
  1100  
  1101  	State := make(map[string]map[string][]byte)
  1102  	State["lscc"] = stublccc.State
  1103  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
  1104  	stub.MockPeerChaincode("lscc", stublccc)
  1105  
  1106  	r1 := stub.MockInit("1", [][]byte{})
  1107  	if r1.Status != shim.OK {
  1108  		fmt.Println("Init failed", string(r1.Message))
  1109  		t.FailNow()
  1110  	}
  1111  
  1112  	r := stublccc.MockInit("1", [][]byte{})
  1113  	if r.Status != shim.OK {
  1114  		fmt.Println("Init failed", string(r.Message))
  1115  		t.FailNow()
  1116  	}
  1117  
  1118  	ccname := "mycc"
  1119  	ccver := "1"
  1120  	path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"
  1121  
  1122  	ppath := lccctestpath + "/" + ccname + "." + ccver
  1123  
  1124  	os.Remove(ppath)
  1125  
  1126  	cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, true)
  1127  	if err != nil {
  1128  		fmt.Printf("%s\n", err)
  1129  		t.FailNow()
  1130  	}
  1131  	defer os.Remove(ppath)
  1132  	var b []byte
  1133  	if b, err = proto.Marshal(cds); err != nil || b == nil {
  1134  		t.FailNow()
  1135  	}
  1136  
  1137  	sProp2, _ := utils.MockSignedEndorserProposal2OrPanic(chainId, &peer.ChaincodeSpec{}, id)
  1138  	args := [][]byte{[]byte("deploy"), []byte(ccname), b}
  1139  	if res := stublccc.MockInvokeWithSignedProposal("1", args, sProp2); res.Status != shim.OK {
  1140  		fmt.Printf("%#v\n", res)
  1141  		t.FailNow()
  1142  	}
  1143  
  1144  	ccver = "2"
  1145  
  1146  	simresres, err := createCCDataRWset(ccname, ccname, ccver, nil)
  1147  	assert.NoError(t, err)
  1148  
  1149  	tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres)
  1150  	if err != nil {
  1151  		t.Fatalf("createTx returned err %s", err)
  1152  	}
  1153  
  1154  	envBytes, err := utils.GetBytesEnvelope(tx)
  1155  	if err != nil {
  1156  		t.Fatalf("GetBytesEnvelope returned err %s", err)
  1157  	}
  1158  
  1159  	// good path: signed by the right MSP
  1160  	policy, err := getSignedByMSPMemberPolicy(mspid)
  1161  	if err != nil {
  1162  		t.Fatalf("failed getting policy, err %s", err)
  1163  	}
  1164  
  1165  	args = [][]byte{[]byte("dv"), envBytes, policy}
  1166  	if res := stub.MockInvoke("1", args); res.Status != shim.OK {
  1167  		t.Fatalf("vscc invoke returned err %s", res.Message)
  1168  	}
  1169  }
  1170  
  1171  func TestInvalidateUpgradeBadVersion(t *testing.T) {
  1172  	v := new(ValidatorOneValidSignature)
  1173  	stub := shim.NewMockStub("validatoronevalidsignature", v)
  1174  
  1175  	lccc := new(lscc.LifeCycleSysCC)
  1176  	stublccc := shim.NewMockStub("lscc", lccc)
  1177  
  1178  	State := make(map[string]map[string][]byte)
  1179  	State["lscc"] = stublccc.State
  1180  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
  1181  	stub.MockPeerChaincode("lscc", stublccc)
  1182  
  1183  	r1 := stub.MockInit("1", [][]byte{})
  1184  	if r1.Status != shim.OK {
  1185  		fmt.Println("Init failed", string(r1.Message))
  1186  		t.FailNow()
  1187  	}
  1188  
  1189  	r := stublccc.MockInit("1", [][]byte{})
  1190  	if r.Status != shim.OK {
  1191  		fmt.Println("Init failed", string(r.Message))
  1192  		t.FailNow()
  1193  	}
  1194  
  1195  	ccname := "mycc"
  1196  	ccver := "1"
  1197  	path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"
  1198  
  1199  	ppath := lccctestpath + "/" + ccname + "." + ccver
  1200  
  1201  	os.Remove(ppath)
  1202  
  1203  	cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, true)
  1204  	if err != nil {
  1205  		fmt.Printf("%s\n", err)
  1206  		t.FailNow()
  1207  	}
  1208  	defer os.Remove(ppath)
  1209  	var b []byte
  1210  	if b, err = proto.Marshal(cds); err != nil || b == nil {
  1211  		t.FailNow()
  1212  	}
  1213  
  1214  	sProp2, _ := utils.MockSignedEndorserProposal2OrPanic(chainId, &peer.ChaincodeSpec{}, id)
  1215  	args := [][]byte{[]byte("deploy"), []byte(ccname), b}
  1216  	if res := stublccc.MockInvokeWithSignedProposal("1", args, sProp2); res.Status != shim.OK {
  1217  		fmt.Printf("%#v\n", res)
  1218  		t.FailNow()
  1219  	}
  1220  
  1221  	simresres, err := createCCDataRWset(ccname, ccname, ccver, nil)
  1222  	assert.NoError(t, err)
  1223  
  1224  	tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres)
  1225  	if err != nil {
  1226  		t.Fatalf("createTx returned err %s", err)
  1227  	}
  1228  
  1229  	envBytes, err := utils.GetBytesEnvelope(tx)
  1230  	if err != nil {
  1231  		t.Fatalf("GetBytesEnvelope returned err %s", err)
  1232  	}
  1233  
  1234  	// good path: signed by the right MSP
  1235  	policy, err := getSignedByMSPMemberPolicy(mspid)
  1236  	if err != nil {
  1237  		t.Fatalf("failed getting policy, err %s", err)
  1238  	}
  1239  
  1240  	args = [][]byte{[]byte("dv"), envBytes, policy}
  1241  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
  1242  		t.Fatalf("vscc invoke should have failed")
  1243  	}
  1244  }
  1245  
  1246  func TestValidateUpgradeWithPoliciesOK(t *testing.T) {
  1247  	v := new(ValidatorOneValidSignature)
  1248  	stub := shim.NewMockStub("validatoronevalidsignature", v)
  1249  
  1250  	lccc := new(lscc.LifeCycleSysCC)
  1251  	stublccc := shim.NewMockStub("lscc", lccc)
  1252  
  1253  	State := make(map[string]map[string][]byte)
  1254  	State["lscc"] = stublccc.State
  1255  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
  1256  	stub.MockPeerChaincode("lscc", stublccc)
  1257  
  1258  	r1 := stub.MockInit("1", [][]byte{})
  1259  	if r1.Status != shim.OK {
  1260  		fmt.Println("Init failed", string(r1.Message))
  1261  		t.FailNow()
  1262  	}
  1263  
  1264  	r := stublccc.MockInit("1", [][]byte{})
  1265  	if r.Status != shim.OK {
  1266  		fmt.Println("Init failed", string(r.Message))
  1267  		t.FailNow()
  1268  	}
  1269  
  1270  	ccname := "mycc"
  1271  	ccver := "1"
  1272  	path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"
  1273  
  1274  	ppath := lccctestpath + "/" + ccname + "." + ccver
  1275  
  1276  	os.Remove(ppath)
  1277  
  1278  	cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, false)
  1279  	if err != nil {
  1280  		fmt.Printf("%s\n", err)
  1281  		t.FailNow()
  1282  	}
  1283  	_, err = processSignedCDS(cds, cauthdsl.AcceptAllPolicy)
  1284  	assert.NoError(t, err)
  1285  	defer os.Remove(ppath)
  1286  	var b []byte
  1287  	if b, err = proto.Marshal(cds); err != nil || b == nil {
  1288  		t.FailNow()
  1289  	}
  1290  
  1291  	sProp2, _ := utils.MockSignedEndorserProposal2OrPanic(chainId, &peer.ChaincodeSpec{}, id)
  1292  	args := [][]byte{[]byte("deploy"), []byte(ccname), b}
  1293  	if res := stublccc.MockInvokeWithSignedProposal("1", args, sProp2); res.Status != shim.OK {
  1294  		fmt.Printf("%#v\n", res)
  1295  		t.FailNow()
  1296  	}
  1297  
  1298  	ccver = "2"
  1299  
  1300  	simresres, err := createCCDataRWset(ccname, ccname, ccver, nil)
  1301  	assert.NoError(t, err)
  1302  
  1303  	tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres)
  1304  	if err != nil {
  1305  		t.Fatalf("createTx returned err %s", err)
  1306  	}
  1307  
  1308  	envBytes, err := utils.GetBytesEnvelope(tx)
  1309  	if err != nil {
  1310  		t.Fatalf("GetBytesEnvelope returned err %s", err)
  1311  	}
  1312  
  1313  	// good path: signed by the right MSP
  1314  	policy, err := getSignedByMSPMemberPolicy(mspid)
  1315  	if err != nil {
  1316  		t.Fatalf("failed getting policy, err %s", err)
  1317  	}
  1318  
  1319  	args = [][]byte{[]byte("dv"), envBytes, policy}
  1320  	if res := stub.MockInvoke("1", args); res.Status != shim.OK {
  1321  		t.Fatalf("vscc invoke returned err %s", res.Message)
  1322  	}
  1323  }
  1324  
  1325  func TestValidateUpgradeWithPoliciesFail(t *testing.T) {
  1326  	v := new(ValidatorOneValidSignature)
  1327  	stub := shim.NewMockStub("validatoronevalidsignature", v)
  1328  
  1329  	lccc := new(lscc.LifeCycleSysCC)
  1330  	stublccc := shim.NewMockStub("lscc", lccc)
  1331  
  1332  	State := make(map[string]map[string][]byte)
  1333  	State["lscc"] = stublccc.State
  1334  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{Qe: lm.NewMockQueryExecutor(State)})
  1335  	stub.MockPeerChaincode("lscc", stublccc)
  1336  
  1337  	r1 := stub.MockInit("1", [][]byte{})
  1338  	if r1.Status != shim.OK {
  1339  		fmt.Println("Init failed", string(r1.Message))
  1340  		t.FailNow()
  1341  	}
  1342  
  1343  	r := stublccc.MockInit("1", [][]byte{})
  1344  	if r.Status != shim.OK {
  1345  		fmt.Println("Init failed", string(r.Message))
  1346  		t.FailNow()
  1347  	}
  1348  
  1349  	ccname := "mycc"
  1350  	ccver := "1"
  1351  	path := "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"
  1352  
  1353  	ppath := lccctestpath + "/" + ccname + "." + ccver
  1354  
  1355  	os.Remove(ppath)
  1356  
  1357  	cds, err := constructDeploymentSpec(ccname, path, ccver, [][]byte{[]byte("init"), []byte("a"), []byte("100"), []byte("b"), []byte("200")}, false)
  1358  	if err != nil {
  1359  		fmt.Printf("%s\n", err)
  1360  		t.FailNow()
  1361  	}
  1362  	cdbytes, err := processSignedCDS(cds, cauthdsl.RejectAllPolicy)
  1363  	assert.NoError(t, err)
  1364  	defer os.Remove(ppath)
  1365  	var b []byte
  1366  	if b, err = proto.Marshal(cds); err != nil || b == nil {
  1367  		t.FailNow()
  1368  	}
  1369  
  1370  	// Simulate the lscc invocation whilst skipping the policy validation,
  1371  	// otherwise we wouldn't be able to deply a chaincode with a reject all policy
  1372  	stublccc.MockTransactionStart("barf")
  1373  	err = stublccc.PutState(ccname, cdbytes)
  1374  	assert.NoError(t, err)
  1375  	stublccc.MockTransactionEnd("barf")
  1376  
  1377  	ccver = "2"
  1378  
  1379  	simresres, err := createCCDataRWset(ccname, ccname, ccver, nil)
  1380  	assert.NoError(t, err)
  1381  
  1382  	tx, err := createLSCCTx(ccname, ccver, lscc.UPGRADE, simresres)
  1383  	if err != nil {
  1384  		t.Fatalf("createTx returned err %s", err)
  1385  	}
  1386  
  1387  	envBytes, err := utils.GetBytesEnvelope(tx)
  1388  	if err != nil {
  1389  		t.Fatalf("GetBytesEnvelope returned err %s", err)
  1390  	}
  1391  
  1392  	// good path: signed by the right MSP
  1393  	policy, err := getSignedByMSPMemberPolicy(mspid)
  1394  	if err != nil {
  1395  		t.Fatalf("failed getting policy, err %s", err)
  1396  	}
  1397  
  1398  	args := [][]byte{[]byte("dv"), envBytes, policy}
  1399  	if res := stub.MockInvoke("1", args); res.Status == shim.OK {
  1400  		t.Fatalf("vscc invocation should have failed")
  1401  	}
  1402  }
  1403  
  1404  var id msp.SigningIdentity
  1405  var sid []byte
  1406  var mspid string
  1407  var chainId string = util.GetTestChainID()
  1408  
  1409  type mockPolicyCheckerFactory struct {
  1410  }
  1411  
  1412  func (c *mockPolicyCheckerFactory) NewPolicyChecker() policy.PolicyChecker {
  1413  	return &mockPolicyChecker{}
  1414  }
  1415  
  1416  type mockPolicyChecker struct {
  1417  }
  1418  
  1419  func (c *mockPolicyChecker) CheckPolicy(channelID, policyName string, signedProp *peer.SignedProposal) error {
  1420  	return nil
  1421  }
  1422  
  1423  func (c *mockPolicyChecker) CheckPolicyBySignedData(channelID, policyName string, sd []*common.SignedData) error {
  1424  	return nil
  1425  }
  1426  
  1427  func (c *mockPolicyChecker) CheckPolicyNoChannel(policyName string, signedProp *peer.SignedProposal) error {
  1428  	return nil
  1429  }
  1430  
  1431  var lccctestpath = "/tmp/lscc-validation-test"
  1432  
  1433  func TestMain(m *testing.M) {
  1434  	ccprovider.SetChaincodesPath(lccctestpath)
  1435  	sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{})
  1436  	policy.RegisterPolicyCheckerFactory(&mockPolicyCheckerFactory{})
  1437  
  1438  	mspGetter := func(cid string) []string {
  1439  		return []string{"DEFAULT"}
  1440  	}
  1441  
  1442  	per.MockSetMSPIDGetter(mspGetter)
  1443  
  1444  	var err error
  1445  
  1446  	// setup the MSP manager so that we can sign/verify
  1447  	msptesttools.LoadMSPSetupForTesting()
  1448  
  1449  	id, err = mspmgmt.GetLocalMSP().GetDefaultSigningIdentity()
  1450  	if err != nil {
  1451  		fmt.Printf("GetSigningIdentity failed with err %s", err)
  1452  		os.Exit(-1)
  1453  	}
  1454  
  1455  	sid, err = id.Serialize()
  1456  	if err != nil {
  1457  		fmt.Printf("Serialize failed with err %s", err)
  1458  		os.Exit(-1)
  1459  	}
  1460  
  1461  	// determine the MSP identifier for the first MSP in the default chain
  1462  	var msp msp.MSP
  1463  	mspMgr := mspmgmt.GetManagerForChain(chainId)
  1464  	msps, err := mspMgr.GetMSPs()
  1465  	if err != nil {
  1466  		fmt.Printf("Could not retrieve the MSPs for the chain manager, err %s", err)
  1467  		os.Exit(-1)
  1468  	}
  1469  	if len(msps) == 0 {
  1470  		fmt.Printf("At least one MSP was expected")
  1471  		os.Exit(-1)
  1472  	}
  1473  	for _, m := range msps {
  1474  		msp = m
  1475  		break
  1476  	}
  1477  	mspid, err = msp.GetIdentifier()
  1478  	if err != nil {
  1479  		fmt.Printf("Failure getting the msp identifier, err %s", err)
  1480  		os.Exit(-1)
  1481  	}
  1482  
  1483  	// also set the MSP for the "test" chain
  1484  	mspmgmt.XXXSetMSPManager("mycc", mspmgmt.GetManagerForChain(util.GetTestChainID()))
  1485  
  1486  	os.Exit(m.Run())
  1487  }