github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/pkg/compute/bidstrategy/engines_installed_strategy_test.go (about) 1 //go:build unit || !integration 2 3 package bidstrategy 4 5 import ( 6 "context" 7 "testing" 8 9 "github.com/filecoin-project/bacalhau/pkg/executor" 10 "github.com/filecoin-project/bacalhau/pkg/model" 11 "github.com/filecoin-project/bacalhau/pkg/publisher" 12 "github.com/filecoin-project/bacalhau/pkg/storage" 13 "github.com/filecoin-project/bacalhau/pkg/verifier" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestEnginesInstalledStrategy(t *testing.T) { 19 tests := []struct { 20 name string 21 storages storage.StorageProvider 22 executors executor.ExecutorProvider 23 verifiers verifier.VerifierProvider 24 publishers publisher.PublisherProvider 25 bid BidStrategyRequest 26 shouldBid bool 27 }{ 28 { 29 name: "no-storage", 30 storages: dummy[model.StorageSourceType, storage.Storage](model.StorageSourceURLDownload), 31 executors: dummy[model.Engine, executor.Executor](model.EngineDocker), 32 verifiers: dummy[model.Verifier, verifier.Verifier](model.VerifierNoop), 33 publishers: dummy[model.Publisher, publisher.Publisher](model.PublisherEstuary), 34 bid: BidStrategyRequest{ 35 Job: model.Job{ 36 Spec: model.Spec{ 37 Inputs: []model.StorageSpec{}, 38 Engine: model.EngineDocker, 39 Verifier: model.VerifierNoop, 40 Publisher: model.PublisherEstuary, 41 }, 42 }, 43 }, 44 shouldBid: true, 45 }, 46 { 47 name: "invalid-storage", 48 storages: dummy[model.StorageSourceType, storage.Storage](model.StorageSourceURLDownload), 49 executors: dummy[model.Engine, executor.Executor](model.EngineDocker), 50 verifiers: dummy[model.Verifier, verifier.Verifier](model.VerifierNoop), 51 publishers: dummy[model.Publisher, publisher.Publisher](model.PublisherEstuary), 52 bid: BidStrategyRequest{ 53 Job: model.Job{ 54 Spec: model.Spec{ 55 Inputs: []model.StorageSpec{ 56 { 57 StorageSource: model.StorageSourceIPFS, 58 }, 59 }, 60 Engine: model.EngineDocker, 61 Verifier: model.VerifierNoop, 62 Publisher: model.PublisherEstuary, 63 }, 64 }, 65 }, 66 shouldBid: false, 67 }, 68 { 69 name: "invalid-executor", 70 storages: dummy[model.StorageSourceType, storage.Storage](model.StorageSourceInline), 71 executors: dummy[model.Engine, executor.Executor](model.EngineWasm), 72 verifiers: dummy[model.Verifier, verifier.Verifier](model.VerifierDeterministic), 73 publishers: dummy[model.Publisher, publisher.Publisher](model.PublisherEstuary), 74 bid: BidStrategyRequest{ 75 Job: model.Job{ 76 Spec: model.Spec{ 77 Inputs: []model.StorageSpec{ 78 { 79 StorageSource: model.StorageSourceInline, 80 }, 81 }, 82 Engine: model.EngineDocker, 83 Verifier: model.VerifierDeterministic, 84 Publisher: model.PublisherEstuary, 85 }, 86 }, 87 }, 88 shouldBid: false, 89 }, 90 { 91 name: "invalid-verifier", 92 storages: dummy[model.StorageSourceType, storage.Storage](model.StorageSourceURLDownload), 93 executors: dummy[model.Engine, executor.Executor](model.EngineDocker), 94 verifiers: dummy[model.Verifier, verifier.Verifier](model.VerifierNoop), 95 publishers: dummy[model.Publisher, publisher.Publisher](model.PublisherEstuary), 96 bid: BidStrategyRequest{ 97 Job: model.Job{ 98 Spec: model.Spec{ 99 Inputs: []model.StorageSpec{ 100 { 101 StorageSource: model.StorageSourceURLDownload, 102 }, 103 }, 104 Engine: model.EngineDocker, 105 Verifier: model.VerifierDeterministic, 106 Publisher: model.PublisherEstuary, 107 }, 108 }, 109 }, 110 shouldBid: false, 111 }, 112 { 113 name: "invalid-publisher", 114 storages: dummy[model.StorageSourceType, storage.Storage](model.StorageSourceFilecoin), 115 executors: dummy[model.Engine, executor.Executor](model.EngineDocker), 116 verifiers: dummy[model.Verifier, verifier.Verifier](model.VerifierNoop), 117 publishers: dummy[model.Publisher, publisher.Publisher](model.PublisherFilecoin), 118 bid: BidStrategyRequest{ 119 Job: model.Job{ 120 Spec: model.Spec{ 121 Inputs: []model.StorageSpec{ 122 { 123 StorageSource: model.StorageSourceFilecoin, 124 }, 125 }, 126 Engine: model.EngineDocker, 127 Verifier: model.VerifierNoop, 128 Publisher: model.PublisherEstuary, 129 }, 130 }, 131 }, 132 shouldBid: false, 133 }, 134 { 135 name: "valid-request", 136 storages: dummy[model.StorageSourceType, storage.Storage](model.StorageSourceInline), 137 executors: dummy[model.Engine, executor.Executor](model.EngineWasm), 138 verifiers: dummy[model.Verifier, verifier.Verifier](model.VerifierDeterministic), 139 publishers: dummy[model.Publisher, publisher.Publisher](model.PublisherIpfs), 140 bid: BidStrategyRequest{ 141 Job: model.Job{ 142 Spec: model.Spec{ 143 Inputs: []model.StorageSpec{ 144 { 145 StorageSource: model.StorageSourceInline, 146 }, 147 }, 148 Engine: model.EngineWasm, 149 Verifier: model.VerifierDeterministic, 150 Publisher: model.PublisherIpfs, 151 }, 152 }, 153 }, 154 shouldBid: true, 155 }, 156 } 157 158 for _, test := range tests { 159 t.Run(test.name, func(t *testing.T) { 160 subject := NewEnginesInstalledStrategy(EnginesInstalledStrategyParams{ 161 Storages: test.storages, 162 Executors: test.executors, 163 Verifiers: test.verifiers, 164 Publishers: test.publishers, 165 }) 166 167 actual, err := subject.ShouldBid(context.Background(), test.bid) 168 require.NoError(t, err) 169 170 assert.Equal(t, test.shouldBid, actual.ShouldBid, actual.Reason) 171 }) 172 } 173 } 174 175 type dummyProvider[Key model.ProviderKey, Value model.Providable] struct { 176 key Key 177 } 178 179 // Get implements executor.ExecutorProvider 180 func (dummyProvider[Key, Value]) Get(context.Context, Key) (Value, error) { 181 panic("unimplemented") 182 } 183 184 // Has implements executor.ExecutorProvider 185 func (d dummyProvider[Key, Value]) Has(_ context.Context, k Key) bool { 186 return d.key == k 187 } 188 189 func dummy[Key model.ProviderKey, Value model.Providable](k Key) model.Provider[Key, Value] { 190 return dummyProvider[Key, Value]{key: k} 191 }