DropBoxTest.java revision f18a01c77e78209b74e34d05cfb352fa4a92db5f
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.unit_tests;
18
19import android.content.BroadcastReceiver;
20import android.content.Context;
21import android.content.Intent;
22import android.os.DropBoxManager;
23import android.os.ParcelFileDescriptor;
24import android.os.ServiceManager;
25import android.os.StatFs;
26import android.provider.Settings;
27import android.test.AndroidTestCase;
28
29import com.android.server.DropBoxManagerService;
30
31import java.io.File;
32import java.io.FileOutputStream;
33import java.io.FileWriter;
34import java.io.InputStream;
35import java.util.Random;
36import java.util.zip.GZIPOutputStream;
37
38/** Test {@link DropBoxManager} functionality. */
39public class DropBoxTest extends AndroidTestCase {
40    public void tearDown() throws Exception {
41        Intent override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
42        override.putExtra(Settings.Gservices.DROPBOX_AGE_SECONDS, "");
43        override.putExtra(Settings.Gservices.DROPBOX_QUOTA_KB, "");
44        override.putExtra(Settings.Gservices.DROPBOX_TAG_PREFIX + "DropBoxTest", "");
45        waitForBroadcast(override);
46    }
47
48    public void testAddText() throws Exception {
49        DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService(
50                Context.DROPBOX_SERVICE);
51        long before = System.currentTimeMillis();
52        Thread.sleep(5);
53        dropbox.addText("DropBoxTest", "TEST0");
54        Thread.sleep(5);
55        long between = System.currentTimeMillis();
56        Thread.sleep(5);
57        dropbox.addText("DropBoxTest", "TEST1");
58        dropbox.addText("DropBoxTest", "TEST2");
59        Thread.sleep(5);
60        long after = System.currentTimeMillis();
61
62        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
63        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
64        DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
65        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis()));
66
67        assertTrue(e0.getTimeMillis() > before);
68        assertTrue(e0.getTimeMillis() < between);
69        assertTrue(e1.getTimeMillis() > between);
70        assertTrue(e1.getTimeMillis() < e2.getTimeMillis());
71        assertTrue(e2.getTimeMillis() < after);
72
73        assertEquals("TEST0", e0.getText(80));
74        assertEquals("TEST1", e1.getText(80));
75        assertEquals("TES", e2.getText(3));
76
77        e0.close();
78        e1.close();
79        e2.close();
80    }
81
82    public void testAddData() throws Exception {
83        DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService(
84                Context.DROPBOX_SERVICE);
85        long before = System.currentTimeMillis();
86        dropbox.addData("DropBoxTest", "TEST".getBytes(), 0);
87        long after = System.currentTimeMillis();
88
89        DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", before);
90        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
91
92        assertEquals("DropBoxTest", e.getTag());
93        assertTrue(e.getTimeMillis() >= before);
94        assertEquals(0, e.getFlags());
95        assertTrue(null == e.getText(80));
96
97        byte[] buf = new byte[80];
98        assertEquals("TEST", new String(buf, 0, e.getInputStream().read(buf)));
99
100        e.close();
101    }
102
103    public void testAddFile() throws Exception {
104        File dir = getEmptyDir("testAddFile");
105        long before = System.currentTimeMillis();
106
107        File f0 = new File(dir, "f0.txt");
108        File f1 = new File(dir, "f1.txt.gz");
109        File f2 = new File(dir, "f2.dat");
110        File f3 = new File(dir, "f2.dat.gz");
111
112        FileWriter w0 = new FileWriter(f0);
113        GZIPOutputStream gz1 = new GZIPOutputStream(new FileOutputStream(f1));
114        FileOutputStream os2 = new FileOutputStream(f2);
115        GZIPOutputStream gz3 = new GZIPOutputStream(new FileOutputStream(f3));
116
117        w0.write("FILE0");
118        gz1.write("FILE1".getBytes());
119        os2.write("DATA2".getBytes());
120        gz3.write("DATA3".getBytes());
121
122        w0.close();
123        gz1.close();
124        os2.close();
125        gz3.close();
126
127        DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService(
128                Context.DROPBOX_SERVICE);
129        int mode = ParcelFileDescriptor.MODE_READ_ONLY;
130
131        ParcelFileDescriptor pfd0 = ParcelFileDescriptor.open(f0, mode);
132        ParcelFileDescriptor pfd1 = ParcelFileDescriptor.open(f1, mode);
133        ParcelFileDescriptor pfd2 = ParcelFileDescriptor.open(f2, mode);
134        ParcelFileDescriptor pfd3 = ParcelFileDescriptor.open(f3, mode);
135
136        dropbox.addFile("DropBoxTest", pfd0, DropBoxManager.IS_TEXT);
137        dropbox.addFile("DropBoxTest", pfd1, DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED);
138        dropbox.addFile("DropBoxTest", pfd2, 0);
139        dropbox.addFile("DropBoxTest", pfd3, DropBoxManager.IS_GZIPPED);
140
141        pfd0.close();
142        pfd1.close();
143        pfd2.close();
144        pfd3.close();
145
146        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
147        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
148        DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
149        DropBoxManager.Entry e3 = dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis());
150        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
151
152        assertTrue(e0.getTimeMillis() > before);
153        assertTrue(e1.getTimeMillis() > e0.getTimeMillis());
154        assertTrue(e2.getTimeMillis() > e1.getTimeMillis());
155        assertTrue(e3.getTimeMillis() > e2.getTimeMillis());
156
157        assertEquals(DropBoxManager.IS_TEXT, e0.getFlags());
158        assertEquals(DropBoxManager.IS_TEXT, e1.getFlags());
159        assertEquals(0, e2.getFlags());
160        assertEquals(0, e3.getFlags());
161
162        assertEquals("FILE0", e0.getText(80));
163
164        byte[] buf1 = new byte[80];
165        assertEquals("FILE1", new String(buf1, 0, e1.getInputStream().read(buf1)));
166
167        assertTrue(null == e2.getText(80));
168        byte[] buf2 = new byte[80];
169        assertEquals("DATA2", new String(buf2, 0, e2.getInputStream().read(buf2)));
170
171        assertTrue(null == e3.getText(80));
172        byte[] buf3 = new byte[80];
173        assertEquals("DATA3", new String(buf3, 0, e3.getInputStream().read(buf3)));
174
175        e0.close();
176        e1.close();
177        e2.close();
178        e3.close();
179    }
180
181    public void testAddEntriesInTheFuture() throws Exception {
182        File dir = getEmptyDir("testAddEntriesInTheFuture");
183        long before = System.currentTimeMillis();
184
185        // Near future: should be allowed to persist
186        FileWriter w0 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 5000) + ".txt"));
187        w0.write("FUTURE0");
188        w0.close();
189
190        // Far future: should be collapsed
191        FileWriter w1 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 100000) + ".txt"));
192        w1.write("FUTURE1");
193        w1.close();
194
195        // Another far future item, this one gzipped
196        File f2 = new File(dir, "DropBoxTest@" + (before + 100001) + ".txt.gz");
197        GZIPOutputStream gz2 = new GZIPOutputStream(new FileOutputStream(f2));
198        gz2.write("FUTURE2".getBytes());
199        gz2.close();
200
201        // Tombstone in the far future
202        new FileOutputStream(new File(dir, "DropBoxTest@" + (before + 100002) + ".lost")).close();
203
204        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
205        DropBoxManager dropbox = new DropBoxManager(service);
206
207        // Until a write, the timestamps are taken at face value
208        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
209        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
210        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
211        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
212        assertTrue(null == dropbox.getNextEntry(null, e3.getTimeMillis()));
213
214        assertEquals("FUTURE0", e0.getText(80));
215        assertEquals("FUTURE1", e1.getText(80));
216        assertEquals("FUTURE2", e2.getText(80));
217        assertEquals(null, e3.getText(80));
218
219        assertEquals(before + 5000, e0.getTimeMillis());
220        assertEquals(before + 100000, e1.getTimeMillis());
221        assertEquals(before + 100001, e2.getTimeMillis());
222        assertEquals(before + 100002, e3.getTimeMillis());
223
224        e0.close();
225        e1.close();
226        e2.close();
227        e3.close();
228
229        // Write something to force a collapse
230        dropbox.addText("NotDropBoxTest", "FUTURE");
231        e0 = dropbox.getNextEntry(null, before);
232        e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
233        e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
234        e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
235        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
236
237        assertEquals("FUTURE0", e0.getText(80));
238        assertEquals("FUTURE1", e1.getText(80));
239        assertEquals("FUTURE2", e2.getText(80));
240        assertEquals(null, e3.getText(80));
241
242        assertEquals(before + 5000, e0.getTimeMillis());
243        assertEquals(before + 5001, e1.getTimeMillis());
244        assertEquals(before + 5002, e2.getTimeMillis());
245        assertEquals(before + 5003, e3.getTimeMillis());
246
247        e0.close();
248        e1.close();
249        e2.close();
250        e3.close();
251        service.stop();
252    }
253
254    public void testIsTagEnabled() throws Exception {
255        DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService(
256                Context.DROPBOX_SERVICE);
257        long before = System.currentTimeMillis();
258        dropbox.addText("DropBoxTest", "TEST-ENABLED");
259        assertTrue(dropbox.isTagEnabled("DropBoxTest"));
260
261        Intent override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
262        override.putExtra(Settings.Gservices.DROPBOX_TAG_PREFIX + "DropBoxTest", "disabled");
263        waitForBroadcast(override);
264
265        dropbox.addText("DropBoxTest", "TEST-DISABLED");
266        assertFalse(dropbox.isTagEnabled("DropBoxTest"));
267
268        override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
269        override.putExtra(Settings.Gservices.DROPBOX_TAG_PREFIX + "DropBoxTest", "");
270        waitForBroadcast(override);
271
272        dropbox.addText("DropBoxTest", "TEST-ENABLED-AGAIN");
273        assertTrue(dropbox.isTagEnabled("DropBoxTest"));
274
275        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
276        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
277        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis()));
278
279        assertEquals("TEST-ENABLED", e0.getText(80));
280        assertEquals("TEST-ENABLED-AGAIN", e1.getText(80));
281
282        e0.close();
283        e1.close();
284    }
285
286    public void testGetNextEntry() throws Exception {
287        File dir = getEmptyDir("testGetNextEntry");
288        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
289        DropBoxManager dropbox = new DropBoxManager(service);
290
291        long before = System.currentTimeMillis();
292        dropbox.addText("DropBoxTest.A", "A0");
293        dropbox.addText("DropBoxTest.B", "B0");
294        dropbox.addText("DropBoxTest.A", "A1");
295
296        DropBoxManager.Entry a0 = dropbox.getNextEntry("DropBoxTest.A", before);
297        DropBoxManager.Entry a1 = dropbox.getNextEntry("DropBoxTest.A", a0.getTimeMillis());
298        assertTrue(null == dropbox.getNextEntry("DropBoxTest.A", a1.getTimeMillis()));
299
300        DropBoxManager.Entry b0 = dropbox.getNextEntry("DropBoxTest.B", before);
301        assertTrue(null == dropbox.getNextEntry("DropBoxTest.B", b0.getTimeMillis()));
302
303        DropBoxManager.Entry x0 = dropbox.getNextEntry(null, before);
304        DropBoxManager.Entry x1 = dropbox.getNextEntry(null, x0.getTimeMillis());
305        DropBoxManager.Entry x2 = dropbox.getNextEntry(null, x1.getTimeMillis());
306        assertTrue(null == dropbox.getNextEntry(null, x2.getTimeMillis()));
307
308        assertEquals("DropBoxTest.A", a0.getTag());
309        assertEquals("DropBoxTest.A", a1.getTag());
310        assertEquals("A0", a0.getText(80));
311        assertEquals("A1", a1.getText(80));
312
313        assertEquals("DropBoxTest.B", b0.getTag());
314        assertEquals("B0", b0.getText(80));
315
316        assertEquals("DropBoxTest.A", x0.getTag());
317        assertEquals("DropBoxTest.B", x1.getTag());
318        assertEquals("DropBoxTest.A", x2.getTag());
319        assertEquals("A0", x0.getText(80));
320        assertEquals("B0", x1.getText(80));
321        assertEquals("A1", x2.getText(80));
322
323        a0.close();
324        a1.close();
325        b0.close();
326        x0.close();
327        x1.close();
328        x2.close();
329        service.stop();
330    }
331
332    public void testSizeLimits() throws Exception {
333        File dir = getEmptyDir("testSizeLimits");
334        int blockSize =  new StatFs(dir.getPath()).getBlockSize();
335
336        // Limit storage to 10 blocks
337        int kb = blockSize * 10 / 1024;
338        Intent override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
339        override.putExtra(Settings.Gservices.DROPBOX_QUOTA_KB, Integer.toString(kb));
340        waitForBroadcast(override);
341
342        // Three tags using a total of 12 blocks:
343        // DropBoxTest0 [ ][ ]
344        // DropBoxTest1 [x][ ][    ][ ][xxx(20 blocks)xxx]
345        // DropBoxTest2 [xxxxxxxxxx][ ][ ]
346        //
347        // The blocks marked "x" will be removed due to storage restrictions.
348        // Use random fill (so it doesn't compress), subtract a little for gzip overhead
349
350        final int overhead = 64;
351        long before = System.currentTimeMillis();
352        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
353        DropBoxManager dropbox = new DropBoxManager(service);
354
355        addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
356        addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
357
358        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
359        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
360        addRandomEntry(dropbox, "DropBoxTest1", blockSize * 2 - overhead);
361        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
362        addRandomEntry(dropbox, "DropBoxTest1", blockSize * 20 - overhead);
363
364        addRandomEntry(dropbox, "DropBoxTest2", blockSize * 4 - overhead);
365        addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
366        addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
367
368        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
369        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
370        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
371        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
372        DropBoxManager.Entry e4 = dropbox.getNextEntry(null, e3.getTimeMillis());
373        DropBoxManager.Entry e5 = dropbox.getNextEntry(null, e4.getTimeMillis());
374        DropBoxManager.Entry e6 = dropbox.getNextEntry(null, e5.getTimeMillis());
375        DropBoxManager.Entry e7 = dropbox.getNextEntry(null, e6.getTimeMillis());
376        DropBoxManager.Entry e8 = dropbox.getNextEntry(null, e7.getTimeMillis());
377        DropBoxManager.Entry e9 = dropbox.getNextEntry(null, e8.getTimeMillis());
378        assertTrue(null == dropbox.getNextEntry(null, e9.getTimeMillis()));
379
380        assertEquals("DropBoxTest0", e0.getTag());
381        assertEquals("DropBoxTest0", e1.getTag());
382        assertEquals(blockSize - overhead, getEntrySize(e0));
383        assertEquals(blockSize - overhead, getEntrySize(e1));
384
385        assertEquals("DropBoxTest1", e2.getTag());
386        assertEquals("DropBoxTest1", e3.getTag());
387        assertEquals("DropBoxTest1", e4.getTag());
388        assertEquals("DropBoxTest1", e5.getTag());
389        assertEquals("DropBoxTest1", e6.getTag());
390        assertEquals(-1, getEntrySize(e2));  // Tombstone
391        assertEquals(blockSize - overhead, getEntrySize(e3));
392        assertEquals(blockSize * 2 - overhead, getEntrySize(e4));
393        assertEquals(blockSize - overhead, getEntrySize(e5));
394        assertEquals(-1, getEntrySize(e6));
395
396        assertEquals("DropBoxTest2", e7.getTag());
397        assertEquals("DropBoxTest2", e8.getTag());
398        assertEquals("DropBoxTest2", e9.getTag());
399        assertEquals(-1, getEntrySize(e7));  // Tombstone
400        assertEquals(blockSize - overhead, getEntrySize(e8));
401        assertEquals(blockSize - overhead, getEntrySize(e9));
402
403        e0.close();
404        e1.close();
405        e2.close();
406        e3.close();
407        e4.close();
408        e5.close();
409        e6.close();
410        e7.close();
411        e8.close();
412        e9.close();
413
414        // Specifying a tag name skips tombstone records.
415
416        DropBoxManager.Entry t0 = dropbox.getNextEntry("DropBoxTest1", before);
417        DropBoxManager.Entry t1 = dropbox.getNextEntry("DropBoxTest1", t0.getTimeMillis());
418        DropBoxManager.Entry t2 = dropbox.getNextEntry("DropBoxTest1", t1.getTimeMillis());
419        assertTrue(null == dropbox.getNextEntry("DropBoxTest1", t2.getTimeMillis()));
420
421        assertEquals("DropBoxTest1", t0.getTag());
422        assertEquals("DropBoxTest1", t1.getTag());
423        assertEquals("DropBoxTest1", t2.getTag());
424
425        assertEquals(blockSize - overhead, getEntrySize(t0));
426        assertEquals(blockSize * 2 - overhead, getEntrySize(t1));
427        assertEquals(blockSize - overhead, getEntrySize(t2));
428
429        t0.close();
430        t1.close();
431        t2.close();
432        service.stop();
433    }
434
435    public void testAgeLimits() throws Exception {
436        File dir = getEmptyDir("testAgeLimits");
437        int blockSize = new StatFs(dir.getPath()).getBlockSize();
438
439        // Limit storage to 10 blocks with an expiration of 1 second
440        int kb = blockSize * 10 / 1024;
441        Intent override = new Intent(Settings.Gservices.OVERRIDE_ACTION);
442        override.putExtra(Settings.Gservices.DROPBOX_AGE_SECONDS, "1");
443        override.putExtra(Settings.Gservices.DROPBOX_QUOTA_KB, Integer.toString(kb));
444        waitForBroadcast(override);
445
446        // Write one normal entry and another so big that it is instantly tombstoned
447        long before = System.currentTimeMillis();
448        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
449        DropBoxManager dropbox = new DropBoxManager(service);
450
451        dropbox.addText("DropBoxTest", "TEST");
452        addRandomEntry(dropbox, "DropBoxTest", blockSize * 20);
453
454        // Verify that things are as expected
455        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
456        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
457        assertTrue(null == dropbox.getNextEntry(null, e1.getTimeMillis()));
458
459        assertEquals("TEST", e0.getText(80));
460        assertEquals(null, e1.getText(80));
461        assertEquals(-1, getEntrySize(e1));
462
463        e0.close();
464        e1.close();
465
466        // Wait a second and write another entry -- old ones should be expunged
467        Thread.sleep(2000);
468        dropbox.addText("DropBoxTest", "TEST1");
469
470        e0 = dropbox.getNextEntry(null, before);
471        assertTrue(null == dropbox.getNextEntry(null, e0.getTimeMillis()));
472        assertEquals("TEST1", e0.getText(80));
473        e0.close();
474    }
475
476    public void testCreateDropBoxManagerWithInvalidDirectory() throws Exception {
477        // If created with an invalid directory, the DropBoxManager should suffer quietly
478        // and fail all operations (this is how it survives a full disk).
479        // Once the directory becomes possible to create, it will start working.
480
481        File dir = new File(getEmptyDir("testCreateDropBoxManagerWith"), "InvalidDirectory");
482        new FileOutputStream(dir).close();  // Create an empty file
483        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
484        DropBoxManager dropbox = new DropBoxManager(service);
485
486        dropbox.addText("DropBoxTest", "should be ignored");
487        dropbox.addData("DropBoxTest", "should be ignored".getBytes(), 0);
488        assertTrue(null == dropbox.getNextEntry("DropBoxTest", 0));
489
490        dir.delete();  // Remove the file so a directory can be created
491        dropbox.addText("DropBoxTest", "TEST");
492        DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", 0);
493        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
494        assertEquals("DropBoxTest", e.getTag());
495        assertEquals("TEST", e.getText(80));
496        e.close();
497        service.stop();
498    }
499
500    private void addRandomEntry(DropBoxManager dropbox, String tag, int size) throws Exception {
501        byte[] bytes = new byte[size];
502        new Random(System.currentTimeMillis()).nextBytes(bytes);
503
504        File f = new File(getEmptyDir("addRandomEntry"), "random.dat");
505        FileOutputStream os = new FileOutputStream(f);
506        os.write(bytes);
507        os.close();
508
509        ParcelFileDescriptor fd = ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
510        dropbox.addFile(tag, fd, 0);
511        fd.close();
512    }
513
514    private int getEntrySize(DropBoxManager.Entry e) throws Exception {
515        InputStream is = e.getInputStream();
516        if (is == null) return -1;
517        int length = 0;
518        while (is.read() != -1) length++;
519        return length;
520    }
521
522    private void waitForBroadcast(Intent intent) throws InterruptedException {
523        BroadcastReceiver receiver = new BroadcastReceiver() {
524            public synchronized void onReceive(Context context, Intent intent) { notify(); }
525        };
526
527        getContext().sendOrderedBroadcast(intent, null, receiver, null, 0, null, null);
528        synchronized (receiver) { receiver.wait(); }
529    }
530
531    private void recursiveDelete(File file) {
532        if (!file.delete() && file.isDirectory()) {
533            for (File f : file.listFiles()) recursiveDelete(f);
534            file.delete();
535        }
536    }
537
538    private File getEmptyDir(String name) {
539        File dir = getContext().getDir("DropBoxTest." + name, 0);
540        for (File f : dir.listFiles()) recursiveDelete(f);
541        assertTrue(dir.listFiles().length == 0);
542        return dir;
543    }
544}
545