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;
21ff94e0351a908504c588efac2084811840cde453Makoto Onukiimport android.content.ContextWrapper;
224410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.content.Intent;
23f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnorimport android.os.DropBoxManager;
24ff94e0351a908504c588efac2084811840cde453Makoto Onukiimport android.os.Looper;
256e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport android.os.Parcel;
266e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport android.os.ParcelFileDescriptor;
27ff94e0351a908504c588efac2084811840cde453Makoto Onukiimport android.os.Parcelable;
286e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport android.os.Process;
294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.os.StatFs;
30ff94e0351a908504c588efac2084811840cde453Makoto Onukiimport android.os.UserHandle;
314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.provider.Settings;
324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport android.test.AndroidTestCase;
334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
34ff94e0351a908504c588efac2084811840cde453Makoto Onukiimport com.android.server.DropBoxManagerService.EntryFile;
354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
366e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport java.io.BufferedReader;
374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.io.File;
384410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.io.FileOutputStream;
394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.io.FileWriter;
406e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport java.io.IOException;
414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.io.InputStream;
426e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnorimport java.io.InputStreamReader;
434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.util.Random;
444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorimport java.util.zip.GZIPOutputStream;
454410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
46ff94e0351a908504c588efac2084811840cde453Makoto Onuki/**
47ff94e0351a908504c588efac2084811840cde453Makoto Onuki * Test {@link DropBoxManager} functionality.
48ff94e0351a908504c588efac2084811840cde453Makoto Onuki *
49ff94e0351a908504c588efac2084811840cde453Makoto Onuki * Run with:
50ff94e0351a908504c588efac2084811840cde453Makoto Onuki * bit FrameworksServicesTests:com.android.server.DropBoxTest
51ff94e0351a908504c588efac2084811840cde453Makoto Onuki */
524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnorpublic class DropBoxTest extends AndroidTestCase {
53ff94e0351a908504c588efac2084811840cde453Makoto Onuki    private Context mContext;
54ff94e0351a908504c588efac2084811840cde453Makoto Onuki
55ff94e0351a908504c588efac2084811840cde453Makoto Onuki    @Override
56ff94e0351a908504c588efac2084811840cde453Makoto Onuki    protected void setUp() throws Exception {
57ff94e0351a908504c588efac2084811840cde453Makoto Onuki        super.setUp();
58ff94e0351a908504c588efac2084811840cde453Makoto Onuki
59ff94e0351a908504c588efac2084811840cde453Makoto Onuki        mContext = new ContextWrapper(super.getContext()) {
60ff94e0351a908504c588efac2084811840cde453Makoto Onuki            @Override
61ff94e0351a908504c588efac2084811840cde453Makoto Onuki            public void sendBroadcastAsUser(Intent intent,
62ff94e0351a908504c588efac2084811840cde453Makoto Onuki                    UserHandle user, String receiverPermission) {
63ff94e0351a908504c588efac2084811840cde453Makoto Onuki                // Don't actually send broadcasts.
64ff94e0351a908504c588efac2084811840cde453Makoto Onuki            }
65ff94e0351a908504c588efac2084811840cde453Makoto Onuki        };
66ff94e0351a908504c588efac2084811840cde453Makoto Onuki    }
67ff94e0351a908504c588efac2084811840cde453Makoto Onuki
684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void tearDown() throws Exception {
6943866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
70625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_AGE_SECONDS, "");
71625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_MAX_FILES, "");
72625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_QUOTA_KB, "");
73625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_TAG_PREFIX + "DropBoxTest", "");
744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
76ff94e0351a908504c588efac2084811840cde453Makoto Onuki    @Override
77ff94e0351a908504c588efac2084811840cde453Makoto Onuki    public Context getContext() {
78ff94e0351a908504c588efac2084811840cde453Makoto Onuki        return mContext;
79ff94e0351a908504c588efac2084811840cde453Makoto Onuki    }
80ff94e0351a908504c588efac2084811840cde453Makoto Onuki
814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddText() throws Exception {
820935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        File dir = getEmptyDir("testAddText");
83ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
84ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
85b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
860935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn
874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
894410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST0");
904410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
914410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long between = System.currentTimeMillis();
924410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
934410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST1");
944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST2");
954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(5);
964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long after = System.currentTimeMillis();
974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
98f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
99f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
100f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
101b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis()));
1024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e0.getTimeMillis() > before);
1044410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e0.getTimeMillis() < between);
1054410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e1.getTimeMillis() > between);
1064410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e1.getTimeMillis() < e2.getTimeMillis());
1074410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e2.getTimeMillis() < after);
1084410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1094410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST0", e0.getText(80));
1104410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST1", e1.getText(80));
1114410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TES", e2.getText(3));
1124410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1134410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
1144410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
1154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
1164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
1174410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddData() throws Exception {
1190935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        File dir = getEmptyDir("testAddData");
120ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
121ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
122b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
1230935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn
1244410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
125ff94e0351a908504c588efac2084811840cde453Makoto Onuki        Thread.sleep(1);
1264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addData("DropBoxTest", "TEST".getBytes(), 0);
127ff94e0351a908504c588efac2084811840cde453Makoto Onuki        Thread.sleep(1);
1284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long after = System.currentTimeMillis();
1294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
130f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", before);
131ff94e0351a908504c588efac2084811840cde453Makoto Onuki        assertNotNull(e);
132ff94e0351a908504c588efac2084811840cde453Makoto Onuki        assertNull(dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
1334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest", e.getTag());
1354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e.getTimeMillis() >= before);
1364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(0, e.getFlags());
1374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(null == e.getText(80));
1384410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf = new byte[80];
1404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST", new String(buf, 0, e.getInputStream().read(buf)));
1414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e.close();
1434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
1444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1454410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddFile() throws Exception {
1464410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testAddFile");
1474410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
1484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
149ff94e0351a908504c588efac2084811840cde453Makoto Onuki        File clientDir = getEmptyDir("testAddFile_client");
150ff94e0351a908504c588efac2084811840cde453Makoto Onuki
151ff94e0351a908504c588efac2084811840cde453Makoto Onuki        File f0 = new File(clientDir, "f0.txt");
152ff94e0351a908504c588efac2084811840cde453Makoto Onuki        File f1 = new File(clientDir, "f1.txt.gz");
153ff94e0351a908504c588efac2084811840cde453Makoto Onuki        File f2 = new File(clientDir, "f2.dat");
154ff94e0351a908504c588efac2084811840cde453Makoto Onuki        File f3 = new File(clientDir, "f2.dat.gz");
1554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1564410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileWriter w0 = new FileWriter(f0);
1574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        GZIPOutputStream gz1 = new GZIPOutputStream(new FileOutputStream(f1));
1584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileOutputStream os2 = new FileOutputStream(f2);
1594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        GZIPOutputStream gz3 = new GZIPOutputStream(new FileOutputStream(f3));
1604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.write("FILE0");
1624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz1.write("FILE1".getBytes());
1634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os2.write("DATA2".getBytes());
1644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz3.write("DATA3".getBytes());
1654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1664410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.close();
1674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz1.close();
1684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os2.close();
1694410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz3.close();
1704410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
171ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
172ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
173b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
1744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
175eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f0, DropBoxManager.IS_TEXT);
176eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f1, DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED);
177eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f2, 0);
178eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile("DropBoxTest", f3, DropBoxManager.IS_GZIPPED);
1794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
180f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
181f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
182f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
183f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis());
184b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
1854410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e0.getTimeMillis() > before);
1874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e1.getTimeMillis() > e0.getTimeMillis());
1884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e2.getTimeMillis() > e1.getTimeMillis());
1894410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(e3.getTimeMillis() > e2.getTimeMillis());
1904410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
191f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        assertEquals(DropBoxManager.IS_TEXT, e0.getFlags());
192f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        assertEquals(DropBoxManager.IS_TEXT, e1.getFlags());
1934410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(0, e2.getFlags());
1944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(0, e3.getFlags());
1954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FILE0", e0.getText(80));
1974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf1 = new byte[80];
1994410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FILE1", new String(buf1, 0, e1.getInputStream().read(buf1)));
2004410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(null == e2.getText(80));
2024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf2 = new byte[80];
2034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DATA2", new String(buf2, 0, e2.getInputStream().read(buf2)));
2044410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2054410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(null == e3.getText(80));
2064410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] buf3 = new byte[80];
2074410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DATA3", new String(buf3, 0, e3.getInputStream().read(buf3)));
2084410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2094410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
2104410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
2114410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
2124410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
2134410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
2144410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAddEntriesInTheFuture() throws Exception {
2164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testAddEntriesInTheFuture");
2174410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
2184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2194410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Near future: should be allowed to persist
2204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileWriter w0 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 5000) + ".txt"));
2214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.write("FUTURE0");
2224410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w0.close();
2234410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2244410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Far future: should be collapsed
2254410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileWriter w1 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 100000) + ".txt"));
2264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w1.write("FUTURE1");
2274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        w1.close();
2284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Another far future item, this one gzipped
2304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f2 = new File(dir, "DropBoxTest@" + (before + 100001) + ".txt.gz");
2314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        GZIPOutputStream gz2 = new GZIPOutputStream(new FileOutputStream(f2));
2324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz2.write("FUTURE2".getBytes());
2334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        gz2.close();
2344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Tombstone in the far future
2364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        new FileOutputStream(new File(dir, "DropBoxTest@" + (before + 100002) + ".lost")).close();
2374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
238ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
239ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
240b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
2414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Until a write, the timestamps are taken at face value
243f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
244f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
245f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
246f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
247b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e3.getTimeMillis()));
2484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2494410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE0", e0.getText(80));
2504410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE1", e1.getText(80));
2514410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE2", e2.getText(80));
2524410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(null, e3.getText(80));
2534410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2544410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5000, e0.getTimeMillis());
2554410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 100000, e1.getTimeMillis());
2564410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 100001, e2.getTimeMillis());
2574410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 100002, e3.getTimeMillis());
2584410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2594410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
2604410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
2614410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
2624410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
2634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Write something to force a collapse
2654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("NotDropBoxTest", "FUTURE");
266b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e0 = dropbox.getNextEntry(null, before);
267b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
268b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
269b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
270b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
2714410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE0", e0.getText(80));
2734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE1", e1.getText(80));
2744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("FUTURE2", e2.getText(80));
2754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(null, e3.getText(80));
2764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5000, e0.getTimeMillis());
2784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5001, e1.getTimeMillis());
2794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5002, e2.getTimeMillis());
2804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(before + 5003, e3.getTimeMillis());
2814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
2834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
2844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
2854410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
2864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
2874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
2884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testIsTagEnabled() throws Exception {
2890935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn        File dir = getEmptyDir("testIsTagEnabled");
290ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
291ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
292b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
2930935f3ce512a62f943d2cc4daa65145ad6937c34Tim Kilbourn
2944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
2954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST-ENABLED");
2964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(dropbox.isTagEnabled("DropBoxTest"));
2974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
29843866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
299625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_TAG_PREFIX + "DropBoxTest",
30043866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker                                  "disabled");
3014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST-DISABLED");
3034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertFalse(dropbox.isTagEnabled("DropBoxTest"));
3044410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
305625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_TAG_PREFIX + "DropBoxTest",
30643866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker                                  "");
3074410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3084410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST-ENABLED-AGAIN");
3094410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(dropbox.isTagEnabled("DropBoxTest"));
3104410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
311f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
312f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
313b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis()));
3144410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST-ENABLED", e0.getText(80));
3164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST-ENABLED-AGAIN", e1.getText(80));
3174410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
3194410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
3204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
3214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
322b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor    public void testGetNextEntry() throws Exception {
323b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        File dir = getEmptyDir("testGetNextEntry");
324ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
325ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
326b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
327b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
328b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        long before = System.currentTimeMillis();
329b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        dropbox.addText("DropBoxTest.A", "A0");
330b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        dropbox.addText("DropBoxTest.B", "B0");
331b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        dropbox.addText("DropBoxTest.A", "A1");
332b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
333f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry a0 = dropbox.getNextEntry("DropBoxTest.A", before);
334f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry a1 = dropbox.getNextEntry("DropBoxTest.A", a0.getTimeMillis());
335b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest.A", a1.getTimeMillis()));
336b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
337f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry b0 = dropbox.getNextEntry("DropBoxTest.B", before);
338b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest.B", b0.getTimeMillis()));
339b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
340f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry x0 = dropbox.getNextEntry(null, before);
341f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry x1 = dropbox.getNextEntry(null, x0.getTimeMillis());
342f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry x2 = dropbox.getNextEntry(null, x1.getTimeMillis());
343b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, x2.getTimeMillis()));
344b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
345b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", a0.getTag());
346b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", a1.getTag());
347b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A0", a0.getText(80));
348b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A1", a1.getText(80));
349b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
350b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.B", b0.getTag());
351b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("B0", b0.getText(80));
352b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
353b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", x0.getTag());
354b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.B", x1.getTag());
355b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest.A", x2.getTag());
356b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A0", x0.getText(80));
357b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("B0", x1.getText(80));
358b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("A1", x2.getText(80));
359b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
360b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        a0.close();
361b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        a1.close();
362b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        b0.close();
363b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        x0.close();
364b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        x1.close();
365b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        x2.close();
366b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor    }
367b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
3684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testSizeLimits() throws Exception {
3694410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testSizeLimits");
3704410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int blockSize =  new StatFs(dir.getPath()).getBlockSize();
3714410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Limit storage to 10 blocks
3734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int kb = blockSize * 10 / 1024;
37443866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
375625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_QUOTA_KB, Integer.toString(kb));
3764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Three tags using a total of 12 blocks:
3784410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // DropBoxTest0 [ ][ ]
3794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // DropBoxTest1 [x][ ][    ][ ][xxx(20 blocks)xxx]
3804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // DropBoxTest2 [xxxxxxxxxx][ ][ ]
3814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        //
3824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // The blocks marked "x" will be removed due to storage restrictions.
3834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Use random fill (so it doesn't compress), subtract a little for gzip overhead
3844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3854410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        final int overhead = 64;
3864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
387ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
388ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
389b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
390952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
3914410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
3924410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
3934410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
3944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
3954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
3964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize * 2 - overhead);
3974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
3984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest1", blockSize * 20 - overhead);
3994410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4004410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest2", blockSize * 4 - overhead);
4014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
4024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
4034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
404f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
405f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
406f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
407f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
408f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e4 = dropbox.getNextEntry(null, e3.getTimeMillis());
409f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e5 = dropbox.getNextEntry(null, e4.getTimeMillis());
410f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e6 = dropbox.getNextEntry(null, e5.getTimeMillis());
411f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e7 = dropbox.getNextEntry(null, e6.getTimeMillis());
412f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e8 = dropbox.getNextEntry(null, e7.getTimeMillis());
413f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e9 = dropbox.getNextEntry(null, e8.getTimeMillis());
414b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e9.getTimeMillis()));
4154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest0", e0.getTag());
4174410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest0", e1.getTag());
4184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e0));
4194410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e1));
4204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e2.getTag());
4224410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e3.getTag());
4234410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e4.getTag());
4244410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e5.getTag());
4254410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest1", e6.getTag());
4264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e2));  // Tombstone
4274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e3));
4284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize * 2 - overhead, getEntrySize(e4));
4294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e5));
4304410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e6));
4314410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4324410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest2", e7.getTag());
4334410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest2", e8.getTag());
4344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest2", e9.getTag());
4354410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e7));  // Tombstone
4364410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e8));
4374410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(blockSize - overhead, getEntrySize(e9));
4384410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4394410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
4404410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
4414410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e2.close();
4424410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e3.close();
4434410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e4.close();
4444410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e5.close();
4454410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e6.close();
4464410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e7.close();
4474410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e8.close();
4484410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e9.close();
449b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
450b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        // Specifying a tag name skips tombstone records.
451b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
452f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry t0 = dropbox.getNextEntry("DropBoxTest1", before);
453f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry t1 = dropbox.getNextEntry("DropBoxTest1", t0.getTimeMillis());
454f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry t2 = dropbox.getNextEntry("DropBoxTest1", t1.getTimeMillis());
455b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest1", t2.getTimeMillis()));
456b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
457b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest1", t0.getTag());
458b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest1", t1.getTag());
459b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals("DropBoxTest1", t2.getTag());
460b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
461b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals(blockSize - overhead, getEntrySize(t0));
462b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals(blockSize * 2 - overhead, getEntrySize(t1));
463b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertEquals(blockSize - overhead, getEntrySize(t2));
464b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor
465b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        t0.close();
466b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        t1.close();
467b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        t2.close();
4684410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
4694410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4704410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    public void testAgeLimits() throws Exception {
4714410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getEmptyDir("testAgeLimits");
4724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int blockSize = new StatFs(dir.getPath()).getBlockSize();
4734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4744410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Limit storage to 10 blocks with an expiration of 1 second
4754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int kb = blockSize * 10 / 1024;
47643866e0c48bb0effe8805afd62b253e50ca7d591Doug Zongker        ContentResolver cr = getContext().getContentResolver();
477625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_AGE_SECONDS, "1");
478625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_QUOTA_KB, Integer.toString(kb));
4794410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Write one normal entry and another so big that it is instantly tombstoned
4814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        long before = System.currentTimeMillis();
482ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
483ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
484b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
485952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor
4864410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST");
4874410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        addRandomEntry(dropbox, "DropBoxTest", blockSize * 20);
4884410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4894410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Verify that things are as expected
490f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
491f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
492b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e1.getTimeMillis()));
4934410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4944410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST", e0.getText(80));
4954410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(null, e1.getText(80));
4964410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals(-1, getEntrySize(e1));
4974410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
4984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
4994410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e1.close();
5004410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Wait a second and write another entry -- old ones should be expunged
5024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        Thread.sleep(2000);
5034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST1");
5044410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
505b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        e0 = dropbox.getNextEntry(null, before);
506b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry(null, e0.getTimeMillis()));
5074410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST1", e0.getText(80));
5084410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e0.close();
5094410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
5104410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5113a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor    public void testFileCountLimits() throws Exception {
5123a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        File dir = getEmptyDir("testFileCountLimits");
5133a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
514ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
515ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
516b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
5173a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST0");
5183a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST1");
5193a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST2");
5203a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST3");
5213a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST4");
5223a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST5");
5233a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5243a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        // Verify 6 files added
5253a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e0 = dropbox.getNextEntry(null, 0);
5263a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
5273a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
5283a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
5293a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e4 = dropbox.getNextEntry(null, e3.getTimeMillis());
5303a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry e5 = dropbox.getNextEntry(null, e4.getTimeMillis());
5313a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertTrue(null == dropbox.getNextEntry(null, e5.getTimeMillis()));
5323a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST0", e0.getText(80));
5333a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST5", e5.getText(80));
5343a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5353a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e0.close();
5363a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e1.close();
5373a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e2.close();
5383a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e3.close();
5393a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e4.close();
5403a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        e5.close();
5413a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5423a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        // Limit to 3 files and add one more entry
5433a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        ContentResolver cr = getContext().getContentResolver();
544625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey        Settings.Global.putString(cr, Settings.Global.DROPBOX_MAX_FILES, "3");
5453a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        dropbox.addText("DropBoxTest", "TEST6");
5463a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5473a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        // Verify only 3 files left
5483a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry f0 = dropbox.getNextEntry(null, 0);
5493a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry f1 = dropbox.getNextEntry(null, f0.getTimeMillis());
5503a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        DropBoxManager.Entry f2 = dropbox.getNextEntry(null, f1.getTimeMillis());
5513a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertTrue(null == dropbox.getNextEntry(null, f2.getTimeMillis()));
5523a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST4", f0.getText(80));
5533a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST5", f1.getText(80));
5543a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        assertEquals("TEST6", f2.getText(80));
5553a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
5563a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        f0.close();
5573a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        f1.close();
5583a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor        f2.close();
5593a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor    }
5603a8b0c18a49c017ecfde8ebf4eb4bb5181ac6fefDan Egnor
561f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    public void testCreateDropBoxManagerWithInvalidDirectory() throws Exception {
562f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        // If created with an invalid directory, the DropBoxManager should suffer quietly
5634410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // and fail all operations (this is how it survives a full disk).
5644410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        // Once the directory becomes possible to create, it will start working.
5654410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
566f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        File dir = new File(getEmptyDir("testCreateDropBoxManagerWith"), "InvalidDirectory");
5674410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        new FileOutputStream(dir).close();  // Create an empty file
568ff94e0351a908504c588efac2084811840cde453Makoto Onuki        DropBoxManagerService service = new DropBoxManagerService(getContext(), dir,
569ff94e0351a908504c588efac2084811840cde453Makoto Onuki                Looper.getMainLooper());
570b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey        DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
5714410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5724410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "should be ignored");
5734410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addData("DropBoxTest", "should be ignored".getBytes(), 0);
574b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", 0));
5754410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5764410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dir.delete();  // Remove the file so a directory can be created
5774410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        dropbox.addText("DropBoxTest", "TEST");
578f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor        DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", 0);
579b3b06fc39b032288d33f663b687d78bec7f1d724Dan Egnor        assertTrue(null == dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
5804410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("DropBoxTest", e.getTag());
5814410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertEquals("TEST", e.getText(80));
5824410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        e.close();
5834410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
5844410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
5856e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    public void testDropBoxEntrySerialization() throws Exception {
5866e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        // Make sure DropBoxManager.Entry can be serialized to a Parcel and back
5876e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        // under a variety of conditions.
5886e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5896e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        Parcel parcel = Parcel.obtain();
5906e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File dir = getEmptyDir("testDropBoxEntrySerialization");
5916e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
5926e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("empty", 1000000).writeToParcel(parcel, 0);
5936e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("string", 2000000, "String Value").writeToParcel(parcel, 0);
5946e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("bytes", 3000000, "Bytes Value".getBytes(),
5956e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_TEXT).writeToParcel(parcel, 0);
5966e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("zerobytes", 4000000, new byte[0], 0).writeToParcel(parcel, 0);
5976e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("emptybytes", 5000000, (byte[]) null,
5986e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
5996e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6006e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
6016e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badbytes", 99999,
6026e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    "Bad Bytes Value".getBytes(),
6036e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
6046e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for non-null byte[] and IS_EMPTY flags");
6056e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
6066e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
6076e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
6086e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6096e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
6106e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badbytes", 99999, (byte[]) null, 0).writeToParcel(parcel, 0);
6116e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for null byte[] and non-IS_EMPTY flags");
6126e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
6136e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
6146e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
6156e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6166e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File f = new File(dir, "file.dat");
6176e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        FileOutputStream os = new FileOutputStream(f);
6186e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.write("File Value".getBytes());
6196e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.close();
6206e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6216e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("file", 6000000, f, DropBoxManager.IS_TEXT).writeToParcel(
6226e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
6236e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("binfile", 7000000, f, 0).writeToParcel(
6246e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
6256e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("emptyfile", 8000000, (ParcelFileDescriptor) null,
6266e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
6276e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6286e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
6296e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badfile", 99999, new File(dir, "nonexist.dat"), 0);
6306e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IOException expected for nonexistent file");
6316e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IOException e) {
6326e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
6336e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
6346e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6356e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
6366e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badfile", 99999, f, DropBoxManager.IS_EMPTY).writeToParcel(
6376e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, 0);
6386e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for non-null file and IS_EMPTY flags");
6396e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
6406e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
6416e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
6426e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6436e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        try {
6446e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("badfile", 99999, (ParcelFileDescriptor) null, 0);
6456e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            fail("IllegalArgumentException expected for null PFD and non-IS_EMPTY flags");
6466e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        } catch (IllegalArgumentException e) {
6476e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            // expected
6486e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
6496e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6506e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File gz = new File(dir, "file.gz");
6516e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        GZIPOutputStream gzout = new GZIPOutputStream(new FileOutputStream(gz));
6526e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        gzout.write("Gzip File Value".getBytes());
6536e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        gzout.close();
6546e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6556e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("gzipfile", 9000000, gz,
6566e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED).writeToParcel(
6576e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
6586e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        new DropBoxManager.Entry("gzipbinfile", 10000000, gz,
6596e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                DropBoxManager.IS_GZIPPED).writeToParcel(
6606e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
6616e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6626e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        //
6636e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        // Switch from writing to reading
6646e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        //
6656e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6666e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        parcel.setDataPosition(0);
6676e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        DropBoxManager.Entry e;
6686e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6696e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6706e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("empty", e.getTag());
6716e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(1000000, e.getTimeMillis());
6726e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
6736e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6746e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getInputStream());
6756e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6766e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6776e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6786e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("string", e.getTag());
6796e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(2000000, e.getTimeMillis());
6806e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6816e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("String Value", e.getText(100));
6826e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("String Value",
6836e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
6846e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6856e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6866e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6876e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("bytes", e.getTag());
6886e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(3000000, e.getTimeMillis());
6896e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
6906e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("Bytes Value", e.getText(100));
6916e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
6926e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
6936e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
6946e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("zerobytes", e.getTag());
6956e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(4000000, e.getTimeMillis());
6966e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, e.getFlags());
6976e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
6986e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null,
6996e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
7006e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
7016e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7026e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
7036e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("emptybytes", e.getTag());
7046e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(5000000, e.getTimeMillis());
7056e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
7066e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
7076e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getInputStream());
7086e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
7096e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7106e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
7116e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("file", e.getTag());
7126e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(6000000, e.getTimeMillis());
7136e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
7146e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("File Value", e.getText(100));
7156e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
7166e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7176e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
7186e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("binfile", e.getTag());
7196e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(7000000, e.getTimeMillis());
7206e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, e.getFlags());
7216e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
7226e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("File Value",
7236e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
7246e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
7256e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
7266e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("emptyfile", e.getTag());
7276e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(8000000, e.getTimeMillis());
7286e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
7296e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
7306e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getInputStream());
7316e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
7326e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7336e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
7346e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("gzipfile", e.getTag());
7356e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(9000000, e.getTimeMillis());
7366e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
7376e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("Gzip File Value", e.getText(100));
7386e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
7396e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7406e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
7416e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("gzipbinfile", e.getTag());
7426e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(10000000, e.getTimeMillis());
7436e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, e.getFlags());
7446e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(null, e.getText(100));
7456e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals("Gzip File Value",
7466e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
7476e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        e.close();
7486e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertEquals(0, parcel.dataAvail());
7496e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        parcel.recycle();
7506e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    }
7516e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7526e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    public void testDropBoxEntrySerializationDoesntLeakFileDescriptors() throws Exception {
7536e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File dir = getEmptyDir("testDropBoxEntrySerialization");
7546e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        File f = new File(dir, "file.dat");
7556e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        FileOutputStream os = new FileOutputStream(f);
7566e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.write("File Value".getBytes());
7576e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        os.close();
7586e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7596e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        int before = countOpenFiles();
7606e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertTrue(before > 0);
7616e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7626e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        for (int i = 0; i < 1000; i++) {
7636e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            Parcel parcel = Parcel.obtain();
7646e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            new DropBoxManager.Entry("file", 1000000, f, 0).writeToParcel(
7656e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor                    parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
7666e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7676e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            parcel.setDataPosition(0);
7686e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            DropBoxManager.Entry e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
7696e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            assertEquals("file", e.getTag());
7706e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            e.close();
7716e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7726e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor            parcel.recycle();
7736e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        }
7746e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
7756e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        int after = countOpenFiles();
7766e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertTrue(after > 0);
7776e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        assertTrue(after < before + 20);
7786e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    }
7796e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
780ff94e0351a908504c588efac2084811840cde453Makoto Onuki    public void testEntryFile() throws Exception {
781ff94e0351a908504c588efac2084811840cde453Makoto Onuki        File fromDir = getEmptyDir("testEntryFile_from");
782ff94e0351a908504c588efac2084811840cde453Makoto Onuki        File toDir = getEmptyDir("testEntryFile_to");
783ff94e0351a908504c588efac2084811840cde453Makoto Onuki
784ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
785ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "f0.txt");
786ff94e0351a908504c588efac2084811840cde453Makoto Onuki            try (FileWriter w = new FileWriter(f)) {
787ff94e0351a908504c588efac2084811840cde453Makoto Onuki                w.write("abc");
788ff94e0351a908504c588efac2084811840cde453Makoto Onuki            }
789ff94e0351a908504c588efac2084811840cde453Makoto Onuki
790ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, toDir, "tag:!", 12345, DropBoxManager.IS_TEXT, 1024);
791ff94e0351a908504c588efac2084811840cde453Makoto Onuki
792ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("tag:!", e.tag);
793ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(12345, e.timestampMillis);
794ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(DropBoxManager.IS_TEXT, e.flags);
795ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(1, e.blocks);
796ff94e0351a908504c588efac2084811840cde453Makoto Onuki
797ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertFalse(f.exists()); // Because it should be renamed.
798ff94e0351a908504c588efac2084811840cde453Makoto Onuki
799ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(e.hasFile());
800ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(new File(toDir, "tag%3A!@12345.txt"), e.getFile(toDir));
801ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(e.getFile(toDir).exists());
802ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
803ff94e0351a908504c588efac2084811840cde453Makoto Onuki        // Same test with gzip.
804ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
805ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "f0.txt.gz"); // It's a lie; it's not actually gz.
806ff94e0351a908504c588efac2084811840cde453Makoto Onuki            try (FileWriter w = new FileWriter(f)) {
807ff94e0351a908504c588efac2084811840cde453Makoto Onuki                w.write("abc");
808ff94e0351a908504c588efac2084811840cde453Makoto Onuki            }
809ff94e0351a908504c588efac2084811840cde453Makoto Onuki
810ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, toDir, "tag:!", 12345,
811ff94e0351a908504c588efac2084811840cde453Makoto Onuki                    DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED, 1024);
812ff94e0351a908504c588efac2084811840cde453Makoto Onuki
813ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("tag:!", e.tag);
814ff94e0351a908504c588efac2084811840cde453Makoto Onuki
815ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertFalse(f.exists()); // Because it should be renamed.
816ff94e0351a908504c588efac2084811840cde453Makoto Onuki
817ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(e.hasFile());
818ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(new File(toDir, "tag%3A!@12345.txt.gz"), e.getFile(toDir));
819ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(e.getFile(toDir).exists());
820ff94e0351a908504c588efac2084811840cde453Makoto Onuki
821ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
822ff94e0351a908504c588efac2084811840cde453Makoto Onuki        // binary, gzip.
823ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
824ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "f0.dat.gz"); // It's a lie; it's not actually gz.
825ff94e0351a908504c588efac2084811840cde453Makoto Onuki            try (FileWriter w = new FileWriter(f)) {
826ff94e0351a908504c588efac2084811840cde453Makoto Onuki                w.write("abc");
827ff94e0351a908504c588efac2084811840cde453Makoto Onuki            }
828ff94e0351a908504c588efac2084811840cde453Makoto Onuki
829ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, toDir, "tag:!", 12345,
830ff94e0351a908504c588efac2084811840cde453Makoto Onuki                    DropBoxManager.IS_GZIPPED, 1024);
831ff94e0351a908504c588efac2084811840cde453Makoto Onuki
832ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("tag:!", e.tag);
833ff94e0351a908504c588efac2084811840cde453Makoto Onuki
834ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertFalse(f.exists()); // Because it should be renamed.
835ff94e0351a908504c588efac2084811840cde453Makoto Onuki
836ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(e.hasFile());
837ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(new File(toDir, "tag%3A!@12345.dat.gz"), e.getFile(toDir));
838ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(e.getFile(toDir).exists());
839ff94e0351a908504c588efac2084811840cde453Makoto Onuki
840ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
841ff94e0351a908504c588efac2084811840cde453Makoto Onuki
842ff94e0351a908504c588efac2084811840cde453Makoto Onuki        // Tombstone.
843ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
844ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(toDir, "tag:!", 12345);
845ff94e0351a908504c588efac2084811840cde453Makoto Onuki
846ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("tag:!", e.tag);
847ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(12345, e.timestampMillis);
848ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(DropBoxManager.IS_EMPTY, e.flags);
849ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.blocks);
850ff94e0351a908504c588efac2084811840cde453Makoto Onuki
851ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(e.hasFile());
852ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(new File(toDir, "tag%3A!@12345.lost"), e.getFile(toDir));
853ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(e.getFile(toDir).exists());
854ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
855ff94e0351a908504c588efac2084811840cde453Makoto Onuki
856ff94e0351a908504c588efac2084811840cde453Makoto Onuki        // From existing files.
857ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
858ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "tag%3A!@12345.dat");
859ff94e0351a908504c588efac2084811840cde453Makoto Onuki            f.createNewFile();
860ff94e0351a908504c588efac2084811840cde453Makoto Onuki
861ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, 1024);
862ff94e0351a908504c588efac2084811840cde453Makoto Onuki
863ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("tag:!", e.tag);
864ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(12345, e.timestampMillis);
865ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.flags);
866ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.blocks);
867ff94e0351a908504c588efac2084811840cde453Makoto Onuki
868ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(f.exists());
869ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
870ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
871ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "tag%3A!@12345.dat.gz");
872ff94e0351a908504c588efac2084811840cde453Makoto Onuki            f.createNewFile();
873ff94e0351a908504c588efac2084811840cde453Makoto Onuki
874ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, 1024);
875ff94e0351a908504c588efac2084811840cde453Makoto Onuki
876ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("tag:!", e.tag);
877ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(12345, e.timestampMillis);
878ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(DropBoxManager.IS_GZIPPED, e.flags);
879ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.blocks);
880ff94e0351a908504c588efac2084811840cde453Makoto Onuki
881ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(f.exists());
882ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
883ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
884ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "tag%3A!@12345.txt");
885ff94e0351a908504c588efac2084811840cde453Makoto Onuki            try (FileWriter w = new FileWriter(f)) {
886ff94e0351a908504c588efac2084811840cde453Makoto Onuki                w.write(new char[1024]);
887ff94e0351a908504c588efac2084811840cde453Makoto Onuki            }
888ff94e0351a908504c588efac2084811840cde453Makoto Onuki
889ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, 1024);
890ff94e0351a908504c588efac2084811840cde453Makoto Onuki
891ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("tag:!", e.tag);
892ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(12345, e.timestampMillis);
893ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(DropBoxManager.IS_TEXT, e.flags);
894ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(1, e.blocks);
895ff94e0351a908504c588efac2084811840cde453Makoto Onuki
896ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(f.exists());
897ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
898ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
899ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "tag%3A!@12345.txt.gz");
900ff94e0351a908504c588efac2084811840cde453Makoto Onuki            try (FileWriter w = new FileWriter(f)) {
901ff94e0351a908504c588efac2084811840cde453Makoto Onuki                w.write(new char[1025]);
902ff94e0351a908504c588efac2084811840cde453Makoto Onuki            }
903ff94e0351a908504c588efac2084811840cde453Makoto Onuki
904ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, 1024);
905ff94e0351a908504c588efac2084811840cde453Makoto Onuki
906ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("tag:!", e.tag);
907ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(12345, e.timestampMillis);
908ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED, e.flags);
909ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(2, e.blocks);
910ff94e0351a908504c588efac2084811840cde453Makoto Onuki
911ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(f.exists());
912ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
913ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
914ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "tag%3A!@12345.lost");
915ff94e0351a908504c588efac2084811840cde453Makoto Onuki            f.createNewFile();
916ff94e0351a908504c588efac2084811840cde453Makoto Onuki
917ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, 1024);
918ff94e0351a908504c588efac2084811840cde453Makoto Onuki
919ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("tag:!", e.tag);
920ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(12345, e.timestampMillis);
921ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(DropBoxManager.IS_EMPTY, e.flags);
922ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.blocks);
923ff94e0351a908504c588efac2084811840cde453Makoto Onuki
924ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(f.exists());
925ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
926ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
927ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "@12345.dat"); // Empty tag -- this actually works.
928ff94e0351a908504c588efac2084811840cde453Makoto Onuki            f.createNewFile();
929ff94e0351a908504c588efac2084811840cde453Makoto Onuki
930ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, 1024);
931ff94e0351a908504c588efac2084811840cde453Makoto Onuki
932ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals("", e.tag);
933ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(12345, e.timestampMillis);
934ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.flags);
935ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.blocks);
936ff94e0351a908504c588efac2084811840cde453Makoto Onuki
937ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertTrue(f.exists());
938ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
939ff94e0351a908504c588efac2084811840cde453Makoto Onuki        // From invalid filenames.
940ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
941ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "tag.dat"); // No @.
942ff94e0351a908504c588efac2084811840cde453Makoto Onuki            f.createNewFile();
943ff94e0351a908504c588efac2084811840cde453Makoto Onuki
944ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, 1024);
945ff94e0351a908504c588efac2084811840cde453Makoto Onuki
946ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(null, e.tag);
947ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.timestampMillis);
948ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(DropBoxManager.IS_EMPTY, e.flags);
949ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.blocks);
950ff94e0351a908504c588efac2084811840cde453Makoto Onuki
951ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertFalse(f.exists());
952ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
953ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
954ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "tag@.dat"); // Invalid timestamp.
955ff94e0351a908504c588efac2084811840cde453Makoto Onuki            f.createNewFile();
956ff94e0351a908504c588efac2084811840cde453Makoto Onuki
957ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, 1024);
958ff94e0351a908504c588efac2084811840cde453Makoto Onuki
959ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(null, e.tag);
960ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.timestampMillis);
961ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(DropBoxManager.IS_EMPTY, e.flags);
962ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.blocks);
963ff94e0351a908504c588efac2084811840cde453Makoto Onuki
964ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertFalse(f.exists());
965ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
966ff94e0351a908504c588efac2084811840cde453Makoto Onuki        {
967ff94e0351a908504c588efac2084811840cde453Makoto Onuki            File f = new File(fromDir, "tag@12345.daxt"); // Invalid extension.
968ff94e0351a908504c588efac2084811840cde453Makoto Onuki            f.createNewFile();
969ff94e0351a908504c588efac2084811840cde453Makoto Onuki
970ff94e0351a908504c588efac2084811840cde453Makoto Onuki            EntryFile e = new EntryFile(f, 1024);
971ff94e0351a908504c588efac2084811840cde453Makoto Onuki
972ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(null, e.tag);
973ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.timestampMillis);
974ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(DropBoxManager.IS_EMPTY, e.flags);
975ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertEquals(0, e.blocks);
976ff94e0351a908504c588efac2084811840cde453Makoto Onuki
977ff94e0351a908504c588efac2084811840cde453Makoto Onuki            assertFalse(f.exists());
978ff94e0351a908504c588efac2084811840cde453Makoto Onuki        }
979ff94e0351a908504c588efac2084811840cde453Makoto Onuki    }
980ff94e0351a908504c588efac2084811840cde453Makoto Onuki
981ff94e0351a908504c588efac2084811840cde453Makoto Onuki    public void testCompareEntries() {
982ff94e0351a908504c588efac2084811840cde453Makoto Onuki        File dir = getEmptyDir("testCompareEntries");
983ff94e0351a908504c588efac2084811840cde453Makoto Onuki        assertEquals(-1,
984ff94e0351a908504c588efac2084811840cde453Makoto Onuki                new EntryFile(new File(dir, "aaa@100.dat"), 1).compareTo(
985ff94e0351a908504c588efac2084811840cde453Makoto Onuki                new EntryFile(new File(dir, "bbb@200.dat"), 1)));
986ff94e0351a908504c588efac2084811840cde453Makoto Onuki        assertEquals(1,
987ff94e0351a908504c588efac2084811840cde453Makoto Onuki                new EntryFile(new File(dir, "aaa@200.dat"), 1).compareTo(
988ff94e0351a908504c588efac2084811840cde453Makoto Onuki                new EntryFile(new File(dir, "bbb@100.dat"), 1)));
989ff94e0351a908504c588efac2084811840cde453Makoto Onuki        assertEquals(-1,
990ff94e0351a908504c588efac2084811840cde453Makoto Onuki                new EntryFile(new File(dir, "aaa@100.dat"), 1).compareTo(
991ff94e0351a908504c588efac2084811840cde453Makoto Onuki                new EntryFile(new File(dir, "bbb@100.dat"), 1)));
992ff94e0351a908504c588efac2084811840cde453Makoto Onuki        assertEquals(1,
993ff94e0351a908504c588efac2084811840cde453Makoto Onuki                new EntryFile(new File(dir, "bbb@100.dat"), 1).compareTo(
994ff94e0351a908504c588efac2084811840cde453Makoto Onuki                new EntryFile(new File(dir, "aaa@100.dat"), 1)));
995ff94e0351a908504c588efac2084811840cde453Makoto Onuki    }
996ff94e0351a908504c588efac2084811840cde453Makoto Onuki
997f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    private void addRandomEntry(DropBoxManager dropbox, String tag, int size) throws Exception {
9984410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        byte[] bytes = new byte[size];
9994410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        new Random(System.currentTimeMillis()).nextBytes(bytes);
10004410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
10014410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File f = new File(getEmptyDir("addRandomEntry"), "random.dat");
10024410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        FileOutputStream os = new FileOutputStream(f);
10034410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os.write(bytes);
10044410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        os.close();
10054410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1006eb7a7d57ca50f85b054edadab766b51ff22a2dfdDan Egnor        dropbox.addFile(tag, f, 0);
10074410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
10084410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
1009f18a01c77e78209b74e34d05cfb352fa4a92db5fDan Egnor    private int getEntrySize(DropBoxManager.Entry e) throws Exception {
10104410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        InputStream is = e.getInputStream();
10114410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        if (is == null) return -1;
10124410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        int length = 0;
10134410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        while (is.read() != -1) length++;
10144410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        return length;
10154410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
10164410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
10174410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    private void recursiveDelete(File file) {
10184410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        if (!file.delete() && file.isDirectory()) {
10194410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor            for (File f : file.listFiles()) recursiveDelete(f);
10204410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor            file.delete();
10214410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        }
10224410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
10234410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor
10244410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    private File getEmptyDir(String name) {
10254410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        File dir = getContext().getDir("DropBoxTest." + name, 0);
10264410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        for (File f : dir.listFiles()) recursiveDelete(f);
10274410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        assertTrue(dir.listFiles().length == 0);
10284410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor        return dir;
10294410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor    }
10306e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor
10316e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    private int countOpenFiles() {
10326e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor        return new File("/proc/" + Process.myPid() + "/fd").listFiles().length;
10336e6d60d4c85ce440d9ef5e5f36e708ed0ced65c6Dan Egnor    }
10344410ec8f7cec6ab05a8c24c04fe2d5ed5d1e18dfDan Egnor}
1035