@@ -6,6 +6,7 @@ import 'dart:convert';
66import 'dart:io' ;
77import 'dart:typed_data' ;
88
9+ import 'package:_pub_shared/data/advisories_api.dart' ;
910import 'package:_pub_shared/data/package_api.dart' ;
1011import 'package:clock/clock.dart' ;
1112import '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