/* * Copyright 2014 Yaroslav Mytkalyk * 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.docd.purefm.test; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.test.AndroidTestCase; import android.util.Pair; import com.docd.purefm.file.GenericFile; import com.docd.purefm.file.JavaFile; import com.docd.purefm.utils.MediaStoreUtils; import org.apache.commons.io.FileUtils; import android.support.annotation.NonNull; import java.io.File; import java.util.ArrayList; import java.util.List; /** * Tests {@link com.docd.purefm.utils.MediaStoreUtils} */ public final class MediaStoreUtilsTest extends AndroidTestCase { private static final File EXT = Environment.getExternalStorageDirectory(); private static final File TEST_ROOT = new File(EXT, "MediaStoreUtilsTest"); @Override protected void setUp() throws Exception { super.setUp(); assertTrue(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)); doTearDown(); TEST_ROOT.mkdirs(); assertTrue(TEST_ROOT.exists()); assertTrue(TEST_ROOT.isDirectory()); } @Override protected void runTest() throws Throwable { super.runTest(); final ContentResolver resolver = getContext().getContentResolver(); testAddAndDeleteFile(resolver); testRenameFile(resolver); testRenameEmptyDirectory(resolver); testMoveFile(resolver); } private void testAddAndDeleteFile(@NonNull final ContentResolver resolver) throws Throwable { final GenericFile test = new JavaFile(TEST_ROOT, "test1.txt"); assertFalse(isFileInMediaStore(resolver, test)); MediaStoreUtils.addEmptyFileOrDirectory(resolver, test); assertTrue(isFileInMediaStore(resolver, test)); MediaStoreUtils.deleteFileOrDirectory(resolver, test); assertFalse(isFileInMediaStore(resolver, test)); } private void testRenameFile(@NonNull final ContentResolver resolver) throws Throwable { final GenericFile test1 = new JavaFile(TEST_ROOT, "test2.txt"); final GenericFile test2 = new JavaFile(TEST_ROOT, "test3.txt"); MediaStoreUtils.addEmptyFileOrDirectory(resolver, test1); assertTrue(isFileInMediaStore(resolver, test1)); MediaStoreUtils.renameFileOrDirectory(getContext(), test1, test2); assertFalse(isFileInMediaStore(resolver, test1)); assertTrue(isFileInMediaStore(resolver, test2)); MediaStoreUtils.deleteFileOrDirectory(resolver, test2); assertFalse(isFileInMediaStore(resolver, test2)); } private void testRenameEmptyDirectory(@NonNull final ContentResolver resolver) throws Throwable { final GenericFile test1 = new JavaFile(TEST_ROOT, "test4dir.txt"); final GenericFile test2 = new JavaFile(TEST_ROOT, "test5dir.txt"); test1.mkdir(); assertTrue(test1.exists()); assertTrue(test1.isDirectory()); MediaStoreUtils.addEmptyFileOrDirectory(resolver, test1); assertTrue(isFileInMediaStore(resolver, test1)); MediaStoreUtils.renameFileOrDirectory(getContext(), test1, test2); assertFalse(isFileInMediaStore(resolver, test1)); //there is no waiting for MediaScanner to finish, so we must skip this check //assertTrue(isFileInMediaStore(resolver, test2)); assertTrue(test1.delete()); MediaStoreUtils.deleteFileOrDirectory(resolver, test2); assertFalse(isFileInMediaStore(resolver, test2)); } private void testMoveFile(@NonNull final ContentResolver resolver) throws Throwable { final GenericFile test1dir = new JavaFile(TEST_ROOT, "test6.txt"); final GenericFile test2dir = new JavaFile(TEST_ROOT, "test7.txt"); test1dir.mkdir(); assertTrue(test1dir.exists()); assertTrue(test1dir.isDirectory()); test2dir.mkdir(); assertTrue(test2dir.exists()); assertTrue(test2dir.isDirectory()); final GenericFile test1file = new JavaFile(test1dir.toFile(), "test8.txt"); final GenericFile test2file = new JavaFile(test2dir.toFile(), "test8.txt"); test1file.createNewFile(); assertTrue(test1file.exists()); assertFalse(test1file.isDirectory()); MediaStoreUtils.addEmptyFileOrDirectory(resolver, test1dir); MediaStoreUtils.addEmptyFileOrDirectory(resolver, test2dir); MediaStoreUtils.addEmptyFileOrDirectory(resolver, test1file); assertTrue(isFileInMediaStore(resolver, test1dir)); assertTrue(isFileInMediaStore(resolver, test2dir)); assertTrue(isFileInMediaStore(resolver, test1file)); FileUtils.moveFile(test1file.toFile(), test2file.toFile()); final List<Pair<GenericFile, GenericFile>> files = new ArrayList<>(1); files.add(new Pair<>(test1file, test2file)); MediaStoreUtils.moveFiles(getContext(), files); assertTrue(isFileInMediaStore(resolver, test1dir)); assertTrue(isFileInMediaStore(resolver, test2dir)); assertFalse(isFileInMediaStore(resolver, test1file)); //there is no waiting for MediaScanner to finish, so we must skip this check //assertTrue(isFileInMediaStore(resolver, test2file)); test2file.delete(); test1dir.delete(); test2dir.delete(); MediaStoreUtils.deleteFileOrDirectory(resolver, test2file); MediaStoreUtils.deleteFileOrDirectory(resolver, test1dir); MediaStoreUtils.deleteFileOrDirectory(resolver, test2dir); assertFalse(isFileInMediaStore(resolver, test1dir)); assertFalse(isFileInMediaStore(resolver, test2dir)); assertFalse(isFileInMediaStore(resolver, test2file)); } private static boolean isFileInMediaStore(final ContentResolver resolver, final GenericFile file) { final Uri uri = MediaStoreUtils.getContentUri(file); final Pair<String, String[]> selection = MediaStoreUtils.dataSelection(file.toFile()); final Cursor c = resolver.query(uri, new String[] {MediaStore.Files.FileColumns._ID}, selection.first, selection.second, null); if (c != null) { try { if (c.moveToFirst()) { return c.getLong(0) != 0; } } finally { c.close(); } } return false; } @Override protected void tearDown() throws Exception { super.tearDown(); doTearDown(); } private void doTearDown() throws Exception { if (TEST_ROOT.exists()) { FileUtils.forceDelete(TEST_ROOT); } MediaStoreUtils.deleteAllFromDirectory(getContext().getContentResolver(), new JavaFile(TEST_ROOT)); } }