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