/*
* Copyright (C) 2015 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 android.support.provider.tests;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.provider.DocumentsContract.Document;
import android.support.provider.DocumentArchive;
import android.test.AndroidTestCase;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
/**
* Tests for DocumentArchive.
*/
public class DocumentArchiveTest extends AndroidTestCase {
private static final String DOCUMENT_ID = "document-id";
private static final char DELIMITER = ':';
private static final String NOTIFICATION_URI = "content://notification-uri";
private DocumentArchive mArchive = null;
public void loadArchive(int resource) {
// Extract the file from resources.
File file = null;
try {
file = File.createTempFile("android.support.provider.tests{",
"}.zip", mContext.getCacheDir());
try (
final FileOutputStream outputStream =
new ParcelFileDescriptor.AutoCloseOutputStream(
ParcelFileDescriptor.open(
file, ParcelFileDescriptor.MODE_WRITE_ONLY));
final InputStream inputStream =
mContext.getResources().openRawResource(resource);
) {
final byte[] buffer = new byte[32 * 1024];
int bytes;
while ((bytes = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytes);
}
outputStream.flush();
mArchive = DocumentArchive.createForLocalFile(
mContext,
file,
DOCUMENT_ID,
DELIMITER,
Uri.parse(NOTIFICATION_URI));
}
} catch (IOException e) {
fail(String.valueOf(e));
} finally {
// On UNIX the file will be still available for processes which opened it, even
// after deleting it. Remove it ASAP, as it won't be used by anyone else.
if (file != null) {
file.delete();
}
}
}
@Override
public void tearDown() {
if (mArchive != null) {
mArchive.close();
}
}
public void testQueryChildDocument() throws IOException {
loadArchive(R.raw.archive);
final Cursor cursor = mArchive.queryChildDocuments(DOCUMENT_ID, null, null);
assertTrue(cursor.moveToFirst());
assertEquals("document-id:dir1/",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DOCUMENT_ID)));
assertEquals("dir1",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DISPLAY_NAME)));
assertEquals(Document.MIME_TYPE_DIR,
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_MIME_TYPE)));
assertEquals(0,
cursor.getInt(cursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
assertTrue(cursor.moveToNext());
assertEquals("document-id:dir2/",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DOCUMENT_ID)));
assertEquals("dir2",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DISPLAY_NAME)));
assertEquals(Document.MIME_TYPE_DIR,
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_MIME_TYPE)));
assertEquals(0,
cursor.getInt(cursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
assertTrue(cursor.moveToNext());
assertEquals("document-id:file1.txt",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DOCUMENT_ID)));
assertEquals("file1.txt",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DISPLAY_NAME)));
assertEquals("text/plain",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_MIME_TYPE)));
assertEquals(13,
cursor.getInt(cursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
assertFalse(cursor.moveToNext());
// Check if querying children works too.
final Cursor childCursor = mArchive.queryChildDocuments("document-id:dir1/", null, null);
assertTrue(childCursor.moveToFirst());
assertEquals("document-id:dir1/cherries.txt",
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_DOCUMENT_ID)));
assertEquals("cherries.txt",
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_DISPLAY_NAME)));
assertEquals("text/plain",
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_MIME_TYPE)));
assertEquals(17,
childCursor.getInt(childCursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
}
public void testQueryChildDocument_NoDirs() throws IOException {
loadArchive(R.raw.no_dirs);
final Cursor cursor = mArchive.queryChildDocuments(DOCUMENT_ID, null, null);
assertTrue(cursor.moveToFirst());
assertEquals("document-id:dir1/",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DOCUMENT_ID)));
assertEquals("dir1",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DISPLAY_NAME)));
assertEquals(Document.MIME_TYPE_DIR,
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_MIME_TYPE)));
assertEquals(0,
cursor.getInt(cursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
assertFalse(cursor.moveToNext());
final Cursor childCursor = mArchive.queryChildDocuments("document-id:dir1/", null, null);
assertTrue(childCursor.moveToFirst());
assertEquals("document-id:dir1/dir2/",
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_DOCUMENT_ID)));
assertEquals("dir2",
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_DISPLAY_NAME)));
assertEquals(Document.MIME_TYPE_DIR,
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_MIME_TYPE)));
assertEquals(0,
childCursor.getInt(childCursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
assertFalse(childCursor.moveToNext());
final Cursor childCursor2 = mArchive.queryChildDocuments(
"document-id:dir1/dir2/", null, null);
assertTrue(childCursor2.moveToFirst());
assertEquals("document-id:dir1/dir2/cherries.txt",
childCursor2.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_DOCUMENT_ID)));
assertFalse(childCursor2.moveToNext());
}
public void testQueryChildDocument_EmptyDirs() throws IOException {
loadArchive(R.raw.empty_dirs);
final Cursor cursor = mArchive.queryChildDocuments(DOCUMENT_ID, null, null);
assertTrue(cursor.moveToFirst());
assertEquals("document-id:dir1/",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DOCUMENT_ID)));
assertEquals("dir1",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DISPLAY_NAME)));
assertEquals(Document.MIME_TYPE_DIR,
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_MIME_TYPE)));
assertEquals(0,
cursor.getInt(cursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
assertFalse(cursor.moveToNext());
final Cursor childCursor = mArchive.queryChildDocuments("document-id:dir1/", null, null);
assertTrue(childCursor.moveToFirst());
assertEquals("document-id:dir1/dir2/",
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_DOCUMENT_ID)));
assertEquals("dir2",
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_DISPLAY_NAME)));
assertEquals(Document.MIME_TYPE_DIR,
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_MIME_TYPE)));
assertEquals(0,
childCursor.getInt(childCursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
assertTrue(childCursor.moveToNext());
assertEquals("document-id:dir1/dir3/",
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_DOCUMENT_ID)));
assertEquals("dir3",
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_DISPLAY_NAME)));
assertEquals(Document.MIME_TYPE_DIR,
childCursor.getString(childCursor.getColumnIndexOrThrow(
Document.COLUMN_MIME_TYPE)));
assertEquals(0,
childCursor.getInt(childCursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
assertFalse(cursor.moveToNext());
final Cursor childCursor2 = mArchive.queryChildDocuments(
"document-id:dir1/dir2/", null, null);
assertFalse(childCursor2.moveToFirst());
final Cursor childCursor3 = mArchive.queryChildDocuments(
"document-id:dir1/dir3/", null, null);
assertFalse(childCursor3.moveToFirst());
}
public void testGetDocumentType() throws IOException {
loadArchive(R.raw.archive);
assertEquals(Document.MIME_TYPE_DIR, mArchive.getDocumentType("document-id:dir1/"));
assertEquals("text/plain", mArchive.getDocumentType("document-id:file1.txt"));
}
public void testIsChildDocument() throws IOException {
loadArchive(R.raw.archive);
assertTrue(mArchive.isChildDocument(DOCUMENT_ID, "document-id:dir1/"));
assertFalse(mArchive.isChildDocument(DOCUMENT_ID, "document-id:this-does-not-exist"));
assertTrue(mArchive.isChildDocument("document-id:dir1/", "document-id:dir1/cherries.txt"));
assertTrue(mArchive.isChildDocument(DOCUMENT_ID, "document-id:dir1/cherries.txt"));
}
public void testQueryDocument() throws IOException {
loadArchive(R.raw.archive);
final Cursor cursor = mArchive.queryDocument("document-id:dir2/strawberries.txt", null);
assertTrue(cursor.moveToFirst());
assertEquals("document-id:dir2/strawberries.txt",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DOCUMENT_ID)));
assertEquals("strawberries.txt",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_DISPLAY_NAME)));
assertEquals("text/plain",
cursor.getString(cursor.getColumnIndexOrThrow(Document.COLUMN_MIME_TYPE)));
assertEquals(21,
cursor.getInt(cursor.getColumnIndexOrThrow(Document.COLUMN_SIZE)));
}
public void testOpenDocument() throws IOException {
loadArchive(R.raw.archive);
final ParcelFileDescriptor descriptor = mArchive.openDocument(
"document-id:dir2/strawberries.txt", "r", null /* signal */);
try (final ParcelFileDescriptor.AutoCloseInputStream inputStream =
new ParcelFileDescriptor.AutoCloseInputStream(descriptor)) {
assertEquals("I love strawberries!", new Scanner(inputStream).nextLine());
}
}
}