14410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor/*
24410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor * Copyright (C) 2009 The Android Open Source Project
34410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor *
44410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor * Licensed under the Apache License, Version 2.0 (the "License");
54410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor * you may not use this file except in compliance with the License.
64410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor * You may obtain a copy of the License at
74410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor *
84410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor *      http://www.apache.org/licenses/LICENSE-2.0
94410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor *
104410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor * Unless required by applicable law or agreed to in writing, software
114410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor * distributed under the License is distributed on an "AS IS" BASIS,
124410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor * See the License for the specific language governing permissions and
144410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor * limitations under the License.
154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor */
164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage com.android.server;
184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1943866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongkerimport android.content.ContentResolver;
204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.content.Context;
214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.content.Intent;
22f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
236e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport android.os.Parcel;
246e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport android.os.Parcelable;
256e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport android.os.ParcelFileDescriptor;
266e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport android.os.Process;
274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.os.ServiceManager;
284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.os.StatFs;
294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.provider.Settings;
304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.test.AndroidTestCase;
314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
32f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport com.android.server.DropBoxManagerService;
334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
346e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport java.io.BufferedReader;
354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.io.File;
364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.io.FileOutputStream;
374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.io.FileWriter;
386e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport java.io.IOException;
394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.io.InputStream;
406e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport java.io.InputStreamReader;
414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.util.Random;
424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.util.zip.GZIPOutputStream;
434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
44f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor/** Test {@link DropBoxManager} functionality. */
454410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorpublic class DropBoxTest extends AndroidTestCase {
464410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void tearDown() throws Exception {
4743866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
48625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_AGE_SECONDS, "");
49625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_MAX_FILES, "");
50625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_QUOTA_KB, "");
51625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_TAG_PREFIX + "DropBoxTest", "");
524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddText() throws Exception {
550935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        File dir = getEmptyDir("testAddText");
560935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
57b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
580935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn
594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST0");
624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long between = System.currentTimeMillis();
644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST1");
664410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST2");
674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long after = System.currentTimeMillis();
694410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
70f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
71f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
72f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
73b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis()));
744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e0.getTimeMillis() > before);
764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e0.getTimeMillis() < between);
774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e1.getTimeMillis() > between);
784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e1.getTimeMillis() < e2.getTimeMillis());
794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e2.getTimeMillis() < after);
804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST0", e0.getText(80));
824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST1", e1.getText(80));
834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TES", e2.getText(3));
844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
854410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
894410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
904410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddData() throws Exception {
910935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        File dir = getEmptyDir("testAddData");
920935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
93b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
940935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn
954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addData("DropBoxTest", "TEST".getBytes(), 0);
974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long after = System.currentTimeMillis();
984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
99f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", before);
100b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
1014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest", e.getTag());
1034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e.getTimeMillis() >= before);
1044410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(0, e.getFlags());
1054410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(null == e.getText(80));
1064410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1074410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf = new byte[80];
1084410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST", new String(buf, 0, e.getInputStream().read(buf)));
1094410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1104410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e.close();
1114410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
1124410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1134410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddFile() throws Exception {
1144410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testAddFile");
1154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
1164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1174410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f0 = new File(dir, "f0.txt");
1184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f1 = new File(dir, "f1.txt.gz");
1194410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f2 = new File(dir, "f2.dat");
1204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f3 = new File(dir, "f2.dat.gz");
1214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1224410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileWriter w0 = new FileWriter(f0);
1234410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        GZIPOutputStream gz1 = new GZIPOutputStream(new FileOutputStream(f1));
1244410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileOutputStream os2 = new FileOutputStream(f2);
1254410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        GZIPOutputStream gz3 = new GZIPOutputStream(new FileOutputStream(f3));
1264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.write("FILE0");
1284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz1.write("FILE1".getBytes());
1294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os2.write("DATA2".getBytes());
1304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz3.write("DATA3".getBytes());
1314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.close();
1334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz1.close();
1344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os2.close();
1354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz3.close();
1364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1370935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
138b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
1394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
140eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f0, DropBoxManager.IS_TEXT);
141eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f1, DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED);
142eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f2, 0);
143eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f3, DropBoxManager.IS_GZIPPED);
1444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
145f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
146f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
147f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
148f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis());
149b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
1504410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1514410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e0.getTimeMillis() > before);
1524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e1.getTimeMillis() > e0.getTimeMillis());
1534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e2.getTimeMillis() > e1.getTimeMillis());
1544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e3.getTimeMillis() > e2.getTimeMillis());
1554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
156f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        assertEquals(DropBoxManager.IS_TEXT, e0.getFlags());
157f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        assertEquals(DropBoxManager.IS_TEXT, e1.getFlags());
1584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(0, e2.getFlags());
1594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(0, e3.getFlags());
1604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FILE0", e0.getText(80));
1624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf1 = new byte[80];
1644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FILE1", new String(buf1, 0, e1.getInputStream().read(buf1)));
1654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1664410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(null == e2.getText(80));
1674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf2 = new byte[80];
1684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DATA2", new String(buf2, 0, e2.getInputStream().read(buf2)));
1694410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1704410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(null == e3.getText(80));
1714410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf3 = new byte[80];
1724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DATA3", new String(buf3, 0, e3.getInputStream().read(buf3)));
1734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
1754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
1764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
1774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
1784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
1794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddEntriesInTheFuture() throws Exception {
1814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testAddEntriesInTheFuture");
1824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
1834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Near future: should be allowed to persist
1854410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileWriter w0 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 5000) + ".txt"));
1864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.write("FUTURE0");
1874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.close();
1884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1894410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Far future: should be collapsed
1904410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileWriter w1 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 100000) + ".txt"));
1914410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w1.write("FUTURE1");
1924410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w1.close();
1934410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Another far future item, this one gzipped
1954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f2 = new File(dir, "DropBoxTest@" + (before + 100001) + ".txt.gz");
1964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        GZIPOutputStream gz2 = new GZIPOutputStream(new FileOutputStream(f2));
1974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz2.write("FUTURE2".getBytes());
1984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz2.close();
1994410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2004410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Tombstone in the far future
2014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        new FileOutputStream(new File(dir, "DropBoxTest@" + (before + 100002) + ".lost")).close();
2024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
203f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
204b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
2054410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2064410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Until a write, the timestamps are taken at face value
207f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
208f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
209f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
210f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
211b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e3.getTimeMillis()));
2124410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2134410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE0", e0.getText(80));
2144410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE1", e1.getText(80));
2154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE2", e2.getText(80));
2164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(null, e3.getText(80));
2174410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5000, e0.getTimeMillis());
2194410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 100000, e1.getTimeMillis());
2204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 100001, e2.getTimeMillis());
2214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 100002, e3.getTimeMillis());
2224410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2234410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
2244410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
2254410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
2264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
2274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Write something to force a collapse
2294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("NotDropBoxTest", "FUTURE");
230b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e0 = dropbox.getNextEntry(null, before);
231b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
232b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
233b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
234b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
2354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE0", e0.getText(80));
2374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE1", e1.getText(80));
2384410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE2", e2.getText(80));
2394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(null, e3.getText(80));
2404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5000, e0.getTimeMillis());
2424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5001, e1.getTimeMillis());
2434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5002, e2.getTimeMillis());
2444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5003, e3.getTimeMillis());
2454410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2464410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
2474410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
2484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
2494410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
2504410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
2514410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testIsTagEnabled() throws Exception {
2530935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        File dir = getEmptyDir("testIsTagEnabled");
2540935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
255b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
2560935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn
2574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
2584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST-ENABLED");
2594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(dropbox.isTagEnabled("DropBoxTest"));
2604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
26143866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
262625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_TAG_PREFIX + "DropBoxTest",
26343866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker                                  "disabled");
2644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST-DISABLED");
2664410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertFalse(dropbox.isTagEnabled("DropBoxTest"));
2674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
268625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_TAG_PREFIX + "DropBoxTest",
26943866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker                                  "");
2704410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2714410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST-ENABLED-AGAIN");
2724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(dropbox.isTagEnabled("DropBoxTest"));
2734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
274f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
275f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
276b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis()));
2774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST-ENABLED", e0.getText(80));
2794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST-ENABLED-AGAIN", e1.getText(80));
2804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
2824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
2834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
2844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
285b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor    public void testGetNextEntry() throws Exception {
286b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        File dir = getEmptyDir("testGetNextEntry");
287f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
288b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
289b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
290b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        long before = System.currentTimeMillis();
291b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        dropbox.addText("DropBoxTest.A", "A0");
292b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        dropbox.addText("DropBoxTest.B", "B0");
293b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        dropbox.addText("DropBoxTest.A", "A1");
294b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
295f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry a0 = dropbox.getNextEntry("DropBoxTest.A", before);
296f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry a1 = dropbox.getNextEntry("DropBoxTest.A", a0.getTimeMillis());
297b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest.A", a1.getTimeMillis()));
298b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
299f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry b0 = dropbox.getNextEntry("DropBoxTest.B", before);
300b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest.B", b0.getTimeMillis()));
301b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
302f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry x0 = dropbox.getNextEntry(null, before);
303f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry x1 = dropbox.getNextEntry(null, x0.getTimeMillis());
304f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry x2 = dropbox.getNextEntry(null, x1.getTimeMillis());
305b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, x2.getTimeMillis()));
306b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
307b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", a0.getTag());
308b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", a1.getTag());
309b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A0", a0.getText(80));
310b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A1", a1.getText(80));
311b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
312b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.B", b0.getTag());
313b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("B0", b0.getText(80));
314b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
315b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", x0.getTag());
316b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.B", x1.getTag());
317b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", x2.getTag());
318b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A0", x0.getText(80));
319b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("B0", x1.getText(80));
320b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A1", x2.getText(80));
321b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
322b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        a0.close();
323b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        a1.close();
324b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        b0.close();
325b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        x0.close();
326b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        x1.close();
327b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        x2.close();
328b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor    }
329b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
3304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testSizeLimits() throws Exception {
3314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testSizeLimits");
3324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int blockSize =  new StatFs(dir.getPath()).getBlockSize();
3334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Limit storage to 10 blocks
3354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int kb = blockSize * 10 / 1024;
33643866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
337625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_QUOTA_KB, Integer.toString(kb));
3384410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Three tags using a total of 12 blocks:
3404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // DropBoxTest0 [ ][ ]
3414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // DropBoxTest1 [x][ ][    ][ ][xxx(20 blocks)xxx]
3424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // DropBoxTest2 [xxxxxxxxxx][ ][ ]
3434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        //
3444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // The blocks marked "x" will be removed due to storage restrictions.
3454410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Use random fill (so it doesn't compress), subtract a little for gzip overhead
3464410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3474410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        final int overhead = 64;
3484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
349f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
350b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
351952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
3524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
3534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
3544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
3564410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
3574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize * 2 - overhead);
3584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
3594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize * 20 - overhead);
3604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest2", blockSize * 4 - overhead);
3624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
3634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
3644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
365f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
366f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
367f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
368f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
369f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e4 = dropbox.getNextEntry(null, e3.getTimeMillis());
370f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e5 = dropbox.getNextEntry(null, e4.getTimeMillis());
371f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e6 = dropbox.getNextEntry(null, e5.getTimeMillis());
372f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e7 = dropbox.getNextEntry(null, e6.getTimeMillis());
373f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e8 = dropbox.getNextEntry(null, e7.getTimeMillis());
374f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e9 = dropbox.getNextEntry(null, e8.getTimeMillis());
375b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e9.getTimeMillis()));
3764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest0", e0.getTag());
3784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest0", e1.getTag());
3794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e0));
3804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e1));
3814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e2.getTag());
3834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e3.getTag());
3844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e4.getTag());
3854410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e5.getTag());
3864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e6.getTag());
3874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e2));  // Tombstone
3884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e3));
3894410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize * 2 - overhead, getEntrySize(e4));
3904410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e5));
3914410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e6));
3924410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3934410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest2", e7.getTag());
3944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest2", e8.getTag());
3954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest2", e9.getTag());
3964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e7));  // Tombstone
3974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e8));
3984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e9));
3994410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4004410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
4014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
4024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
4034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
4044410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e4.close();
4054410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e5.close();
4064410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e6.close();
4074410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e7.close();
4084410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e8.close();
4094410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e9.close();
410b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
411b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        // Specifying a tag name skips tombstone records.
412b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
413f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry t0 = dropbox.getNextEntry("DropBoxTest1", before);
414f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry t1 = dropbox.getNextEntry("DropBoxTest1", t0.getTimeMillis());
415f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry t2 = dropbox.getNextEntry("DropBoxTest1", t1.getTimeMillis());
416b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest1", t2.getTimeMillis()));
417b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
418b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest1", t0.getTag());
419b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest1", t1.getTag());
420b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest1", t2.getTag());
421b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
422b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals(blockSize - overhead, getEntrySize(t0));
423b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals(blockSize * 2 - overhead, getEntrySize(t1));
424b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals(blockSize - overhead, getEntrySize(t2));
425b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
426b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        t0.close();
427b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        t1.close();
428b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        t2.close();
4294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
4304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAgeLimits() throws Exception {
4324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testAgeLimits");
4334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int blockSize = new StatFs(dir.getPath()).getBlockSize();
4344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Limit storage to 10 blocks with an expiration of 1 second
4364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int kb = blockSize * 10 / 1024;
43743866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
438625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_AGE_SECONDS, "1");
439625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_QUOTA_KB, Integer.toString(kb));
4404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Write one normal entry and another so big that it is instantly tombstoned
4424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
443f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
444b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
445952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
4464410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST");
4474410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest", blockSize * 20);
4484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4494410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Verify that things are as expected
450f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
451f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
452b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e1.getTimeMillis()));
4534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST", e0.getText(80));
4554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(null, e1.getText(80));
4564410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e1));
4574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
4594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
4604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Wait a second and write another entry -- old ones should be expunged
4624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(2000);
4634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST1");
4644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
465b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e0 = dropbox.getNextEntry(null, before);
466b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e0.getTimeMillis()));
4674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST1", e0.getText(80));
4684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
4694410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
4704410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4713a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor    public void testFileCountLimits() throws Exception {
4723a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        File dir = getEmptyDir("testFileCountLimits");
4733a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
4743a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
475b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
4763a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST0");
4773a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST1");
4783a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST2");
4793a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST3");
4803a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST4");
4813a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST5");
4823a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
4833a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        // Verify 6 files added
4843a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, 0);
4853a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
4863a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
4873a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
4883a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e4 = dropbox.getNextEntry(null, e3.getTimeMillis());
4893a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e5 = dropbox.getNextEntry(null, e4.getTimeMillis());
4903a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertTrue(null == dropbox.getNextEntry(null, e5.getTimeMillis()));
4913a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST0", e0.getText(80));
4923a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST5", e5.getText(80));
4933a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
4943a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e0.close();
4953a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e1.close();
4963a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e2.close();
4973a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e3.close();
4983a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e4.close();
4993a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e5.close();
5003a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5013a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        // Limit to 3 files and add one more entry
5023a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        ContentResolver cr = getContext().getContentResolver();
503625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_MAX_FILES, "3");
5043a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST6");
5053a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5063a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        // Verify only 3 files left
5073a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry f0 = dropbox.getNextEntry(null, 0);
5083a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry f1 = dropbox.getNextEntry(null, f0.getTimeMillis());
5093a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry f2 = dropbox.getNextEntry(null, f1.getTimeMillis());
5103a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertTrue(null == dropbox.getNextEntry(null, f2.getTimeMillis()));
5113a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST4", f0.getText(80));
5123a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST5", f1.getText(80));
5133a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST6", f2.getText(80));
5143a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5153a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        f0.close();
5163a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        f1.close();
5173a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        f2.close();
5183a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor    }
5193a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
520f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    public void testCreateDropBoxManagerWithInvalidDirectory() throws Exception {
521f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        // If created with an invalid directory, the DropBoxManager should suffer quietly
5224410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // and fail all operations (this is how it survives a full disk).
5234410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Once the directory becomes possible to create, it will start working.
5244410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
525f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        File dir = new File(getEmptyDir("testCreateDropBoxManagerWith"), "InvalidDirectory");
5264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        new FileOutputStream(dir).close();  // Create an empty file
527f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
528b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
5294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "should be ignored");
5314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addData("DropBoxTest", "should be ignored".getBytes(), 0);
532b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", 0));
5334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dir.delete();  // Remove the file so a directory can be created
5354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST");
536f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", 0);
537b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
5384410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest", e.getTag());
5394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST", e.getText(80));
5404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e.close();
5414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
5424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5436e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    public void testDropBoxEntrySerialization() throws Exception {
5446e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        // Make sure DropBoxManager.Entry can be serialized to a Parcel and back
5456e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        // under a variety of conditions.
5466e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5476e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        Parcel parcel = Parcel.obtain();
5486e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File dir = getEmptyDir("testDropBoxEntrySerialization");
5496e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5506e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("empty", 1000000).writeToParcel(parcel, 0);
5516e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("string", 2000000, "String Value").writeToParcel(parcel, 0);
5526e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("bytes", 3000000, "Bytes Value".getBytes(),
5536e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_TEXT).writeToParcel(parcel, 0);
5546e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("zerobytes", 4000000, new byte[0], 0).writeToParcel(parcel, 0);
5556e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("emptybytes", 5000000, (byte[]) null,
5566e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
5576e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5586e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
5596e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badbytes", 99999,
5606e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    "Bad Bytes Value".getBytes(),
5616e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
5626e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for non-null byte[] and IS_EMPTY flags");
5636e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
5646e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
5656e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
5666e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5676e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
5686e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badbytes", 99999, (byte[]) null, 0).writeToParcel(parcel, 0);
5696e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for null byte[] and non-IS_EMPTY flags");
5706e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
5716e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
5726e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
5736e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5746e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File f = new File(dir, "file.dat");
5756e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        FileOutputStream os = new FileOutputStream(f);
5766e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.write("File Value".getBytes());
5776e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.close();
5786e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5796e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("file", 6000000, f, DropBoxManager.IS_TEXT).writeToParcel(
5806e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
5816e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("binfile", 7000000, f, 0).writeToParcel(
5826e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
5836e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("emptyfile", 8000000, (ParcelFileDescriptor) null,
5846e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
5856e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5866e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
5876e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badfile", 99999, new File(dir, "nonexist.dat"), 0);
5886e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IOException expected for nonexistent file");
5896e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IOException e) {
5906e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
5916e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
5926e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5936e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
5946e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badfile", 99999, f, DropBoxManager.IS_EMPTY).writeToParcel(
5956e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, 0);
5966e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for non-null file and IS_EMPTY flags");
5976e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
5986e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
5996e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
6006e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6016e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
6026e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badfile", 99999, (ParcelFileDescriptor) null, 0);
6036e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for null PFD and non-IS_EMPTY flags");
6046e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
6056e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
6066e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
6076e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6086e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File gz = new File(dir, "file.gz");
6096e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        GZIPOutputStream gzout = new GZIPOutputStream(new FileOutputStream(gz));
6106e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        gzout.write("Gzip File Value".getBytes());
6116e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        gzout.close();
6126e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6136e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("gzipfile", 9000000, gz,
6146e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED).writeToParcel(
6156e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
6166e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("gzipbinfile", 10000000, gz,
6176e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_GZIPPED).writeToParcel(
6186e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
6196e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6206e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        //
6216e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        // Switch from writing to reading
6226e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        //
6236e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6246e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        parcel.setDataPosition(0);
6256e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        DropBoxManager.Entry e;
6266e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6276e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6286e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("empty", e.getTag());
6296e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(1000000, e.getTimeMillis());
6306e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
6316e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6326e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getInputStream());
6336e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6346e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6356e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6366e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("string", e.getTag());
6376e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(2000000, e.getTimeMillis());
6386e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6396e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("String Value", e.getText(100));
6406e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("String Value",
6416e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
6426e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6436e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6446e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6456e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("bytes", e.getTag());
6466e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(3000000, e.getTimeMillis());
6476e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6486e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("Bytes Value", e.getText(100));
6496e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6506e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6516e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6526e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("zerobytes", e.getTag());
6536e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(4000000, e.getTimeMillis());
6546e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, e.getFlags());
6556e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6566e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null,
6576e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
6586e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6596e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6606e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6616e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("emptybytes", e.getTag());
6626e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(5000000, e.getTimeMillis());
6636e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
6646e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6656e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getInputStream());
6666e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6676e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6686e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6696e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("file", e.getTag());
6706e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(6000000, e.getTimeMillis());
6716e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6726e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("File Value", e.getText(100));
6736e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6746e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6756e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6766e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("binfile", e.getTag());
6776e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(7000000, e.getTimeMillis());
6786e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, e.getFlags());
6796e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6806e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("File Value",
6816e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
6826e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6836e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6846e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("emptyfile", e.getTag());
6856e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(8000000, e.getTimeMillis());
6866e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
6876e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6886e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getInputStream());
6896e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6906e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6916e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6926e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("gzipfile", e.getTag());
6936e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(9000000, e.getTimeMillis());
6946e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6956e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("Gzip File Value", e.getText(100));
6966e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6976e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6986e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6996e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("gzipbinfile", e.getTag());
7006e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(10000000, e.getTimeMillis());
7016e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, e.getFlags());
7026e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
7036e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("Gzip File Value",
7046e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
7056e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
7066e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, parcel.dataAvail());
7076e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        parcel.recycle();
7086e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    }
7096e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7106e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    public void testDropBoxEntrySerializationDoesntLeakFileDescriptors() throws Exception {
7116e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File dir = getEmptyDir("testDropBoxEntrySerialization");
7126e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File f = new File(dir, "file.dat");
7136e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        FileOutputStream os = new FileOutputStream(f);
7146e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.write("File Value".getBytes());
7156e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.close();
7166e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7176e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        int before = countOpenFiles();
7186e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertTrue(before > 0);
7196e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7206e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        for (int i = 0; i < 1000; i++) {
7216e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            Parcel parcel = Parcel.obtain();
7226e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("file", 1000000, f, 0).writeToParcel(
7236e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
7246e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7256e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            parcel.setDataPosition(0);
7266e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            DropBoxManager.Entry e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
7276e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            assertEquals("file", e.getTag());
7286e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            e.close();
7296e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7306e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            parcel.recycle();
7316e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
7326e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7336e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        int after = countOpenFiles();
7346e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertTrue(after > 0);
7356e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertTrue(after < before + 20);
7366e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    }
7376e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
738f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    private void addRandomEntry(DropBoxManager dropbox, String tag, int size) throws Exception {
7394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] bytes = new byte[size];
7404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        new Random(System.currentTimeMillis()).nextBytes(bytes);
7414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
7424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f = new File(getEmptyDir("addRandomEntry"), "random.dat");
7434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileOutputStream os = new FileOutputStream(f);
7444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os.write(bytes);
7454410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os.close();
7464410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
747eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile(tag, f, 0);
7484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
7494410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
750f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    private int getEntrySize(DropBoxManager.Entry e) throws Exception {
7514410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        InputStream is = e.getInputStream();
7524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        if (is == null) return -1;
7534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int length = 0;
7544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        while (is.read() != -1) length++;
7554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        return length;
7564410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
7574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
7584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    private void recursiveDelete(File file) {
7594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        if (!file.delete() && file.isDirectory()) {
7604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor            for (File f : file.listFiles()) recursiveDelete(f);
7614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor            file.delete();
7624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        }
7634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
7644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
7654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    private File getEmptyDir(String name) {
7664410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getContext().getDir("DropBoxTest." + name, 0);
7674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        for (File f : dir.listFiles()) recursiveDelete(f);
7684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(dir.listFiles().length == 0);
7694410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        return dir;
7704410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
7716e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7726e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    private int countOpenFiles() {
7736e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        return new File("/proc/" + Process.myPid() + "/fd").listFiles().length;
7746e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    }
7754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor}
776