Skip to content

Commit a91e750

Browse files
Rozerxshashankadecaro
authored andcommitted
Add benchmarks for fabtoken
Signed-off-by: Shashank <yshashank959@gmail.com>
1 parent 76a3da2 commit a91e750

3 files changed

Lines changed: 437 additions & 0 deletions

File tree

token/core/fabtoken/v1/issue_test.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1414
"github.com/hyperledger-labs/fabric-token-sdk/token/driver/mock"
15+
benchmark2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/benchmark"
1516
"github.com/hyperledger-labs/fabric-token-sdk/token/token"
1617
"github.com/stretchr/testify/assert"
1718
"github.com/stretchr/testify/require"
@@ -187,3 +188,115 @@ func TestDeserializeIssueAction(t *testing.T) {
187188
require.Error(t, err)
188189
})
189190
}
191+
192+
// BenchmarkIssueServiceIssue benchmarks the Issue method of the IssueService.
193+
func BenchmarkIssueServiceIssue(b *testing.B) {
194+
_, _, cases, err := benchmark2.GenerateCasesWithDefaults()
195+
require.NoError(b, err)
196+
197+
for _, tc := range cases {
198+
b.Run(tc.Name, func(b *testing.B) {
199+
env, err := newBenchmarkIssueEnv(b.N, tc.BenchmarkCase)
200+
require.NoError(b, err)
201+
202+
b.ResetTimer()
203+
i := 0
204+
for b.Loop() {
205+
e := env.Envs[i%len(env.Envs)]
206+
action, _, err := e.is.Issue(
207+
b.Context(),
208+
e.issuer,
209+
e.tokenType,
210+
e.values,
211+
e.owners,
212+
nil,
213+
)
214+
require.NoError(b, err)
215+
require.NotNil(b, action)
216+
i++
217+
}
218+
})
219+
}
220+
}
221+
222+
// TestParallelBenchmarkIssueServiceIssue runs the issue benchmark in parallel.
223+
func TestParallelBenchmarkIssueServiceIssue(t *testing.T) {
224+
_, _, cases, err := benchmark2.GenerateCasesWithDefaults()
225+
require.NoError(t, err)
226+
227+
test := benchmark2.NewTest[*benchmarkIssueEnv](cases)
228+
test.RunBenchmark(t,
229+
func(c *benchmark2.Case) (*benchmarkIssueEnv, error) {
230+
return newBenchmarkIssueEnv(1, c)
231+
},
232+
func(ctx context.Context, env *benchmarkIssueEnv) error {
233+
action, _, err := env.Envs[0].is.Issue(
234+
ctx,
235+
env.Envs[0].issuer,
236+
env.Envs[0].tokenType,
237+
env.Envs[0].values,
238+
env.Envs[0].owners,
239+
nil,
240+
)
241+
if err != nil {
242+
return err
243+
}
244+
_, err = action.Serialize()
245+
return err
246+
},
247+
)
248+
}
249+
250+
type issueEnv struct {
251+
is *IssueService
252+
issuer driver.Identity
253+
tokenType token.Type
254+
values []uint64
255+
owners [][]byte
256+
}
257+
258+
func newIssueEnv(benchmarkCase *benchmark2.Case) (*issueEnv, error) {
259+
ppm := &mock.PublicParamsManager{}
260+
pp := &mock.PublicParameters{}
261+
pp.PrecisionReturns(64)
262+
ppm.PublicParametersReturns(pp)
263+
264+
ws := &mock.WalletService{}
265+
des := &mock.Deserializer{}
266+
is := NewIssueService(ppm, ws, des)
267+
268+
issuer := driver.Identity("issuer")
269+
tokenType := token.Type("ABC")
270+
values := make([]uint64, benchmarkCase.NumOutputs)
271+
owners := make([][]byte, benchmarkCase.NumOutputs)
272+
for i := range values {
273+
values[i] = uint64(i)*10 + 10
274+
owners[i] = []byte("owner")
275+
}
276+
277+
des.GetAuditInfoReturns([]byte("audit"), nil)
278+
279+
return &issueEnv{
280+
is: is,
281+
issuer: issuer,
282+
tokenType: tokenType,
283+
values: values,
284+
owners: owners,
285+
}, nil
286+
}
287+
288+
type benchmarkIssueEnv struct {
289+
Envs []*issueEnv
290+
}
291+
292+
func newBenchmarkIssueEnv(n int, benchmarkCase *benchmark2.Case) (*benchmarkIssueEnv, error) {
293+
envs := make([]*issueEnv, n)
294+
for i := range n {
295+
env, err := newIssueEnv(benchmarkCase)
296+
if err != nil {
297+
return nil, err
298+
}
299+
envs[i] = env
300+
}
301+
return &benchmarkIssueEnv{Envs: envs}, nil
302+
}

token/core/fabtoken/v1/transfer_test.go

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package v1_test
88

