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();
4843866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_AGE_SECONDS, "");
493a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_MAX_FILES, "");
5043866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_QUOTA_KB, "");
5143866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_TAG_PREFIX + "DropBoxTest", "");
524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddText() throws Exception {
55f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService(
56f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor                Context.DROPBOX_SERVICE);
574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST0");
604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long between = System.currentTimeMillis();
624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST1");
644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST2");
654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
664410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long after = System.currentTimeMillis();
674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
68f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
69f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
70f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
71b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis()));
724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e0.getTimeMillis() > before);
744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e0.getTimeMillis() < between);
754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e1.getTimeMillis() > between);
764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e1.getTimeMillis() < e2.getTimeMillis());
774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e2.getTimeMillis() < after);
784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST0", e0.getText(80));
804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST1", e1.getText(80));
814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TES", e2.getText(3));
824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
854410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddData() throws Exception {
89f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService(
90f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor                Context.DROPBOX_SERVICE);
914410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
924410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addData("DropBoxTest", "TEST".getBytes(), 0);
934410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long after = System.currentTimeMillis();
944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
95f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", before);
96b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest", e.getTag());
994410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e.getTimeMillis() >= before);
1004410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(0, e.getFlags());
1014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(null == e.getText(80));
1024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf = new byte[80];
1044410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST", new String(buf, 0, e.getInputStream().read(buf)));
1054410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1064410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e.close();
1074410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
1084410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1094410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddFile() throws Exception {
1104410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testAddFile");
1114410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
1124410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1134410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f0 = new File(dir, "f0.txt");
1144410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f1 = new File(dir, "f1.txt.gz");
1154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f2 = new File(dir, "f2.dat");
1164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f3 = new File(dir, "f2.dat.gz");
1174410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileWriter w0 = new FileWriter(f0);
1194410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        GZIPOutputStream gz1 = new GZIPOutputStream(new FileOutputStream(f1));
1204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileOutputStream os2 = new FileOutputStream(f2);
1214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        GZIPOutputStream gz3 = new GZIPOutputStream(new FileOutputStream(f3));
1224410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1234410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.write("FILE0");
1244410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz1.write("FILE1".getBytes());
1254410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os2.write("DATA2".getBytes());
1264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz3.write("DATA3".getBytes());
1274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.close();
1294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz1.close();
1304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os2.close();
1314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz3.close();
1324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
133f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService(
134f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor                Context.DROPBOX_SERVICE);
1354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
136eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f0, DropBoxManager.IS_TEXT);
137eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f1, DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED);
138eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f2, 0);
139eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f3, DropBoxManager.IS_GZIPPED);
1404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
141f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
142f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
143f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
144f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis());
145b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
1464410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1474410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e0.getTimeMillis() > before);
1484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e1.getTimeMillis() > e0.getTimeMillis());
1494410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e2.getTimeMillis() > e1.getTimeMillis());
1504410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e3.getTimeMillis() > e2.getTimeMillis());
1514410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
152f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        assertEquals(DropBoxManager.IS_TEXT, e0.getFlags());
153f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        assertEquals(DropBoxManager.IS_TEXT, e1.getFlags());
1544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(0, e2.getFlags());
1554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(0, e3.getFlags());
1564410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FILE0", e0.getText(80));
1584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf1 = new byte[80];
1604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FILE1", new String(buf1, 0, e1.getInputStream().read(buf1)));
1614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(null == e2.getText(80));
1634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf2 = new byte[80];
1644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DATA2", new String(buf2, 0, e2.getInputStream().read(buf2)));
1654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1664410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(null == e3.getText(80));
1674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf3 = new byte[80];
1684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DATA3", new String(buf3, 0, e3.getInputStream().read(buf3)));
1694410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1704410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
1714410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
1724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
1734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
1744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
1754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddEntriesInTheFuture() throws Exception {
1774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testAddEntriesInTheFuture");
1784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
1794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Near future: should be allowed to persist
1814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileWriter w0 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 5000) + ".txt"));
1824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.write("FUTURE0");
1834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.close();
1844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1854410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Far future: should be collapsed
1864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileWriter w1 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 100000) + ".txt"));
1874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w1.write("FUTURE1");
1884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w1.close();
1894410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1904410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Another far future item, this one gzipped
1914410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f2 = new File(dir, "DropBoxTest@" + (before + 100001) + ".txt.gz");
1924410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        GZIPOutputStream gz2 = new GZIPOutputStream(new FileOutputStream(f2));
1934410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz2.write("FUTURE2".getBytes());
1944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz2.close();
1954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Tombstone in the far future
1974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        new FileOutputStream(new File(dir, "DropBoxTest@" + (before + 100002) + ".lost")).close();
1984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
199f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
200f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager dropbox = new DropBoxManager(service);
2014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Until a write, the timestamps are taken at face value
203f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
204f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
205f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
206f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
207b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e3.getTimeMillis()));
2084410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2094410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE0", e0.getText(80));
2104410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE1", e1.getText(80));
2114410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE2", e2.getText(80));
2124410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(null, e3.getText(80));
2134410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2144410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5000, e0.getTimeMillis());
2154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 100000, e1.getTimeMillis());
2164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 100001, e2.getTimeMillis());
2174410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 100002, e3.getTimeMillis());
2184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2194410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
2204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
2214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
2224410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
2234410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2244410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Write something to force a collapse
2254410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("NotDropBoxTest", "FUTURE");
226b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e0 = dropbox.getNextEntry(null, before);
227b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
228b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
229b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
230b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
2314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE0", e0.getText(80));
2334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE1", e1.getText(80));
2344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE2", e2.getText(80));
2354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(null, e3.getText(80));
2364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5000, e0.getTimeMillis());
2384410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5001, e1.getTimeMillis());
2394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5002, e2.getTimeMillis());
2404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5003, e3.getTimeMillis());
2414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
2434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
2444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
2454410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
246952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        service.stop();
2474410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
2484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2494410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testIsTagEnabled() throws Exception {
250f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager dropbox = (DropBoxManager) getContext().getSystemService(
251f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor                Context.DROPBOX_SERVICE);
2524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
2534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST-ENABLED");
2544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(dropbox.isTagEnabled("DropBoxTest"));
2554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
25643866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
25743866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_TAG_PREFIX + "DropBoxTest",
25843866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker                                  "disabled");
2594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST-DISABLED");
2614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertFalse(dropbox.isTagEnabled("DropBoxTest"));
2624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
26343866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_TAG_PREFIX + "DropBoxTest",
26443866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker                                  "");
2654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2664410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST-ENABLED-AGAIN");
2674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(dropbox.isTagEnabled("DropBoxTest"));
2684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
269f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
270f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
271b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis()));
2724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST-ENABLED", e0.getText(80));
2744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST-ENABLED-AGAIN", e1.getText(80));
2754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
2774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
2784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
2794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
280b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor    public void testGetNextEntry() throws Exception {
281b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        File dir = getEmptyDir("testGetNextEntry");
282f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
283f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager dropbox = new DropBoxManager(service);
284b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
285b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        long before = System.currentTimeMillis();
286b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        dropbox.addText("DropBoxTest.A", "A0");
287b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        dropbox.addText("DropBoxTest.B", "B0");
288b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        dropbox.addText("DropBoxTest.A", "A1");
289b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
290f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry a0 = dropbox.getNextEntry("DropBoxTest.A", before);
291f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry a1 = dropbox.getNextEntry("DropBoxTest.A", a0.getTimeMillis());
292b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest.A", a1.getTimeMillis()));
293b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
294f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry b0 = dropbox.getNextEntry("DropBoxTest.B", before);
295b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest.B", b0.getTimeMillis()));
296b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
297f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry x0 = dropbox.getNextEntry(null, before);
298f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry x1 = dropbox.getNextEntry(null, x0.getTimeMillis());
299f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry x2 = dropbox.getNextEntry(null, x1.getTimeMillis());
300b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, x2.getTimeMillis()));
301b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
302b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", a0.getTag());
303b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", a1.getTag());
304b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A0", a0.getText(80));
305b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A1", a1.getText(80));
306b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
307b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.B", b0.getTag());
308b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("B0", b0.getText(80));
309b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
310b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", x0.getTag());
311b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.B", x1.getTag());
312b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", x2.getTag());
313b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A0", x0.getText(80));
314b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("B0", x1.getText(80));
315b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A1", x2.getText(80));
316b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
317b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        a0.close();
318b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        a1.close();
319b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        b0.close();
320b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        x0.close();
321b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        x1.close();
322b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        x2.close();
323952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        service.stop();
324b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor    }
325b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
3264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testSizeLimits() throws Exception {
3274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testSizeLimits");
3284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int blockSize =  new StatFs(dir.getPath()).getBlockSize();
3294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Limit storage to 10 blocks
3314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int kb = blockSize * 10 / 1024;
33243866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
33343866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_QUOTA_KB, Integer.toString(kb));
3344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Three tags using a total of 12 blocks:
3364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // DropBoxTest0 [ ][ ]
3374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // DropBoxTest1 [x][ ][    ][ ][xxx(20 blocks)xxx]
3384410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // DropBoxTest2 [xxxxxxxxxx][ ][ ]
3394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        //
3404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // The blocks marked "x" will be removed due to storage restrictions.
3414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Use random fill (so it doesn't compress), subtract a little for gzip overhead
3424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        final int overhead = 64;
3444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
345f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
346f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager dropbox = new DropBoxManager(service);
347952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
3484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
3494410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
3504410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3514410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
3524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
3534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize * 2 - overhead);
3544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
3554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize * 20 - overhead);
3564410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest2", blockSize * 4 - overhead);
3584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
3594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
3604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
361f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
362f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
363f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
364f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
365f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e4 = dropbox.getNextEntry(null, e3.getTimeMillis());
366f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e5 = dropbox.getNextEntry(null, e4.getTimeMillis());
367f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e6 = dropbox.getNextEntry(null, e5.getTimeMillis());
368f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e7 = dropbox.getNextEntry(null, e6.getTimeMillis());
369f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e8 = dropbox.getNextEntry(null, e7.getTimeMillis());
370f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e9 = dropbox.getNextEntry(null, e8.getTimeMillis());
371b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e9.getTimeMillis()));
3724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest0", e0.getTag());
3744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest0", e1.getTag());
3754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e0));
3764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e1));
3774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e2.getTag());
3794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e3.getTag());
3804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e4.getTag());
3814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e5.getTag());
3824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e6.getTag());
3834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e2));  // Tombstone
3844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e3));
3854410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize * 2 - overhead, getEntrySize(e4));
3864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e5));
3874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e6));
3884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3894410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest2", e7.getTag());
3904410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest2", e8.getTag());
3914410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest2", e9.getTag());
3924410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e7));  // Tombstone
3934410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e8));
3944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e9));
3954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
3974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
3984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
3994410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
4004410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e4.close();
4014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e5.close();
4024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e6.close();
4034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e7.close();
4044410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e8.close();
4054410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e9.close();
406b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
407b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        // Specifying a tag name skips tombstone records.
408b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
409f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry t0 = dropbox.getNextEntry("DropBoxTest1", before);
410f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry t1 = dropbox.getNextEntry("DropBoxTest1", t0.getTimeMillis());
411f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry t2 = dropbox.getNextEntry("DropBoxTest1", t1.getTimeMillis());
412b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest1", t2.getTimeMillis()));
413b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
414b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest1", t0.getTag());
415b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest1", t1.getTag());
416b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest1", t2.getTag());
417b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
418b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals(blockSize - overhead, getEntrySize(t0));
419b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals(blockSize * 2 - overhead, getEntrySize(t1));
420b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals(blockSize - overhead, getEntrySize(t2));
421b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
422b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        t0.close();
423b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        t1.close();
424b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        t2.close();
425952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        service.stop();
4264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
4274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAgeLimits() throws Exception {
4294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testAgeLimits");
4304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int blockSize = new StatFs(dir.getPath()).getBlockSize();
4314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Limit storage to 10 blocks with an expiration of 1 second
4334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int kb = blockSize * 10 / 1024;
43443866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
43543866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_AGE_SECONDS, "1");
43643866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_QUOTA_KB, Integer.toString(kb));
4374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4384410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Write one normal entry and another so big that it is instantly tombstoned
4394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
440f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
441f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager dropbox = new DropBoxManager(service);
442952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
4434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST");
4444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest", blockSize * 20);
4454410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4464410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Verify that things are as expected
447f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
448f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
449b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e1.getTimeMillis()));
4504410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4514410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST", e0.getText(80));
4524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(null, e1.getText(80));
4534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e1));
4544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
4564410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
4574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Wait a second and write another entry -- old ones should be expunged
4594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(2000);
4604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST1");
4614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
462b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e0 = dropbox.getNextEntry(null, before);
463b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e0.getTimeMillis()));
4644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST1", e0.getText(80));
4654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
4664410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
4674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4683a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor    public void testFileCountLimits() throws Exception {
4693a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        File dir = getEmptyDir("testFileCountLimits");
4703a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
4713a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
4723a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager dropbox = new DropBoxManager(service);
4733a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST0");
4743a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST1");
4753a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST2");
4763a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST3");
4773a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST4");
4783a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST5");
4793a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
4803a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        // Verify 6 files added
4813a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, 0);
4823a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
4833a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
4843a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
4853a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e4 = dropbox.getNextEntry(null, e3.getTimeMillis());
4863a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e5 = dropbox.getNextEntry(null, e4.getTimeMillis());
4873a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertTrue(null == dropbox.getNextEntry(null, e5.getTimeMillis()));
4883a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST0", e0.getText(80));
4893a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST5", e5.getText(80));
4903a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
4913a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e0.close();
4923a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e1.close();
4933a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e2.close();
4943a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e3.close();
4953a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e4.close();
4963a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e5.close();
4973a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
4983a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        // Limit to 3 files and add one more entry
4993a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        ContentResolver cr = getContext().getContentResolver();
5003a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        Settings.Secure.putString(cr, Settings.Secure.DROPBOX_MAX_FILES, "3");
5013a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST6");
5023a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5033a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        // Verify only 3 files left
5043a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry f0 = dropbox.getNextEntry(null, 0);
5053a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry f1 = dropbox.getNextEntry(null, f0.getTimeMillis());
5063a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry f2 = dropbox.getNextEntry(null, f1.getTimeMillis());
5073a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertTrue(null == dropbox.getNextEntry(null, f2.getTimeMillis()));
5083a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST4", f0.getText(80));
5093a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST5", f1.getText(80));
5103a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST6", f2.getText(80));
5113a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5123a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        f0.close();
5133a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        f1.close();
5143a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        f2.close();
5153a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor    }
5163a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
517f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    public void testCreateDropBoxManagerWithInvalidDirectory() throws Exception {
518f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        // If created with an invalid directory, the DropBoxManager should suffer quietly
5194410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // and fail all operations (this is how it survives a full disk).
5204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Once the directory becomes possible to create, it will start working.
5214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
522f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        File dir = new File(getEmptyDir("testCreateDropBoxManagerWith"), "InvalidDirectory");
5234410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        new FileOutputStream(dir).close();  // Create an empty file
524f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
525f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager dropbox = new DropBoxManager(service);
5264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "should be ignored");
5284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addData("DropBoxTest", "should be ignored".getBytes(), 0);
529b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", 0));
5304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dir.delete();  // Remove the file so a directory can be created
5324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST");
533f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", 0);
534b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
5354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest", e.getTag());
5364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST", e.getText(80));
5374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e.close();
538952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor        service.stop();
5394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
5404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5416e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    public void testDropBoxEntrySerialization() throws Exception {
5426e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        // Make sure DropBoxManager.Entry can be serialized to a Parcel and back
5436e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        // under a variety of conditions.
5446e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5456e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        Parcel parcel = Parcel.obtain();
5466e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File dir = getEmptyDir("testDropBoxEntrySerialization");
5476e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5486e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("empty", 1000000).writeToParcel(parcel, 0);
5496e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("string", 2000000, "String Value").writeToParcel(parcel, 0);
5506e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("bytes", 3000000, "Bytes Value".getBytes(),
5516e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_TEXT).writeToParcel(parcel, 0);
5526e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("zerobytes", 4000000, new byte[0], 0).writeToParcel(parcel, 0);
5536e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("emptybytes", 5000000, (byte[]) null,
5546e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
5556e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5566e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
5576e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badbytes", 99999,
5586e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    "Bad Bytes Value".getBytes(),
5596e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
5606e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for non-null byte[] and IS_EMPTY flags");
5616e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
5626e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
5636e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
5646e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5656e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
5666e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badbytes", 99999, (byte[]) null, 0).writeToParcel(parcel, 0);
5676e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for null byte[] and non-IS_EMPTY flags");
5686e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
5696e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
5706e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
5716e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5726e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File f = new File(dir, "file.dat");
5736e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        FileOutputStream os = new FileOutputStream(f);
5746e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.write("File Value".getBytes());
5756e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.close();
5766e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5776e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("file", 6000000, f, DropBoxManager.IS_TEXT).writeToParcel(
5786e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
5796e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("binfile", 7000000, f, 0).writeToParcel(
5806e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
5816e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("emptyfile", 8000000, (ParcelFileDescriptor) null,
5826e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
5836e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5846e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
5856e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badfile", 99999, new File(dir, "nonexist.dat"), 0);
5866e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IOException expected for nonexistent file");
5876e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IOException e) {
5886e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
5896e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
5906e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5916e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
5926e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badfile", 99999, f, DropBoxManager.IS_EMPTY).writeToParcel(
5936e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, 0);
5946e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for non-null file and IS_EMPTY flags");
5956e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
5966e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
5976e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
5986e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5996e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
6006e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badfile", 99999, (ParcelFileDescriptor) null, 0);
6016e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for null PFD and non-IS_EMPTY flags");
6026e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
6036e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
6046e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
6056e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6066e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File gz = new File(dir, "file.gz");
6076e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        GZIPOutputStream gzout = new GZIPOutputStream(new FileOutputStream(gz));
6086e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        gzout.write("Gzip File Value".getBytes());
6096e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        gzout.close();
6106e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6116e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("gzipfile", 9000000, gz,
6126e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED).writeToParcel(
6136e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
6146e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("gzipbinfile", 10000000, gz,
6156e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_GZIPPED).writeToParcel(
6166e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
6176e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6186e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        //
6196e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        // Switch from writing to reading
6206e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        //
6216e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6226e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        parcel.setDataPosition(0);
6236e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        DropBoxManager.Entry e;
6246e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6256e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6266e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("empty", e.getTag());
6276e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(1000000, e.getTimeMillis());
6286e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
6296e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6306e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getInputStream());
6316e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6326e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6336e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6346e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("string", e.getTag());
6356e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(2000000, e.getTimeMillis());
6366e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6376e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("String Value", e.getText(100));
6386e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("String Value",
6396e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
6406e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6416e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6426e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6436e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("bytes", e.getTag());
6446e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(3000000, e.getTimeMillis());
6456e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6466e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("Bytes Value", e.getText(100));
6476e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6486e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6496e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6506e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("zerobytes", e.getTag());
6516e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(4000000, e.getTimeMillis());
6526e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, e.getFlags());
6536e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6546e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null,
6556e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
6566e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6576e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6586e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6596e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("emptybytes", e.getTag());
6606e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(5000000, e.getTimeMillis());
6616e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
6626e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6636e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getInputStream());
6646e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6656e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6666e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6676e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("file", e.getTag());
6686e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(6000000, e.getTimeMillis());
6696e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6706e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("File Value", e.getText(100));
6716e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6726e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6736e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6746e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("binfile", e.getTag());
6756e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(7000000, e.getTimeMillis());
6766e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, e.getFlags());
6776e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6786e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("File Value",
6796e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
6806e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6816e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6826e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6836e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("emptyfile", e.getTag());
6846e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(8000000, e.getTimeMillis());
6856e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
6866e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6876e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getInputStream());
6886e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6896e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6906e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6916e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("gzipfile", e.getTag());
6926e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(9000000, e.getTimeMillis());
6936e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6946e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("Gzip File Value", e.getText(100));
6956e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6966e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6976e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6986e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("gzipbinfile", e.getTag());
6996e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(10000000, e.getTimeMillis());
7006e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, e.getFlags());
7016e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
7026e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("Gzip File Value",
7036e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
7046e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
7056e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
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