Skip to content

Commit cc8a035

Browse files
Rozerxshashankaaradhychinche-alt
authored andcommitted
Add chaincode-to-fsc PoC with full integration test
Signed-off-by: Shivam <shivam@obmondo.com>
1 parent b0c1864 commit cc8a035

6 files changed

Lines changed: 938 additions & 0 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package finality
8+
9+
import (
10+
"testing"
11+
12+
"github.com/stretchr/testify/assert"
13+
"github.com/stretchr/testify/mock"
14+
15+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric"
16+
finalitymock "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core/generic/finality/mock"
17+
)
18+
19+
func TestCommitterFLM(t *testing.T) {
20+
t.Parallel()
21+
22+
setup := func() (*finalitymock.Committer, *committerListenerManager) {
23+
mockCommitter := &finalitymock.Committer{}
24+
mockChannel := &finalitymock.Channel{}
25+
mockChannel.On("Committer").Return(mockCommitter)
26+
27+
committer := fabric.NewCommitter(mockChannel)
28+
flm := NewCommitterFLM(committer)
29+
return mockCommitter, flm
30+
}
31+
32+
t.Run("AddFinalityListener", func(t *testing.T) {
33+
t.Parallel()
34+
mockCommitter, flm := setup()
35+
mockCommitter.On("AddFinalityListener", "tx1", mock.Anything).Return(nil).Once()
36+
err := flm.AddFinalityListener("", "tx1", &finalitymock.FinalityListener{})
37+
assert.NoError(t, err)
38+
})
39+
40+
t.Run("RemoveFinalityListener", func(t *testing.T) {
41+
t.Parallel()
42+
mockCommitter, flm := setup()
43+
mockCommitter.On("RemoveFinalityListener", "tx1", mock.Anything).Return(nil).Once()
44+
err := flm.RemoveFinalityListener("tx1", &finalitymock.FinalityListener{})
45+
assert.NoError(t, err)
46+
})
47+
}
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package finality
8+
9+
import (
10+
"context"
11+
"reflect"
12+
"testing"
13+
14+
"github.com/hyperledger/fabric-protos-go-apiv2/common"
15+
"github.com/stretchr/testify/mock"
16+
"github.com/stretchr/testify/require"
17+
18+
"github.com/hyperledger-labs/fabric-smart-client/pkg/utils/proto"
19+
driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver"
20+
"github.com/hyperledger-labs/fabric-smart-client/platform/common/services/logging"
21+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric"
22+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core/generic/events"
23+
finalitymock "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core/generic/finality/mock"
24+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/driver"
25+
)
26+
27+
func TestDeliveryFLM(t *testing.T) {
28+
t.Parallel()
29+
30+
setup := func() (*mockListenerManager, *deliveryListenerManager) {
31+
mockLM := &mockListenerManager{}
32+
dlm := &deliveryListenerManager{flm: mockLM}
33+
return mockLM, dlm
34+
}
35+
36+
t.Run("AddFinalityListener", func(t *testing.T) {
37+
t.Parallel()
38+
mockLM, dlm := setup()
39+
mockLM.On("AddEventListener", "tx1", mock.Anything).Return(nil).Once()
40+
err := dlm.AddFinalityListener("tx1", &finalitymock.FinalityListener{})
41+
require.NoError(t, err)
42+
})
43+
44+
t.Run("RemoveFinalityListener", func(t *testing.T) {
45+
t.Parallel()
46+
mockLM, dlm := setup()
47+
mockLM.On("RemoveEventListener", "tx1", mock.Anything).Return(nil).Once()
48+
err := dlm.RemoveFinalityListener("tx1", &finalitymock.FinalityListener{})
49+
require.NoError(t, err)
50+
})
51+
52+
t.Run("deliveryListenerEntry", func(t *testing.T) {
53+
t.Parallel()
54+
mockFL := &finalitymock.FinalityListener{}
55+
entry := &deliveryListenerEntry{l: mockFL}
56+
57+
require.Equal(t, driver2.Namespace(""), entry.Namespace())
58+
59+
ctx := context.Background()
60+
info := txInfo{txID: "tx1", status: driver.Valid, message: "ok"}
61+
mockFL.On("OnStatus", ctx, "tx1", driver.Valid, "ok").Once()
62+
entry.OnStatus(ctx, info)
63+
mockFL.AssertExpectations(t)
64+
65+
require.True(t, entry.Equals(&deliveryListenerEntry{l: mockFL}))
66+
require.False(t, entry.Equals(nil))
67+
require.False(t, entry.Equals(&deliveryListenerEntry{l: &finalitymock.FinalityListener{}}))
68+
})
69+
70+
t.Run("txInfo_ID", func(t *testing.T) {
71+
t.Parallel()
72+
info := txInfo{txID: "tx1"}
73+
require.Equal(t, events.EventID("tx1"), info.ID())
74+
})
75+
}
76+
77+
type mockListenerManager struct {
78+
mock.Mock
79+
}
80+
81+
func (m *mockListenerManager) AddEventListener(txID string, e events.ListenerEntry[txInfo]) error {
82+
args := m.Called(txID, e)
83+
return args.Error(0)
84+
}
85+
86+
func (m *mockListenerManager) RemoveEventListener(txID string, e events.ListenerEntry[txInfo]) error {
87+
args := m.Called(txID, e)
88+
return args.Error(0)
89+
}
90+
91+
func TestNewDeliveryFLM(t *testing.T) {
92+
t.Parallel()
93+
logger := logging.MustGetLogger("test")
94+
95+
mockChannelDriver := &finalitymock.Channel{}
96+
mockD := &finalitymock.Delivery{}
97+
mockChannelDriver.On("Delivery").Return(mockD)
98+
99+
fCh := &fabric.Channel{}
100+
v := reflect.ValueOf(fCh).Elem()
101+
f := v.FieldByName("ch")
102+
ptr := reflect.NewAt(f.Type(), f.Addr().UnsafePointer()).Elem()
103+
ptr.Set(reflect.ValueOf(mockChannelDriver))
104+
105+
config := events.DeliveryListenerManagerConfig{}
106+
flm, err := NewDeliveryFLM(logger, config, "test-network", fCh)
107+
if err == nil {
108+
require.NotNil(t, flm)
109+
}
110+
}
111+
112+
func TestTxInfoMapper(t *testing.T) {
113+
t.Parallel()
114+
mapper := &txInfoMapper{network: "test", logger: nil}
115+
116+
t.Run("MapProcessedTx", func(t *testing.T) {
117+
t.Parallel()
118+
mockPT := &finalitymock.ProcessedTransaction{}
119+
mockPT.On("TxID").Return("tx1")
120+
mockPT.On("ValidationCode").Return(int32(0)) // Valid
121+
122+
pt := newProcessedTransaction(mockPT)
123+
infos, err := mapper.MapProcessedTx(pt)
124+
require.NoError(t, err)
125+
require.Len(t, infos, 1)
126+
require.Equal(t, "tx1", infos[0].txID)
127+
require.Equal(t, driver.Valid, infos[0].status)
128+
})
129+
130+
t.Run("MapTxData_UnmarshalError", func(t *testing.T) {
131+
t.Parallel()
132+
logger := logging.MustGetLogger("test")
133+
mapper := &txInfoMapper{logger: logger}
134+
_, err := mapper.MapTxData(context.Background(), []byte("invalid"), nil, 0, 0)
135+
require.Error(t, err)
136+
require.Contains(t, err.Error(), "failed unmarshaling tx")
137+
})
138+
139+
t.Run("MapTxData_WrongHeaderType", func(t *testing.T) {
140+
t.Parallel()
141+
logger := logging.MustGetLogger("test")
142+
mapper := &txInfoMapper{logger: logger}
143+
144+
chdrRaw, _ := proto.Marshal(&common.ChannelHeader{Type: int32(common.HeaderType_CONFIG)})
145+
payloadRaw, _ := proto.Marshal(&common.Payload{
146+
Header: &common.Header{
147+
ChannelHeader: chdrRaw,
148+
},
149+
})
150+
envRaw, _ := proto.Marshal(&common.Envelope{
151+
Payload: payloadRaw,
152+
})
153+
154+
infos, err := mapper.MapTxData(context.Background(), envRaw, nil, 0, 0)
155+
require.NoError(t, err)
156+
require.Nil(t, infos)
157+
})
158+
}

0 commit comments

Comments
 (0)