99
import (
1010
"context"
11+
"strconv"
1112
"testing"
1213

1314
"github.com/hyperledger-labs/fabric-smart-client/pkg/utils/errors"
@@ -16,6 +17,7 @@ import (
1617
"github.com/hyperledger-labs/fabric-token-sdk/token/core/fabtoken/v1/setup"
1718
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
1819
"github.com/hyperledger-labs/fabric-token-sdk/token/driver/mock"
20+
benchmark2 "github.com/hyperledger-labs/fabric-token-sdk/token/services/benchmark"
1921
"github.com/hyperledger-labs/fabric-token-sdk/token/services/logging"
2022
"github.com/hyperledger-labs/fabric-token-sdk/token/services/ttx"
2123
"github.com/hyperledger-labs/fabric-token-sdk/token/token"
@@ -309,3 +311,130 @@ func TestTransferService(t *testing.T) {
309311
require.Error(t, err)
310312
})
311313
}
314+
315+
// BenchmarkTransferServiceTransfer benchmarks the Transfer method of the TransferService.
316+
func BenchmarkTransferServiceTransfer(b *testing.B) {
317+
_, _, cases, err := benchmark2.GenerateCasesWithDefaults()
318+
require.NoError(b, err)
319+
320+
for _, tc := range cases {
321+
b.Run(tc.Name, func(b *testing.B) {
322+
env, err := newBenchmarkTransferEnv(b.N, tc.BenchmarkCase)
323+
require.NoError(b, err)
324+
325+
b.ResetTimer()
326+
i := 0
327+
for b.Loop() {
328+
e := env.Envs[i%len(env.Envs)]
329+
action, _, err := e.ts.Transfer(
330+
b.Context(),
331+
"an_anchor",
332+
nil,
333+
e.ids,
334+
e.outputs,
335+
nil,
336+
)
337+
require.NoError(b, err)
338+
require.NotNil(b, action)
339+
i++
340+
}
341+
})
342+
}
343+
}
344+
345+
// TestParallelBenchmarkTransferServiceTransfer runs the transfer benchmark in parallel.
346+
func TestParallelBenchmarkTransferServiceTransfer(t *testing.T) {
347+
_, _, cases, err := benchmark2.GenerateCasesWithDefaults()
348+
require.NoError(t, err)
349+
350+
test := benchmark2.NewTest[*benchmarkTransferEnv](cases)
351+
test.RunBenchmark(t,
352+
func(c *benchmark2.Case) (*benchmarkTransferEnv, error) {
353+
return newBenchmarkTransferEnv(1, c)
354+
},
355+
func(ctx context.Context, env *benchmarkTransferEnv) error {
356+
action, _, err := env.Envs[0].ts.Transfer(
357+
ctx,
358+
"an_anchor",
359+
nil,
360+
env.Envs[0].ids,
361+
env.Envs[0].outputs,
362+
nil,
363+
)
364+
if err != nil {
365+
return err
366+
}
367+
_, err = action.Serialize()
368+
return err
369+
},
370+
)
371+
}
372+
373+
type transferEnv struct {
374+
ts *v1.TransferService
375+
outputs []*token.Token
376+
ids []*token.ID
377+
}
378+
379+
func newTransferEnv(benchmarkCase *benchmark2.Case) (*transferEnv, error) {
380+
logger := logging.MustGetLogger("test")
381+
ppm := &mockPublicParamsManager{PublicParamsManager: &mock.PublicParamsManager{}}
382+
pp, err := setup.Setup(64)
383+
if err != nil {
384+
return nil, err
385+
}
386+
ppm.PublicParametersReturns(pp)
387+
388+
ws := &mock.WalletService{}
389+
tl := &MockTokenLoader{}
390+
des := &mock.Deserializer{}
391+
ts := v1.NewTransferService(logger, ppm, ws, tl, des)
392+
393+
outputs := make([]*token.Token, benchmarkCase.NumOutputs)
394+
for i := range outputs {
395+
outputs[i] = &token.Token{
396+
Owner: []byte("owner2"),
397+
Type: "ABC",
398+
Quantity: token.NewQuantityFromUInt64(uint64(i)*10 + 10).Hex(),
399+
}
400+
}
401+
402+
ids := make([]*token.ID, benchmarkCase.NumInputs)
403+
inputTokens := make([]*token.Token, benchmarkCase.NumInputs)
404+
for i := range ids {
405+
ids[i] = &token.ID{TxId: strconv.Itoa(i), Index: 0}
406+
inputTokens[i] = &token.Token{
407+
Owner: []byte("owner1"),
408+
Type: "ABC",
409+
Quantity: token.NewQuantityFromUInt64(uint64(i)*10 + 10).Hex(),
410+
}
411+
}
412+
413+
tl.GetTokensStub = func(ctx context.Context, ids []*token.ID) ([]*token.Token, error) {
414+
return inputTokens, nil
415+
}
416+
des.GetAuditInfoReturns([]byte("audit"), nil)
417+
des.RecipientsReturns([]driver.Identity{[]byte("owner2")}, nil)
418+
419+
return &transferEnv{
420+
ts: ts,
421+
outputs: outputs,
422+
ids: ids,
423+
}, nil
424+
}
425+
426+
type benchmarkTransferEnv struct {
427+
Envs []*transferEnv
428+
}
429+
430+
func newBenchmarkTransferEnv(n int, benchmarkCase *benchmark2.Case) (*benchmarkTransferEnv, error) {
431+
envs := make([]*transferEnv, n)
432+
for i := range n {
433+
env, err := newTransferEnv(benchmarkCase)
434+
if err != nil {
435+
return nil, err
436+
}
437+
envs[i] = env
438+
}
439+
return &benchmarkTransferEnv{Envs: envs}, nil
440+
}

0 commit comments

Comments
 (0)