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 }