@@ -8,6 +8,7 @@ package v1_test
88
99import (
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