/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.sync.engine.service; import com.liferay.sync.engine.BaseTestCase; import com.liferay.sync.engine.document.library.util.FileEventUtil; import com.liferay.sync.engine.model.SyncFile; import com.liferay.sync.engine.service.persistence.SyncFilePersistence; import com.liferay.sync.engine.util.FileUtil; import com.liferay.sync.engine.util.test.SyncFileTestUtil; import java.io.File; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; /** * @author Shinn Lok */ @PrepareForTest(FileEventUtil.class) @RunWith(PowerMockRunner.class) public class SyncFileServiceTest extends BaseTestCase { @Test public void testDeleteFolderSyncFile() throws Exception { List<SyncFile> syncFiles = SyncFileService.findSyncFiles( syncAccount.getSyncAccountId()); Assert.assertEquals(syncFiles.toString(), 1, syncFiles.size()); SyncFile folderSyncFileA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a"), syncAccount.getSyncAccountId()); SyncFile folderSyncFileAA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "a"), folderSyncFileA.getTypePK(), syncAccount.getSyncAccountId()); SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "b"), folderSyncFileA.getTypePK(), syncAccount.getSyncAccountId()); SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "a", "a"), folderSyncFileAA.getTypePK(), syncAccount.getSyncAccountId()); SyncFileTestUtil.addFileSyncFile( FileUtil.getFilePathName(filePathName, "a", "b.txt"), folderSyncFileA.getTypePK(), syncAccount.getSyncAccountId()); SyncFileTestUtil.addFileSyncFile( FileUtil.getFilePathName(filePathName, "a", "c.txt"), folderSyncFileA.getTypePK(), syncAccount.getSyncAccountId()); SyncFileTestUtil.addFileSyncFile( FileUtil.getFilePathName(filePathName, "a", "a", "a.txt"), folderSyncFileAA.getTypePK(), syncAccount.getSyncAccountId()); syncFiles = SyncFileService.findSyncFiles( syncAccount.getSyncAccountId()); Assert.assertEquals(syncFiles.toString(), 8, syncFiles.size()); SyncFileService.deleteSyncFile(folderSyncFileA); syncFiles = SyncFileService.findSyncFiles( syncAccount.getSyncAccountId()); Assert.assertEquals(syncFiles.toString(), 1, syncFiles.size()); } @Test public void testDoUpdateFolderSyncFile() throws Exception { SyncFile folderSyncFileA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a"), syncAccount.getSyncAccountId()); SyncFile folderSyncFileB = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "b"), syncAccount.getSyncAccountId()); SyncFile folderSyncFileAA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "a"), folderSyncFileA.getTypePK(), syncAccount.getSyncAccountId()); SyncFile fileSyncFileAA = SyncFileTestUtil.addFileSyncFile( FileUtil.getFilePathName(filePathName, "a", "a.txt"), folderSyncFileA.getTypePK(), syncAccount.getSyncAccountId()); SyncFileService.updateSyncFile( Paths.get(FileUtil.getFilePathName(filePathName, "b", "a")), folderSyncFileB.getTypePK(), folderSyncFileA); SyncFilePersistence syncFilePersistence = SyncFileService.getSyncFilePersistence(); folderSyncFileAA = syncFilePersistence.queryForId( folderSyncFileAA.getTypePK()); Assert.assertEquals( FileUtil.getFilePathName(filePathName, "b", "a", "a"), folderSyncFileAA.getFilePathName()); fileSyncFileAA = syncFilePersistence.queryForId( fileSyncFileAA.getTypePK()); Assert.assertEquals( FileUtil.getFilePathName(filePathName, "b", "a", "a.txt"), fileSyncFileAA.getFilePathName()); } @Test public void testResyncFolders() throws Exception { testResyncFolders( new int[] { SyncFile.STATE_UNSYNCED, SyncFile.STATE_UNSYNCED, SyncFile.STATE_UNSYNCED, SyncFile.STATE_UNSYNCED }, 1, 4); testResyncFolders( new int[] { SyncFile.STATE_SYNCED, SyncFile.STATE_UNSYNCED, SyncFile.STATE_UNSYNCED, SyncFile.STATE_UNSYNCED }, 2, 3); testResyncFolders( new int[] { SyncFile.STATE_SYNCED, SyncFile.STATE_SYNCED, SyncFile.STATE_UNSYNCED, SyncFile.STATE_UNSYNCED }, 2, 2); testResyncFolders( new int[] { SyncFile.STATE_SYNCED, SyncFile.STATE_SYNCED, SyncFile.STATE_SYNCED, SyncFile.STATE_UNSYNCED }, 1, 1); } @Test public void testUnsyncFolders() throws Exception { List<SyncFile> syncFiles = new ArrayList<>(); SyncFile folderSyncFileA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a"), syncAccount.getSyncAccountId()); syncFiles.add(folderSyncFileA); SyncFile folderSyncFileAA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "a"), folderSyncFileA.getTypePK(), syncAccount.getSyncAccountId()); syncFiles.add(folderSyncFileAA); SyncFile folderSyncFileAB = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "b"), folderSyncFileA.getTypePK(), syncAccount.getSyncAccountId()); syncFiles.add(folderSyncFileAB); SyncFile folderSyncFileAAA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "a", "a"), folderSyncFileAA.getTypePK(), syncAccount.getSyncAccountId()); syncFiles.add(folderSyncFileAAA); SyncFilePersistence syncFilePersistence = SyncFileService.getSyncFilePersistence(); List<SyncFile> syncedSyncFiles = syncFilePersistence.queryForEq( "state", SyncFile.STATE_SYNCED); int previousSyncedSyncFilesSize = syncedSyncFiles.size(); SyncFileService.unsyncFolders( syncAccount.getSyncAccountId(), syncFiles); syncedSyncFiles = syncFilePersistence.queryForEq( "state", SyncFile.STATE_SYNCED); Assert.assertEquals( syncedSyncFiles.toString(), previousSyncedSyncFilesSize - 4, syncedSyncFiles.size()); for (SyncFile syncFile : syncFiles) { syncFilePersistence.delete(syncFile); } } protected void testResyncFolders( int[] syncFileStates, int expectedExecutionCount, int expectedModifiedCount) throws Exception { List<SyncFile> syncFiles = new ArrayList<>(); SyncFile folderSyncFileA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a"), syncFileStates[0], syncAccount.getSyncAccountId()); syncFiles.add(folderSyncFileA); SyncFile folderSyncFileAA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "a"), folderSyncFileA.getTypePK(), syncFileStates[1], syncAccount.getSyncAccountId()); syncFiles.add(folderSyncFileAA); SyncFile folderSyncFileAB = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "b"), folderSyncFileA.getTypePK(), syncFileStates[2], syncAccount.getSyncAccountId()); syncFiles.add(folderSyncFileAB); SyncFile folderSyncFileAAA = SyncFileTestUtil.addFolderSyncFile( FileUtil.getFilePathName(filePathName, "a", "a", "a"), folderSyncFileAA.getTypePK(), syncFileStates[3], syncAccount.getSyncAccountId()); syncFiles.add(folderSyncFileAAA); SyncFilePersistence syncFilePersistence = SyncFileService.getSyncFilePersistence(); PowerMockito.mockStatic(FileEventUtil.class); SyncFileService.resyncFolders( syncAccount.getSyncAccountId(), syncFiles); PowerMockito.verifyStatic(Mockito.times(expectedExecutionCount)); FileEventUtil.resyncFolder( Mockito.anyLong(), Mockito.any(SyncFile.class)); List<SyncFile> resyncingSyncFiles = syncFilePersistence.queryForEq( "uiEvent", SyncFile.UI_EVENT_RESYNCING); Assert.assertEquals( resyncingSyncFiles.toString(), expectedModifiedCount, resyncingSyncFiles.size()); for (SyncFile syncFile : syncFiles) { syncFilePersistence.delete(syncFile); } FileUtils.deleteDirectory(new File(folderSyncFileA.getFilePathName())); } }