Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 1 | package impl_test |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 2 | |
| 3 | import ( |
| 4 | "bytes" |
| 5 | "crypto/md5" |
| 6 | "encoding/hex" |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 7 | "fmt" |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 8 | "net" |
| 9 | "net/http" |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 10 | "reflect" |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 11 | "testing" |
Jiri Simsa | 01cf937 | 2014-06-30 09:49:55 -0700 | [diff] [blame] | 12 | |
Robert Kroeger | 8d7a0ef | 2015-01-14 17:38:40 -0800 | [diff] [blame] | 13 | "v.io/core/veyron2" |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 14 | "v.io/core/veyron2/context" |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 15 | "v.io/core/veyron2/naming" |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 16 | "v.io/core/veyron2/services/mgmt/repository" |
| 17 | verror "v.io/core/veyron2/verror2" |
| 18 | "v.io/core/veyron2/vlog" |
Cosmos Nicolaou | d6c3c9c | 2014-09-30 15:42:53 -0700 | [diff] [blame] | 19 | |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 20 | "v.io/core/veyron/lib/testutil" |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 21 | _ "v.io/core/veyron/profiles/static" |
| 22 | "v.io/core/veyron/services/mgmt/binary/impl" |
| 23 | mgmttest "v.io/core/veyron/services/mgmt/lib/testutil" |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 24 | ) |
| 25 | |
| 26 | const ( |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 27 | veyronPrefix = "veyron_binary_repository" |
| 28 | ) |
| 29 | |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 30 | var gctx *context.T |
Robert Kroeger | 8d7a0ef | 2015-01-14 17:38:40 -0800 | [diff] [blame] | 31 | var globalCancel context.CancelFunc |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 32 | |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 33 | // startServer starts the binary repository server. |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 34 | func startServer(t *testing.T, depth int) (repository.BinaryClientMethods, string, string, func()) { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 35 | // Setup the root of the binary repository. |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 36 | rootDir, cleanup := mgmttest.SetupRootDir(t, "bindir") |
| 37 | prepDirectory(t, rootDir) |
| 38 | |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 39 | // Setup and start the binary repository server. |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 40 | server, endpoint := mgmttest.NewServer(gctx) |
| 41 | |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 42 | listener, err := net.Listen("tcp", "127.0.0.1:0") |
| 43 | if err != nil { |
| 44 | t.Fatal(err) |
| 45 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 46 | state, err := impl.NewState(rootDir, listener.Addr().String(), depth) |
Jiri Simsa | 432cc2e | 2014-12-08 15:53:38 -0800 | [diff] [blame] | 47 | if err != nil { |
| 48 | t.Fatalf("NewState(%v, %v) failed: %v", rootDir, listener.Addr().String(), depth, err) |
| 49 | } |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 50 | go func() { |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 51 | if err := http.Serve(listener, http.FileServer(impl.NewHTTPRoot(state))); err != nil { |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 52 | vlog.Fatalf("Serve() failed: %v", err) |
| 53 | } |
| 54 | }() |
Robert Kroeger | 8d7a0ef | 2015-01-14 17:38:40 -0800 | [diff] [blame] | 55 | dispatcher, err := impl.NewDispatcher(veyron2.GetPrincipal(gctx), state) |
| 56 | if err != nil { |
| 57 | t.Fatalf("NewDispatcher failed: %v", err) |
| 58 | } |
Bogdan Caprita | eed1c47 | 2014-07-02 14:44:54 -0700 | [diff] [blame] | 59 | dontPublishName := "" |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 60 | if err := server.ServeDispatcher(dontPublishName, dispatcher); err != nil { |
Bogdan Caprita | eed1c47 | 2014-07-02 14:44:54 -0700 | [diff] [blame] | 61 | t.Fatalf("Serve(%q) failed: %v", dontPublishName, err) |
Jiri Simsa | 661ebbc | 2014-07-01 13:53:27 -0700 | [diff] [blame] | 62 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 63 | name := naming.JoinAddressName(endpoint, "test") |
Todd Wang | 702385a | 2014-11-07 01:54:08 -0800 | [diff] [blame] | 64 | binary := repository.BinaryClient(name) |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 65 | return binary, endpoint, fmt.Sprintf("http://%s/test", listener.Addr()), func() { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 66 | // Shutdown the binary repository server. |
| 67 | if err := server.Stop(); err != nil { |
| 68 | t.Fatalf("Stop() failed: %v", err) |
| 69 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 70 | cleanup() |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 71 | } |
| 72 | } |
| 73 | |
| 74 | // TestHierarchy checks that the binary repository works correctly for |
| 75 | // all possible valid values of the depth used for the directory |
| 76 | // hierarchy that stores binary objects in the local file system. |
| 77 | func TestHierarchy(t *testing.T) { |
| 78 | for i := 0; i < md5.Size; i++ { |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 79 | binary, ep, _, cleanup := startServer(t, i) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 80 | defer cleanup() |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 81 | data := testData() |
| 82 | |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 83 | // Test the binary repository interface. |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 84 | if err := binary.Create(gctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 85 | t.Fatalf("Create() failed: %v", err) |
| 86 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 87 | if streamErr, err := invokeUpload(t, gctx, binary, data, 0); streamErr != nil || err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 88 | t.FailNow() |
| 89 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 90 | parts, _, err := binary.Stat(gctx) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 91 | if err != nil { |
| 92 | t.Fatalf("Stat() failed: %v", err) |
| 93 | } |
| 94 | h := md5.New() |
| 95 | h.Write(data) |
| 96 | checksum := hex.EncodeToString(h.Sum(nil)) |
| 97 | if expected, got := checksum, parts[0].Checksum; expected != got { |
| 98 | t.Fatalf("Unexpected checksum: expected %v, got %v", expected, got) |
| 99 | } |
| 100 | if expected, got := len(data), int(parts[0].Size); expected != got { |
| 101 | t.Fatalf("Unexpected size: expected %v, got %v", expected, got) |
| 102 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 103 | output, streamErr, err := invokeDownload(t, gctx, binary, 0) |
Jiri Simsa | 518ef15 | 2014-08-08 18:07:55 -0700 | [diff] [blame] | 104 | if streamErr != nil || err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 105 | t.FailNow() |
| 106 | } |
| 107 | if bytes.Compare(output, data) != 0 { |
| 108 | t.Fatalf("Unexpected output: expected %v, got %v", data, output) |
| 109 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 110 | results, err := testutil.GlobName(gctx, naming.JoinAddressName(ep, ""), "...") |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 111 | if err != nil { |
| 112 | t.Fatalf("GlobName failed: %v", err) |
| 113 | } |
| 114 | if expected := []string{"", "test"}; !reflect.DeepEqual(results, expected) { |
| 115 | t.Errorf("Unexpected results: expected %q, got %q", expected, results) |
| 116 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 117 | if err := binary.Delete(gctx); err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 118 | t.Fatalf("Delete() failed: %v", err) |
| 119 | } |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | // TestMultiPart checks that the binary repository supports multi-part |
| 124 | // uploads and downloads ranging the number of parts the test binary |
| 125 | // consists of. |
| 126 | func TestMultiPart(t *testing.T) { |
| 127 | for length := 2; length < 5; length++ { |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 128 | binary, _, _, cleanup := startServer(t, 2) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 129 | defer cleanup() |
| 130 | // Create <length> chunks of up to 4MB of random bytes. |
| 131 | data := make([][]byte, length) |
| 132 | for i := 0; i < length; i++ { |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 133 | data[i] = testData() |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 134 | } |
| 135 | // Test the binary repository interface. |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 136 | if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 137 | t.Fatalf("Create() failed: %v", err) |
| 138 | } |
| 139 | for i := 0; i < length; i++ { |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 140 | if streamErr, err := invokeUpload(t, gctx, binary, data[i], int32(i)); streamErr != nil || err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 141 | t.FailNow() |
| 142 | } |
| 143 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 144 | parts, _, err := binary.Stat(gctx) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 145 | if err != nil { |
| 146 | t.Fatalf("Stat() failed: %v", err) |
| 147 | } |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 148 | for i := 0; i < length; i++ { |
| 149 | hpart := md5.New() |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 150 | output, streamErr, err := invokeDownload(t, gctx, binary, int32(i)) |
Jiri Simsa | 518ef15 | 2014-08-08 18:07:55 -0700 | [diff] [blame] | 151 | if streamErr != nil || err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 152 | t.FailNow() |
| 153 | } |
| 154 | if bytes.Compare(output, data[i]) != 0 { |
| 155 | t.Fatalf("Unexpected output: expected %v, got %v", data[i], output) |
| 156 | } |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 157 | hpart.Write(data[i]) |
| 158 | checksum := hex.EncodeToString(hpart.Sum(nil)) |
| 159 | if expected, got := checksum, parts[i].Checksum; expected != got { |
| 160 | t.Fatalf("Unexpected checksum: expected %v, got %v", expected, got) |
| 161 | } |
| 162 | if expected, got := len(data[i]), int(parts[i].Size); expected != got { |
| 163 | t.Fatalf("Unexpected size: expected %v, got %v", expected, got) |
| 164 | } |
| 165 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 166 | if err := binary.Delete(gctx); err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 167 | t.Fatalf("Delete() failed: %v", err) |
| 168 | } |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | // TestResumption checks that the binary interface supports upload |
| 173 | // resumption ranging the number of parts the uploaded binary consists |
| 174 | // of. |
| 175 | func TestResumption(t *testing.T) { |
| 176 | for length := 2; length < 5; length++ { |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 177 | binary, _, _, cleanup := startServer(t, 2) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 178 | defer cleanup() |
| 179 | // Create <length> chunks of up to 4MB of random bytes. |
| 180 | data := make([][]byte, length) |
| 181 | for i := 0; i < length; i++ { |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 182 | data[i] = testData() |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 183 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 184 | if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 185 | t.Fatalf("Create() failed: %v", err) |
| 186 | } |
| 187 | // Simulate a flaky upload client that keeps uploading parts until |
| 188 | // finished. |
| 189 | for { |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 190 | parts, _, err := binary.Stat(gctx) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 191 | if err != nil { |
| 192 | t.Fatalf("Stat() failed: %v", err) |
| 193 | } |
| 194 | finished := true |
| 195 | for _, part := range parts { |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 196 | finished = finished && (part != impl.MissingPart) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 197 | } |
| 198 | if finished { |
| 199 | break |
| 200 | } |
| 201 | for i := 0; i < length; i++ { |
Jiri Simsa | 01cf937 | 2014-06-30 09:49:55 -0700 | [diff] [blame] | 202 | fail := testutil.Rand.Intn(2) |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 203 | if parts[i] == impl.MissingPart && fail != 0 { |
| 204 | if streamErr, err := invokeUpload(t, gctx, binary, data[i], int32(i)); streamErr != nil || err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 205 | t.FailNow() |
| 206 | } |
| 207 | } |
| 208 | } |
| 209 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 210 | if err := binary.Delete(gctx); err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 211 | t.Fatalf("Delete() failed: %v", err) |
| 212 | } |
| 213 | } |
| 214 | } |
| 215 | |
| 216 | // TestErrors checks that the binary interface correctly reports errors. |
| 217 | func TestErrors(t *testing.T) { |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 218 | binary, _, _, cleanup := startServer(t, 2) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 219 | defer cleanup() |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 220 | const length = 2 |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 221 | data := make([][]byte, length) |
| 222 | for i := 0; i < length; i++ { |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 223 | data[i] = testData() |
| 224 | for j := 0; j < len(data[i]); j++ { |
Jiri Simsa | 01cf937 | 2014-06-30 09:49:55 -0700 | [diff] [blame] | 225 | data[i][j] = byte(testutil.Rand.Int()) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 226 | } |
| 227 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 228 | if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 229 | t.Fatalf("Create() failed: %v", err) |
| 230 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 231 | if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err == nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 232 | t.Fatalf("Create() did not fail when it should have") |
Mike Burrows | d65df96 | 2014-12-17 10:01:19 -0800 | [diff] [blame] | 233 | } else if want := verror.Exist.ID; !verror.Is(err, want) { |
Jiri Simsa | 518ef15 | 2014-08-08 18:07:55 -0700 | [diff] [blame] | 234 | t.Fatalf("Unexpected error: %v, expected error id %v", err, want) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 235 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 236 | if streamErr, err := invokeUpload(t, gctx, binary, data[0], 0); streamErr != nil || err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 237 | t.Fatalf("Upload() failed: %v", err) |
| 238 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 239 | if _, err := invokeUpload(t, gctx, binary, data[0], 0); err == nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 240 | t.Fatalf("Upload() did not fail when it should have") |
Mike Burrows | d65df96 | 2014-12-17 10:01:19 -0800 | [diff] [blame] | 241 | } else if want := verror.Exist.ID; !verror.Is(err, want) { |
Jiri Simsa | 518ef15 | 2014-08-08 18:07:55 -0700 | [diff] [blame] | 242 | t.Fatalf("Unexpected error: %v, expected error id %v", err, want) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 243 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 244 | if _, _, err := invokeDownload(t, gctx, binary, 1); err == nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 245 | t.Fatalf("Download() did not fail when it should have") |
Mike Burrows | d65df96 | 2014-12-17 10:01:19 -0800 | [diff] [blame] | 246 | } else if want := verror.NoExist.ID; !verror.Is(err, want) { |
Jiri Simsa | 518ef15 | 2014-08-08 18:07:55 -0700 | [diff] [blame] | 247 | t.Fatalf("Unexpected error: %v, expected error id %v", err, want) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 248 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 249 | if streamErr, err := invokeUpload(t, gctx, binary, data[1], 1); streamErr != nil || err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 250 | t.Fatalf("Upload() failed: %v", err) |
| 251 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 252 | if _, streamErr, err := invokeDownload(t, gctx, binary, 0); streamErr != nil || err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 253 | t.Fatalf("Download() failed: %v", err) |
| 254 | } |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 255 | // Upload/Download on a part number that's outside the range set forth in |
| 256 | // Create should fail. |
| 257 | for _, part := range []int32{-1, length} { |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 258 | if _, err := invokeUpload(t, gctx, binary, []byte("dummy"), part); err == nil { |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 259 | t.Fatalf("Upload() did not fail when it should have") |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 260 | } else if want := impl.ErrInvalidPart.ID; !verror.Is(err, want) { |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 261 | t.Fatalf("Unexpected error: %v, expected error id %v", err, want) |
| 262 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 263 | if _, _, err := invokeDownload(t, gctx, binary, part); err == nil { |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 264 | t.Fatalf("Download() did not fail when it should have") |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 265 | } else if want := impl.ErrInvalidPart.ID; !verror.Is(err, want) { |
Bogdan Caprita | e783dcc | 2014-11-04 14:16:55 -0800 | [diff] [blame] | 266 | t.Fatalf("Unexpected error: %v, expected error id %v", err, want) |
| 267 | } |
| 268 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 269 | if err := binary.Delete(gctx); err != nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 270 | t.Fatalf("Delete() failed: %v", err) |
| 271 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 272 | if err := binary.Delete(gctx); err == nil { |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 273 | t.Fatalf("Delete() did not fail when it should have") |
Mike Burrows | d65df96 | 2014-12-17 10:01:19 -0800 | [diff] [blame] | 274 | } else if want := verror.NoExist.ID; !verror.Is(err, want) { |
Jiri Simsa | 518ef15 | 2014-08-08 18:07:55 -0700 | [diff] [blame] | 275 | t.Fatalf("Unexpected error: %v, expected error id %v", err, want) |
Jiri Simsa | b04fbb2 | 2014-06-27 17:38:04 -0700 | [diff] [blame] | 276 | } |
| 277 | } |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 278 | |
| 279 | func TestGlob(t *testing.T) { |
| 280 | _, ep, _, cleanup := startServer(t, 2) |
| 281 | defer cleanup() |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 282 | data := testData() |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 283 | |
| 284 | objects := []string{"foo", "bar", "hello world", "a/b/c"} |
| 285 | for _, obj := range objects { |
| 286 | name := naming.JoinAddressName(ep, obj) |
| 287 | binary := repository.BinaryClient(name) |
| 288 | |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 289 | if err := binary.Create(gctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil { |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 290 | t.Fatalf("Create() failed: %v", err) |
| 291 | } |
Robert Kroeger | 586bcb9 | 2015-01-14 17:56:21 -0800 | [diff] [blame] | 292 | if streamErr, err := invokeUpload(t, gctx, binary, data, 0); streamErr != nil || err != nil { |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 293 | t.FailNow() |
| 294 | } |
| 295 | } |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 296 | results, err := testutil.GlobName(gctx, naming.JoinAddressName(ep, ""), "...") |
Robin Thellend | c5856f6 | 2014-11-17 10:30:54 -0800 | [diff] [blame] | 297 | if err != nil { |
| 298 | t.Fatalf("GlobName failed: %v", err) |
| 299 | } |
| 300 | expected := []string{"", "a", "a/b", "a/b/c", "bar", "foo", "hello world"} |
| 301 | if !reflect.DeepEqual(results, expected) { |
| 302 | t.Errorf("Unexpected results: expected %q, got %q", expected, results) |
| 303 | } |
| 304 | } |