xref: /expo/apps/test-suite/tests/FileSystem.js (revision 2bd74c95)
1740b3867SJames Ide'use strict';
2740b3867SJames Ide
3740b3867SJames Ideexport const name = 'FileSystem';
4740b3867SJames Ide
5*2bd74c95SEvan Baconimport { FileSystem as FS, Asset } from 'expo';
6740b3867SJames Ideimport { CameraRoll } from 'react-native';
7740b3867SJames Ide
8740b3867SJames Ideexport function test(t) {
9740b3867SJames Ide  t.describe('FileSystem', () => {
10740b3867SJames Ide    const throws = async run => {
11740b3867SJames Ide      let error = null;
12740b3867SJames Ide      try {
13740b3867SJames Ide        await run();
14740b3867SJames Ide      } catch (e) {
15740b3867SJames Ide        // Uncomment to log error message.
16740b3867SJames Ide        // const func = run.toString().match(/[A-Za-z]+\(/)[0].slice(0, -1);
17740b3867SJames Ide        // console.log(`${func}: ${e.message}`);
18740b3867SJames Ide        error = e;
19740b3867SJames Ide      }
20740b3867SJames Ide      t.expect(error).toBeTruthy();
21740b3867SJames Ide    };
22740b3867SJames Ide
23740b3867SJames Ide    /*t.it(
24740b3867SJames Ide      'delete(idempotent) -> !exists -> download(md5, uri) -> exists ' + '-> delete -> !exists',
25740b3867SJames Ide      async () => {
26740b3867SJames Ide        const localUri = FS.documentDirectory + 'download1.png';
27740b3867SJames Ide
28740b3867SJames Ide        const assertExists = async expectedToExist => {
29740b3867SJames Ide          let { exists } = await FS.getInfoAsync(localUri);
30740b3867SJames Ide          if (expectedToExist) {
31740b3867SJames Ide            t.expect(exists).toBeTruthy();
32740b3867SJames Ide          } else {
33740b3867SJames Ide            t.expect(exists).not.toBeTruthy();
34740b3867SJames Ide          }
35740b3867SJames Ide        };
36740b3867SJames Ide
37740b3867SJames Ide        await FS.deleteAsync(localUri, { idempotent: true });
38740b3867SJames Ide        await assertExists(false);
39740b3867SJames Ide
40740b3867SJames Ide        const {
41740b3867SJames Ide          md5,
42740b3867SJames Ide          uri,
43740b3867SJames Ide          headers,
44740b3867SJames Ide        } = await FS.downloadAsync(
45740b3867SJames Ide          'https://s3-us-west-1.amazonaws.com/test-suite-data/avatar2.png',
46740b3867SJames Ide          localUri,
47740b3867SJames Ide          { md5: true }
48740b3867SJames Ide        );
49740b3867SJames Ide        t.expect(md5).toBe('1e02045c10b8f1145edc7c8375998f87');
50740b3867SJames Ide        await assertExists(true);
51740b3867SJames Ide        t.expect(headers['Content-Type']).toBe('image/png');
52740b3867SJames Ide
53740b3867SJames Ide        await FS.deleteAsync(localUri);
54740b3867SJames Ide        await assertExists(false);
55740b3867SJames Ide      },
56740b3867SJames Ide      9000
57740b3867SJames Ide    );*/
58740b3867SJames Ide
59*2bd74c95SEvan Bacon    t.it('Can read/write Base64', async () => {
60*2bd74c95SEvan Bacon      const asset = await Asset.fromModule(require('../assets/icons/app.png'));
61*2bd74c95SEvan Bacon      await asset.downloadAsync();
62*2bd74c95SEvan Bacon
63*2bd74c95SEvan Bacon      let startingPosition = 0;
64*2bd74c95SEvan Bacon
65*2bd74c95SEvan Bacon      for (let i = 0; i < 3; i++) {
66*2bd74c95SEvan Bacon        const options = {
67*2bd74c95SEvan Bacon          encoding: FS.EncodingTypes.Base64,
68*2bd74c95SEvan Bacon          position: i,
69*2bd74c95SEvan Bacon          length: i + 1,
70*2bd74c95SEvan Bacon        };
71*2bd74c95SEvan Bacon
72*2bd74c95SEvan Bacon        const b64 = await FS.readAsStringAsync(asset.localUri, options);
73*2bd74c95SEvan Bacon        t.expect(b64).toBeDefined();
74*2bd74c95SEvan Bacon        t.expect(typeof b64).toBe('string');
75*2bd74c95SEvan Bacon        t.expect(b64.split('') % 4).toBe(0);
76*2bd74c95SEvan Bacon
77*2bd74c95SEvan Bacon        const localUri = FS.documentDirectory + 'b64.png';
78*2bd74c95SEvan Bacon
79*2bd74c95SEvan Bacon        await FS.writeAsStringAsync(localUri, b64, options);
80*2bd74c95SEvan Bacon
81*2bd74c95SEvan Bacon        t.expect(await FS.readAsStringAsync(localUri, options)).toBe(b64);
82*2bd74c95SEvan Bacon      }
83*2bd74c95SEvan Bacon    });
84*2bd74c95SEvan Bacon
85740b3867SJames Ide    t.it('delete(idempotent) -> delete[error]', async () => {
86740b3867SJames Ide      const localUri = FS.documentDirectory + 'willDelete.png';
87740b3867SJames Ide
88740b3867SJames Ide      await FS.deleteAsync(localUri, { idempotent: true });
89740b3867SJames Ide
90740b3867SJames Ide      let error;
91740b3867SJames Ide      try {
92740b3867SJames Ide        await FS.deleteAsync(localUri);
93740b3867SJames Ide      } catch (e) {
94740b3867SJames Ide        error = e;
95740b3867SJames Ide      }
96740b3867SJames Ide      t.expect(error.message).toMatch(/not.*found/);
97740b3867SJames Ide    });
98740b3867SJames Ide
99740b3867SJames Ide    /*t.it(
100740b3867SJames Ide      'download(md5, uri) -> read -> delete -> !exists -> read[error]',
101740b3867SJames Ide      async () => {
102740b3867SJames Ide        const localUri = FS.documentDirectory + 'download1.txt';
103740b3867SJames Ide
104740b3867SJames Ide        const {
105740b3867SJames Ide          md5,
106740b3867SJames Ide          uri,
107740b3867SJames Ide        } = await FS.downloadAsync(
108740b3867SJames Ide          'https://s3-us-west-1.amazonaws.com/test-suite-data/text-file.txt',
109740b3867SJames Ide          localUri,
110740b3867SJames Ide          { md5: true }
111740b3867SJames Ide        );
112740b3867SJames Ide        t.expect(md5).toBe('86d73d2f11e507365f7ea8e7ec3cc4cb');
113740b3867SJames Ide
114740b3867SJames Ide        const string = await FS.readAsStringAsync(localUri);
115740b3867SJames Ide        t.expect(string).toBe('hello, world\nthis is a test file\n');
116740b3867SJames Ide
117740b3867SJames Ide        await FS.deleteAsync(localUri, { idempotent: true });
118740b3867SJames Ide
119740b3867SJames Ide        let error;
120740b3867SJames Ide        try {
121740b3867SJames Ide          await FS.readAsStringAsync(localUri);
122740b3867SJames Ide        } catch (e) {
123740b3867SJames Ide          error = e;
124740b3867SJames Ide        }
125740b3867SJames Ide        t.expect(error).toBeTruthy();
126740b3867SJames Ide      },
127740b3867SJames Ide      9000
128740b3867SJames Ide    );*/
129740b3867SJames Ide
130740b3867SJames Ide    t.it('delete(idempotent) -> !exists -> write -> read -> write -> read', async () => {
131740b3867SJames Ide      const localUri = FS.documentDirectory + 'write1.txt';
132740b3867SJames Ide
133740b3867SJames Ide      await FS.deleteAsync(localUri, { idempotent: true });
134740b3867SJames Ide
135740b3867SJames Ide      const { exists } = await FS.getInfoAsync(localUri);
136740b3867SJames Ide      t.expect(exists).not.toBeTruthy();
137740b3867SJames Ide
138740b3867SJames Ide      const writeAndVerify = async expected => {
139740b3867SJames Ide        await FS.writeAsStringAsync(localUri, expected);
140740b3867SJames Ide        const string = await FS.readAsStringAsync(localUri);
141740b3867SJames Ide        t.expect(string).toBe(expected);
142740b3867SJames Ide      };
143740b3867SJames Ide
144740b3867SJames Ide      await writeAndVerify('hello, world');
145740b3867SJames Ide      await writeAndVerify('hello, world!!!!!!');
146740b3867SJames Ide    });
147740b3867SJames Ide
148740b3867SJames Ide    t.it('delete(new) -> 2 * [write -> move -> !exists(orig) -> read(new)]', async () => {
149740b3867SJames Ide      const from = FS.documentDirectory + 'from.txt';
150740b3867SJames Ide      const to = FS.documentDirectory + 'to.txt';
151740b3867SJames Ide      const contents = ['contents 1', 'contents 2'];
152740b3867SJames Ide
153740b3867SJames Ide      await FS.deleteAsync(to, { idempotent: true });
154740b3867SJames Ide
155740b3867SJames Ide      // Move twice to make sure we can overwrite
156740b3867SJames Ide      for (let i = 0; i < 2; ++i) {
157740b3867SJames Ide        await FS.writeAsStringAsync(from, contents[i]);
158740b3867SJames Ide
159740b3867SJames Ide        await FS.moveAsync({ from, to });
160740b3867SJames Ide
161740b3867SJames Ide        const { exists } = await FS.getInfoAsync(from);
162740b3867SJames Ide        t.expect(exists).not.toBeTruthy();
163740b3867SJames Ide
164740b3867SJames Ide        t.expect(await FS.readAsStringAsync(to)).toBe(contents[i]);
165740b3867SJames Ide      }
166740b3867SJames Ide    });
167740b3867SJames Ide
168740b3867SJames Ide    t.it('delete(new) -> 2 * [write -> copy -> exists(orig) -> read(new)]', async () => {
169740b3867SJames Ide      const from = FS.documentDirectory + 'from.txt';
170740b3867SJames Ide      const to = FS.documentDirectory + 'to.txt';
171740b3867SJames Ide      const contents = ['contents 1', 'contents 2'];
172740b3867SJames Ide
173740b3867SJames Ide      await FS.deleteAsync(to, { idempotent: true });
174740b3867SJames Ide
175740b3867SJames Ide      // Copy twice to make sure we can overwrite
176740b3867SJames Ide      for (let i = 0; i < 2; ++i) {
177740b3867SJames Ide        await FS.writeAsStringAsync(from, contents[i]);
178740b3867SJames Ide
179740b3867SJames Ide        await FS.copyAsync({ from, to });
180740b3867SJames Ide
181740b3867SJames Ide        const { exists } = await FS.getInfoAsync(from);
182740b3867SJames Ide        t.expect(exists).toBeTruthy();
183740b3867SJames Ide
184740b3867SJames Ide        t.expect(await FS.readAsStringAsync(to)).toBe(contents[i]);
185740b3867SJames Ide      }
186740b3867SJames Ide    });
187740b3867SJames Ide
188740b3867SJames Ide    t.it(
189740b3867SJames Ide      'delete(dir) -> write(dir/file)[error] -> mkdir(dir) ->' +
190740b3867SJames Ide        'mkdir(dir)[error] -> write(dir/file) -> read',
191740b3867SJames Ide      async () => {
192740b3867SJames Ide        let error;
193740b3867SJames Ide        const path = FS.documentDirectory + 'dir/file';
194740b3867SJames Ide        const dir = FS.documentDirectory + 'dir';
195740b3867SJames Ide        const contents = 'hello, world';
196740b3867SJames Ide
197740b3867SJames Ide        await FS.deleteAsync(dir, { idempotent: true });
198740b3867SJames Ide
199740b3867SJames Ide        error = null;
200740b3867SJames Ide        try {
201740b3867SJames Ide          await FS.writeAsStringAsync(path, contents);
202740b3867SJames Ide        } catch (e) {
203740b3867SJames Ide          error = e;
204740b3867SJames Ide        }
205740b3867SJames Ide        t.expect(error).toBeTruthy();
206740b3867SJames Ide
207740b3867SJames Ide        await FS.makeDirectoryAsync(dir);
208740b3867SJames Ide
209740b3867SJames Ide        error = null;
210740b3867SJames Ide        try {
211740b3867SJames Ide          await FS.makeDirectoryAsync(dir);
212740b3867SJames Ide        } catch (e) {
213740b3867SJames Ide          error = e;
214740b3867SJames Ide        }
215740b3867SJames Ide        t.expect(error).toBeTruthy();
216740b3867SJames Ide
217740b3867SJames Ide        await FS.writeAsStringAsync(path, contents);
218740b3867SJames Ide
219740b3867SJames Ide        t.expect(await FS.readAsStringAsync(path)).toBe(contents);
220740b3867SJames Ide      }
221740b3867SJames Ide    );
222740b3867SJames Ide
223740b3867SJames Ide    t.it(
224740b3867SJames Ide      'delete(dir) -> write(dir/dir2/file)[error] -> ' +
225740b3867SJames Ide        'mkdir(dir/dir2, intermediates) -> ' +
226740b3867SJames Ide        'mkdir(dir/dir2, intermediates) -> write(dir/dir2/file) -> read',
227740b3867SJames Ide      async () => {
228740b3867SJames Ide        let error;
229740b3867SJames Ide        const path = FS.documentDirectory + 'dir/dir2/file';
230740b3867SJames Ide        const dir = FS.documentDirectory + 'dir/dir2';
231740b3867SJames Ide        const contents = 'hello, world';
232740b3867SJames Ide
233740b3867SJames Ide        await FS.deleteAsync(dir, { idempotent: true });
234740b3867SJames Ide
235740b3867SJames Ide        error = null;
236740b3867SJames Ide        try {
237740b3867SJames Ide          await FS.writeAsStringAsync(path, contents);
238740b3867SJames Ide        } catch (e) {
239740b3867SJames Ide          error = e;
240740b3867SJames Ide        }
241740b3867SJames Ide        t.expect(error).toBeTruthy();
242740b3867SJames Ide
243740b3867SJames Ide        await FS.makeDirectoryAsync(dir, {
244740b3867SJames Ide          intermediates: true,
245740b3867SJames Ide        });
246740b3867SJames Ide
247740b3867SJames Ide        error = null;
248740b3867SJames Ide        try {
249740b3867SJames Ide          await FS.makeDirectoryAsync(dir);
250740b3867SJames Ide        } catch (e) {
251740b3867SJames Ide          error = e;
252740b3867SJames Ide        }
253740b3867SJames Ide        t.expect(error).toBeTruthy();
254740b3867SJames Ide
255740b3867SJames Ide        await FS.writeAsStringAsync(path, contents);
256740b3867SJames Ide
257740b3867SJames Ide        t.expect(await FS.readAsStringAsync(path)).toBe(contents);
258740b3867SJames Ide      }
259740b3867SJames Ide    );
260740b3867SJames Ide
261740b3867SJames Ide    t.it(
262740b3867SJames Ide      'delete(dir, idempotent) -> make tree -> check contents ' +
263740b3867SJames Ide        '-> check directory listings' +
264740b3867SJames Ide        '-> move -> check directory listings' +
265740b3867SJames Ide        '-> copy -> check directory listings',
266740b3867SJames Ide      async () => {
267740b3867SJames Ide        let error;
268740b3867SJames Ide        const dir = FS.documentDirectory + 'dir';
269740b3867SJames Ide
270740b3867SJames Ide        await FS.deleteAsync(dir, { idempotent: true });
271740b3867SJames Ide
272740b3867SJames Ide        await FS.makeDirectoryAsync(dir + '/child1', {
273740b3867SJames Ide          intermediates: true,
274740b3867SJames Ide        });
275740b3867SJames Ide        await FS.makeDirectoryAsync(dir + '/child2', {
276740b3867SJames Ide          intermediates: true,
277740b3867SJames Ide        });
278740b3867SJames Ide
279740b3867SJames Ide        await FS.writeAsStringAsync(dir + '/file1', 'contents1');
280740b3867SJames Ide        await FS.writeAsStringAsync(dir + '/file2', 'contents2');
281740b3867SJames Ide
282740b3867SJames Ide        await FS.writeAsStringAsync(dir + '/child1/file3', 'contents3');
283740b3867SJames Ide
284740b3867SJames Ide        await FS.writeAsStringAsync(dir + '/child2/file4', 'contents4');
285740b3867SJames Ide        await FS.writeAsStringAsync(dir + '/child2/file5', 'contents5');
286740b3867SJames Ide
287740b3867SJames Ide        const checkContents = async (path, contents) =>
288740b3867SJames Ide          t.expect(await FS.readAsStringAsync(path)).toBe(contents);
289740b3867SJames Ide
290740b3867SJames Ide        await checkContents(dir + '/file1', 'contents1');
291740b3867SJames Ide        await checkContents(dir + '/file2', 'contents2');
292740b3867SJames Ide        await checkContents(dir + '/child1/file3', 'contents3');
293740b3867SJames Ide        await checkContents(dir + '/child2/file4', 'contents4');
294740b3867SJames Ide        await checkContents(dir + '/child2/file5', 'contents5');
295740b3867SJames Ide
296740b3867SJames Ide        const checkDirectory = async (path, expected) => {
297740b3867SJames Ide          const list = await FS.readDirectoryAsync(path);
298740b3867SJames Ide          t.expect(list.sort()).toEqual(expected.sort());
299740b3867SJames Ide        };
300740b3867SJames Ide
301740b3867SJames Ide        const checkRoot = async root => {
302740b3867SJames Ide          await checkDirectory(root, ['file1', 'file2', 'child1', 'child2']);
303740b3867SJames Ide          await checkDirectory(root + '/child1', ['file3']);
304740b3867SJames Ide          await checkDirectory(root + '/child2', ['file4', 'file5']);
305740b3867SJames Ide
306740b3867SJames Ide          error = null;
307740b3867SJames Ide          try {
308740b3867SJames Ide            await checkDirectory(root + '/file1', ['nope']);
309740b3867SJames Ide          } catch (e) {
310740b3867SJames Ide            error = e;
311740b3867SJames Ide          }
312740b3867SJames Ide          t.expect(error).toBeTruthy();
313740b3867SJames Ide        };
314740b3867SJames Ide
315740b3867SJames Ide        await checkRoot(dir);
316740b3867SJames Ide
317740b3867SJames Ide        await FS.deleteAsync(FS.documentDirectory + 'moved', {
318740b3867SJames Ide          idempotent: true,
319740b3867SJames Ide        });
320740b3867SJames Ide        await FS.moveAsync({ from: dir, to: FS.documentDirectory + 'moved' });
321740b3867SJames Ide        await checkRoot(FS.documentDirectory + 'moved');
322740b3867SJames Ide        await FS.copyAsync({
323740b3867SJames Ide          from: FS.documentDirectory + 'moved',
324740b3867SJames Ide          to: FS.documentDirectory + 'copied',
325740b3867SJames Ide        });
326740b3867SJames Ide        await checkRoot(FS.documentDirectory + 'copied');
327740b3867SJames Ide      }
328740b3867SJames Ide    );
329740b3867SJames Ide
330740b3867SJames Ide    t.it(
331740b3867SJames Ide      'delete(idempotent) -> download(md5) -> getInfo(size)',
332740b3867SJames Ide      async () => {
333740b3867SJames Ide        const localUri = FS.documentDirectory + 'download1.png';
334740b3867SJames Ide
335740b3867SJames Ide        await FS.deleteAsync(localUri, { idempotent: true });
336740b3867SJames Ide
337740b3867SJames Ide        const {
338740b3867SJames Ide          md5,
339740b3867SJames Ide        } = await FS.downloadAsync(
340740b3867SJames Ide          'https://s3-us-west-1.amazonaws.com/test-suite-data/avatar2.png',
341740b3867SJames Ide          localUri,
342740b3867SJames Ide          { md5: true }
343740b3867SJames Ide        );
344740b3867SJames Ide        t.expect(md5).toBe('1e02045c10b8f1145edc7c8375998f87');
345740b3867SJames Ide
346740b3867SJames Ide        const { size, modificationTime } = await FS.getInfoAsync(localUri);
347740b3867SJames Ide        t.expect(size).toBe(3230);
348740b3867SJames Ide        const nowTime = 0.001 * new Date().getTime();
349740b3867SJames Ide        t.expect(nowTime - modificationTime).toBeLessThan(3600);
350740b3867SJames Ide
351740b3867SJames Ide        await FS.deleteAsync(localUri);
352740b3867SJames Ide      },
353740b3867SJames Ide      9000
354740b3867SJames Ide    );
355740b3867SJames Ide
356740b3867SJames Ide    t.it('throws out-of-scope exceptions', async () => {
357740b3867SJames Ide      const p = FS.documentDirectory;
358740b3867SJames Ide
359740b3867SJames Ide      await throws(() => FS.getInfoAsync(p + '../hello/world'));
360740b3867SJames Ide      await throws(() => FS.readAsStringAsync(p + '../hello/world'));
361740b3867SJames Ide      await throws(() => FS.writeAsStringAsync(p + '../hello/world', ''));
362740b3867SJames Ide      await throws(() => FS.deleteAsync(p + '../hello/world'));
363740b3867SJames Ide      await throws(() => FS.deleteAsync(p));
364740b3867SJames Ide      await throws(() => FS.deleteAsync(FS.cacheDirectory));
365740b3867SJames Ide      await throws(() => FS.moveAsync({ from: p + '../a/b', to: 'c' }));
366740b3867SJames Ide      await throws(() => FS.moveAsync({ from: 'c', to: p + '../a/b' }));
367740b3867SJames Ide      await throws(() => FS.copyAsync({ from: p + '../a/b', to: 'c' }));
368740b3867SJames Ide      await throws(() => FS.copyAsync({ from: 'c', to: p + '../a/b' }));
369740b3867SJames Ide      await throws(() => FS.makeDirectoryAsync(p + '../hello/world'));
370740b3867SJames Ide      await throws(() => FS.readDirectoryAsync(p + '../hello/world'));
371740b3867SJames Ide      await throws(() => FS.downloadAsync('http://www.google.com', p + '../hello/world'));
372740b3867SJames Ide      await throws(() => FS.readDirectoryAsync(p + '../'));
373740b3867SJames Ide      await throws(() => FS.downloadAsync('http://www.google.com', p + '../hello/world'));
374740b3867SJames Ide    });
375740b3867SJames Ide
376740b3867SJames Ide    t.it('missing parameters', async () => {
377740b3867SJames Ide      const p = FS.documentDirectory + 'test';
378740b3867SJames Ide
379740b3867SJames Ide      await throws(() => FS.moveAsync({ from: p }));
380740b3867SJames Ide      await throws(() => FS.moveAsync({ to: p }));
381740b3867SJames Ide      await throws(() => FS.copyAsync({ from: p }));
382740b3867SJames Ide      await throws(() => FS.copyAsync({ to: p }));
383740b3867SJames Ide    });
384740b3867SJames Ide
385740b3867SJames Ide    t.it('can read root directories', async () => {
386740b3867SJames Ide      await FS.readDirectoryAsync(FS.documentDirectory);
387740b3867SJames Ide      await FS.readDirectoryAsync(FS.cacheDirectory);
388740b3867SJames Ide    });
389740b3867SJames Ide
390740b3867SJames Ide    /*t.it('can copy from `CameraRoll`, verify hash, other methods restricted', async () => {
391740b3867SJames Ide      await Promise.all(
392740b3867SJames Ide        (await CameraRoll.getPhotos({
393740b3867SJames Ide          first: 1,
394740b3867SJames Ide        })).edges.map(async ({ node: { image: { uri: cameraRollUri } } }) => {
395740b3867SJames Ide          const destinationUri = FS.documentDirectory + 'photo.jpg';
396740b3867SJames Ide
397740b3867SJames Ide          await throws(() => FS.readAsStringAsync(cameraRollUri));
398740b3867SJames Ide          await throws(() => FS.writeAsStringAsync(cameraRollUri));
399740b3867SJames Ide          await throws(() => FS.deleteAsync(cameraRollUri));
400740b3867SJames Ide          await throws(() => FS.moveAsync({ from: cameraRollUri, to: destinationUri }));
401740b3867SJames Ide          await throws(() => FS.copyAsync({ from: destinationUri, to: cameraRollUri }));
402740b3867SJames Ide          await throws(() => FS.makeDirectoryAsync(cameraRollUri));
403740b3867SJames Ide          await throws(() => FS.readDirectoryAsync(cameraRollUri));
404740b3867SJames Ide          await throws(() => FS.downloadAsync('http://www.google.com', cameraRollUri));
405740b3867SJames Ide
406740b3867SJames Ide          await FS.copyAsync({ from: cameraRollUri, to: destinationUri });
407740b3867SJames Ide
408740b3867SJames Ide          const origInfo = await FS.getInfoAsync(cameraRollUri, {
409740b3867SJames Ide            size: true,
410740b3867SJames Ide            md5: true,
411740b3867SJames Ide          });
412740b3867SJames Ide          const copyInfo = await FS.getInfoAsync(destinationUri, {
413740b3867SJames Ide            size: true,
414740b3867SJames Ide            md5: true,
415740b3867SJames Ide          });
416740b3867SJames Ide
417740b3867SJames Ide          t.expect(origInfo.md5).toEqual(copyInfo.md5);
418740b3867SJames Ide          t.expect(origInfo.size).toEqual(copyInfo.size);
419740b3867SJames Ide        })
420740b3867SJames Ide      );
421740b3867SJames Ide    });*/
422740b3867SJames Ide
423740b3867SJames Ide    t.it(
424740b3867SJames Ide      'download(network failure)',
425740b3867SJames Ide      async () => {
426740b3867SJames Ide        const localUri = FS.documentDirectory + 'download1.png';
427740b3867SJames Ide
428740b3867SJames Ide        const assertExists = async expectedToExist => {
429740b3867SJames Ide          let { exists } = await FS.getInfoAsync(localUri);
430740b3867SJames Ide          if (expectedToExist) {
431740b3867SJames Ide            t.expect(exists).toBeTruthy();
432740b3867SJames Ide          } else {
433740b3867SJames Ide            t.expect(exists).not.toBeTruthy();
434740b3867SJames Ide          }
435740b3867SJames Ide        };
436740b3867SJames Ide
437740b3867SJames Ide        await FS.deleteAsync(localUri, { idempotent: true });
438740b3867SJames Ide        await assertExists(false);
439740b3867SJames Ide
440740b3867SJames Ide        let error;
441740b3867SJames Ide        try {
442740b3867SJames Ide          const { md5, uri } = await FS.downloadAsync(
443740b3867SJames Ide            'https://nonexistent-subdomain.expo.io',
444740b3867SJames Ide            localUri,
445740b3867SJames Ide            { md5: true }
446740b3867SJames Ide          );
447740b3867SJames Ide        } catch (e) {
448740b3867SJames Ide          error = e;
449740b3867SJames Ide        }
450740b3867SJames Ide        t.expect(error).toBeTruthy();
451740b3867SJames Ide        await assertExists(false);
452740b3867SJames Ide        await FS.deleteAsync(localUri, { idempotent: true });
453740b3867SJames Ide      },
454740b3867SJames Ide      9000
455740b3867SJames Ide    );
456740b3867SJames Ide
457740b3867SJames Ide    t.it(
458740b3867SJames Ide      'download(404)',
459740b3867SJames Ide      async () => {
460740b3867SJames Ide        const localUri = FS.documentDirectory + 'download1.png';
461740b3867SJames Ide
462740b3867SJames Ide        const assertExists = async expectedToExist => {
463740b3867SJames Ide          let { exists } = await FS.getInfoAsync(localUri);
464740b3867SJames Ide          if (expectedToExist) {
465740b3867SJames Ide            t.expect(exists).toBeTruthy();
466740b3867SJames Ide          } else {
467740b3867SJames Ide            t.expect(exists).not.toBeTruthy();
468740b3867SJames Ide          }
469740b3867SJames Ide        };
470740b3867SJames Ide
471740b3867SJames Ide        await FS.deleteAsync(localUri, { idempotent: true });
472740b3867SJames Ide        await assertExists(false);
473740b3867SJames Ide
474740b3867SJames Ide        const { md5, uri, status } = await FS.downloadAsync('https://expo.io/404', localUri, {
475740b3867SJames Ide          md5: true,
476740b3867SJames Ide        });
477740b3867SJames Ide        await assertExists(true);
478740b3867SJames Ide        t.expect(status).toBe(404);
479740b3867SJames Ide
480740b3867SJames Ide        await FS.deleteAsync(localUri);
481740b3867SJames Ide        await assertExists(false);
482740b3867SJames Ide      },
483740b3867SJames Ide      9000
484740b3867SJames Ide    );
485740b3867SJames Ide  });
486740b3867SJames Ide}
487