github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/core/scc/samplesyscc/samplesyscc_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 samplesyscc 18 19 import ( 20 "errors" 21 "fmt" 22 "testing" 23 24 "github.com/golang/protobuf/ptypes/timestamp" 25 "github.com/hyperledger/fabric/core/chaincode/shim" 26 "github.com/hyperledger/fabric/protos/peer" 27 "github.com/stretchr/testify/assert" 28 "github.com/stretchr/testify/mock" 29 ) 30 31 func TestSampleSysCC_Init(t *testing.T) { 32 assert.Equal(t, shim.Success(nil), (&SampleSysCC{}).Init(&mockStub{})) 33 } 34 35 type testCase struct { 36 expected peer.Response 37 mockStub 38 } 39 40 func TestSampleSysCC_Invoke(t *testing.T) { 41 putvalIncorrectArgNum := &testCase{ 42 mockStub: mockStub{ 43 f: "putval", 44 args: []string{}, 45 }, 46 expected: shim.Error("need 2 args (key and a value)"), 47 } 48 49 putvalKeyNotFound := &testCase{ 50 mockStub: mockStub{ 51 f: "putval", 52 args: []string{"key", "value"}, 53 }, 54 expected: shim.Error(fmt.Sprintf("{\"Error\":\"Failed to get val for %s\"}", "key")), 55 } 56 putvalKeyNotFound.On("GetState", mock.Anything).Return(nil, errors.New("key not found")) 57 58 putvalKeyKeyFoundButPutStateFailed := &testCase{ 59 mockStub: mockStub{ 60 f: "putval", 61 args: []string{"key", "value"}, 62 }, 63 expected: shim.Error("PutState failed"), 64 } 65 putvalKeyKeyFoundButPutStateFailed.On("GetState", mock.Anything).Return([]byte{}, nil) 66 putvalKeyKeyFoundButPutStateFailed.On("PutState", mock.Anything).Return(errors.New("PutState failed")) 67 68 putvalKeyKeyFoundAndPutStateSucceeded := &testCase{ 69 mockStub: mockStub{ 70 f: "putval", 71 args: []string{"key", "value"}, 72 }, 73 expected: shim.Success(nil), 74 } 75 putvalKeyKeyFoundAndPutStateSucceeded.On("GetState", mock.Anything).Return([]byte{}, nil) 76 putvalKeyKeyFoundAndPutStateSucceeded.On("PutState", mock.Anything).Return(nil) 77 78 getvalIncorrectArgNum := &testCase{ 79 mockStub: mockStub{ 80 f: "getval", 81 args: []string{}, 82 }, 83 expected: shim.Error("Incorrect number of arguments. Expecting key to query"), 84 } 85 86 getvalGetStateFails := &testCase{ 87 mockStub: mockStub{ 88 f: "getval", 89 args: []string{"key"}, 90 }, 91 expected: shim.Error(fmt.Sprintf("{\"Error\":\"Failed to get state for %s\"}", "key")), 92 } 93 getvalGetStateFails.On("GetState", mock.Anything).Return(nil, errors.New("GetState failed")) 94 95 getvalGetStateSucceedsButNoData := &testCase{ 96 mockStub: mockStub{ 97 f: "getval", 98 args: []string{"key"}, 99 }, 100 expected: shim.Error(fmt.Sprintf("{\"Error\":\"Nil val for %s\"}", "key")), 101 } 102 var nilSlice []byte 103 getvalGetStateSucceedsButNoData.On("GetState", mock.Anything).Return(nilSlice, nil) 104 105 getvalGetStateSucceeds := &testCase{ 106 mockStub: mockStub{ 107 f: "getval", 108 args: []string{"key"}, 109 }, 110 expected: shim.Success([]byte("value")), 111 } 112 getvalGetStateSucceeds.On("GetState", mock.Anything).Return([]byte("value"), nil) 113 114 unknownFunction := &testCase{ 115 mockStub: mockStub{ 116 f: "default", 117 args: []string{}, 118 }, 119 expected: shim.Error("{\"Error\":\"Unknown function default\"}"), 120 } 121 122 for _, tc := range []*testCase{ 123 putvalIncorrectArgNum, 124 putvalKeyNotFound, 125 putvalKeyKeyFoundButPutStateFailed, 126 putvalKeyKeyFoundAndPutStateSucceeded, 127 getvalIncorrectArgNum, 128 getvalGetStateFails, 129 getvalGetStateSucceedsButNoData, 130 getvalGetStateSucceeds, 131 unknownFunction, 132 } { 133 resp := (&SampleSysCC{}).Invoke(tc) 134 assert.Equal(t, tc.expected, resp) 135 } 136 } 137 138 type mockStub struct { 139 f string 140 args []string 141 mock.Mock 142 } 143 144 func (*mockStub) GetArgs() [][]byte { 145 panic("implement me") 146 } 147 148 func (*mockStub) GetStringArgs() []string { 149 panic("implement me") 150 } 151 152 func (s *mockStub) GetFunctionAndParameters() (string, []string) { 153 return s.f, s.args 154 } 155 156 func (*mockStub) GetTxID() string { 157 panic("implement me") 158 } 159 160 func (*mockStub) InvokeChaincode(chaincodeName string, args [][]byte, channel string) peer.Response { 161 panic("implement me") 162 } 163 164 func (s *mockStub) GetState(key string) ([]byte, error) { 165 args := s.Called(key) 166 if args.Get(1) == nil { 167 return args.Get(0).([]byte), nil 168 } 169 return nil, args.Get(1).(error) 170 } 171 172 func (s *mockStub) PutState(key string, value []byte) error { 173 args := s.Called(key) 174 if args.Get(0) == nil { 175 return nil 176 } 177 return args.Get(0).(error) 178 } 179 180 func (*mockStub) DelState(key string) error { 181 panic("implement me") 182 } 183 184 func (*mockStub) GetStateByRange(startKey, endKey string) (shim.StateQueryIteratorInterface, error) { 185 panic("implement me") 186 } 187 188 func (*mockStub) GetStateByPartialCompositeKey(objectType string, keys []string) (shim.StateQueryIteratorInterface, error) { 189 panic("implement me") 190 } 191 192 func (*mockStub) CreateCompositeKey(objectType string, attributes []string) (string, error) { 193 panic("implement me") 194 } 195 196 func (*mockStub) SplitCompositeKey(compositeKey string) (string, []string, error) { 197 panic("implement me") 198 } 199 200 func (*mockStub) GetQueryResult(query string) (shim.StateQueryIteratorInterface, error) { 201 panic("implement me") 202 } 203 204 func (*mockStub) GetHistoryForKey(key string) (shim.HistoryQueryIteratorInterface, error) { 205 panic("implement me") 206 } 207 208 func (*mockStub) GetCreator() ([]byte, error) { 209 panic("implement me") 210 } 211 212 func (*mockStub) GetTransient() (map[string][]byte, error) { 213 panic("implement me") 214 } 215 216 func (*mockStub) GetBinding() ([]byte, error) { 217 panic("implement me") 218 } 219 220 func (*mockStub) GetSignedProposal() (*peer.SignedProposal, error) { 221 panic("implement me") 222 } 223 224 func (*mockStub) GetArgsSlice() ([]byte, error) { 225 panic("implement me") 226 } 227 228 func (*mockStub) GetTxTimestamp() (*timestamp.Timestamp, error) { 229 panic("implement me") 230 } 231 232 func (*mockStub) SetEvent(name string, payload []byte) error { 233 panic("implement me") 234 }