Skip to content

Commit 7761050

Browse files
committed
Unit tests and documentations
Signed-off-by: AkramBitar <akram@il.ibm.com>
1 parent 57b15b2 commit 7761050

37 files changed

Lines changed: 2933 additions & 21 deletions

token/request.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,13 +1108,48 @@ func (r *Request) FromBytes(raw []byte) error {
11081108
}
11091109

11101110
// AddAuditorSignature adds an auditor signature to the request.
1111+
// PreAllocateAuditorSignatures pre-allocates the auditor signatures slice to avoid repeated reallocations.
1112+
// Call this method if you know the expected number of auditors in advance.
1113+
func (r *Request) PreAllocateAuditorSignatures(expectedCount int) {
1114+
if expectedCount > 0 && cap(r.Actions.AuditorSignatures) < expectedCount {
1115+
r.Actions.AuditorSignatures = make([]*driver.AuditorSignature, 0, expectedCount)
1116+
}
1117+
}
1118+
1119+
// AddAuditorSignature adds a single auditor signature to the request.
1120+
// For better performance when adding multiple signatures, consider using AddAuditorSignatures instead.
11111121
func (r *Request) AddAuditorSignature(identity Identity, sigma []byte) {
11121122
r.Actions.AuditorSignatures = append(r.Actions.AuditorSignatures, &driver.AuditorSignature{
11131123
Identity: identity,
11141124
Signature: sigma,
11151125
})
11161126
}
11171127

