/* * Copyright (C) 2017 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.mtp; import android.os.FileUtils; import android.os.UserHandle; import android.os.storage.StorageVolume; import android.util.Log; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.junit.runners.MethodSorters; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * Tests for MtpStorageManager functionality. */ @RunWith(JUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class MtpStorageManagerTest { private static final String TAG = MtpStorageManagerTest.class.getSimpleName(); private static final String TEMP_DIR = InstrumentationRegistry.getContext().getFilesDir() + "/" + TAG + "/"; private static final File TEMP_DIR_FILE = new File(TEMP_DIR); private MtpStorageManager manager; private ArrayList objectsAdded; private ArrayList objectsRemoved; private ArrayList objectsInfoChanged; private File mainStorageDir; private File secondaryStorageDir; private MtpStorage mainMtpStorage; private MtpStorage secondaryMtpStorage; static { MtpStorageManager.sDebug = true; } private static void logMethodName() { Log.d(TAG, Thread.currentThread().getStackTrace()[3].getMethodName()); } private static void logMethodValue(String szVar, int iValue) { Log.d(TAG, szVar + "=" + iValue + ": " + Thread.currentThread().getStackTrace()[3].getMethodName()); } private static void vWriteNewFile(File newFile) { try { new FileOutputStream(newFile).write(new byte[] {0, 0, 0}); } catch (IOException e) { Assert.fail(); } } private static File createNewFile(File parent) { return createNewFile(parent, "file-" + UUID.randomUUID().toString()); } private static File createNewFileNonZero(File parent) { return createNewFileNonZero(parent, "file-" + UUID.randomUUID().toString()); } private static File createNewFile(File parent, String name) { return createNewFile(parent, name, false); } private static File createNewFileNonZero(File parent, String name) { return createNewFile(parent, name, true); } private static File createNewFile(File parent, String name, boolean fgNonZero) { try { File ret = new File(parent, name); if (!ret.createNewFile()) throw new AssertionError("Failed to create file"); if (fgNonZero) vWriteNewFile(ret); // create non-zero size file return ret; } catch (IOException e) { throw new AssertionError(e.getMessage()); } } private static File createNewDir(File parent, String name) { File ret = new File(parent, name); if (!ret.mkdir()) throw new AssertionError("Failed to create file"); return ret; } private static File createNewDir(File parent) { return createNewDir(parent, "dir-" + UUID.randomUUID().toString()); } @Before public void before() { FileUtils.deleteContentsAndDir(TEMP_DIR_FILE); Assert.assertTrue(TEMP_DIR_FILE.mkdir()); mainStorageDir = createNewDir(TEMP_DIR_FILE); secondaryStorageDir = createNewDir(TEMP_DIR_FILE); StorageVolume mainStorage = new StorageVolume("1", mainStorageDir, mainStorageDir, "", true, false, true, false, false, -1, UserHandle.CURRENT, null /* uuid */, "", ""); StorageVolume secondaryStorage = new StorageVolume("2", secondaryStorageDir, secondaryStorageDir, "", false, false, true, false, false, -1, UserHandle.CURRENT, null /* uuid */, "", ""); objectsAdded = new ArrayList<>(); objectsRemoved = new ArrayList<>(); objectsInfoChanged = new ArrayList<>(); manager = new MtpStorageManager(new MtpStorageManager.MtpNotifier() { @Override public void sendObjectAdded(int id) { Log.d(TAG, "sendObjectAdded " + id); objectsAdded.add(id); } @Override public void sendObjectRemoved(int id) { Log.d(TAG, "sendObjectRemoved " + id); objectsRemoved.add(id); } @Override public void sendObjectInfoChanged(int id) { Log.d(TAG, "sendObjectInfoChanged: " + id); objectsInfoChanged.add(id); } }, /* subdirectories= */ null); mainMtpStorage = manager.addMtpStorage(mainStorage, /* isHostWindows= */ () -> false); secondaryMtpStorage = manager.addMtpStorage(secondaryStorage, /* isHostWindows= */ () -> false); } @After public void after() { manager.close(); FileUtils.deleteContentsAndDir(TEMP_DIR_FILE); } /** MtpObject getter tests. **/ @Test @SmallTest public void testMtpObjectGetNameRoot() { logMethodName(); MtpStorageManager.MtpObject obj = manager.getStorageRoot(mainMtpStorage.getStorageId()); Assert.assertEquals(obj.getName(), mainStorageDir.getPath()); } @Test @SmallTest public void testMtpObjectGetNameNonRoot() { logMethodName(); File newFile = createNewFile(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getName(), newFile.getName()); } @Test @SmallTest public void testMtpObjectGetIdRoot() { logMethodName(); MtpStorageManager.MtpObject obj = manager.getStorageRoot(mainMtpStorage.getStorageId()); Assert.assertEquals(obj.getId(), mainMtpStorage.getStorageId()); } @Test @SmallTest public void testMtpObjectGetIdNonRoot() { logMethodName(); File newFile = createNewFile(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getId(), 1); } @Test @SmallTest public void testMtpObjectIsDirTrue() { logMethodName(); MtpStorageManager.MtpObject obj = manager.getStorageRoot(mainMtpStorage.getStorageId()); Assert.assertTrue(obj.isDir()); } @Test @SmallTest public void testMtpObjectIsDirFalse() { logMethodName(); File newFile = createNewFile(mainStorageDir, "TEST123.mp3"); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertFalse(stream.get(0).isDir()); } @Test @SmallTest public void testMtpObjectGetFormatDir() { logMethodName(); File newFile = createNewDir(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getFormat(), MtpConstants.FORMAT_ASSOCIATION); } @Test @SmallTest public void testMtpObjectGetFormatNonDir() { logMethodName(); File newFile = createNewFile(mainStorageDir, "TEST123.mp3"); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getFormat(), MtpConstants.FORMAT_MP3); } @Test @SmallTest public void testMtpObjectGetStorageId() { logMethodName(); File newFile = createNewFile(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getStorageId(), mainMtpStorage.getStorageId()); } @Test @SmallTest public void testMtpObjectGetLastModified() { logMethodName(); File newFile = createNewFile(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getModifiedTime(), newFile.lastModified() / 1000); } @Test @SmallTest public void testMtpObjectGetParent() { logMethodName(); File newFile = createNewFile(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getParent(), manager.getStorageRoot(mainMtpStorage.getStorageId())); } @Test @SmallTest public void testMtpObjectGetRoot() { logMethodName(); File newFile = createNewFile(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getRoot(), manager.getStorageRoot(mainMtpStorage.getStorageId())); } @Test @SmallTest public void testMtpObjectGetPath() { logMethodName(); File newFile = createNewFile(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getPath().toString(), newFile.getPath()); } @Test @SmallTest public void testMtpObjectGetSize() { logMethodName(); File newFile = createNewFile(mainStorageDir); try { new FileOutputStream(newFile).write(new byte[] {0, 0, 0, 0, 0, 0, 0, 0}); } catch (IOException e) { Assert.fail(); } List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getSize(), 8); } @Test @SmallTest public void testMtpObjectGetSizeDir() { logMethodName(); File newDir = createNewDir(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getSize(), 0); } /** MtpStorageManager cache access tests. **/ @Test @SmallTest public void testAddMtpStorage() { logMethodName(); Assert.assertEquals(mainMtpStorage.getPath(), mainStorageDir.getPath()); Assert.assertNotNull(manager.getStorageRoot(mainMtpStorage.getStorageId())); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRemoveMtpStorage() { logMethodName(); File newFile = createNewFile(secondaryStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, secondaryMtpStorage.getStorageId()); Assert.assertEquals(stream.size(), 1); manager.removeMtpStorage(secondaryMtpStorage); Assert.assertNull(manager.getStorageRoot(secondaryMtpStorage.getStorageId())); Assert.assertNull(manager.getObject(1)); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetByPath() { logMethodName(); File newFile = createNewFile(createNewDir(createNewDir(mainStorageDir))); MtpStorageManager.MtpObject obj = manager.getByPath(newFile.getPath()); Assert.assertNotNull(obj); Assert.assertEquals(obj.getPath().toString(), newFile.getPath()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetByPathError() { logMethodName(); File newFile = createNewFile(createNewDir(createNewDir(mainStorageDir))); MtpStorageManager.MtpObject obj = manager.getByPath(newFile.getPath() + "q"); Assert.assertNull(obj); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetObject() { logMethodName(); File newFile = createNewFile(createNewDir(createNewDir(mainStorageDir))); MtpStorageManager.MtpObject obj = manager.getByPath(newFile.getPath()); Assert.assertNotNull(obj); Assert.assertEquals(manager.getObject(obj.getId()), obj); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetObjectError() { logMethodName(); File newFile = createNewFile(createNewDir(createNewDir(mainStorageDir))); Assert.assertNull(manager.getObject(42)); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetStorageRoot() { logMethodName(); MtpStorageManager.MtpObject obj = manager.getStorageRoot(mainMtpStorage.getStorageId()); Assert.assertEquals(obj.getPath().toString(), mainStorageDir.getPath()); } @Test @SmallTest public void testGetObjectsParent() { logMethodName(); File newDir = createNewDir(createNewDir(mainStorageDir)); File newFile = createNewFile(newDir); File newMP3File = createNewFile(newDir, "lalala.mp3"); MtpStorageManager.MtpObject parent = manager.getByPath(newDir.getPath()); Assert.assertNotNull(parent); List stream = manager.getObjects(parent.getId(), 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.size(), 2); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetObjectsFormat() { logMethodName(); File newDir = createNewDir(createNewDir(mainStorageDir)); File newFile = createNewFile(newDir); File newMP3File = createNewFile(newDir, "lalala.mp3"); MtpStorageManager.MtpObject parent = manager.getByPath(newDir.getPath()); Assert.assertNotNull(parent); List stream = manager.getObjects(parent.getId(), MtpConstants.FORMAT_MP3, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.get(0).getPath().toString(), newMP3File.toString()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetObjectsRoot() { logMethodName(); File newDir = createNewDir(mainStorageDir); File newFile = createNewFile(mainStorageDir); File newMP3File = createNewFile(newDir, "lalala.mp3"); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.size(), 2); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetObjectsAll() { logMethodName(); File newDir = createNewDir(mainStorageDir); File newFile = createNewFile(mainStorageDir); File newMP3File = createNewFile(newDir, "lalala.mp3"); List stream = manager.getObjects(0, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.size(), 3); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetObjectsAllStorages() { logMethodName(); File newDir = createNewDir(mainStorageDir); createNewFile(mainStorageDir); createNewFile(newDir, "lalala.mp3"); File newDir2 = createNewDir(secondaryStorageDir); createNewFile(secondaryStorageDir); createNewFile(newDir2, "lalala.mp3"); List stream = manager.getObjects(0, 0, 0xFFFFFFFF); Assert.assertEquals(stream.size(), 6); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testGetObjectsAllStoragesRoot() { logMethodName(); File newDir = createNewDir(mainStorageDir); createNewFile(mainStorageDir); createNewFile(newDir, "lalala.mp3"); File newDir2 = createNewDir(secondaryStorageDir); createNewFile(secondaryStorageDir); createNewFile(newDir2, "lalala.mp3"); List stream = manager.getObjects(0xFFFFFFFF, 0, 0xFFFFFFFF); Assert.assertEquals(stream.size(), 4); Assert.assertTrue(manager.checkConsistency()); } /** MtpStorageManager event handling tests. **/ @Test @SmallTest public void testObjectAdded() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.size(), 0); File newFile = createNewFileNonZero(mainStorageDir); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(manager.getObject(objectsAdded.get(0)).getPath().toString(), newFile.getPath()); logMethodValue("objectsInfoChanged.size", objectsInfoChanged.size()); if (objectsInfoChanged.size() > 0) Assert.assertEquals(objectsAdded.get(0).intValue(), objectsInfoChanged.get(0).intValue()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testObjectAddedDir() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.size(), 0); File newDir = createNewDir(mainStorageDir); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(manager.getObject(objectsAdded.get(0)).getPath().toString(), newDir.getPath()); Assert.assertTrue(manager.getObject(objectsAdded.get(0)).isDir()); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testObjectAddedRecursiveDir() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.size(), 0); File newDir = createNewDir(createNewDir(createNewDir(mainStorageDir))); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 3); Assert.assertEquals(manager.getObject(objectsAdded.get(2)).getPath().toString(), newDir.getPath()); Assert.assertTrue(manager.getObject(objectsAdded.get(2)).isDir()); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testObjectRemoved() { logMethodName(); File newFile = createNewFile(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.size(), 1); Assert.assertTrue(newFile.delete()); manager.flushEvents(); Assert.assertEquals(objectsRemoved.size(), 1); Assert.assertNull(manager.getObject(objectsRemoved.get(0))); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testObjectMoved() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); Assert.assertEquals(stream.size(), 1); File toFile = new File(mainStorageDir, "to" + newFile.getName()); Assert.assertTrue(newFile.renameTo(toFile)); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(objectsRemoved.size(), 1); Assert.assertEquals(manager.getObject(objectsAdded.get(0)).getPath().toString(), toFile.getPath()); Assert.assertNull(manager.getObject(objectsRemoved.get(0))); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertTrue(manager.checkConsistency()); } /** MtpStorageManager operation tests. Ensure that events are not sent for the main operation, and also test all possible cases of other processes accessing the file at the same time, as well as cases of both failure and success. **/ @Test @SmallTest public void testSendObjectSuccess() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); int id = manager.beginSendObject(manager.getStorageRoot(mainMtpStorage.getStorageId()), "newFile", MtpConstants.FORMAT_UNDEFINED); Assert.assertEquals(id, 1); File newFile = createNewFileNonZero(mainStorageDir, "newFile"); manager.flushEvents(); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endSendObject(obj, true)); Assert.assertEquals(obj.getPath().toString(), newFile.getPath()); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testSendObjectSuccessDir() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); int id = manager.beginSendObject(manager.getStorageRoot(mainMtpStorage.getStorageId()), "newDir", MtpConstants.FORMAT_ASSOCIATION); Assert.assertEquals(id, 1); File newFile = createNewDir(mainStorageDir, "newDir"); manager.flushEvents(); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endSendObject(obj, true)); Assert.assertEquals(obj.getPath().toString(), newFile.getPath()); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(obj.getFormat(), MtpConstants.FORMAT_ASSOCIATION); Assert.assertTrue(manager.checkConsistency()); // Check that new dir receives events File newerFile = createNewFileNonZero(newFile); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(manager.getObject(objectsAdded.get(0)).getPath().toString(), newerFile.getPath()); } @Test @SmallTest public void testSendObjectSuccessDelayed() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); int id = manager.beginSendObject(manager.getStorageRoot(mainMtpStorage.getStorageId()), "newFile", MtpConstants.FORMAT_UNDEFINED); Assert.assertEquals(id, 1); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endSendObject(obj, true)); File newFile = createNewFileNonZero(mainStorageDir, "newFile"); manager.flushEvents(); Assert.assertEquals(obj.getPath().toString(), newFile.getPath()); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testSendObjectSuccessDirDelayed() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); int id = manager.beginSendObject(manager.getStorageRoot(mainMtpStorage.getStorageId()), "newDir", MtpConstants.FORMAT_ASSOCIATION); Assert.assertEquals(id, 1); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endSendObject(obj, true)); File newFile = createNewDir(mainStorageDir, "newDir"); manager.flushEvents(); Assert.assertEquals(obj.getPath().toString(), newFile.getPath()); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(obj.getFormat(), MtpConstants.FORMAT_ASSOCIATION); Assert.assertTrue(manager.checkConsistency()); // Check that new dir receives events File newerFile = createNewFileNonZero(newFile); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(manager.getObject(objectsAdded.get(0)).getPath().toString(), newerFile.getPath()); } @Test @SmallTest public void testSendObjectSuccessDeleted() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); int id = manager.beginSendObject(manager.getStorageRoot(mainMtpStorage.getStorageId()), "newFile", MtpConstants.FORMAT_UNDEFINED); Assert.assertEquals(id, 1); File newFile = createNewFile(mainStorageDir, "newFile"); Assert.assertTrue(newFile.delete()); manager.flushEvents(); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endSendObject(obj, true)); Assert.assertNull(manager.getObject(obj.getId())); Assert.assertEquals(objectsRemoved.get(0).intValue(), obj.getId()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testSendObjectFailed() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); int id = manager.beginSendObject(manager.getStorageRoot(mainMtpStorage.getStorageId()), "newFile", MtpConstants.FORMAT_UNDEFINED); Assert.assertEquals(id, 1); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endSendObject(obj, false)); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testSendObjectFailedDeleted() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); int id = manager.beginSendObject(manager.getStorageRoot(mainMtpStorage.getStorageId()), "newFile", MtpConstants.FORMAT_UNDEFINED); Assert.assertEquals(id, 1); MtpStorageManager.MtpObject obj = manager.getObject(id); File newFile = createNewFileNonZero(mainStorageDir, "newFile"); Assert.assertTrue(newFile.delete()); manager.flushEvents(); Assert.assertTrue(manager.endSendObject(obj, false)); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testSendObjectFailedAdded() { logMethodName(); List stream = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()); int id = manager.beginSendObject(manager.getStorageRoot(mainMtpStorage.getStorageId()), "newFile", MtpConstants.FORMAT_UNDEFINED); Assert.assertEquals(id, 1); MtpStorageManager.MtpObject obj = manager.getObject(id); File newDir = createNewDir(mainStorageDir, "newFile"); manager.flushEvents(); Assert.assertTrue(manager.endSendObject(obj, false)); Assert.assertNotEquals(objectsAdded.get(0).intValue(), id); logMethodValue("objectsInfoChanged.size", objectsInfoChanged.size()); if (objectsInfoChanged.size() > 0) Assert.assertNotEquals(objectsInfoChanged.get(0).intValue(), id); Assert.assertNull(manager.getObject(id)); Assert.assertEquals(manager.getObject(objectsAdded.get(0)).getPath().toString(), newDir.getPath()); Assert.assertTrue(manager.checkConsistency()); // Expect events in new dir createNewFileNonZero(newDir); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 2); logMethodValue("objectsInfoChanged.size", objectsInfoChanged.size()); if (objectsInfoChanged.size() == 1) Assert.assertEquals(objectsAdded.get(1).intValue(), objectsInfoChanged.get(0).intValue()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRemoveObjectSuccess() { logMethodName(); File newFile = createNewFile(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRemoveObject(obj)); Assert.assertTrue(newFile.delete()); manager.flushEvents(); Assert.assertTrue(manager.endRemoveObject(obj, true)); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertNull(manager.getObject(obj.getId())); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRemoveObjectDelayed() { logMethodName(); File newFile = createNewFile(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRemoveObject(obj)); Assert.assertTrue(manager.endRemoveObject(obj, true)); Assert.assertTrue(newFile.delete()); manager.flushEvents(); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertNull(manager.getObject(obj.getId())); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRemoveObjectDir() { logMethodName(); File newDir = createNewDir(mainStorageDir); createNewFileNonZero(createNewDir(newDir)); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); manager.getObjects(obj.getId(), 0, mainMtpStorage.getStorageId()); Assert.assertTrue(manager.beginRemoveObject(obj)); createNewFileNonZero(newDir); Assert.assertTrue(FileUtils.deleteContentsAndDir(newDir)); manager.flushEvents(); Assert.assertTrue(manager.endRemoveObject(obj, true)); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(objectsRemoved.size(), 1); Assert.assertEquals(manager.getObjects(0, 0, mainMtpStorage.getStorageId()).size(), 0); Assert.assertNull(manager.getObject(obj.getId())); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRemoveObjectDirDelayed() { logMethodName(); File newDir = createNewDir(mainStorageDir); createNewFile(createNewDir(newDir)); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRemoveObject(obj)); Assert.assertTrue(manager.endRemoveObject(obj, true)); Assert.assertTrue(FileUtils.deleteContentsAndDir(newDir)); manager.flushEvents(); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(manager.getObjects(0, 0, mainMtpStorage.getStorageId()).size(), 0); Assert.assertNull(manager.getObject(obj.getId())); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRemoveObjectSuccessAdded() { logMethodName(); File newFile = createNewFile(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); int id = obj.getId(); Assert.assertTrue(manager.beginRemoveObject(obj)); Assert.assertTrue(newFile.delete()); createNewFileNonZero(mainStorageDir, newFile.getName()); manager.flushEvents(); Assert.assertTrue(manager.endRemoveObject(obj, true)); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertNull(manager.getObject(id)); Assert.assertNotEquals(objectsAdded.get(0).intValue(), id); logMethodValue("objectsInfoChanged.size", objectsInfoChanged.size()); if (objectsInfoChanged.size() > 0) Assert.assertNotEquals(objectsInfoChanged.get(0).intValue(), objectsAdded.get(0).intValue()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRemoveObjectFailed() { logMethodName(); File newFile = createNewFile(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRemoveObject(obj)); Assert.assertTrue(manager.endRemoveObject(obj, false)); Assert.assertEquals(manager.getObject(obj.getId()), obj); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRemoveObjectFailedDir() { logMethodName(); File newDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); manager.getObjects(obj.getId(), 0, mainMtpStorage.getStorageId()); Assert.assertTrue(manager.beginRemoveObject(obj)); createNewFile(newDir); manager.flushEvents(); Assert.assertTrue(manager.endRemoveObject(obj, false)); Assert.assertEquals(manager.getObject(obj.getId()), obj); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRemoveObjectFailedRemoved() { logMethodName(); File newFile = createNewFile(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRemoveObject(obj)); Assert.assertTrue(newFile.delete()); manager.flushEvents(); Assert.assertTrue(manager.endRemoveObject(obj, false)); Assert.assertEquals(objectsRemoved.size(), 1); Assert.assertEquals(objectsRemoved.get(0).intValue(), obj.getId()); Assert.assertNull(manager.getObject(obj.getId())); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testCopyObjectSuccess() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); File newDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()) .stream().filter(MtpStorageManager.MtpObject::isDir).findFirst().get(); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> !o.isDir()).findFirst().get(); int id = manager.beginCopyObject(fileObj, dirObj); Assert.assertNotEquals(id, -1); createNewFileNonZero(newDir, newFile.getName()); manager.flushEvents(); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endCopyObject(obj, true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testCopyObjectSuccessRecursive() { logMethodName(); File newDirFrom = createNewDir(mainStorageDir); File newDirFrom1 = createNewDir(newDirFrom); File newDirFrom2 = createNewFileNonZero(newDirFrom1); File delayedFile = createNewFileNonZero(newDirFrom); File deletedFile = createNewFileNonZero(newDirFrom); File newDirTo = createNewDir(mainStorageDir); MtpStorageManager.MtpObject toObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> o.getName().equals(newDirTo.getName())).findFirst().get(); MtpStorageManager.MtpObject fromObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> o.getName().equals(newDirFrom.getName())).findFirst().get(); manager.getObjects(fromObj.getId(), 0, mainMtpStorage.getStorageId()); int id = manager.beginCopyObject(fromObj, toObj); Assert.assertNotEquals(id, -1); File copiedDir = createNewDir(newDirTo, newDirFrom.getName()); File copiedDir1 = createNewDir(copiedDir, newDirFrom1.getName()); createNewFileNonZero(copiedDir1, newDirFrom2.getName()); createNewFileNonZero(copiedDir, "extraFile"); File toDelete = createNewFileNonZero(copiedDir, deletedFile.getName()); manager.flushEvents(); Assert.assertTrue(toDelete.delete()); manager.flushEvents(); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endCopyObject(obj, true)); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(objectsRemoved.size(), 1); createNewFileNonZero(copiedDir, delayedFile.getName()); manager.flushEvents(); Assert.assertTrue(manager.checkConsistency()); // Expect events in the visited dir, but not the unvisited dir. createNewFileNonZero(copiedDir); createNewFileNonZero(copiedDir1); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 2); Assert.assertEquals(objectsAdded.size(), 2); // Number of files/dirs created, minus the one that was deleted. Assert.assertEquals(manager.getObjects(0, 0, mainMtpStorage.getStorageId()).size(), 13); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testCopyObjectFailed() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); File newDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(MtpStorageManager.MtpObject::isDir).findFirst().get(); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> !o.isDir()).findFirst().get(); int id = manager.beginCopyObject(fileObj, dirObj); Assert.assertNotEquals(id, -1); manager.flushEvents(); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endCopyObject(obj, false)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testCopyObjectFailedAdded() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); File newDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(MtpStorageManager.MtpObject::isDir).findFirst().get(); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> !o.isDir()).findFirst().get(); int id = manager.beginCopyObject(fileObj, dirObj); Assert.assertNotEquals(id, -1); File addedDir = createNewDir(newDir, newFile.getName()); manager.flushEvents(); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endCopyObject(obj, false)); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertNotEquals(objectsAdded.get(0).intValue(), id); Assert.assertTrue(manager.checkConsistency()); // Expect events in new dir createNewFileNonZero(addedDir); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 2); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testCopyObjectFailedDeleted() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); File newDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(MtpStorageManager.MtpObject::isDir).findFirst().get(); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> !o.isDir()).findFirst().get(); int id = manager.beginCopyObject(fileObj, dirObj); Assert.assertNotEquals(id, -1); Assert.assertTrue(createNewFileNonZero(newDir, newFile.getName()).delete()); manager.flushEvents(); MtpStorageManager.MtpObject obj = manager.getObject(id); Assert.assertTrue(manager.endCopyObject(obj, false)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRenameObjectSuccess() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRenameObject(obj, "renamed")); File renamed = new File(mainStorageDir, "renamed"); Assert.assertTrue(newFile.renameTo(renamed)); manager.flushEvents(); Assert.assertTrue(manager.endRenameObject(obj, newFile.getName(), true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(obj.getPath().toString(), renamed.getPath()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRenameObjectDirSuccess() { logMethodName(); File newDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRenameObject(obj, "renamed")); File renamed = new File(mainStorageDir, "renamed"); Assert.assertTrue(newDir.renameTo(renamed)); manager.flushEvents(); Assert.assertTrue(manager.endRenameObject(obj, newDir.getName(), true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(obj.getPath().toString(), renamed.getPath()); Assert.assertTrue(manager.checkConsistency()); // Don't expect events createNewFile(renamed); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRenameObjectDirVisitedSuccess() { logMethodName(); File newDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); manager.getObjects(obj.getId(), 0, mainMtpStorage.getStorageId()); Assert.assertTrue(manager.beginRenameObject(obj, "renamed")); File renamed = new File(mainStorageDir, "renamed"); Assert.assertTrue(newDir.renameTo(renamed)); manager.flushEvents(); Assert.assertTrue(manager.endRenameObject(obj, newDir.getName(), true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(obj.getPath().toString(), renamed.getPath()); Assert.assertTrue(manager.checkConsistency()); // Expect events since the dir was visited createNewFileNonZero(renamed); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRenameObjectDelayed() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRenameObject(obj, "renamed")); Assert.assertTrue(manager.endRenameObject(obj, newFile.getName(), true)); File renamed = new File(mainStorageDir, "renamed"); Assert.assertTrue(newFile.renameTo(renamed)); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(obj.getPath().toString(), renamed.getPath()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRenameObjectDirVisitedDelayed() { logMethodName(); File newDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); manager.getObjects(obj.getId(), 0, mainMtpStorage.getStorageId()); Assert.assertTrue(manager.beginRenameObject(obj, "renamed")); Assert.assertTrue(manager.endRenameObject(obj, newDir.getName(), true)); File renamed = new File(mainStorageDir, "renamed"); Assert.assertTrue(newDir.renameTo(renamed)); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(obj.getPath().toString(), renamed.getPath()); Assert.assertTrue(manager.checkConsistency()); // Expect events since the dir was visited createNewFileNonZero(renamed); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRenameObjectFailed() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRenameObject(obj, "renamed")); Assert.assertTrue(manager.endRenameObject(obj, newFile.getName(), false)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRenameObjectFailedOldRemoved() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRenameObject(obj, "renamed")); Assert.assertTrue(newFile.delete()); manager.flushEvents(); Assert.assertTrue(manager.endRenameObject(obj, newFile.getName(), false)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 1); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testRenameObjectFailedNewAdded() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject obj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginRenameObject(obj, "renamed")); createNewFileNonZero(mainStorageDir, "renamed"); manager.flushEvents(); Assert.assertTrue(manager.endRenameObject(obj, newFile.getName(), false)); Assert.assertEquals(objectsAdded.size(), 1); logMethodValue("objectsInfoChanged.size", objectsInfoChanged.size()); if (objectsInfoChanged.size() > 0) Assert.assertNotEquals(objectsAdded.get(0).intValue(), objectsInfoChanged.get(0).intValue()); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectSuccess() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); File dir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(MtpStorageManager.MtpObject::isDir).findFirst().get(); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> !o.isDir()).findFirst().get(); Assert.assertTrue(manager.beginMoveObject(fileObj, dirObj)); File moved = new File(dir, newFile.getName()); Assert.assertTrue(newFile.renameTo(moved)); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), dirObj, newFile.getName(), true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(fileObj.getPath().toString(), moved.getPath()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectDirSuccess() { logMethodName(); File newDir = createNewDir(mainStorageDir); File movedDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> o.getName().equals(newDir.getName())).findFirst().get(); MtpStorageManager.MtpObject movedObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> o.getName().equals(movedDir.getName())).findFirst().get(); Assert.assertTrue(manager.beginMoveObject(movedObj, dirObj)); File renamed = new File(newDir, movedDir.getName()); Assert.assertTrue(movedDir.renameTo(renamed)); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), dirObj, movedDir.getName(), true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(movedObj.getPath().toString(), renamed.getPath()); Assert.assertTrue(manager.checkConsistency()); // Don't expect events createNewFile(renamed); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectDirVisitedSuccess() { logMethodName(); File newDir = createNewDir(mainStorageDir); File movedDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> o.getName().equals(newDir.getName())).findFirst().get(); MtpStorageManager.MtpObject movedObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> o.getName().equals(movedDir.getName())).findFirst().get(); manager.getObjects(movedObj.getId(), 0, mainMtpStorage.getStorageId()); Assert.assertTrue(manager.beginMoveObject(movedObj, dirObj)); File renamed = new File(newDir, movedDir.getName()); Assert.assertTrue(movedDir.renameTo(renamed)); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), dirObj, movedDir.getName(), true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(movedObj.getPath().toString(), renamed.getPath()); Assert.assertTrue(manager.checkConsistency()); // Expect events since the dir was visited createNewFileNonZero(renamed); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectDelayed() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); File dir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(MtpStorageManager.MtpObject::isDir).findFirst().get(); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> !o.isDir()).findFirst().get(); Assert.assertTrue(manager.beginMoveObject(fileObj, dirObj)); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), dirObj, newFile.getName(), true)); File moved = new File(dir, newFile.getName()); Assert.assertTrue(newFile.renameTo(moved)); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(fileObj.getPath().toString(), moved.getPath()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectDirVisitedDelayed() { logMethodName(); File newDir = createNewDir(mainStorageDir); File movedDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> o.getName().equals(newDir.getName())).findFirst().get(); MtpStorageManager.MtpObject movedObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> o.getName().equals(movedDir.getName())).findFirst().get(); manager.getObjects(movedObj.getId(), 0, mainMtpStorage.getStorageId()); Assert.assertTrue(manager.beginMoveObject(movedObj, dirObj)); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), dirObj, movedDir.getName(), true)); File renamed = new File(newDir, movedDir.getName()); Assert.assertTrue(movedDir.renameTo(renamed)); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(movedObj.getPath().toString(), renamed.getPath()); Assert.assertTrue(manager.checkConsistency()); // Expect events since the dir was visited createNewFileNonZero(renamed); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectFailed() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); File dir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(MtpStorageManager.MtpObject::isDir).findFirst().get(); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> !o.isDir()).findFirst().get(); Assert.assertTrue(manager.beginMoveObject(fileObj, dirObj)); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), dirObj, newFile.getName(), false)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectFailedOldRemoved() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); File dir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(MtpStorageManager.MtpObject::isDir).findFirst().get(); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> !o.isDir()).findFirst().get(); Assert.assertTrue(manager.beginMoveObject(fileObj, dirObj)); Assert.assertTrue(newFile.delete()); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), dirObj, newFile.getName(), false)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 1); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectFailedNewAdded() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); File dir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject dirObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(MtpStorageManager.MtpObject::isDir).findFirst().get(); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).stream() .filter(o -> !o.isDir()).findFirst().get(); Assert.assertTrue(manager.beginMoveObject(fileObj, dirObj)); createNewFileNonZero(dir, newFile.getName()); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), dirObj, newFile.getName(), false)); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectXStorageSuccess() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginMoveObject(fileObj, manager.getStorageRoot(secondaryMtpStorage.getStorageId()))); Assert.assertTrue(newFile.delete()); File moved = createNewFileNonZero(secondaryStorageDir, newFile.getName()); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), manager.getStorageRoot(secondaryMtpStorage.getStorageId()), newFile.getName(), true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(manager.getObject(fileObj.getId()).getPath().toString(), moved.getPath()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectXStorageDirSuccess() { logMethodName(); File movedDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject movedObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginMoveObject(movedObj, manager.getStorageRoot(secondaryMtpStorage.getStorageId()))); Assert.assertTrue(movedDir.delete()); File moved = createNewDir(secondaryStorageDir, movedDir.getName()); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), manager.getStorageRoot(secondaryMtpStorage.getStorageId()), movedDir.getName(), true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(manager.getObject(movedObj.getId()).getPath().toString(), moved.getPath()); Assert.assertTrue(manager.checkConsistency()); // Don't expect events createNewFile(moved); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectXStorageDirVisitedSuccess() { logMethodName(); File movedDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject movedObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); manager.getObjects(movedObj.getId(), 0, mainMtpStorage.getStorageId()); Assert.assertTrue(manager.beginMoveObject(movedObj, manager.getStorageRoot(secondaryMtpStorage.getStorageId()))); Assert.assertTrue(movedDir.delete()); File moved = createNewDir(secondaryStorageDir, movedDir.getName()); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), manager.getStorageRoot(secondaryMtpStorage.getStorageId()), movedDir.getName(), true)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(manager.getObject(movedObj.getId()).getPath().toString(), moved.getPath()); Assert.assertTrue(manager.checkConsistency()); // Expect events since the dir was visited createNewFileNonZero(moved); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectXStorageDelayed() { logMethodName(); File movedFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject movedObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginMoveObject(movedObj, manager.getStorageRoot(secondaryMtpStorage.getStorageId()))); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), manager.getStorageRoot(secondaryMtpStorage.getStorageId()), movedFile.getName(), true)); Assert.assertTrue(movedFile.delete()); File moved = createNewFileNonZero(secondaryStorageDir, movedFile.getName()); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(manager.getObject(movedObj.getId()).getPath().toString(), moved.getPath()); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectXStorageDirVisitedDelayed() { logMethodName(); File movedDir = createNewDir(mainStorageDir); MtpStorageManager.MtpObject movedObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); manager.getObjects(movedObj.getId(), 0, mainMtpStorage.getStorageId()); Assert.assertTrue(manager.beginMoveObject(movedObj, manager.getStorageRoot(secondaryMtpStorage.getStorageId()))); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), manager.getStorageRoot(secondaryMtpStorage.getStorageId()), movedDir.getName(), true)); Assert.assertTrue(movedDir.delete()); File moved = createNewDir(secondaryStorageDir, movedDir.getName()); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertEquals(manager.getObject(movedObj.getId()).getPath().toString(), moved.getPath()); Assert.assertTrue(manager.checkConsistency()); // Expect events since the dir was visited createNewFileNonZero(moved); manager.flushEvents(); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectXStorageFailed() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginMoveObject(fileObj, manager.getStorageRoot(secondaryMtpStorage.getStorageId()))); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), manager.getStorageRoot(secondaryMtpStorage.getStorageId()), newFile.getName(), false)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectXStorageFailedOldRemoved() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginMoveObject(fileObj, manager.getStorageRoot(secondaryMtpStorage.getStorageId()))); Assert.assertTrue(newFile.delete()); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), manager.getStorageRoot(secondaryMtpStorage.getStorageId()), newFile.getName(), false)); Assert.assertEquals(objectsAdded.size(), 0); Assert.assertEquals(objectsInfoChanged.size(), 0); Assert.assertEquals(objectsRemoved.size(), 1); Assert.assertTrue(manager.checkConsistency()); } @Test @SmallTest public void testMoveObjectXStorageFailedNewAdded() { logMethodName(); File newFile = createNewFileNonZero(mainStorageDir); MtpStorageManager.MtpObject fileObj = manager.getObjects(0xFFFFFFFF, 0, mainMtpStorage.getStorageId()).get(0); Assert.assertTrue(manager.beginMoveObject(fileObj, manager.getStorageRoot(secondaryMtpStorage.getStorageId()))); createNewFileNonZero(secondaryStorageDir, newFile.getName()); manager.flushEvents(); Assert.assertTrue(manager.endMoveObject( manager.getStorageRoot(mainMtpStorage.getStorageId()), manager.getStorageRoot(secondaryMtpStorage.getStorageId()), newFile.getName(), false)); Assert.assertEquals(objectsAdded.size(), 1); Assert.assertEquals(objectsRemoved.size(), 0); Assert.assertTrue(manager.checkConsistency()); } }