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  }