Skip to content

Commit 420a6a5

Browse files
ale-linuxyacovm
authored andcommitted
[FAB-3561] Increase test coverage for VSCC
Output of test coverage for core/scc/vscc now is coverage: 85.1% of statements ok github.com/hyperledger/fabric/core/scc/vscc 0.078s Change-Id: Ic2882cfccdee02f0b3f680585097d4ea26b69099 Signed-off-by: Alessandro Sorniotti <[email protected]>
1 parent 3d169cc commit 420a6a5

File tree

3 files changed

+227
-25
lines changed

3 files changed

+227
-25
lines changed

common/mocks/scc/sccprovider.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,17 @@ import (
2323
)
2424

2525
type MocksccProviderFactory struct {
26-
Qe *lm.MockQueryExecutor
26+
Qe *lm.MockQueryExecutor
27+
QErr error
2728
}
2829

2930
func (c *MocksccProviderFactory) NewSystemChaincodeProvider() sysccprovider.SystemChaincodeProvider {
30-
return &mocksccProviderImpl{Qe: c.Qe}
31+
return &mocksccProviderImpl{Qe: c.Qe, QErr: c.QErr}
3132
}
3233

3334
type mocksccProviderImpl struct {
34-
Qe *lm.MockQueryExecutor
35+
Qe *lm.MockQueryExecutor
36+
QErr error
3537
}
3638

