github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/integration/e2e/scenario_test.go (about)

     1  // +build requires_docker
     2  
     3  package e2e_test
     4  
     5  import (
     6  	"bytes"
     7  	"context"
     8  	"io/ioutil"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/go-kit/log"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  	"github.com/thanos-io/thanos/pkg/objstore/s3"
    16  	"gopkg.in/yaml.v2"
    17  
    18  	"github.com/cortexproject/cortex/integration/e2e"
    19  	e2edb "github.com/cortexproject/cortex/integration/e2e/db"
    20  )
    21  
    22  const bktName = "cheesecake"
    23  
    24  func spinup(t *testing.T, networkName string) (*e2e.Scenario, *e2e.HTTPService, *e2e.HTTPService) {
    25  	s, err := e2e.NewScenario(networkName)
    26  	assert.NoError(t, err)
    27  
    28  	m1 := e2edb.NewMinio(9000, bktName)
    29  	m2 := e2edb.NewMinio(9001, bktName)
    30  
    31  	closePlease := true
    32  	defer func() {
    33  		if closePlease {
    34  			// You're welcome.
    35  			s.Close()
    36  		}
    37  	}()
    38  	require.NoError(t, s.StartAndWaitReady(m1, m2))
    39  	require.Error(t, s.Start(m1))
    40  	require.Error(t, s.Start(e2edb.NewMinio(9000, "cheescake")))
    41  
    42  	closePlease = false
    43  	return s, m1, m2
    44  }
    45  
    46  func testMinioWorking(t *testing.T, m *e2e.HTTPService) {
    47  	ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute)
    48  	defer cancel()
    49  
    50  	b, err := yaml.Marshal(s3.Config{
    51  		Endpoint:  m.HTTPEndpoint(),
    52  		Bucket:    bktName,
    53  		AccessKey: e2edb.MinioAccessKey,
    54  		SecretKey: e2edb.MinioSecretKey,
    55  		Insecure:  true, // WARNING: Our secret cheesecake recipes might leak.
    56  	})
    57  	require.NoError(t, err)
    58  
    59  	bkt, err := s3.NewBucket(log.NewNopLogger(), b, "test")
    60  	require.NoError(t, err)
    61  
    62  	require.NoError(t, bkt.Upload(ctx, "recipe", bytes.NewReader([]byte("Just go to Pastry Shop and buy."))))
    63  	require.NoError(t, bkt.Upload(ctx, "mom/recipe", bytes.NewReader([]byte("https://www.bbcgoodfood.com/recipes/strawberry-cheesecake-4-easy-steps"))))
    64  
    65  	r, err := bkt.Get(ctx, "recipe")
    66  	require.NoError(t, err)
    67  	b, err = ioutil.ReadAll(r)
    68  	require.NoError(t, err)
    69  	require.Equal(t, "Just go to Pastry Shop and buy.", string(b))
    70  
    71  	r, err = bkt.Get(ctx, "mom/recipe")
    72  	require.NoError(t, err)
    73  	b, err = ioutil.ReadAll(r)
    74  	require.NoError(t, err)
    75  	require.Equal(t, "https://www.bbcgoodfood.com/recipes/strawberry-cheesecake-4-easy-steps", string(b))
    76  }
    77  
    78  func TestScenario(t *testing.T) {
    79  	t.Parallel()
    80  
    81  	s, m1, m2 := spinup(t, "e2e-scenario-test")
    82  	defer s.Close()
    83  
    84  	t.Run("minio is working", func(t *testing.T) {
    85  		testMinioWorking(t, m1)
    86  		testMinioWorking(t, m2)
    87  	})
    88  
    89  	t.Run("concurrent nested scenario 1 is working just fine as well", func(t *testing.T) {
    90  		t.Parallel()
    91  
    92  		s, m1, m2 := spinup(t, "e2e-scenario-test1")
    93  		defer s.Close()
    94  
    95  		testMinioWorking(t, m1)
    96  		testMinioWorking(t, m2)
    97  	})
    98  	t.Run("concurrent nested scenario 2 is working just fine as well", func(t *testing.T) {
    99  		t.Parallel()
   100  
   101  		s, m1, m2 := spinup(t, "e2e-scenario-test2")
   102  		defer s.Close()
   103  
   104  		testMinioWorking(t, m1)
   105  		testMinioWorking(t, m2)
   106  	})
   107  
   108  	require.NoError(t, s.Stop(m1))
   109  
   110  	// Expect m1 not working.
   111  	b, err := yaml.Marshal(s3.Config{
   112  		Endpoint:  m1.Name(),
   113  		Bucket:    "cheescake",
   114  		AccessKey: e2edb.MinioAccessKey,
   115  		SecretKey: e2edb.MinioSecretKey,
   116  	})
   117  	require.NoError(t, err)
   118  	bkt, err := s3.NewBucket(log.NewNopLogger(), b, "test")
   119  	require.NoError(t, err)
   120  
   121  	_, err = bkt.Get(context.Background(), "recipe")
   122  	require.Error(t, err)
   123  
   124  	testMinioWorking(t, m2)
   125  
   126  	require.Error(t, s.Stop(m1))
   127  	// Should be noop.
   128  	require.NoError(t, m1.Stop())
   129  	// I can run closes as many times I want.
   130  	s.Close()
   131  	s.Close()
   132  	s.Close()
   133  
   134  	// Expect m2 not working.
   135  	b, err = yaml.Marshal(s3.Config{
   136  		Endpoint:  m2.Name(),
   137  		Bucket:    "cheescake",
   138  		AccessKey: e2edb.MinioAccessKey,
   139  		SecretKey: e2edb.MinioSecretKey,
   140  	})
   141  	require.NoError(t, err)
   142  	bkt, err = s3.NewBucket(log.NewNopLogger(), b, "test")
   143  	require.NoError(t, err)
   144  
   145  	_, err = bkt.Get(context.Background(), "recipe")
   146  	require.Error(t, err)
   147  }