github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/block/gs/main_test.go (about)

     1  package gs_test
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"log"
     8  	"net/url"
     9  	"os"
    10  	"testing"
    11  
    12  	"cloud.google.com/go/storage"
    13  	"github.com/ory/dockertest/v3"
    14  	"github.com/ory/dockertest/v3/docker"
    15  	"google.golang.org/api/iterator"
    16  	"google.golang.org/api/option"
    17  )
    18  
    19  const bucketName = "bucket1"
    20  
    21  var client *storage.Client
    22  
    23  func TestMain(m *testing.M) {
    24  	const (
    25  		emulatorContainerTimeoutSeconds = 10 * 60 // 10 min
    26  		emulatorTestEndpoint            = "127.0.0.1"
    27  		emulatorTestPort                = "4443"
    28  		gcsProjectID                    = "testProject"
    29  	)
    30  
    31  	ctx := context.Background()
    32  	// External port required for '-public-host' configuration in docker cmd
    33  	endpoint := fmt.Sprintf("%s:%s", emulatorTestEndpoint, emulatorTestPort)
    34  	pool, err := dockertest.NewPool("")
    35  	if err != nil {
    36  		log.Fatalf("Could not connect to Docker: %s", err)
    37  	}
    38  	resource, err := pool.RunWithOptions(&dockertest.RunOptions{
    39  		Repository: "fsouza/fake-gcs-server",
    40  		Tag:        "1.47.6",
    41  		Cmd: []string{
    42  			"-scheme", "http",
    43  			"-backend", "memory",
    44  			"-public-host", endpoint,
    45  		},
    46  		ExposedPorts: []string{emulatorTestPort},
    47  		PortBindings: map[docker.Port][]docker.PortBinding{
    48  			docker.Port(emulatorTestPort + "/tcp"): {
    49  				{HostIP: emulatorTestPort, HostPort: emulatorTestPort + "/tcp"},
    50  			},
    51  		},
    52  	})
    53  	if err != nil {
    54  		log.Fatalf("Could not start fake-gcs-server: %s", err)
    55  	}
    56  
    57  	// set cleanup
    58  	closer := func() {
    59  		err = pool.Purge(resource)
    60  		if err != nil {
    61  			log.Fatalf("Could not purge fake-gcs-server: %s", err)
    62  		}
    63  	}
    64  
    65  	// expire, just to make sure
    66  	err = resource.Expire(emulatorContainerTimeoutSeconds)
    67  	if err != nil {
    68  		log.Fatalf("Could not expire fake-gcs-server: %s", err)
    69  	}
    70  
    71  	// Create the test client and bucket
    72  	blockURL := fmt.Sprintf("http://%s/storage/v1/", url.PathEscape(endpoint))
    73  	client, err = storage.NewClient(ctx, option.WithEndpoint(blockURL), option.WithoutAuthentication())
    74  	if err != nil {
    75  		log.Fatalf("Could not create gs client: %s", err)
    76  	}
    77  
    78  	// Wait for the container to be ready by listing buckets
    79  	if err := pool.Retry(func() error {
    80  		it := client.Buckets(ctx, gcsProjectID)
    81  		for {
    82  			_, err := it.Next()
    83  			if err != nil {
    84  				if errors.Is(err, iterator.Done) {
    85  					return nil
    86  				}
    87  				return err
    88  			}
    89  		}
    90  		return nil
    91  	}); err != nil {
    92  		log.Fatalf("Could not connect to fake-gcs-server while trying to list buckets: %s", err)
    93  	}
    94  
    95  	if err := client.Bucket(bucketName).Create(ctx, gcsProjectID, nil); err != nil {
    96  		log.Fatalf("Could not create bucket '%s': %s", bucketName, err)
    97  	}
    98  
    99  	code := m.Run()
   100  	closer()
   101  	os.Exit(code)
   102  }