3739
func (c *mocksccProviderImpl) IsSysCC(name string) bool {
@@ -47,5 +49,5 @@ func (c *mocksccProviderImpl) IsSysCCAndNotInvokableExternal(name string) bool {
4749
}
4850

4951
func (c *mocksccProviderImpl) GetQueryExecutorForLedger(cid string) (ledger.QueryExecutor, error) {
50-
return c.Qe, nil
52+
return c.Qe, c.QErr
5153
}

core/scc/vscc/validator_onevalidsignature.go

+5-12
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ func (vscc *ValidatorOneValidSignature) Invoke(stub shim.ChaincodeStubInterface)
168168
if hdrExt.ChaincodeId.Name == "lscc" {
169169
logger.Debugf("VSCC info: doing special validation for LSCC")
170170

171-
err = vscc.ValidateLSCCInvocation(stub, chdr.ChannelId, env, cap)
171+
err = vscc.ValidateLSCCInvocation(stub, chdr.ChannelId, env, cap, payl)
172172
if err != nil {
173173
logger.Errorf("VSCC error: ValidateLSCCInvocation failed, err %s", err)
174174
return shim.Error(err.Error())
@@ -182,7 +182,7 @@ func (vscc *ValidatorOneValidSignature) Invoke(stub shim.ChaincodeStubInterface)
182182
}
183183

184184
// checkInstantiationPolicy evaluates an instantiation policy against a signed proposal
185-
func (vscc *ValidatorOneValidSignature) checkInstantiationPolicy(chainName string, env *common.Envelope, instantiationPolicy []byte) error {
185+
func (vscc *ValidatorOneValidSignature) checkInstantiationPolicy(chainName string, env *common.Envelope, instantiationPolicy []byte, payl *common.Payload) error {
186186
// create a policy object from the policy bytes
187187
mgr := mspmgmt.GetManagerForChain(chainName)
188188
if mgr == nil {
@@ -197,13 +197,6 @@ func (vscc *ValidatorOneValidSignature) checkInstantiationPolicy(chainName strin
197197

198198
logger.Debugf("VSCC info: checkInstantiationPolicy starts, policy is %#v", instPol)
199199

200-
// get the payload
201-
payl, err := utils.GetPayload(env)
202-
if err != nil {
203-
logger.Errorf("VSCC error: GetPayload failed, err %s", err)
204-
return err
205-
}
206-
207200
// get the signature header
208201
shdr, err := utils.GetSignatureHeader(payl.Header.SignatureHeader)
209202
if err != nil {
@@ -223,7 +216,7 @@ func (vscc *ValidatorOneValidSignature) checkInstantiationPolicy(chainName strin
223216
return nil
224217
}
225218

226-
func (vscc *ValidatorOneValidSignature) ValidateLSCCInvocation(stub shim.ChaincodeStubInterface, chid string, env *common.Envelope, cap *pb.ChaincodeActionPayload) error {
219+
func (vscc *ValidatorOneValidSignature) ValidateLSCCInvocation(stub shim.ChaincodeStubInterface, chid string, env *common.Envelope, cap *pb.ChaincodeActionPayload, payl *common.Payload) error {
227220
cpp, err := utils.GetChaincodeProposalPayload(cap.ChaincodeProposalPayload)
228221
if err != nil {
229222
logger.Errorf("VSCC error: GetChaincodeProposalPayload failed, err %s", err)
@@ -352,7 +345,7 @@ func (vscc *ValidatorOneValidSignature) ValidateLSCCInvocation(stub shim.Chainco
352345
// here is the same as the one on disk?
353346
// PROS: we prevent attacks where the policy is replaced
354347
// CONS: this would be a point of non-determinism
355-
err = vscc.checkInstantiationPolicy(chid, env, pol)
348+
err = vscc.checkInstantiationPolicy(chid, env, pol, payl)
356349
if err != nil {
357350
return err
358351
}
@@ -384,7 +377,7 @@ func (vscc *ValidatorOneValidSignature) ValidateLSCCInvocation(stub shim.Chainco
384377
// here is the same as the one on disk?
385378
// PROS: we prevent attacks where the policy is replaced
386379
// CONS: this would be a point of non-determinism
387-
err = vscc.checkInstantiationPolicy(chid, env, pol)
380+
err = vscc.checkInstantiationPolicy(chid, env, pol, payl)
388381
if err != nil {
389382
return err
390383
}

core/scc/vscc/validator_onevalidsignature_test.go

+216-9
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ func createCCDataRWset(nameK, nameV, version string, policy []byte) ([]byte, err
136136
}
137137

138138
func createLSCCTx(ccname, ccver, f string, res []byte) (*common.Envelope, error) {
139+
return createLSCCTxPutCds(ccname, ccver, f, res, nil, true)
140+
}
141+
142+
func createLSCCTxPutCds(ccname, ccver, f string, res, cdsbytes []byte, putcds bool) (*common.Envelope, error) {
139143
cds := &peer.ChaincodeDeploymentSpec{
140144
ChaincodeSpec: &peer.ChaincodeSpec{
141145
ChaincodeId: &peer.ChaincodeID{
@@ -151,14 +155,30 @@ func createLSCCTx(ccname, ccver, f string, res []byte) (*common.Envelope, error)
151155
return nil, err
152156
}
153157

154-
cis := &peer.ChaincodeInvocationSpec{
155-
ChaincodeSpec: &peer.ChaincodeSpec{
156-
ChaincodeId: &peer.ChaincodeID{Name: "lscc"},
157-
Input: &peer.ChaincodeInput{
158-
Args: [][]byte{[]byte(f), []byte("barf"), cdsBytes},
158+
var cis *peer.ChaincodeInvocationSpec
159+
if putcds {
160+
if cdsbytes != nil {
161+
cdsBytes = cdsbytes
162+
}
163+
cis = &peer.ChaincodeInvocationSpec{
164+
ChaincodeSpec: &peer.ChaincodeSpec{
165+
ChaincodeId: &peer.ChaincodeID{Name: "lscc"},
166+
Input: &peer.ChaincodeInput{
167+
Args: [][]byte{[]byte(f), []byte("barf"), cdsBytes},
168+
},
169+
Type: peer.ChaincodeSpec_GOLANG,
159170
},
160-
Type: peer.ChaincodeSpec_GOLANG,
161-
},
171+
}
172+
} else {
173+
cis = &peer.ChaincodeInvocationSpec{
174+
ChaincodeSpec: &peer.ChaincodeSpec{
175+
ChaincodeId: &peer.ChaincodeID{Name: "lscc"},
176+
Input: &peer.ChaincodeInput{
177+
Args: [][]byte{[]byte(f), []byte("barf")},
178+
},
179+
Type: peer.ChaincodeSpec_GOLANG,
180+
},
181+
}
162182
}
163183

164184
prop, _, err := utils.CreateProposalFromCIS(common.HeaderType_ENDORSER_TRANSACTION, util.GetTestChainID(), cis, sid)
@@ -217,12 +237,44 @@ func TestInvoke(t *testing.T) {
217237
t.Fatalf("vscc invoke should have failed")
218238
}
219239

240+
// not enough args
220241
args = [][]byte{[]byte("dv"), []byte("tx")}
221242
args[1] = nil
222243
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
223244
t.Fatalf("vscc invoke should have failed")
224245
}
225246

247+
// nil args
248+
args = [][]byte{nil, nil, nil}
249+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
250+
t.Fatalf("vscc invoke should have failed")
251+
}
252+
253+
// nil args
254+
args = [][]byte{[]byte("a"), []byte("a"), nil}
255+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
256+
t.Fatalf("vscc invoke should have failed")
257+
}
258+
259+
// broken Envelope
260+
args = [][]byte{[]byte("a"), []byte("a"), []byte("a")}
261+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
262+
t.Fatalf("vscc invoke should have failed")
263+
}
264+
265+
// (still) broken Envelope
266+
args = [][]byte{[]byte("a"), utils.MarshalOrPanic(&common.Envelope{Payload: []byte("barf")}), []byte("a")}
267+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
268+
t.Fatalf("vscc invoke should have failed")
269+
}
270+
271+
// (still) broken Envelope
272+
b := utils.MarshalOrPanic(&common.Envelope{Payload: utils.MarshalOrPanic(&common.Payload{Header: &common.Header{ChannelHeader: []byte("barf")}})})
273+
args = [][]byte{[]byte("a"), b, []byte("a")}
274+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
275+
t.Fatalf("vscc invoke should have failed")
276+
}
277+
226278
tx, _, err := createTx()
227279
if err != nil {
228280
t.Fatalf("createTx returned err %s", err)
@@ -233,12 +285,32 @@ func TestInvoke(t *testing.T) {
233285
t.Fatalf("GetBytesEnvelope returned err %s", err)
234286
}
235287

236-
// good path: signed by the right MSP
288+
// broken policy
289+
args = [][]byte{[]byte("dv"), envBytes, []byte("barf")}
290+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
291+
t.Fatalf("vscc invoke should have failed")
292+
}
293+
237294
policy, err := getSignedByMSPMemberPolicy(mspid)
238295
if err != nil {
239296
t.Fatalf("failed getting policy, err %s", err)
240297
}
241298

299+
// broken type
300+
b = utils.MarshalOrPanic(&common.Envelope{Payload: utils.MarshalOrPanic(&common.Payload{Header: &common.Header{ChannelHeader: utils.MarshalOrPanic(&common.ChannelHeader{Type: int32(common.HeaderType_ORDERER_TRANSACTION)})}})})
301+
args = [][]byte{[]byte("dv"), b, policy}
302+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
303+
t.Fatalf("vscc invoke should have failed")
304+
}
305+
306+
// broken tx payload
307+
b = utils.MarshalOrPanic(&common.Envelope{Payload: utils.MarshalOrPanic(&common.Payload{Header: &common.Header{ChannelHeader: utils.MarshalOrPanic(&common.ChannelHeader{Type: int32(common.HeaderType_ORDERER_TRANSACTION)})}})})
308+
args = [][]byte{[]byte("dv"), b, policy}
309+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
310+
t.Fatalf("vscc invoke should have failed")
311+
}
312+
313+
// good path: signed by the right MSP
242314
args = [][]byte{[]byte("dv"), envBytes, policy}
243315
res := stub.MockInvoke("1", args)
244316
if res.Status != shim.OK {
@@ -456,11 +528,67 @@ func TestValidateDeployFail(t *testing.T) {
456528
t.Fatalf("vscc invoke should have failed")
457529
}
458530

531+
/**********************/
532+
/* test bad LSCC args */
533+
/**********************/
534+
535+
res, err := createCCDataRWset(ccname, ccname, ccver, nil)
536+
assert.NoError(t, err)
537+
538+
tx, err = createLSCCTxPutCds(ccname, ccver, lscc.DEPLOY, res, nil, false)
539+
if err != nil {
540+
t.Fatalf("createTx returned err %s", err)
541+
}
542+
543+
envBytes, err = utils.GetBytesEnvelope(tx)
544+
if err != nil {
545+
t.Fatalf("GetBytesEnvelope returned err %s", err)
546+
}
547+
548+
// good path: signed by the right MSP
549+
policy, err = getSignedByMSPMemberPolicy(mspid)
550+
if err != nil {
551+
t.Fatalf("failed getting policy, err %s", err)
552+
}
553+
554+
args = [][]byte{[]byte("dv"), envBytes, policy}
555+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
556+
t.Fatalf("vscc invoke should have failed")
557+
}
558+
559+
/**********************/
560+
/* test bad LSCC args */
561+
/**********************/
562+
563+
res, err = createCCDataRWset(ccname, ccname, ccver, nil)
564+
assert.NoError(t, err)
565+
566+
tx, err = createLSCCTxPutCds(ccname, ccver, lscc.DEPLOY, res, []byte("barf"), true)
567+
if err != nil {
568+
t.Fatalf("createTx returned err %s", err)
569+
}
570+
571+
envBytes, err = utils.GetBytesEnvelope(tx)
572+
if err != nil {
573+
t.Fatalf("GetBytesEnvelope returned err %s", err)
574+
}
575+
576+
// good path: signed by the right MSP
577+
policy, err = getSignedByMSPMemberPolicy(mspid)
578+
if err != nil {
579+
t.Fatalf("failed getting policy, err %s", err)
580+
}
581+
582+
args = [][]byte{[]byte("dv"), envBytes, policy}
583+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
584+
t.Fatalf("vscc invoke should have failed")
585+
}
586+
459587
/***********************/
460588
/* test bad cc version */
461589
/***********************/
462590

463-
res, err := createCCDataRWset(ccname, ccname, ccver+".1", nil)
591+
res, err = createCCDataRWset(ccname, ccname, ccver+".1", nil)
464592
assert.NoError(t, err)
465593

466594
tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
@@ -484,6 +612,31 @@ func TestValidateDeployFail(t *testing.T) {
484612
t.Fatalf("vscc invoke should have failed")
485613
}
486614

615+
/*************/
616+
/* bad rwset */
617+
/*************/
618+
619+
tx, err = createLSCCTx(ccname, ccver, lscc.DEPLOY, []byte("barf"))
620+
if err != nil {
621+
t.Fatalf("createTx returned err %s", err)
622+
}
623+
624+
envBytes, err = utils.GetBytesEnvelope(tx)
625+
if err != nil {
626+
t.Fatalf("GetBytesEnvelope returned err %s", err)
627+
}
628+
629+
// good path: signed by the right MSP
630+
policy, err = getSignedByMSPMemberPolicy(mspid)
631+
if err != nil {
632+
t.Fatalf("failed getting policy, err %s", err)
633+
}
634+
635+
args = [][]byte{[]byte("dv"), envBytes, policy}
636+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
637+
t.Fatalf("vscc invoke should have failed")
638+
}
639+
487640
/********************/
488641
/* test bad cc name */
489642
/********************/
@@ -652,6 +805,60 @@ func TestAlreadyDeployed(t *testing.T) {
652805
}
653806
}
654807

808+
func TestValidateDeployNoLedger(t *testing.T) {
809+
v := new(ValidatorOneValidSignature)
810+
stub := shim.NewMockStub("validatoronevalidsignature", v)
811+
812+
lccc := new(lscc.LifeCycleSysCC)
813+
stublccc := shim.NewMockStub("lscc", lccc)
814+
815+
State := make(map[string]map[string][]byte)
816+
State["lscc"] = stublccc.State
817+
sysccprovider.RegisterSystemChaincodeProviderFactory(&scc.MocksccProviderFactory{QErr: fmt.Errorf("Simulated error")})
818+
stub.MockPeerChaincode("lscc", stublccc)
819+
820+
r1 := stub.MockInit("1", [][]byte{})
821+
if r1.Status != shim.OK {
822+
fmt.Println("Init failed", string(r1.Message))
823+
t.FailNow()
824+
}
825+
826+
r := stublccc.MockInit("1", [][]byte{})
827+
if r.Status != shim.OK {
828+
fmt.Println("Init failed", string(r.Message))
829+
t.FailNow()
830+
}
831+
832+
ccname := "mycc"
833+
ccver := "1"
834+
835+
defaultPolicy, err := getSignedByMSPAdminPolicy(mspid)
836+
assert.NoError(t, err)
837+
res, err := createCCDataRWset(ccname, ccname, ccver, defaultPolicy)
838+
assert.NoError(t, err)
839+
840+
tx, err := createLSCCTx(ccname, ccver, lscc.DEPLOY, res)
841+
if err != nil {
842+
t.Fatalf("createTx returned err %s", err)
843+
}
844+
845+
envBytes, err := utils.GetBytesEnvelope(tx)
846+
if err != nil {
847+
t.Fatalf("GetBytesEnvelope returned err %s", err)
848+
}
849+
850+
// good path: signed by the right MSP
851+
policy, err := getSignedByMSPMemberPolicy(mspid)
852+
if err != nil {
853+
t.Fatalf("failed getting policy, err %s", err)
854+
}
855+
856+
args := [][]byte{[]byte("dv"), envBytes, policy}
857+
if res := stub.MockInvoke("1", args); res.Status == shim.OK {
858+
t.Fatalf("vscc invoke should have failed")
859+
}
860+
}
861+
655862
func TestValidateDeployOK(t *testing.T) {
656863
v := new(ValidatorOneValidSignature)
657864
stub := shim.NewMockStub("validatoronevalidsignature", v)

0 commit comments

Comments
 (0)