Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit 29957ca

Browse files
committed
[FAB-9678] Channel Client: Examples
Change-Id: I9fd8f4f64213b9b75419d14102521d974ed99a9e Signed-off-by: Sandra Vrtikapa <sandra.vrtikapa@securekey.com>
1 parent 830bdea commit 29957ca

File tree

9 files changed

+379
-450
lines changed

9 files changed

+379
-450
lines changed

pkg/client/channel/chclient_test.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -369,18 +369,10 @@ func TestOrdererStatusError(t *testing.T) {
369369
func TestTransactionValidationError(t *testing.T) {
370370
validationCode := pb.TxValidationCode_BAD_RWSET
371371
mockEventService := fcmocks.NewMockEventService()
372+
mockEventService.TxValidationCode = validationCode
372373
testPeer1 := fcmocks.NewMockPeer("Peer1", "http://peer1.com")
373374
peers := []fab.Peer{testPeer1}
374375

375-
go func() {
376-
select {
377-
case txStatusReg := <-mockEventService.TxStatusRegCh:
378-
txStatusReg.Eventch <- &fab.TxStatusEvent{TxID: txStatusReg.TxID, TxValidationCode: validationCode}
379-
case <-time.After(time.Second * 5):
380-
panic("Timed out waiting for execute Tx to register event callback")
381-
}
382-
}()
383-
384376
chClient := setupChannelClient(peers, t)
385377
chClient.eventService = mockEventService
386378
response, err := chClient.Execute(Request{ChaincodeID: "test", Fcn: "invoke",
@@ -392,6 +384,25 @@ func TestTransactionValidationError(t *testing.T) {
392384
assert.EqualValues(t, validationCode, status.ToTransactionValidationCode(statusError.Code))
393385
}
394386

387+
func TestTransactionTimeout(t *testing.T) {
388+
389+
mockEventService := fcmocks.NewMockEventService()
390+
mockEventService.Timeout = true
391+
testPeer1 := fcmocks.NewMockPeer("Peer1", "http://peer1.com")
392+
peers := []fab.Peer{testPeer1}
393+
394+
chClient := setupChannelClient(peers, t)
395+
chClient.eventService = mockEventService
396+
response, err := chClient.Execute(Request{ChaincodeID: "test", Fcn: "invoke",
397+
Args: [][]byte{[]byte("move"), []byte("a"), []byte("b"), []byte("1")}})
398+
assert.Nil(t, response.Payload, "Expected nil result on failed execute operation")
399+
assert.NotNil(t, err, "expected error")
400+
statusError, ok := status.FromError(err)
401+
assert.True(t, ok, "Expected status error got %+v", err)
402+
403+
assert.EqualValues(t, statusError.Code, status.Timeout)
404+
}
405+
395406
func TestExecuteTxWithRetries(t *testing.T) {
396407
testStatus := status.New(status.EndorserClientStatus, status.ConnectionFailed.ToInt32(), "test", nil)
397408
testResp := []byte("test")

pkg/client/channel/example_test.go

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
/*
2+
Copyright SecureKey Technologies Inc. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
package channel
7+
8+
import (
9+
"fmt"
10+
11+
"github.com/hyperledger/fabric-sdk-go/pkg/client/channel/invoke"
12+
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/context"
13+
"github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
14+
)
15+
16+
func Example() {
17+
18+
c, err := New(mockChannelProvider("mychannel"))
19+
if err != nil {
20+
fmt.Println("failed to create client")
21+
}
22+
23+
response, err := c.Query(Request{ChaincodeID: "testCC", Fcn: "invoke", Args: [][]byte{[]byte("query"), []byte("data")}})
24+
if err != nil {
25+
fmt.Printf("failed to query chaincode: %v", err)
26+
}
27+
28+
fmt.Println(string(response.Payload))
29+
30+
// Output: abc
31+
}
32+
33+
func ExampleNew() {
34+
35+
ctx := mockChannelProvider("mychannel")
36+
37+
c, err := New(ctx)
38+
if err != nil {
39+
fmt.Println(err)
40+
}
41+
42+
if c != nil {
43+
fmt.Println("channel client created")
44+
} else {
45+
fmt.Println("channel client is nil")
46+
}
47+
48+
// Output: channel client created
49+
50+
}
51+
52+
func ExampleClient_Query() {
53+
54+
c, err := New(mockChannelProvider("mychannel"))
55+
if err != nil {
56+
fmt.Println("failed to create client")
57+
}
58+
59+
response, err := c.Query(Request{ChaincodeID: "testCC", Fcn: "invoke", Args: [][]byte{[]byte("query"), []byte("b")}})
60+
if err != nil {
61+
fmt.Printf("failed to query chaincode: %v", err)
62+
}
63+
64+
if len(response.Payload) > 0 {
65+
fmt.Println("chaincode query success")
66+
}
67+
68+
// Output: chaincode query success
69+
}
70+
71+
func ExampleClient_Execute() {
72+
73+
c, err := New(mockChannelProvider("mychannel"))
74+
if err != nil {
75+
fmt.Println("failed to create client")
76+
}
77+
78+
_, err = c.Execute(Request{ChaincodeID: "testCC", Fcn: "invoke", Args: [][]byte{[]byte("move"), []byte("a"), []byte("b"), []byte("1")}})
79+
if err != nil {
80+
fmt.Println(err.Error())
81+
}
82+
83+
fmt.Println("Chaincode transaction completed")
84+
85+
// Output: Chaincode transaction completed
86+
}
87+
88+
func ExampleClient_RegisterChaincodeEvent() {
89+
90+
c, err := New(mockChannelProvider("mychannel"))
91+
if err != nil {
92+
fmt.Println("failed to create client")
93+
}
94+
95+
registration, _, err := c.RegisterChaincodeEvent("examplecc", "event123")
96+
if err != nil {
97+
fmt.Println("failed to register chaincode event")
98+
}
99+
defer c.UnregisterChaincodeEvent(registration)
100+
101+
fmt.Println("chaincode event registered successfully")
102+
103+
// Output: chaincode event registered successfully
104+
105+
}
106+
107+
func ExampleClient_InvokeHandler() {
108+
109+
c, err := New(mockChannelProvider("mychannel"))
110+
if err != nil {
111+
fmt.Println("failed to create client")
112+
}
113+
114+
response, err := c.InvokeHandler(&exampleHandler{}, Request{ChaincodeID: "testCC", Fcn: "invoke", Args: [][]byte{[]byte("query"), []byte("data")}})
115+
if err != nil {
116+
fmt.Printf("failed to query chaincode: %v", err)
117+
}
118+
119+
fmt.Println(string(response.Payload))
120+
121+
// Output: custom
122+
}
123+
124+
type exampleHandler struct {
125+
}
126+
127+
func (c *exampleHandler) Handle(requestContext *invoke.RequestContext, clientContext *invoke.ClientContext) {
128+
requestContext.Response.Payload = []byte("custom")
129+
}
130+
131+
func mockChannelProvider(channelID string) context.ChannelProvider {
132+
133+
channelProvider := func() (context.Channel, error) {
134+
return mocks.NewMockChannel(channelID)
135+
}
136+
137+
return channelProvider
138+
}

pkg/client/channel/invoke/signature.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func (f *SignatureValidationHandler) Handle(requestContext *RequestContext, clie
2828
//Filter tx proposal responses
2929
err := f.validate(requestContext.Response.Responses, clientContext)
3030
if err != nil {
31-
requestContext.Error = errors.WithMessage(err, "endorsement validation failed")
31+
requestContext.Error = errors.WithMessage(err, "signature validation failed")
3232
return
3333
}
3434

pkg/client/channel/invoke/txnhandler_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,19 @@ func TestExecuteTxHandlerErrors(t *testing.T) {
148148
func TestEndorsementHandler(t *testing.T) {
149149
request := Request{ChaincodeID: "test", Fcn: "invoke", Args: [][]byte{[]byte("move"), []byte("a"), []byte("b"), []byte("1")}}
150150

151-
requestContext := prepareRequestContext(request, Opts{Targets: []fab.Peer{fcmocks.NewMockPeer("p2", "")}}, t)
152151
clientContext := setupChannelClientContext(nil, nil, nil, t)
152+
requestContext := prepareRequestContext(request, Opts{Targets: nil}, t)
153153

154154
handler := NewEndorsementHandler()
155155
handler.Handle(requestContext, clientContext)
156+
assert.NotNil(t, requestContext.Error)
157+
158+
requestContext = prepareRequestContext(request, Opts{Targets: []fab.Peer{fcmocks.NewMockPeer("p2", "")}}, t)
159+
160+
handler = NewEndorsementHandler()
161+
handler.Handle(requestContext, clientContext)
156162
assert.Nil(t, requestContext.Error)
163+
157164
}
158165

159166
// Target filter

pkg/client/resmgmt/resmgmt.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func New(ctxProvider context.ClientProvider, opts ...ClientOption) (*Client, err
144144

145145
ctx, err := ctxProvider()
146146
if err != nil {
147-
return nil, errors.WithMessage(err, "failed to create resmgmt client")
147+
return nil, errors.WithMessage(err, "failed to create resmgmt client due to context error")
148148
}
149149

150150
if ctx.Identifier().MSPID == "" {
@@ -688,7 +688,7 @@ func (rc *Client) sendCCProposal(reqCtx reqContext.Context, ccProposalType chain
688688
// Verify signature(s)
689689
err = rc.verifyTPSignature(channelService, txProposalResponse)
690690
if err != nil {
691-
return tp.TxnID, errors.WithMessage(err, "sending deploy transaction proposal failed")
691+
return tp.TxnID, errors.WithMessage(err, "sending deploy transaction proposal failed to verify signature")
692692
}
693693

694694
eventService, err := channelService.EventService()

0 commit comments

Comments
 (0)