1128+
// AddAuditorSignatures adds multiple auditor signatures in a single operation.
1129+
// This is more efficient than calling AddAuditorSignature multiple times.
1130+
func (r *Request) AddAuditorSignatures(identities []Identity, sigmas [][]byte) error {
1131+
if len(identities) != len(sigmas) {
1132+
return errors.Errorf("identities and signatures length mismatch: %d != %d", len(identities), len(sigmas))
1133+
}
1134+
1135+
// Pre-allocate if needed
1136+
if cap(r.Actions.AuditorSignatures) < len(r.Actions.AuditorSignatures)+len(identities) {
1137+
newCap := len(r.Actions.AuditorSignatures) + len(identities)
1138+
newSlice := make([]*driver.AuditorSignature, len(r.Actions.AuditorSignatures), newCap)
1139+
copy(newSlice, r.Actions.AuditorSignatures)
1140+
r.Actions.AuditorSignatures = newSlice
1141+
}
1142+
1143+
for i := range identities {
1144+
r.Actions.AuditorSignatures = append(r.Actions.AuditorSignatures, &driver.AuditorSignature{
1145+
Identity: identities[i],
1146+
Signature: sigmas[i],
1147+
})
1148+
}
1149+
1150+
return nil
1151+
}
1152+
11181153
func (r *Request) SetSignatures(sigmas map[string][]byte) bool {
11191154
signers := append(r.IssueSigners(), r.TransferSigners()...)
11201155
signatures := make([][]byte, len(signers))

token/sdk/db/checks.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@ import (
1616
"github.com/hyperledger-labs/fabric-token-sdk/token/services/ttx"
1717
)
1818

19+
// AuditorCheckServiceProvider creates check services for auditors.
20+
// It combines default checkers with custom checkers for database validation.
1921
type AuditorCheckServiceProvider struct {
2022
tmsProvider common.TokenManagementServiceProvider
2123
networkProvider common.NetworkProvider
2224
checkers []common.NamedChecker
2325
}
2426

27+
// NewAuditorCheckServiceProvider creates a new auditor check service provider.
2528
func NewAuditorCheckServiceProvider(tmsProvider common.TokenManagementServiceProvider, networkProvider common.NetworkProvider, checkers []common.NamedChecker) *AuditorCheckServiceProvider {
2629
return &AuditorCheckServiceProvider{
2730
tmsProvider: tmsProvider,
@@ -30,16 +33,21 @@ func NewAuditorCheckServiceProvider(tmsProvider common.TokenManagementServicePro
3033
}
3134
}
3235

36+
// CheckService creates a check service for the given TMS ID and databases.
37+
// It combines default checkers with custom checkers provided during initialization.
3338
func (a *AuditorCheckServiceProvider) CheckService(id token.TMSID, adb *auditdb.StoreService, tdb *tokens.Service) (auditor.CheckService, error) {
3439
return common.NewChecksService(append(common.NewDefaultCheckers(a.tmsProvider, a.networkProvider, adb, tdb, id), a.checkers...)), nil
3540
}
3641

42+
// OwnerCheckServiceProvider creates check services for token owners.
43+
// It combines default checkers with custom checkers for database validation.
3744
type OwnerCheckServiceProvider struct {
3845
tmsProvider common.TokenManagementServiceProvider
3946
networkProvider common.NetworkProvider
4047
checkers []common.NamedChecker
4148
}
4249

50+
// NewOwnerCheckServiceProvider creates a new owner check service provider.
4351
func NewOwnerCheckServiceProvider(tmsProvider common.TokenManagementServiceProvider, networkProvider common.NetworkProvider, checkers []common.NamedChecker) *OwnerCheckServiceProvider {
4452
return &OwnerCheckServiceProvider{
4553
tmsProvider: tmsProvider,
@@ -48,6 +56,8 @@ func NewOwnerCheckServiceProvider(tmsProvider common.TokenManagementServiceProvi
4856
}
4957
}
5058

59+
// CheckService creates a check service for the given TMS ID and databases.
60+
// It combines default checkers with custom checkers provided during initialization.
5161
func (a *OwnerCheckServiceProvider) CheckService(id token.TMSID, txdb *ttxdb.StoreService, tdb *tokens.Service) (ttx.CheckService, error) {
5262
return common.NewChecksService(append(common.NewDefaultCheckers(a.tmsProvider, a.networkProvider, txdb, tdb, id), a.checkers...)), nil
5363
}

token/sdk/db/checks_test.go

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package db
8+
9+
import (
10+
"context"
11+
"testing"
12+
13+
"github.com/hyperledger-labs/fabric-token-sdk/token"
14+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/storage/db/common"
15+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/storage/db/common/mock"
16+
"github.com/stretchr/testify/assert"
17+
"github.com/stretchr/testify/require"
18+
)
19+
20+
// TestNewAuditorCheckServiceProvider verifies that NewAuditorCheckServiceProvider
21+
// correctly initializes an AuditorCheckServiceProvider with the given dependencies.
22+
func TestNewAuditorCheckServiceProvider(t *testing.T) {
23+
tmsProvider := &mock.TokenManagementServiceProvider{}
24+
networkProvider := &mock.NetworkProvider{}
25+
checkers := []common.NamedChecker{
26+
{Name: "checker1", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
27+
{Name: "checker2", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
28+
}
29+
30+
provider := NewAuditorCheckServiceProvider(tmsProvider, networkProvider, checkers)
31+
32+
assert.NotNil(t, provider)
33+
assert.Equal(t, tmsProvider, provider.tmsProvider)
34+
assert.Equal(t, networkProvider, provider.networkProvider)
35+
assert.Equal(t, checkers, provider.checkers)
36+
}
37+
38+
// TestAuditorCheckServiceProvider_CheckService verifies that CheckService
39+
// creates a check service with default and custom checkers.
40+
func TestAuditorCheckServiceProvider_CheckService(t *testing.T) {
41+
tmsProvider := &mock.TokenManagementServiceProvider{}
42+
networkProvider := &mock.NetworkProvider{}
43+
checkers := []common.NamedChecker{
44+
{Name: "checker1", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
45+
}
46+
47+
provider := NewAuditorCheckServiceProvider(tmsProvider, networkProvider, checkers)
48+
49+
tmsID := token.TMSID{
50+
Network: "test-network",
51+
Channel: "test-channel",
52+
Namespace: "test-namespace",
53+
}
54+
55+
// Note: This test will return a service but we can't fully test it without mocking the dependencies
56+
// The actual CheckService creation requires valid auditdb and tokens services
57+
service, err := provider.CheckService(tmsID, nil, nil)
58+
59+
// We expect the service to be created even with nil dependencies
60+
// as the common.NewChecksService should handle it
61+
assert.NotNil(t, service)
62+
assert.NoError(t, err)
63+
}
64+
65+
// TestNewOwnerCheckServiceProvider verifies that NewOwnerCheckServiceProvider
66+
// correctly initializes an OwnerCheckServiceProvider with the given dependencies.
67+
func TestNewOwnerCheckServiceProvider(t *testing.T) {
68+
tmsProvider := &mock.TokenManagementServiceProvider{}
69+
networkProvider := &mock.NetworkProvider{}
70+
checkers := []common.NamedChecker{
71+
{Name: "checker1", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
72+
{Name: "checker2", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
73+
}
74+
75+
provider := NewOwnerCheckServiceProvider(tmsProvider, networkProvider, checkers)
76+
77+
assert.NotNil(t, provider)
78+
assert.Equal(t, tmsProvider, provider.tmsProvider)
79+
assert.Equal(t, networkProvider, provider.networkProvider)
80+
assert.Equal(t, checkers, provider.checkers)
81+
}
82+
83+
// TestOwnerCheckServiceProvider_CheckService verifies that CheckService
84+
// creates a check service with default and custom checkers.
85+
func TestOwnerCheckServiceProvider_CheckService(t *testing.T) {
86+
tmsProvider := &mock.TokenManagementServiceProvider{}
87+
networkProvider := &mock.NetworkProvider{}
88+
checkers := []common.NamedChecker{
89+
{Name: "checker1", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
90+
}
91+
92+
provider := NewOwnerCheckServiceProvider(tmsProvider, networkProvider, checkers)
93+
94+
tmsID := token.TMSID{
95+
Network: "test-network",
96+
Channel: "test-channel",
97+
Namespace: "test-namespace",
98+
}
99+
100+
// Note: This test will return a service but we can't fully test it without mocking the dependencies
101+
service, err := provider.CheckService(tmsID, nil, nil)
102+
103+
// We expect the service to be created even with nil dependencies
104+
assert.NotNil(t, service)
105+
assert.NoError(t, err)
106+
}
107+
108+
// TestAuditorCheckServiceProvider_WithMultipleCheckers verifies that the provider
109+
// correctly handles multiple custom checkers.
110+
func TestAuditorCheckServiceProvider_WithMultipleCheckers(t *testing.T) {
111+
tmsProvider := &mock.TokenManagementServiceProvider{}
112+
networkProvider := &mock.NetworkProvider{}
113+
114+
// Test with multiple checkers
115+
checkers := []common.NamedChecker{
116+
{Name: "checker1", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
117+
{Name: "checker2", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
118+
{Name: "checker3", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
119+
}
120+
121+
provider := NewAuditorCheckServiceProvider(tmsProvider, networkProvider, checkers)
122+
require.NotNil(t, provider)
123+
assert.Len(t, provider.checkers, 3)
124+
}
125+
126+
// TestOwnerCheckServiceProvider_WithMultipleCheckers verifies that the provider
127+
// correctly handles multiple custom checkers.
128+
func TestOwnerCheckServiceProvider_WithMultipleCheckers(t *testing.T) {
129+
tmsProvider := &mock.TokenManagementServiceProvider{}
130+
networkProvider := &mock.NetworkProvider{}
131+
132+
// Test with multiple checkers
133+
checkers := []common.NamedChecker{
134+
{Name: "checker1", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
135+
{Name: "checker2", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
136+
{Name: "checker3", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
137+
}
138+
139+
provider := NewOwnerCheckServiceProvider(tmsProvider, networkProvider, checkers)
140+
require.NotNil(t, provider)
141+
assert.Len(t, provider.checkers, 3)
142+
}
143+
144+
// TestAuditorCheckServiceProvider_WithEmptyCheckers verifies that the provider
145+
// works correctly with an empty checkers list.
146+
func TestAuditorCheckServiceProvider_WithEmptyCheckers(t *testing.T) {
147+
tmsProvider := &mock.TokenManagementServiceProvider{}
148+
networkProvider := &mock.NetworkProvider{}
149+
checkers := []common.NamedChecker{}
150+
151+
provider := NewAuditorCheckServiceProvider(tmsProvider, networkProvider, checkers)
152+
require.NotNil(t, provider)
153+
assert.Empty(t, provider.checkers)
154+
}
155+
156+
// TestOwnerCheckServiceProvider_WithEmptyCheckers verifies that the provider
157+
// works correctly with an empty checkers list.
158+
func TestOwnerCheckServiceProvider_WithEmptyCheckers(t *testing.T) {
159+
tmsProvider := &mock.TokenManagementServiceProvider{}
160+
networkProvider := &mock.NetworkProvider{}
161+
checkers := []common.NamedChecker{}
162+
163+
provider := NewOwnerCheckServiceProvider(tmsProvider, networkProvider, checkers)
164+
require.NotNil(t, provider)
165+
assert.Empty(t, provider.checkers)
166+
}
167+
168+
// TestAuditorCheckServiceProvider_WithNilProviders verifies that the provider
169+
// can be created with nil TMS and network providers.
170+
func TestAuditorCheckServiceProvider_WithNilProviders(t *testing.T) {
171+
checkers := []common.NamedChecker{
172+
{Name: "checker1", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
173+
}
174+
175+
// Test with nil providers - should still create the provider
176+
provider := NewAuditorCheckServiceProvider(nil, nil, checkers)
177+
require.NotNil(t, provider)
178+
assert.Nil(t, provider.tmsProvider)
179+
assert.Nil(t, provider.networkProvider)
180+
assert.Len(t, provider.checkers, 1)
181+
}
182+
183+
// TestOwnerCheckServiceProvider_WithNilProviders verifies that the provider
184+
// can be created with nil TMS and network providers.
185+
func TestOwnerCheckServiceProvider_WithNilProviders(t *testing.T) {
186+
checkers := []common.NamedChecker{
187+
{Name: "checker1", Checker: func(ctx context.Context) ([]string, error) { return nil, nil }},
188+
}
189+
190+
// Test with nil providers - should still create the provider
191+
provider := NewOwnerCheckServiceProvider(nil, nil, checkers)
192+
require.NotNil(t, provider)
193+
assert.Nil(t, provider.tmsProvider)
194+
assert.Nil(t, provider.networkProvider)
195+
assert.Len(t, provider.checkers, 1)
196+
}

token/sdk/dig/checks.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"go.uber.org/dig"
1313
)
1414

15+
// NewAuditorCheckServiceProvider creates an auditor check service provider using dependency injection.
16+
// It aggregates TMS provider, network provider, and custom checkers from the DI container.
1517
func NewAuditorCheckServiceProvider(in struct {
1618
dig.In
1719
TMSProvider common.TokenManagementServiceProvider
@@ -21,6 +23,8 @@ func NewAuditorCheckServiceProvider(in struct {
2123
return db.NewAuditorCheckServiceProvider(in.TMSProvider, in.NetworkProvider, in.Checkers)
2224
}
2325

26+
// NewOwnerCheckServiceProvider creates an owner check service provider using dependency injection.
27+
// It aggregates TMS provider, network provider, and custom checkers from the DI container.
2428
func NewOwnerCheckServiceProvider(in struct {
2529
dig.In
2630
TMSProvider common.TokenManagementServiceProvider

0 commit comments

Comments
 (0)