github.com/MetalBlockchain/metalgo@v1.11.9/snow/engine/avalanche/bootstrap/queue/test_job.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package queue 5 6 import ( 7 "context" 8 "errors" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 13 "github.com/MetalBlockchain/metalgo/ids" 14 "github.com/MetalBlockchain/metalgo/utils/set" 15 ) 16 17 var ( 18 errExecute = errors.New("unexpectedly called Execute") 19 errHasMissingDependencies = errors.New("unexpectedly called HasMissingDependencies") 20 ) 21 22 // TestJob is a test Job 23 type TestJob struct { 24 T *testing.T 25 26 CantID, 27 CantMissingDependencies, 28 CantExecute, 29 CantBytes, 30 CantHasMissingDependencies bool 31 32 IDF func() ids.ID 33 MissingDependenciesF func(context.Context) (set.Set[ids.ID], error) 34 ExecuteF func(context.Context) error 35 BytesF func() []byte 36 HasMissingDependenciesF func(context.Context) (bool, error) 37 } 38 39 func (j *TestJob) Default(cant bool) { 40 j.CantID = cant 41 j.CantMissingDependencies = cant 42 j.CantExecute = cant 43 j.CantBytes = cant 44 j.CantHasMissingDependencies = cant 45 } 46 47 func (j *TestJob) ID() ids.ID { 48 if j.IDF != nil { 49 return j.IDF() 50 } 51 if j.CantID && j.T != nil { 52 require.FailNow(j.T, "Unexpectedly called ID") 53 } 54 return ids.Empty 55 } 56 57 func (j *TestJob) MissingDependencies(ctx context.Context) (set.Set[ids.ID], error) { 58 if j.MissingDependenciesF != nil { 59 return j.MissingDependenciesF(ctx) 60 } 61 if j.CantMissingDependencies && j.T != nil { 62 require.FailNow(j.T, "Unexpectedly called MissingDependencies") 63 } 64 return set.Set[ids.ID]{}, nil 65 } 66 67 func (j *TestJob) Execute(ctx context.Context) error { 68 if j.ExecuteF != nil { 69 return j.ExecuteF(ctx) 70 } 71 if j.CantExecute && j.T != nil { 72 require.FailNow(j.T, errExecute.Error()) 73 } 74 return errExecute 75 } 76 77 func (j *TestJob) Bytes() []byte { 78 if j.BytesF != nil { 79 return j.BytesF() 80 } 81 if j.CantBytes && j.T != nil { 82 require.FailNow(j.T, "Unexpectedly called Bytes") 83 } 84 return nil 85 } 86 87 func (j *TestJob) HasMissingDependencies(ctx context.Context) (bool, error) { 88 if j.HasMissingDependenciesF != nil { 89 return j.HasMissingDependenciesF(ctx) 90 } 91 if j.CantHasMissingDependencies && j.T != nil { 92 require.FailNow(j.T, errHasMissingDependencies.Error()) 93 } 94 return false, errHasMissingDependencies 95 }