Skip to content

Commit 05ee255

Browse files
authored
Test synchronizeTarballs (#8231)
1 parent eacba32 commit 05ee255

File tree

1 file changed

+242
-1
lines changed

1 file changed

+242
-1
lines changed

app/test/package/api_export/exported_api_test.dart

Lines changed: 242 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:convert';
66
import 'dart:io';
77
import 'dart:typed_data';
88

9+
import 'package:_pub_shared/data/advisories_api.dart';
910
import 'package:_pub_shared/data/package_api.dart';
1011
import 'package:clock/clock.dart';
1112
import 'package:gcloud/storage.dart';
@@ -30,6 +31,164 @@ void main() {
3031
versions: [],
3132
);
3233

34+
final retryPkgData2 = PackageData(
35+
name: 'retry',
36+
latest: VersionInfo(
37+
version: '1.2.3',
38+
retracted: false,
39+
pubspec: {},
40+
archiveUrl: '-',
41+
archiveSha256: '-',
42+
published: clock.now(),
43+
),
44+
versions: [
45+
VersionInfo(
46+
version: '1.2.3',
47+
retracted: false,
48+
pubspec: {},
49+
archiveUrl: '-',
50+
archiveSha256: '-',
51+
published: clock.now(),
52+
)
53+
],
54+
);
55+
56+
final retryAdvisoryData1 = ListAdvisoriesResponse(
57+
advisories: [],
58+
);
59+
60+
testWithProfile('ExportedApi.package().versions/advisories', fn: () async {
61+
await storageService.createBucket('exported-api');
62+
final bucket = storageService.bucket('exported-api');
63+
final exportedApi = ExportedApi(storageService, bucket);
64+
65+
// Check that we can write JSON files
66+
await exportedApi.package('retry').versions.write(retryPkgData1);
67+
await exportedApi.package('retry').advisories.write(retryAdvisoryData1);
68+
69+
// Check contents of the files
70+
expect(
71+
await bucket.readGzippedJson('latest/api/packages/retry'),
72+
json.decode(json.encode(retryPkgData1.toJson())),
73+
);
74+
expect(
75+
await bucket.readGzippedJson('latest/api/packages/retry/advisories'),
76+
json.decode(json.encode(retryAdvisoryData1.toJson())),
77+
);
78+
79+
// Check that we can update JSON files
80+
await exportedApi.package('retry').versions.write(retryPkgData2);
81+
expect(
82+
await bucket.readGzippedJson('latest/api/packages/retry'),
83+
json.decode(json.encode(retryPkgData2.toJson())),
84+
);
85+
86+
// CHeck that we can delete files
87+
await exportedApi.package('retry').versions.delete();
88+
await exportedApi.package('retry').advisories.delete();
89+
expect(
90+
await bucket.readGzippedJson('latest/api/packages/retry'),
91+
isNull,
92+
);
93+
expect(
94+
await bucket.readGzippedJson('latest/api/packages/retry/advisories'),
95+
isNull,
96+
);
97+
});
98+
99+
testWithProfile('ExportedApi.package().tarball().write/copyFrom',
100+
fn: () async {
101+
await storageService.createBucket('exported-api');
102+
final bucket = storageService.bucket('exported-api');
103+
final exportedApi = ExportedApi(storageService, bucket);
104+
105+
// Check that we can write tarballs
106+
await exportedApi.package('retry').tarball('1.2.3').write([1, 2, 3]);
107+
// Check that we can copy tarballs
108+
await exportedApi.package('retry').tarball('1.2.4').copyFrom(
109+
SourceObjectInfo.fromObjectInfo(
110+
bucket,
111+
await bucket.info('latest/api/archives/retry-1.2.3.tar.gz'),
112+
),
113+
);
114+
115+
// Check files created
116+
expect(
117+
await bucket.readBytes('latest/api/archives/retry-1.2.3.tar.gz'),
118+
[1, 2, 3],
119+
);
120+
expect(
121+
await bucket.readBytes('latest/api/archives/retry-1.2.4.tar.gz'),
122+
[1, 2, 3],
123+
);
124+
125+
// Check that we can update tarballs, but writing or copying
126+
await exportedApi.package('retry').tarball('1.2.3').write([1, 2, 4]);
127+
await exportedApi.package('retry').tarball('1.2.4').copyFrom(
128+
SourceObjectInfo.fromObjectInfo(
129+
bucket,
130+
await bucket.info('latest/api/archives/retry-1.2.3.tar.gz'),
131+
),
132+
);
133+
134+
// Check files are updated
135+
expect(
136+
await bucket.readBytes('latest/api/archives/retry-1.2.3.tar.gz'),
137+
[1, 2, 4],
138+
);
139+
expect(
140+
await bucket.readBytes('latest/api/archives/retry-1.2.4.tar.gz'),
141+
[1, 2, 4],
142+
);
143+
144+
// Check that we can delete files
145+
await exportedApi.package('retry').tarball('1.2.3').delete();
146+
await exportedApi.package('retry').tarball('1.2.4').delete();
147+
expect(
148+
await bucket.readBytes('latest/api/archives/retry-1.2.3.tar.gz'),
149+
isNull,
150+
);
151+
expect(
152+
await bucket.readBytes('latest/api/archives/retry-1.2.4.tar.gz'),
153+
isNull,
154+
);
155+
});
156+
157+
testWithProfile('ExportedApi.package().tarball() version encoding',
158+
fn: () async {
159+
await storageService.createBucket('exported-api');
160+
final bucket = storageService.bucket('exported-api');
161+
final exportedApi = ExportedApi(storageService, bucket);
162+
163+
await exportedApi.package('_foo').tarball('1.2.3').write([1, 2, 3]);
164+
await exportedApi.package('_foo').tarball('1.2.3-dev+2').copyFrom(
165+
SourceObjectInfo.fromObjectInfo(
166+
bucket,
167+
await bucket.info('latest/api/archives/_foo-1.2.3.tar.gz'),
168+
),
169+
);
170+
await exportedApi.package('_foo').tarball('1.2.3-d.tar.gz').write([42]);
171+
await exportedApi.package('_foo').tarball('1.2.3-d+4.tar.gz').write([42]);
172+
173+
expect(
174+
await bucket.readBytes('latest/api/archives/_foo-1.2.3.tar.gz'),
175+
[1, 2, 3],
176+
);
177+
expect(
178+
await bucket.readBytes('latest/api/archives/_foo-1.2.3-dev%2B2.tar.gz'),
179+
[1, 2, 3],
180+
);
181+
expect(
182+
await bucket.readBytes('latest/api/archives/_foo-1.2.3-d.tar.gz.tar.gz'),
183+
[42],
184+
);
185+
expect(
186+
await bucket
187+
.readBytes('latest/api/archives/_foo-1.2.3-d%2B4.tar.gz.tar.gz'),
188+
[42],
189+
);
190+
});
191+
33192
testWithFakeTime('ExportedApi.garbageCollect()', (fakeTime) async {
34193
await storageService.createBucket('exported-api');
35194
final bucket = storageService.bucket('exported-api');
@@ -97,7 +256,89 @@ void main() {
97256
}
98257
});
99258

100-
testWithFakeTime('ExportedApi.garbageCollect()', (fakeTime) async {
259+
testWithFakeTime('ExportedApi.package().synchronizeTarballs()',
260+
(fakeTime) async {
261+
await storageService.createBucket('exported-api');
262+
final bucket = storageService.bucket('exported-api');
263+
final exportedApi = ExportedApi(storageService, bucket);
264+
265+
await storageService.createBucket('canonical-packages');
266+
final canonical = storageService.bucket('canonical-packages');
267+
268+
final src1 = SourceObjectInfo.fromObjectInfo(
269+
canonical,
270+
await canonical.writeBytes('packages/retry-1.0.0.tar.gz', [1, 0, 0]),
271+
);
272+
final src2 = SourceObjectInfo.fromObjectInfo(
273+
canonical,
274+
await canonical.writeBytes('packages/retry-2.0.0.tar.gz', [2, 0, 0]),
275+
);
276+
final src3 = SourceObjectInfo.fromObjectInfo(
277+
canonical,
278+
await canonical.writeBytes('packages/retry-3.0.0+1.tar.gz', [3, 0, 0]),
279+
);
280+
281+
await exportedApi.package('retry').tarball('1.0.0').copyFrom(src1);
282+
await exportedApi.package('retry').tarball('1.0.5').copyFrom(src2);
283+
284+
expect(
285+
await bucket.readBytes('latest/api/archives/retry-1.0.0.tar.gz'),
286+
[1, 0, 0],
287+
);
288+
expect(
289+
await bucket.readBytes('latest/api/archives/retry-1.0.5.tar.gz'),
290+
[2, 0, 0],
291+
);
292+
293+
await exportedApi.package('retry').synchronizeTarballs({
294+
'1.0.0': src1,
295+
'2.0.0': src2,
296+
'3.0.0+1': src3,
297+
});
298+
299+
expect(
300+
await bucket.readBytes('latest/api/archives/retry-1.0.0.tar.gz'),
301+
[1, 0, 0],
302+
);
303+
expect(
304+
await bucket.readBytes('latest/api/archives/retry-1.0.5.tar.gz'),
305+
[2, 0, 0],
306+
);
307+
expect(
308+
await bucket.readBytes('latest/api/archives/retry-2.0.0.tar.gz'),
309+
[2, 0, 0],
310+
);
311+
expect(
312+
await bucket.readBytes('latest/api/archives/retry-3.0.0%2B1.tar.gz'),
313+
[3, 0, 0],
314+
);
315+
316+
fakeTime.elapseSync(days: 2);
317+
318+
await exportedApi.package('retry').synchronizeTarballs({
319+
'1.0.0': src1,
320+
'2.0.0': src2,
321+
'3.0.0+1': src3,
322+
});
323+
expect(
324+
await bucket.readBytes('latest/api/archives/retry-1.0.0.tar.gz'),
325+
[1, 0, 0],
326+
);
327+
expect(
328+
await bucket.readBytes('latest/api/archives/retry-1.0.5.tar.gz'),
329+
isNull,
330+
);
331+
expect(
332+
await bucket.readBytes('latest/api/archives/retry-2.0.0.tar.gz'),
333+
[2, 0, 0],
334+
);
335+
expect(
336+
await bucket.readBytes('latest/api/archives/retry-3.0.0%2B1.tar.gz'),
337+
[3, 0, 0],
338+
);
339+
});
340+
341+
testWithFakeTime('ExportedApi.package().garbageCollect()', (fakeTime) async {
101342
await storageService.createBucket('exported-api');
102343
final bucket = storageService.bucket('exported-api');
103344
final exportedApi = ExportedApi(storageService, bucket);

0 commit comments

Comments
 (0)