github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/test/store_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  package test
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  	"strings"
    10  	"testing"
    11  	"time"
    12  )
    13  
    14  func TestStore(t *testing.T) {
    15  	TrySuite(t, testStore, 5)
    16  }
    17  
    18  func testStore(t *T) {
    19  	t.Parallel()
    20  	serv := NewServer(t, WithLogin())
    21  	defer serv.Close()
    22  	if err := serv.Run(); err != nil {
    23  		return
    24  	}
    25  
    26  	cmd := serv.Command()
    27  
    28  	// Execute first command in read to wait for store service
    29  	// to start up
    30  	if err := Try("Calling micro store read", t, func() ([]byte, error) {
    31  		outp, err := cmd.Exec("store", "read", "somekey")
    32  		if err == nil {
    33  			return outp, errors.New("store read should fail")
    34  		}
    35  		if !strings.Contains(string(outp), "Not found") {
    36  			return outp, fmt.Errorf("Output should be 'Not found', got %v", string(outp))
    37  		}
    38  		return outp, nil
    39  	}, 8*time.Second); err != nil {
    40  		return
    41  	}
    42  
    43  	outp, err := cmd.Exec("store", "write", "somekey", "val1")
    44  	if err != nil {
    45  		t.Fatal(string(outp))
    46  		return
    47  	}
    48  	if string(outp) != "" {
    49  		t.Fatalf("Expected no output, got: %v", string(outp))
    50  		return
    51  	}
    52  
    53  	outp, err = cmd.Exec("store", "read", "somekey")
    54  	if err != nil {
    55  		t.Fatal(string(outp))
    56  		return
    57  	}
    58  	if string(outp) != "val1\n" {
    59  		t.Fatalf("Expected 'val1\n', got: '%v'", string(outp))
    60  		return
    61  	}
    62  
    63  	outp, err = cmd.Exec("store", "delete", "somekey")
    64  	if err != nil {
    65  		t.Fatal(err)
    66  		return
    67  	}
    68  	if string(outp) != "" {
    69  		t.Fatalf("Expected '', got: '%v'", string(outp))
    70  		return
    71  	}
    72  
    73  	outp, err = cmd.Exec("store", "read", "somekey")
    74  	if err == nil {
    75  		t.Fatalf("store read should fail: %v", string(outp))
    76  		return
    77  	}
    78  	if !strings.Contains(string(outp), "Not found") {
    79  		t.Fatalf("Expected 'Not found\n', got: '%v'", string(outp))
    80  		return
    81  	}
    82  
    83  	// Test prefixes
    84  	outp, err = cmd.Exec("store", "write", "somekey1", "val1")
    85  	if err != nil {
    86  		t.Fatal(string(outp))
    87  		return
    88  	}
    89  	if string(outp) != "" {
    90  		t.Fatalf("Expected no output, got: %v", string(outp))
    91  		return
    92  	}
    93  
    94  	outp, err = cmd.Exec("store", "write", "somekey2", "val2")
    95  	if err != nil {
    96  		t.Fatal(string(outp))
    97  		return
    98  	}
    99  	if string(outp) != "" {
   100  		t.Fatalf("Expected no output, got: %v", string(outp))
   101  		return
   102  	}
   103  
   104  	// Read exact key
   105  	outp, err = cmd.Exec("store", "read", "somekey")
   106  	if err == nil {
   107  		t.Fatalf("store read should fail: %v", string(outp))
   108  		return
   109  	}
   110  	if !strings.Contains(string(outp), "Not found") {
   111  		t.Fatalf("Expected 'Not found\n', got: '%v'", string(outp))
   112  		return
   113  	}
   114  
   115  	outp, err = cmd.Exec("store", "read", "--prefix", "somekey")
   116  	if err != nil {
   117  		t.Fatalf("store prefix read not should fail: %v", string(outp))
   118  		return
   119  	}
   120  	if string(outp) != "val1\nval2\n" {
   121  		t.Fatalf("Expected output not present, got: '%v'", string(outp))
   122  		return
   123  	}
   124  
   125  	outp, err = cmd.Exec("store", "read", "-v", "--prefix", "somekey")
   126  	if err != nil {
   127  		t.Fatalf("store prefix read not should fail: %v", string(outp))
   128  		return
   129  	}
   130  	if !strings.Contains(string(outp), "somekey1") || !strings.Contains(string(outp), "somekey2") ||
   131  		!strings.Contains(string(outp), "val1") || !strings.Contains(string(outp), "val2") {
   132  		t.Fatalf("Expected output not present, got: '%v'", string(outp))
   133  		return
   134  	}
   135  
   136  	outp, err = cmd.Exec("store", "list")
   137  	if err != nil {
   138  		t.Fatalf("store list should not fail: %v", string(outp))
   139  		return
   140  	}
   141  	if !strings.Contains(string(outp), "somekey1") || !strings.Contains(string(outp), "somekey2") {
   142  		t.Fatalf("Expected output not present, got: '%v'", string(outp))
   143  		return
   144  	}
   145  
   146  }
   147  
   148  func TestStoreImpl(t *testing.T) {
   149  	TrySuite(t, testStoreImpl, 3)
   150  }
   151  
   152  func testStoreImpl(t *T) {
   153  	t.Parallel()
   154  	serv := NewServer(t, WithLogin())
   155  	defer serv.Close()
   156  	if err := serv.Run(); err != nil {
   157  		return
   158  	}
   159  
   160  	cmd := serv.Command()
   161  	outp, err := cmd.Exec("run", "--image", "localhost:5000/cells:v3", "./services/test/kv")
   162  	if err != nil {
   163  		t.Fatalf("micro run failure, output: %v", string(outp))
   164  		return
   165  	}
   166  
   167  	if err := Try("Find store", t, func() ([]byte, error) {
   168  		outp, err := cmd.Exec("status")
   169  		if err != nil {
   170  			return outp, err
   171  		}
   172  
   173  		// The started service should have the runtime name of "service/example",
   174  		// as the runtime name is the relative path inside a repo.
   175  		if !statusRunning("kv", "latest", outp) {
   176  			return outp, errors.New("Can't find example service in runtime")
   177  		}
   178  		return outp, err
   179  	}, 90*time.Second); err != nil {
   180  		return
   181  	}
   182  
   183  	if err := Try("Check logs", t, func() ([]byte, error) {
   184  		outp, err := cmd.Exec("logs", "kv")
   185  		if err != nil {
   186  			return outp, err
   187  		}
   188  		if !strings.Contains(string(outp), "Listening on") {
   189  			return outp, fmt.Errorf("Service not ready")
   190  		}
   191  		return nil, nil
   192  	}, 60*time.Second); err != nil {
   193  		return
   194  	}
   195  	outp, err = cmd.Exec("call", "--request_timeout=15s", "example", "Example.TestExpiry")
   196  	if err != nil {
   197  		t.Fatalf("Error %s, %s", err, outp)
   198  	}
   199  
   200  	outp, err = cmd.Exec("call", "--request_timeout=15s", "example", "Example.TestList")
   201  	if err != nil {
   202  		t.Fatalf("Error %s, %s", err, outp)
   203  	}
   204  
   205  	outp, err = cmd.Exec("call", "--request_timeout=15s", "example", "Example.TestListLimit")
   206  	if err != nil {
   207  		t.Fatalf("Error %s, %s", err, outp)
   208  	}
   209  	outp, err = cmd.Exec("call", "--request_timeout=15s", "example", "Example.TestListOffset")
   210  	if err != nil {
   211  		t.Fatalf("Error %s, %s", err, outp)
   212  	}
   213  }
   214  
   215  func TestBlobStore(t *testing.T) {
   216  	TrySuite(t, testBlobStore, retryCount)
   217  }
   218  
   219  func testBlobStore(t *T) {
   220  	t.Parallel()
   221  	serv := NewServer(t, WithLogin())
   222  	defer serv.Close()
   223  	if err := serv.Run(); err != nil {
   224  		return
   225  	}
   226  
   227  	cmd := serv.Command()
   228  	outp, err := cmd.Exec("run", "--image", "localhost:5000/cells:v3", "./services/test/blob-store")
   229  	if err != nil {
   230  		t.Fatalf("micro run failure, output: %v", string(outp))
   231  		return
   232  	}
   233  
   234  	if err := Try("Find blob-store", t, func() ([]byte, error) {
   235  		outp, err := cmd.Exec("status")
   236  		if err != nil {
   237  			return outp, err
   238  		}
   239  
   240  		if !statusRunning("blob-store", "latest", outp) {
   241  			return outp, errors.New("Can't find blob-store service in runtime")
   242  		}
   243  		return outp, err
   244  	}, 15*time.Second); err != nil {
   245  		return
   246  	}
   247  
   248  	if err := Try("Check logs", t, func() ([]byte, error) {
   249  		outp, err := cmd.Exec("logs", "blob-store")
   250  		if err != nil {
   251  			return nil, err
   252  		}
   253  		if !strings.Contains(string(outp), "Read from blob store: world") {
   254  			return outp, fmt.Errorf("Didn't read from the blob store")
   255  		}
   256  		return nil, nil
   257  	}, 60*time.Second); err != nil {
   258  		return
   259  	}
   260  }