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 }