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