/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.os.DropBoxManager;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.ServiceManager;
import android.os.StatFs;
import android.provider.Settings;
import android.test.AndroidTestCase;
import com.android.server.DropBoxManagerService;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Random;
import java.util.zip.GZIPOutputStream;
/** Test {@link DropBoxManager} functionality. */
public class DropBoxTest extends AndroidTestCase {
public void tearDown() throws Exception {
ContentResolver cr = getContext().getContentResolver();
Settings.Global.putString(cr, Settings.Global.DROPBOX_AGE_SECONDS, "");
Settings.Global.putString(cr, Settings.Global.DROPBOX_MAX_FILES, "");
Settings.Global.putString(cr, Settings.Global.DROPBOX_QUOTA_KB, "");
Settings.Global.putString(cr, Settings.Global.DROPBOX_TAG_PREFIX + "DropBoxTest", "");
}
public void testAddText() throws Exception {
File dir = getEmptyDir("testAddText");
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
long before = System.currentTimeMillis();
Thread.sleep(5);
dropbox.addText("DropBoxTest", "TEST0");
Thread.sleep(5);
long between = System.currentTimeMillis();
Thread.sleep(5);
dropbox.addText("DropBoxTest", "TEST1");
dropbox.addText("DropBoxTest", "TEST2");
Thread.sleep(5);
long after = System.currentTimeMillis();
DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
assertTrue(null == dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis()));
assertTrue(e0.getTimeMillis() > before);
assertTrue(e0.getTimeMillis() < between);
assertTrue(e1.getTimeMillis() > between);
assertTrue(e1.getTimeMillis() < e2.getTimeMillis());
assertTrue(e2.getTimeMillis() < after);
assertEquals("TEST0", e0.getText(80));
assertEquals("TEST1", e1.getText(80));
assertEquals("TES", e2.getText(3));
e0.close();
e1.close();
e2.close();
}
public void testAddData() throws Exception {
File dir = getEmptyDir("testAddData");
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
long before = System.currentTimeMillis();
dropbox.addData("DropBoxTest", "TEST".getBytes(), 0);
long after = System.currentTimeMillis();
DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", before);
assertTrue(null == dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
assertEquals("DropBoxTest", e.getTag());
assertTrue(e.getTimeMillis() >= before);
assertEquals(0, e.getFlags());
assertTrue(null == e.getText(80));
byte[] buf = new byte[80];
assertEquals("TEST", new String(buf, 0, e.getInputStream().read(buf)));
e.close();
}
public void testAddFile() throws Exception {
File dir = getEmptyDir("testAddFile");
long before = System.currentTimeMillis();
File f0 = new File(dir, "f0.txt");
File f1 = new File(dir, "f1.txt.gz");
File f2 = new File(dir, "f2.dat");
File f3 = new File(dir, "f2.dat.gz");
FileWriter w0 = new FileWriter(f0);
GZIPOutputStream gz1 = new GZIPOutputStream(new FileOutputStream(f1));
FileOutputStream os2 = new FileOutputStream(f2);
GZIPOutputStream gz3 = new GZIPOutputStream(new FileOutputStream(f3));
w0.write("FILE0");
gz1.write("FILE1".getBytes());
os2.write("DATA2".getBytes());
gz3.write("DATA3".getBytes());
w0.close();
gz1.close();
os2.close();
gz3.close();
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
dropbox.addFile("DropBoxTest", f0, DropBoxManager.IS_TEXT);
dropbox.addFile("DropBoxTest", f1, DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED);
dropbox.addFile("DropBoxTest", f2, 0);
dropbox.addFile("DropBoxTest", f3, DropBoxManager.IS_GZIPPED);
DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
DropBoxManager.Entry e2 = dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis());
DropBoxManager.Entry e3 = dropbox.getNextEntry("DropBoxTest", e2.getTimeMillis());
assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
assertTrue(e0.getTimeMillis() > before);
assertTrue(e1.getTimeMillis() > e0.getTimeMillis());
assertTrue(e2.getTimeMillis() > e1.getTimeMillis());
assertTrue(e3.getTimeMillis() > e2.getTimeMillis());
assertEquals(DropBoxManager.IS_TEXT, e0.getFlags());
assertEquals(DropBoxManager.IS_TEXT, e1.getFlags());
assertEquals(0, e2.getFlags());
assertEquals(0, e3.getFlags());
assertEquals("FILE0", e0.getText(80));
byte[] buf1 = new byte[80];
assertEquals("FILE1", new String(buf1, 0, e1.getInputStream().read(buf1)));
assertTrue(null == e2.getText(80));
byte[] buf2 = new byte[80];
assertEquals("DATA2", new String(buf2, 0, e2.getInputStream().read(buf2)));
assertTrue(null == e3.getText(80));
byte[] buf3 = new byte[80];
assertEquals("DATA3", new String(buf3, 0, e3.getInputStream().read(buf3)));
e0.close();
e1.close();
e2.close();
e3.close();
}
public void testAddEntriesInTheFuture() throws Exception {
File dir = getEmptyDir("testAddEntriesInTheFuture");
long before = System.currentTimeMillis();
// Near future: should be allowed to persist
FileWriter w0 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 5000) + ".txt"));
w0.write("FUTURE0");
w0.close();
// Far future: should be collapsed
FileWriter w1 = new FileWriter(new File(dir, "DropBoxTest@" + (before + 100000) + ".txt"));
w1.write("FUTURE1");
w1.close();
// Another far future item, this one gzipped
File f2 = new File(dir, "DropBoxTest@" + (before + 100001) + ".txt.gz");
GZIPOutputStream gz2 = new GZIPOutputStream(new FileOutputStream(f2));
gz2.write("FUTURE2".getBytes());
gz2.close();
// Tombstone in the far future
new FileOutputStream(new File(dir, "DropBoxTest@" + (before + 100002) + ".lost")).close();
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
// Until a write, the timestamps are taken at face value
DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
assertTrue(null == dropbox.getNextEntry(null, e3.getTimeMillis()));
assertEquals("FUTURE0", e0.getText(80));
assertEquals("FUTURE1", e1.getText(80));
assertEquals("FUTURE2", e2.getText(80));
assertEquals(null, e3.getText(80));
assertEquals(before + 5000, e0.getTimeMillis());
assertEquals(before + 100000, e1.getTimeMillis());
assertEquals(before + 100001, e2.getTimeMillis());
assertEquals(before + 100002, e3.getTimeMillis());
e0.close();
e1.close();
e2.close();
e3.close();
// Write something to force a collapse
dropbox.addText("NotDropBoxTest", "FUTURE");
e0 = dropbox.getNextEntry(null, before);
e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
assertTrue(null == dropbox.getNextEntry("DropBoxTest", e3.getTimeMillis()));
assertEquals("FUTURE0", e0.getText(80));
assertEquals("FUTURE1", e1.getText(80));
assertEquals("FUTURE2", e2.getText(80));
assertEquals(null, e3.getText(80));
assertEquals(before + 5000, e0.getTimeMillis());
assertEquals(before + 5001, e1.getTimeMillis());
assertEquals(before + 5002, e2.getTimeMillis());
assertEquals(before + 5003, e3.getTimeMillis());
e0.close();
e1.close();
e2.close();
e3.close();
}
public void testIsTagEnabled() throws Exception {
File dir = getEmptyDir("testIsTagEnabled");
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
long before = System.currentTimeMillis();
dropbox.addText("DropBoxTest", "TEST-ENABLED");
assertTrue(dropbox.isTagEnabled("DropBoxTest"));
ContentResolver cr = getContext().getContentResolver();
Settings.Global.putString(cr, Settings.Global.DROPBOX_TAG_PREFIX + "DropBoxTest",
"disabled");
dropbox.addText("DropBoxTest", "TEST-DISABLED");
assertFalse(dropbox.isTagEnabled("DropBoxTest"));
Settings.Global.putString(cr, Settings.Global.DROPBOX_TAG_PREFIX + "DropBoxTest",
"");
dropbox.addText("DropBoxTest", "TEST-ENABLED-AGAIN");
assertTrue(dropbox.isTagEnabled("DropBoxTest"));
DropBoxManager.Entry e0 = dropbox.getNextEntry("DropBoxTest", before);
DropBoxManager.Entry e1 = dropbox.getNextEntry("DropBoxTest", e0.getTimeMillis());
assertTrue(null == dropbox.getNextEntry("DropBoxTest", e1.getTimeMillis()));
assertEquals("TEST-ENABLED", e0.getText(80));
assertEquals("TEST-ENABLED-AGAIN", e1.getText(80));
e0.close();
e1.close();
}
public void testGetNextEntry() throws Exception {
File dir = getEmptyDir("testGetNextEntry");
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
long before = System.currentTimeMillis();
dropbox.addText("DropBoxTest.A", "A0");
dropbox.addText("DropBoxTest.B", "B0");
dropbox.addText("DropBoxTest.A", "A1");
DropBoxManager.Entry a0 = dropbox.getNextEntry("DropBoxTest.A", before);
DropBoxManager.Entry a1 = dropbox.getNextEntry("DropBoxTest.A", a0.getTimeMillis());
assertTrue(null == dropbox.getNextEntry("DropBoxTest.A", a1.getTimeMillis()));
DropBoxManager.Entry b0 = dropbox.getNextEntry("DropBoxTest.B", before);
assertTrue(null == dropbox.getNextEntry("DropBoxTest.B", b0.getTimeMillis()));
DropBoxManager.Entry x0 = dropbox.getNextEntry(null, before);
DropBoxManager.Entry x1 = dropbox.getNextEntry(null, x0.getTimeMillis());
DropBoxManager.Entry x2 = dropbox.getNextEntry(null, x1.getTimeMillis());
assertTrue(null == dropbox.getNextEntry(null, x2.getTimeMillis()));
assertEquals("DropBoxTest.A", a0.getTag());
assertEquals("DropBoxTest.A", a1.getTag());
assertEquals("A0", a0.getText(80));
assertEquals("A1", a1.getText(80));
assertEquals("DropBoxTest.B", b0.getTag());
assertEquals("B0", b0.getText(80));
assertEquals("DropBoxTest.A", x0.getTag());
assertEquals("DropBoxTest.B", x1.getTag());
assertEquals("DropBoxTest.A", x2.getTag());
assertEquals("A0", x0.getText(80));
assertEquals("B0", x1.getText(80));
assertEquals("A1", x2.getText(80));
a0.close();
a1.close();
b0.close();
x0.close();
x1.close();
x2.close();
}
public void testSizeLimits() throws Exception {
File dir = getEmptyDir("testSizeLimits");
int blockSize = new StatFs(dir.getPath()).getBlockSize();
// Limit storage to 10 blocks
int kb = blockSize * 10 / 1024;
ContentResolver cr = getContext().getContentResolver();
Settings.Global.putString(cr, Settings.Global.DROPBOX_QUOTA_KB, Integer.toString(kb));
// Three tags using a total of 12 blocks:
// DropBoxTest0 [ ][ ]
// DropBoxTest1 [x][ ][ ][ ][xxx(20 blocks)xxx]
// DropBoxTest2 [xxxxxxxxxx][ ][ ]
//
// The blocks marked "x" will be removed due to storage restrictions.
// Use random fill (so it doesn't compress), subtract a little for gzip overhead
final int overhead = 64;
long before = System.currentTimeMillis();
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
addRandomEntry(dropbox, "DropBoxTest0", blockSize - overhead);
addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
addRandomEntry(dropbox, "DropBoxTest1", blockSize * 2 - overhead);
addRandomEntry(dropbox, "DropBoxTest1", blockSize - overhead);
addRandomEntry(dropbox, "DropBoxTest1", blockSize * 20 - overhead);
addRandomEntry(dropbox, "DropBoxTest2", blockSize * 4 - overhead);
addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
addRandomEntry(dropbox, "DropBoxTest2", blockSize - overhead);
DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
DropBoxManager.Entry e4 = dropbox.getNextEntry(null, e3.getTimeMillis());
DropBoxManager.Entry e5 = dropbox.getNextEntry(null, e4.getTimeMillis());
DropBoxManager.Entry e6 = dropbox.getNextEntry(null, e5.getTimeMillis());
DropBoxManager.Entry e7 = dropbox.getNextEntry(null, e6.getTimeMillis());
DropBoxManager.Entry e8 = dropbox.getNextEntry(null, e7.getTimeMillis());
DropBoxManager.Entry e9 = dropbox.getNextEntry(null, e8.getTimeMillis());
assertTrue(null == dropbox.getNextEntry(null, e9.getTimeMillis()));
assertEquals("DropBoxTest0", e0.getTag());
assertEquals("DropBoxTest0", e1.getTag());
assertEquals(blockSize - overhead, getEntrySize(e0));
assertEquals(blockSize - overhead, getEntrySize(e1));
assertEquals("DropBoxTest1", e2.getTag());
assertEquals("DropBoxTest1", e3.getTag());
assertEquals("DropBoxTest1", e4.getTag());
assertEquals("DropBoxTest1", e5.getTag());
assertEquals("DropBoxTest1", e6.getTag());
assertEquals(-1, getEntrySize(e2)); // Tombstone
assertEquals(blockSize - overhead, getEntrySize(e3));
assertEquals(blockSize * 2 - overhead, getEntrySize(e4));
assertEquals(blockSize - overhead, getEntrySize(e5));
assertEquals(-1, getEntrySize(e6));
assertEquals("DropBoxTest2", e7.getTag());
assertEquals("DropBoxTest2", e8.getTag());
assertEquals("DropBoxTest2", e9.getTag());
assertEquals(-1, getEntrySize(e7)); // Tombstone
assertEquals(blockSize - overhead, getEntrySize(e8));
assertEquals(blockSize - overhead, getEntrySize(e9));
e0.close();
e1.close();
e2.close();
e3.close();
e4.close();
e5.close();
e6.close();
e7.close();
e8.close();
e9.close();
// Specifying a tag name skips tombstone records.
DropBoxManager.Entry t0 = dropbox.getNextEntry("DropBoxTest1", before);
DropBoxManager.Entry t1 = dropbox.getNextEntry("DropBoxTest1", t0.getTimeMillis());
DropBoxManager.Entry t2 = dropbox.getNextEntry("DropBoxTest1", t1.getTimeMillis());
assertTrue(null == dropbox.getNextEntry("DropBoxTest1", t2.getTimeMillis()));
assertEquals("DropBoxTest1", t0.getTag());
assertEquals("DropBoxTest1", t1.getTag());
assertEquals("DropBoxTest1", t2.getTag());
assertEquals(blockSize - overhead, getEntrySize(t0));
assertEquals(blockSize * 2 - overhead, getEntrySize(t1));
assertEquals(blockSize - overhead, getEntrySize(t2));
t0.close();
t1.close();
t2.close();
}
public void testAgeLimits() throws Exception {
File dir = getEmptyDir("testAgeLimits");
int blockSize = new StatFs(dir.getPath()).getBlockSize();
// Limit storage to 10 blocks with an expiration of 1 second
int kb = blockSize * 10 / 1024;
ContentResolver cr = getContext().getContentResolver();
Settings.Global.putString(cr, Settings.Global.DROPBOX_AGE_SECONDS, "1");
Settings.Global.putString(cr, Settings.Global.DROPBOX_QUOTA_KB, Integer.toString(kb));
// Write one normal entry and another so big that it is instantly tombstoned
long before = System.currentTimeMillis();
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
dropbox.addText("DropBoxTest", "TEST");
addRandomEntry(dropbox, "DropBoxTest", blockSize * 20);
// Verify that things are as expected
DropBoxManager.Entry e0 = dropbox.getNextEntry(null, before);
DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
assertTrue(null == dropbox.getNextEntry(null, e1.getTimeMillis()));
assertEquals("TEST", e0.getText(80));
assertEquals(null, e1.getText(80));
assertEquals(-1, getEntrySize(e1));
e0.close();
e1.close();
// Wait a second and write another entry -- old ones should be expunged
Thread.sleep(2000);
dropbox.addText("DropBoxTest", "TEST1");
e0 = dropbox.getNextEntry(null, before);
assertTrue(null == dropbox.getNextEntry(null, e0.getTimeMillis()));
assertEquals("TEST1", e0.getText(80));
e0.close();
}
public void testFileCountLimits() throws Exception {
File dir = getEmptyDir("testFileCountLimits");
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
dropbox.addText("DropBoxTest", "TEST0");
dropbox.addText("DropBoxTest", "TEST1");
dropbox.addText("DropBoxTest", "TEST2");
dropbox.addText("DropBoxTest", "TEST3");
dropbox.addText("DropBoxTest", "TEST4");
dropbox.addText("DropBoxTest", "TEST5");
// Verify 6 files added
DropBoxManager.Entry e0 = dropbox.getNextEntry(null, 0);
DropBoxManager.Entry e1 = dropbox.getNextEntry(null, e0.getTimeMillis());
DropBoxManager.Entry e2 = dropbox.getNextEntry(null, e1.getTimeMillis());
DropBoxManager.Entry e3 = dropbox.getNextEntry(null, e2.getTimeMillis());
DropBoxManager.Entry e4 = dropbox.getNextEntry(null, e3.getTimeMillis());
DropBoxManager.Entry e5 = dropbox.getNextEntry(null, e4.getTimeMillis());
assertTrue(null == dropbox.getNextEntry(null, e5.getTimeMillis()));
assertEquals("TEST0", e0.getText(80));
assertEquals("TEST5", e5.getText(80));
e0.close();
e1.close();
e2.close();
e3.close();
e4.close();
e5.close();
// Limit to 3 files and add one more entry
ContentResolver cr = getContext().getContentResolver();
Settings.Global.putString(cr, Settings.Global.DROPBOX_MAX_FILES, "3");
dropbox.addText("DropBoxTest", "TEST6");
// Verify only 3 files left
DropBoxManager.Entry f0 = dropbox.getNextEntry(null, 0);
DropBoxManager.Entry f1 = dropbox.getNextEntry(null, f0.getTimeMillis());
DropBoxManager.Entry f2 = dropbox.getNextEntry(null, f1.getTimeMillis());
assertTrue(null == dropbox.getNextEntry(null, f2.getTimeMillis()));
assertEquals("TEST4", f0.getText(80));
assertEquals("TEST5", f1.getText(80));
assertEquals("TEST6", f2.getText(80));
f0.close();
f1.close();
f2.close();
}
public void testCreateDropBoxManagerWithInvalidDirectory() throws Exception {
// If created with an invalid directory, the DropBoxManager should suffer quietly
// and fail all operations (this is how it survives a full disk).
// Once the directory becomes possible to create, it will start working.
File dir = new File(getEmptyDir("testCreateDropBoxManagerWith"), "InvalidDirectory");
new FileOutputStream(dir).close(); // Create an empty file
DropBoxManagerService service = new DropBoxManagerService(getContext(), dir);
DropBoxManager dropbox = new DropBoxManager(getContext(), service.getServiceStub());
dropbox.addText("DropBoxTest", "should be ignored");
dropbox.addData("DropBoxTest", "should be ignored".getBytes(), 0);
assertTrue(null == dropbox.getNextEntry("DropBoxTest", 0));
dir.delete(); // Remove the file so a directory can be created
dropbox.addText("DropBoxTest", "TEST");
DropBoxManager.Entry e = dropbox.getNextEntry("DropBoxTest", 0);
assertTrue(null == dropbox.getNextEntry("DropBoxTest", e.getTimeMillis()));
assertEquals("DropBoxTest", e.getTag());
assertEquals("TEST", e.getText(80));
e.close();
}
public void testDropBoxEntrySerialization() throws Exception {
// Make sure DropBoxManager.Entry can be serialized to a Parcel and back
// under a variety of conditions.
Parcel parcel = Parcel.obtain();
File dir = getEmptyDir("testDropBoxEntrySerialization");
new DropBoxManager.Entry("empty", 1000000).writeToParcel(parcel, 0);
new DropBoxManager.Entry("string", 2000000, "String Value").writeToParcel(parcel, 0);
new DropBoxManager.Entry("bytes", 3000000, "Bytes Value".getBytes(),
DropBoxManager.IS_TEXT).writeToParcel(parcel, 0);
new DropBoxManager.Entry("zerobytes", 4000000, new byte[0], 0).writeToParcel(parcel, 0);
new DropBoxManager.Entry("emptybytes", 5000000, (byte[]) null,
DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
try {
new DropBoxManager.Entry("badbytes", 99999,
"Bad Bytes Value".getBytes(),
DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
fail("IllegalArgumentException expected for non-null byte[] and IS_EMPTY flags");
} catch (IllegalArgumentException e) {
// expected
}
try {
new DropBoxManager.Entry("badbytes", 99999, (byte[]) null, 0).writeToParcel(parcel, 0);
fail("IllegalArgumentException expected for null byte[] and non-IS_EMPTY flags");
} catch (IllegalArgumentException e) {
// expected
}
File f = new File(dir, "file.dat");
FileOutputStream os = new FileOutputStream(f);
os.write("File Value".getBytes());
os.close();
new DropBoxManager.Entry("file", 6000000, f, DropBoxManager.IS_TEXT).writeToParcel(
parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
new DropBoxManager.Entry("binfile", 7000000, f, 0).writeToParcel(
parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
new DropBoxManager.Entry("emptyfile", 8000000, (ParcelFileDescriptor) null,
DropBoxManager.IS_EMPTY).writeToParcel(parcel, 0);
try {
new DropBoxManager.Entry("badfile", 99999, new File(dir, "nonexist.dat"), 0);
fail("IOException expected for nonexistent file");
} catch (IOException e) {
// expected
}
try {
new DropBoxManager.Entry("badfile", 99999, f, DropBoxManager.IS_EMPTY).writeToParcel(
parcel, 0);
fail("IllegalArgumentException expected for non-null file and IS_EMPTY flags");
} catch (IllegalArgumentException e) {
// expected
}
try {
new DropBoxManager.Entry("badfile", 99999, (ParcelFileDescriptor) null, 0);
fail("IllegalArgumentException expected for null PFD and non-IS_EMPTY flags");
} catch (IllegalArgumentException e) {
// expected
}
File gz = new File(dir, "file.gz");
GZIPOutputStream gzout = new GZIPOutputStream(new FileOutputStream(gz));
gzout.write("Gzip File Value".getBytes());
gzout.close();
new DropBoxManager.Entry("gzipfile", 9000000, gz,
DropBoxManager.IS_TEXT | DropBoxManager.IS_GZIPPED).writeToParcel(
parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
new DropBoxManager.Entry("gzipbinfile", 10000000, gz,
DropBoxManager.IS_GZIPPED).writeToParcel(
parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
//
// Switch from writing to reading
//
parcel.setDataPosition(0);
DropBoxManager.Entry e;
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("empty", e.getTag());
assertEquals(1000000, e.getTimeMillis());
assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
assertEquals(null, e.getText(100));
assertEquals(null, e.getInputStream());
e.close();
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("string", e.getTag());
assertEquals(2000000, e.getTimeMillis());
assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
assertEquals("String Value", e.getText(100));
assertEquals("String Value",
new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
e.close();
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("bytes", e.getTag());
assertEquals(3000000, e.getTimeMillis());
assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
assertEquals("Bytes Value", e.getText(100));
e.close();
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("zerobytes", e.getTag());
assertEquals(4000000, e.getTimeMillis());
assertEquals(0, e.getFlags());
assertEquals(null, e.getText(100));
assertEquals(null,
new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
e.close();
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("emptybytes", e.getTag());
assertEquals(5000000, e.getTimeMillis());
assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
assertEquals(null, e.getText(100));
assertEquals(null, e.getInputStream());
e.close();
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("file", e.getTag());
assertEquals(6000000, e.getTimeMillis());
assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
assertEquals("File Value", e.getText(100));
e.close();
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("binfile", e.getTag());
assertEquals(7000000, e.getTimeMillis());
assertEquals(0, e.getFlags());
assertEquals(null, e.getText(100));
assertEquals("File Value",
new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
e.close();
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("emptyfile", e.getTag());
assertEquals(8000000, e.getTimeMillis());
assertEquals(DropBoxManager.IS_EMPTY, e.getFlags());
assertEquals(null, e.getText(100));
assertEquals(null, e.getInputStream());
e.close();
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("gzipfile", e.getTag());
assertEquals(9000000, e.getTimeMillis());
assertEquals(DropBoxManager.IS_TEXT, e.getFlags());
assertEquals("Gzip File Value", e.getText(100));
e.close();
e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("gzipbinfile", e.getTag());
assertEquals(10000000, e.getTimeMillis());
assertEquals(0, e.getFlags());
assertEquals(null, e.getText(100));
assertEquals("Gzip File Value",
new BufferedReader(new InputStreamReader(e.getInputStream())).readLine());
e.close();
assertEquals(0, parcel.dataAvail());
parcel.recycle();
}
public void testDropBoxEntrySerializationDoesntLeakFileDescriptors() throws Exception {
File dir = getEmptyDir("testDropBoxEntrySerialization");
File f = new File(dir, "file.dat");
FileOutputStream os = new FileOutputStream(f);
os.write("File Value".getBytes());
os.close();
int before = countOpenFiles();
assertTrue(before > 0);
for (int i = 0; i < 1000; i++) {
Parcel parcel = Parcel.obtain();
new DropBoxManager.Entry("file", 1000000, f, 0).writeToParcel(
parcel, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
parcel.setDataPosition(0);
DropBoxManager.Entry e = DropBoxManager.Entry.CREATOR.createFromParcel(parcel);
assertEquals("file", e.getTag());
e.close();
parcel.recycle();
}
int after = countOpenFiles();
assertTrue(after > 0);
assertTrue(after < before + 20);
}
private void addRandomEntry(DropBoxManager dropbox, String tag, int size) throws Exception {
byte[] bytes = new byte[size];
new Random(System.currentTimeMillis()).nextBytes(bytes);
File f = new File(getEmptyDir("addRandomEntry"), "random.dat");
FileOutputStream os = new FileOutputStream(f);
os.write(bytes);
os.close();
dropbox.addFile(tag, f, 0);
}
private int getEntrySize(DropBoxManager.Entry e) throws Exception {
InputStream is = e.getInputStream();
if (is == null) return -1;
int length = 0;
while (is.read() != -1) length++;
return length;
}
private void recursiveDelete(File file) {
if (!file.delete() && file.isDirectory()) {
for (File f : file.listFiles()) recursiveDelete(f);
file.delete();
}
}
private File getEmptyDir(String name) {
File dir = getContext().getDir("DropBoxTest." + name, 0);
for (File f : dir.listFiles()) recursiveDelete(f);
assertTrue(dir.listFiles().length == 0);
return dir;
}
private int countOpenFiles() {
return new File("/proc/" + Process.myPid() + "/fd").listFiles().length;
}
}