package com.constellio.app.modules.es.connectors.smb; import static com.constellio.app.modules.es.sdk.TestConnectorEvent.ADD_EVENT; import static com.constellio.app.modules.es.sdk.TestConnectorEvent.DELETE_EVENT; import static com.constellio.app.modules.es.sdk.TestConnectorEvent.MODIFY_EVENT; import static com.constellio.model.entities.schemas.Schemas.IDENTIFIER; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.where; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.groups.Tuple.tuple; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import com.constellio.app.modules.es.connectors.smb.testutils.SmbTestCommand; import com.constellio.app.modules.es.connectors.smb.testutils.SmbTestCommandFactory; import com.constellio.app.modules.es.connectors.smb.testutils.SmbTestCommandFactory.SmbTestCommandType; import com.constellio.app.modules.es.connectors.smb.testutils.SmbTestParams; import com.constellio.app.modules.es.connectors.spi.ConnectorLogger; import com.constellio.app.modules.es.connectors.spi.ConsoleConnectorLogger; import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbDocument; import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbFolder; import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbInstance; import com.constellio.app.modules.es.sdk.TestConnectorEventObserver; import com.constellio.app.modules.es.services.ConnectorManager; import com.constellio.app.modules.es.services.ESSchemasRecordsServices; import com.constellio.app.modules.es.services.crawler.ConnectorCrawler; import com.constellio.app.modules.es.services.crawler.DefaultConnectorEventObserver; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.sdk.SDKPasswords; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.annotations.InDevelopmentTest; import jcifs.smb.NtlmPasswordAuthentication; @InDevelopmentTest //TODO Activate test public class ConnectorSmbAcceptanceTest extends ConstellioTest { private ConnectorManager connectorManager; private RecordServices recordServices; private ESSchemasRecordsServices es; private ConnectorSmbInstance connectorInstance; private ConnectorLogger logger = new ConsoleConnectorLogger(); private TestConnectorEventObserver eventObserver; private List<String> seeds; private List<String> inclusions; private List<String> exclusions; private SmbTestCommandFactory commandFactory; private LocalDateTime TIME1 = new LocalDateTime(); private LocalDateTime ONE_MINUTE_AFTER_TIME1 = TIME1.plusMinutes(1); private LocalDateTime TWO_MINUTES_AFTER_TIME1 = TIME1.plusMinutes(2); private LocalDateTime THREE_MINUTES_AFTER_TIME1 = TIME1.plusMinutes(3); private LocalDateTime FOUR_MINUTES_AFTER_TIME1 = TIME1.plusMinutes(4); private LocalDateTime FIVE_MINUTES_AFTER_TIME1 = TIME1.plusMinutes(5); private LocalDateTime TWO_WEEKS_AFTER_TIME1 = TIME1.plusDays(14); private LocalDateTime FOUR_WEEKS_AFTER_TIME1 = TIME1.plusDays(28); private LocalDateTime FIVE_WEEKS_AFTER_TIME1 = TIME1.plusDays(5 * 7); private LocalDateTime SIX_WEEKS_AFTER_TIME1 = TIME1.plusDays(6 * 7); private LocalDateTime SEVEN_WEEKS_AFTER_TIME1 = TIME1.plusDays(7 * 7); private LocalDateTime EIGHT_WEEKS_AFTER_TIME1 = TIME1.plusDays(8 * 7); private String SHARE_URL = SDKPasswords.testSmbServer() + SDKPasswords.testSmbShare(); private String FILE_URL = SHARE_URL + SmbTestParams.FILE_NAME; private String FOLDER_URL = SHARE_URL + SmbTestParams.FOLDER_NAME; private String ANOTHER_FILE_URL = FOLDER_URL + SmbTestParams.ANOTHER_FILE_NAME; private String FOLDER2_URL = SHARE_URL + "folder2/"; private String FILE2_URL = FOLDER2_URL + "file2.txt"; private String FILE3_URL = SHARE_URL + "file3.txt"; private String FILE4_URL = SHARE_URL + "file4.txt"; private String FILE5_URL = FOLDER2_URL + "file5.txt"; @Before public void setUp() throws Exception { // givenCollection(zeCollection).withConstellioESModule().withAllTestUsers(); prepareSystem(withZeCollection().withConstellioESModule() .withAllTestUsers()); es = new ESSchemasRecordsServices(zeCollection, getAppLayerFactory()); recordServices = getModelLayerFactory().newRecordServices(); connectorManager = es.getConnectorManager(); eventObserver = new TestConnectorEventObserver(es, new DefaultConnectorEventObserver(es, logger, "crawlerObserver")); connectorManager.setCrawler(ConnectorCrawler.runningJobsSequentially(es, eventObserver) .withoutSleeps()); NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(SDKPasswords.testSmbDomain(), SDKPasswords.testSmbUsername(), SDKPasswords.testSmbPassword()); commandFactory = new SmbTestCommandFactory(auth); givenTimeIs(TIME1); } @Test public void onFirstStartIfInvalidShareThenErrorInUserLog() { String seedUrl = SDKPasswords.testSmbServer() + "invalidShare/"; seeds = Arrays.asList(seedUrl); inclusions = seeds; exclusions = new ArrayList<>(); connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode(SmbTestParams.INSTANCE_CODE) .setEnabled(true) .setSeeds(seeds) .setUsername(SDKPasswords.testSmbUsername()) .setPassword(SDKPasswords.testSmbPassword()) .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusions) .setExclusions(exclusions) .setTitle(SmbTestParams.CONNECTOR_TITLE)); // * // * ----------------- Fetch phase 1 -------------- // * System.out.println("Fetch phase 1"); SmbResult result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); // * // * ----------------- Fetch phase 2 -------------- // * System.out.println("Fetch phase 2"); givenTimeIs(ONE_MINUTE_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(ADD_EVENT, seedUrl)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .isEmpty(); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(seedUrl, true, ONE_MINUTE_AFTER_TIME1, true)); ConnectorSmbFolder folder = result.getFolders() .get(0); assertThat(folder.getErrorMessage()).isEqualTo("The network name cannot be found."); assertThat(folder.getErrorCode()).isEqualTo("ErrorCode"); assertThat(folder.getErrorStackTrace()).isEqualTo("The network name cannot be found."); assertThat(folder.getErrorsCount()).isEqualTo(1); } @Test public void onFirstStartIfInvalidPasswordThenErrorInUserLog() { SmbTestCommand populateMinimalShare = commandFactory.get(SmbTestCommandType.POPULATE_MINIMAL_SHARE, SHARE_URL, ""); populateMinimalShare.execute(); seeds = Arrays.asList(SHARE_URL); inclusions = seeds; exclusions = new ArrayList<>(); connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode(SmbTestParams.INSTANCE_CODE) .setEnabled(true) .setSeeds(seeds) .setUsername(SDKPasswords.testSmbUsername()) .setPassword("invalidPassword") .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusions) .setExclusions(exclusions) .setTitle(SmbTestParams.CONNECTOR_TITLE)); // * // * ----------------- Fetch phase 1 -------------- // * System.out.println("Fetch phase 1"); SmbResult result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); // * // * ----------------- Fetch phase 2 -------------- // * System.out.println("Fetch phase 2"); givenTimeIs(ONE_MINUTE_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(ADD_EVENT, SHARE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .isEmpty(); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, ONE_MINUTE_AFTER_TIME1, true)); ConnectorSmbFolder folder = result.getFolders() .get(0); assertThat(folder.getErrorMessage()).isEqualTo("Logon failure: unknown user name or bad password."); assertThat(folder.getErrorCode()).isEqualTo("ErrorCode"); assertThat(folder.getErrorStackTrace()).isEqualTo("Logon failure: unknown user name or bad password."); assertThat(folder.getErrorsCount()).isEqualTo(1); } @Test public void onFirstStartIfInvalidIPThenErrorInUserLog() { String seedUrl = "smb://ip/share/"; seeds = Arrays.asList(seedUrl); inclusions = seeds; exclusions = new ArrayList<>(); connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode(SmbTestParams.INSTANCE_CODE) .setEnabled(true) .setSeeds(seeds) .setUsername(SDKPasswords.testSmbUsername()) .setPassword("invalidPassword") .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusions) .setExclusions(exclusions) .setTitle(SmbTestParams.CONNECTOR_TITLE)); // * // * ----------------- Fetch phase 1 -------------- // * System.out.println("Fetch phase 1"); SmbResult result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); // * // * ----------------- Fetch phase 2 -------------- // * System.out.println("Fetch phase 2"); givenTimeIs(ONE_MINUTE_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(ADD_EVENT, seedUrl)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .isEmpty(); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(seedUrl, true, ONE_MINUTE_AFTER_TIME1, true)); ConnectorSmbFolder folder = result.getFolders() .get(0); assertThat(folder.getErrorMessage()).isEqualTo("Failed to connect to server"); assertThat(folder.getErrorCode()).isEqualTo("ErrorCode"); assertThat(folder.getErrorStackTrace()).isEqualTo("Failed to connect to server"); assertThat(folder.getErrorsCount()).isEqualTo(1); } @Test public void givenMinimalShareWhenTraversingTwiceThenFetchAndRefetchDocumentsAndFolders() { SmbTestCommand populateMinimalShare = commandFactory.get(SmbTestCommandType.POPULATE_MINIMAL_SHARE, SHARE_URL, ""); populateMinimalShare.execute(); seeds = Arrays.asList(SHARE_URL); inclusions = seeds; exclusions = new ArrayList<>(); connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode(SmbTestParams.INSTANCE_CODE) .setEnabled(true) .setSeeds(seeds) .setUsername(SDKPasswords.testSmbUsername()) .setPassword(SDKPasswords.testSmbPassword()) .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusions) .setExclusions(exclusions) .setTitle(SmbTestParams.CONNECTOR_TITLE)); // * // * ----------------- Fetch phase 1 -------------- // * System.out.println("Fetch phase 1"); SmbResult result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); // * // * ----------------- Fetch phase 2 -------------- // * System.out.println("Fetch phase 2"); givenTimeIs(ONE_MINUTE_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(ADD_EVENT, SHARE_URL), tuple(ADD_EVENT, FILE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, ONE_MINUTE_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, ONE_MINUTE_AFTER_TIME1, true)); // * // * ----------------- End of traversal -------------- // * System.out.println("End of traversal"); givenTimeIs(TWO_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(ADD_EVENT, FOLDER_URL), tuple(ADD_EVENT, ANOTHER_FILE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(ANOTHER_FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(FOLDER_URL, true, TWO_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Refetch phase 3 -------------- // * System.out.println("Refetch phase 3"); givenTimeIs(THREE_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(ANOTHER_FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(FOLDER_URL, true, TWO_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Refetch phase 4 -------------- // * System.out.println("Refetch phase 4"); givenTimeIs(FOUR_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(ANOTHER_FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(FOLDER_URL, true, TWO_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Refetch phase 5 -------------- // * System.out.println("Refetch phase 5"); givenTimeIs(FIVE_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(MODIFY_EVENT, SHARE_URL), tuple(MODIFY_EVENT, FILE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true), tuple(ANOTHER_FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true), tuple(FOLDER_URL, true, TWO_MINUTES_AFTER_TIME1, true)); // * // * ----------------- End of second traversal -------------- // * System.out.println("End of second traversal"); givenTimeIs(TWO_WEEKS_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(MODIFY_EVENT, FOLDER_URL), tuple(MODIFY_EVENT, ANOTHER_FILE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true), tuple(ANOTHER_FILE_URL, true, TWO_WEEKS_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true), tuple(FOLDER_URL, true, TWO_WEEKS_AFTER_TIME1, true)); SmbTestCommand cleanShare = commandFactory.get(SmbTestCommandType.CLEAN_SHARE, SHARE_URL, ""); cleanShare.execute(); } @Test public void givenMinimalShareIsModifiedWhenTraversingThenUpdateCorrectly() { SmbTestCommand populateMinimalShare = commandFactory.get(SmbTestCommandType.POPULATE_MINIMAL_SHARE, SHARE_URL, ""); populateMinimalShare.execute(); seeds = Arrays.asList(SHARE_URL); inclusions = seeds; exclusions = new ArrayList<>(); connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode(SmbTestParams.INSTANCE_CODE) .setEnabled(true) .setSeeds(seeds) .setUsername(SDKPasswords.testSmbUsername()) .setPassword(SDKPasswords.testSmbPassword()) .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusions) .setExclusions(exclusions) .setTitle(SmbTestParams.CONNECTOR_TITLE)); SmbResult result = fullyFetchShare(); result = fullyFetchShare(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, TIME1, true), tuple(ANOTHER_FILE_URL, true, TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, TIME1, true), tuple(FOLDER_URL, true, TIME1, true)); SmbTestCommand deleteFolder = commandFactory.get(SmbTestCommandType.DELETE, FOLDER_URL, ""); SmbTestCommand createFolder2 = commandFactory.get(SmbTestCommandType.CREATE_FOLDER, FOLDER2_URL, ""); SmbTestCommand createFile2 = commandFactory.get(SmbTestCommandType.CREATE_FILE, FILE2_URL, "file2 content"); SmbTestCommand modifyFile = commandFactory.get(SmbTestCommandType.UPDATE_FILE, FILE_URL, "new content for file"); deleteFolder.execute(); createFolder2.execute(); createFile2.execute(); modifyFile.execute(); // * // * ----------------- Fetch phase 1 -------------- // * System.out.println("Fetch phase 1"); givenTimeIs(ONE_MINUTE_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, TIME1, true), tuple(ANOTHER_FILE_URL, true, TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, TIME1, true), tuple(FOLDER_URL, true, TIME1, true)); // * // * ----------------- Fetch phase 2 -------------- // * System.out.println("Fetch phase 2"); givenTimeIs(TWO_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(MODIFY_EVENT, SHARE_URL), tuple(MODIFY_EVENT, FILE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(ANOTHER_FILE_URL, true, TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(FOLDER_URL, true, TIME1, true)); // * // * ----------------- Fetch phase 3 -------------- // * System.out.println("Fetch phase 3"); givenTimeIs(THREE_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(ADD_EVENT, FOLDER2_URL), tuple(ADD_EVENT, FILE2_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(FILE2_URL, true, THREE_MINUTES_AFTER_TIME1, true), tuple(ANOTHER_FILE_URL, true, TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(FOLDER2_URL, true, THREE_MINUTES_AFTER_TIME1, true), tuple(FOLDER_URL, true, TIME1, true)); // * // * ----------------- End of traversal -------------- // * System.out.println("End of traversal"); givenTimeIs(FOUR_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(DELETE_EVENT, FOLDER_URL), tuple(DELETE_EVENT, ANOTHER_FILE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(FILE2_URL, true, THREE_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(FOLDER2_URL, true, THREE_MINUTES_AFTER_TIME1, true)); SmbTestCommand cleanShare = commandFactory.get(SmbTestCommandType.CLEAN_SHARE, SHARE_URL, ""); cleanShare.execute(); } @Test public void givenNewContentAndModifiedContentAndNonModifiedContentWhenTraversingThenFetchInOrderNewThenModifiedThenNonModifiedAndPreserveParentRelationshipForTaxonomy() { // First traversal // // smb://ip/share/ // smb://ip/share/file.txt // smb://ip/share/file3.txt // smb://ip/share/folder/ // smb://ip/share/folder/another_file.txt // // Changes after first traversal and before second traversal // // smb://ip/share/file4.txt <--- New file (parent share) // smb://ip/share/file3.txt <--- Modified file (parent share) // smb://ip/share/file.txt <--- Non modified file (parent share) // // smb://ip/share/folder2/ <--- New folder (parent share) // smb://ip/share/folder2/file5.txt <--- New file (parent folder2) SmbTestCommand populateMinimalShare = commandFactory.get(SmbTestCommandType.POPULATE_MINIMAL_SHARE, SHARE_URL, ""); populateMinimalShare.execute(); SmbTestCommand createFile3 = commandFactory.get(SmbTestCommandType.CREATE_FILE, FILE3_URL, "file3 content"); createFile3.execute(); seeds = Arrays.asList(SHARE_URL); inclusions = seeds; exclusions = new ArrayList<>(); connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode(SmbTestParams.INSTANCE_CODE) .setEnabled(true) .setSeeds(seeds) .setUsername(SDKPasswords.testSmbUsername()) .setPassword(SDKPasswords.testSmbPassword()) .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusions) .setExclusions(exclusions) .setTitle(SmbTestParams.CONNECTOR_TITLE)); SmbResult result = fullyFetchShare(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE_URL, true, TIME1, true), tuple(ANOTHER_FILE_URL, true, TIME1, true), tuple(FILE3_URL, true, TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, TIME1, true), tuple(FOLDER_URL, true, TIME1, true)); SmbTestCommand createFile4 = commandFactory.get(SmbTestCommandType.CREATE_FILE, FILE4_URL, "file4 content"); createFile4.execute(); SmbTestCommand modifyFile3 = commandFactory.get(SmbTestCommandType.UPDATE_FILE, FILE3_URL, "new file 3 content"); modifyFile3.execute(); SmbTestCommand createFolder2 = commandFactory.get(SmbTestCommandType.CREATE_FOLDER, FOLDER2_URL, ""); createFolder2.execute(); SmbTestCommand createFile5 = commandFactory.get(SmbTestCommandType.CREATE_FILE, FILE5_URL, "file5 content"); createFile5.execute(); // * // * ----------------- Fetch phase 1 -------------- // * System.out.println("Fetch phase 1"); givenTimeIs(ONE_MINUTE_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE3_URL, true, TIME1, true), tuple(FILE_URL, true, TIME1, true), tuple(ANOTHER_FILE_URL, true, TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, TIME1, true), tuple(FOLDER_URL, true, TIME1, true)); // * // * ----------------- Fetch phase 2 -------------- // * System.out.println("Fetch phase 2"); givenTimeIs(ONE_MINUTE_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsSequence(tuple(ADD_EVENT, FILE4_URL), tuple(MODIFY_EVENT, FILE3_URL), tuple(MODIFY_EVENT, FILE_URL), tuple(MODIFY_EVENT, SHARE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE4_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(FILE3_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(FILE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(ANOTHER_FILE_URL, true, TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(FOLDER_URL, true, TIME1, true)); // * // * ----------------- Fetch phase 3 -------------- // * System.out.println("Fetch phase 3"); givenTimeIs(TWO_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsSequence(tuple(ADD_EVENT, FILE5_URL), tuple(ADD_EVENT, FOLDER2_URL), tuple(MODIFY_EVENT, ANOTHER_FILE_URL), tuple(MODIFY_EVENT, FOLDER_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FILE4_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(FILE3_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(FILE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(ANOTHER_FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(FILE5_URL, true, TWO_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(SHARE_URL, true, ONE_MINUTE_AFTER_TIME1, true), tuple(FOLDER_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(FOLDER2_URL, true, TWO_MINUTES_AFTER_TIME1, true)); // * // * ----------------- End of traversal -------------- // * System.out.println("End of traversal"); givenTimeIs(TWO_WEEKS_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); result = tickAndGetAllDocumentsAndFolders(); result = tickAndGetAllDocumentsAndFolders(); result = tickAndGetAllDocumentsAndFolders(); assertThat(getParentForDocument(result, FILE_URL)).isEqualTo(getId(result, SHARE_URL)); assertThat(getParentForDocument(result, FILE3_URL)).isEqualTo(getId(result, SHARE_URL)); assertThat(getParentForDocument(result, FILE4_URL)).isEqualTo(getId(result, SHARE_URL)); assertThat(getParentForFolder(result, FOLDER_URL)).isEqualTo(getId(result, SHARE_URL)); assertThat(getParentForFolder(result, FOLDER2_URL)).isEqualTo(getId(result, SHARE_URL)); assertThat(getParentForDocument(result, FILE5_URL)).isEqualTo(getId(result, FOLDER2_URL)); assertThat(getParentForDocument(result, ANOTHER_FILE_URL)).isEqualTo(getId(result, FOLDER_URL)); SmbTestCommand cleanShare = commandFactory.get(SmbTestCommandType.CLEAN_SHARE, SHARE_URL, ""); cleanShare.execute(); } private String getParentForDocument(SmbResult result, String url) { for (ConnectorSmbDocument document : result.getDocuments()) { if (StringUtils.equals(document.getUrl(), url)) { return document.getParent(); } } return "Parent not found for document"; } private String getParentForFolder(SmbResult result, String url) { for (ConnectorSmbFolder folder : result.getFolders()) { if (StringUtils.equals(folder.getUrl(), url)) { return folder.getParent(); } } return "Parent not found for folder"; } private String getId(SmbResult result, String url) { for (ConnectorSmbFolder folder : result.getFolders()) { if (StringUtils.equals(folder.getUrl(), url)) { return folder.getId(); } } return "Id not found"; } @Test @Ignore public void givenANewWantedTraversalOrderWhenTraversingThenUseNewTraversalOrder() { fail("To implement!"); } @Test public void givenTwoConnectorsThatRunAtTheSameTimeWhenRunningThenNoProblems() throws InterruptedException { String SHARE_URL_A = SDKPasswords.testSmbServer() + SDKPasswords.testSmbShareA(); String FILE_URL_A = SHARE_URL_A + SmbTestParams.EXISTING_FILE; String FOLDER_URL_A = SHARE_URL_A + SmbTestParams.EXISTING_FOLDER; String ANOTHER_FILE_A = FOLDER_URL_A + SmbTestParams.ANOTHER_FILE_NAME; SmbTestCommand populateMinimalShareA = commandFactory.get(SmbTestCommandType.POPULATE_MINIMAL_SHARE, SHARE_URL_A, ""); populateMinimalShareA.execute(); String SHARE_URL_B = SDKPasswords.testSmbServer() + SDKPasswords.testSmbShareB(); String FILE_URL_B = SHARE_URL_B + SmbTestParams.EXISTING_FILE; String FOLDER_URL_B = SHARE_URL_B + SmbTestParams.EXISTING_FOLDER; String ANOTHER_FILE_B = FOLDER_URL_B + SmbTestParams.ANOTHER_FILE_NAME; SmbTestCommand populateMinimalShareB = commandFactory.get(SmbTestCommandType.POPULATE_MINIMAL_SHARE, SHARE_URL_B, ""); populateMinimalShareB.execute(); List<String> seedsA = Arrays.asList(SHARE_URL_A); List<String> inclusionsA = seedsA; List<String> exclusionsA = new ArrayList<>(); ConnectorSmbInstance connectorInstanceA = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode("connectora") .setEnabled(true) .setSeeds(seedsA) .setUsername(SDKPasswords.testSmbUsername()) .setPassword(SDKPasswords.testSmbPassword()) .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusionsA) .setExclusions(exclusionsA) .setTitle("ConnectorA")); List<String> seedsB = Arrays.asList(SHARE_URL_B); List<String> inclusionsB = seedsB; List<String> exclusionsB = new ArrayList<>(); ConnectorSmbInstance connectorInstanceB = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode("connectorb") .setEnabled(true) .setSeeds(seedsB) .setUsername(SDKPasswords.testSmbUsername()) .setPassword(SDKPasswords.testSmbPassword()) .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusionsB) .setExclusions(exclusionsB) .setTitle("ConnectorB")); connectorManager.getCrawler() .crawlNTimes(10); List<ConnectorSmbDocument> documentsA = es .searchConnectorSmbDocuments(es.fromConnectorSmbDocumentWhereConnectorIs(connectorInstanceA)); assertThat(documentsA).extracting("url") .containsOnly(FILE_URL_A, ANOTHER_FILE_A); List<ConnectorSmbFolder> foldersA = es .searchConnectorSmbFolders(es.fromConnectorSmbFolderWhereConnectorIs(connectorInstanceA)); assertThat(foldersA).extracting("url") .containsOnly(SHARE_URL_A, FOLDER_URL_A); List<ConnectorSmbDocument> documentsB = es .searchConnectorSmbDocuments(es.fromConnectorSmbDocumentWhereConnectorIs(connectorInstanceB)); assertThat(documentsB).extracting("url") .containsOnly(FILE_URL_B, ANOTHER_FILE_B); List<ConnectorSmbFolder> foldersB = es .searchConnectorSmbFolders(es.fromConnectorSmbFolderWhereConnectorIs(connectorInstanceB)); assertThat(foldersB).extracting("url") .containsOnly(SHARE_URL_B, FOLDER_URL_B); SmbTestCommand cleanShareA = commandFactory.get(SmbTestCommandType.CLEAN_SHARE, SHARE_URL_A, ""); cleanShareA.execute(); SmbTestCommand cleanShareB = commandFactory.get(SmbTestCommandType.CLEAN_SHARE, SHARE_URL_B, ""); cleanShareB.execute(); } @Test public void whenResumingThenResumeFromResumeUrlAndConfirmThereAreNoUndueDeletes() throws RecordServicesException { SmbTestCommand populateMinimalShare = commandFactory.get(SmbTestCommandType.POPULATE_MINIMAL_SHARE, SHARE_URL, ""); populateMinimalShare.execute(); seeds = Arrays.asList(SHARE_URL); inclusions = seeds; exclusions = new ArrayList<>(); connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode(SmbTestParams.INSTANCE_CODE) .setEnabled(true) .setSeeds(seeds) .setUsername(SDKPasswords.testSmbUsername()) .setPassword(SDKPasswords.testSmbPassword()) .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusions) .setExclusions(exclusions) .setTitle(SmbTestParams.CONNECTOR_TITLE) .setResumeUrl(FOLDER_URL)); // * // * ----------------- Fetch phase 1 -------------- // * System.out.println("Fetch phase 1"); SmbResult result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetchAttempt", "searchable") .isEmpty(); // * // * ----------------- Fetch phase 2 -------------- // * System.out.println("Fetch phase 2"); givenTimeIs(ONE_MINUTE_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .isEmpty(); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .isEmpty(); // * // * ----------------- Fetch phase 3 -------------- // * System.out.println("Fetch phase 3"); givenTimeIs(TWO_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(ADD_EVENT, ANOTHER_FILE_URL), tuple(ADD_EVENT, FOLDER_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, TWO_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 4. End of traversal -------------- // * System.out.println("Fetch phase 4"); givenTimeIs(THREE_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, TWO_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 5 -------------- // * System.out.println("Fetch phase 5"); givenTimeIs(FOUR_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, TWO_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 6 -------------- // * System.out.println("Fetch phase 6"); givenTimeIs(FIVE_MINUTES_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(ADD_EVENT, SHARE_URL), tuple(ADD_EVENT, FILE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, TWO_MINUTES_AFTER_TIME1, true), tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 7 -------------- // * System.out.println("Fetch phase 7"); givenTimeIs(TWO_WEEKS_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(MODIFY_EVENT, FOLDER_URL), tuple(MODIFY_EVENT, ANOTHER_FILE_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 8. End of traversal -------------- // * System.out.println("Fetch phase 8"); givenTimeIs(FOUR_WEEKS_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 9. Stopping connector -------------- // * System.out.println("Fetch phase 9"); givenTimeIs(FIVE_WEEKS_AFTER_TIME1); recordServices.update(connectorInstance.setEnabled(false)); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 10. Starting connector with resume url -------------- // * System.out.println("Fetch phase 10"); givenTimeIs(SIX_WEEKS_AFTER_TIME1); connectorInstance = connectorInstance.setResumeUrl(FOLDER_URL); connectorInstance = connectorInstance.setEnabled(true); assertThat(connectorInstance.getResumeUrl()).isEqualTo(FOLDER_URL); es.getRecordServices() .update(connectorInstance); assertThat(connectorInstance.getResumeUrl()).isEqualTo(FOLDER_URL); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 11 -------------- // * System.out.println("Fetch phase 11"); givenTimeIs(SIX_WEEKS_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, TWO_WEEKS_AFTER_TIME1, true), tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 12 -------------- // * System.out.println("Fetch phase 12"); givenTimeIs(SEVEN_WEEKS_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .containsOnly(tuple(MODIFY_EVENT, ANOTHER_FILE_URL), tuple(MODIFY_EVENT, FOLDER_URL)); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, SEVEN_WEEKS_AFTER_TIME1, true), tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, SEVEN_WEEKS_AFTER_TIME1, true), tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); // * // * ----------------- Fetch phase 13. End of traversal -------------- // * System.out.println("Fetch phase 13"); givenTimeIs(EIGHT_WEEKS_AFTER_TIME1); result = tickAndGetAllDocumentsAndFolders(); assertThat(eventObserver.newEvents()).extracting("eventType", "url") .isEmpty(); assertThat(result.getDocuments()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(ANOTHER_FILE_URL, true, SEVEN_WEEKS_AFTER_TIME1, true), tuple(FILE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); assertThat(result.getFolders()).extracting("url", "fetched", "lastFetched", "searchable") .containsOnly(tuple(FOLDER_URL, true, SEVEN_WEEKS_AFTER_TIME1, true), tuple(SHARE_URL, true, FIVE_MINUTES_AFTER_TIME1, true)); } @Test public void whenUpdatingConnectorInstanceMetadataThenMetadataDoesNotVanish() throws RecordServicesException { SmbTestCommand populateMinimalShare = commandFactory.get(SmbTestCommandType.POPULATE_MINIMAL_SHARE, SHARE_URL, ""); populateMinimalShare.execute(); seeds = Arrays.asList(SHARE_URL); inclusions = seeds; exclusions = new ArrayList<>(); connectorInstance = connectorManager.createConnector(es.newConnectorSmbInstance() .setCode(SmbTestParams.INSTANCE_CODE) .setEnabled(true) .setSeeds(seeds) .setUsername(SDKPasswords.testSmbUsername()) .setPassword(SDKPasswords.testSmbPassword()) .setDomain(SDKPasswords.testSmbDomain()) .setInclusions(inclusions) .setExclusions(exclusions) .setTitle(SmbTestParams.CONNECTOR_TITLE) .setResumeUrl(FOLDER_URL)); // * // * ----------------- Fetch phase 8. End of traversal -------------- // * System.out.println("Fetch phase 8"); givenTimeIs(FOUR_WEEKS_AFTER_TIME1); tickAndGetAllDocumentsAndFolders(); // * // * ----------------- Fetch phase 9. Stopping connector -------------- // * System.out.println("Fetch phase 9"); givenTimeIs(FIVE_WEEKS_AFTER_TIME1); recordServices.update(connectorInstance.setEnabled(false)); tickAndGetAllDocumentsAndFolders(); // * // * ----------------- Fetch phase 10. Starting connector with resume url -------------- // * System.out.println("Fetch phase 10"); givenTimeIs(SIX_WEEKS_AFTER_TIME1); connectorInstance = connectorInstance.setResumeUrl(FOLDER_URL); connectorInstance = connectorInstance.setEnabled(true); assertThat(connectorInstance.getResumeUrl()).isEqualTo(FOLDER_URL); es.getRecordServices() .update(connectorInstance); assertThat(connectorInstance.getResumeUrl()).isEqualTo(FOLDER_URL); } private SmbResult fullyFetchShare() { SmbResult results = new SmbResult(new ArrayList<ConnectorSmbDocument>(), new ArrayList<ConnectorSmbFolder>()); // Dispatch job does not create event yet results = tickAndGetAllDocumentsAndFolders(); boolean newEvents = true; while (newEvents) { results = tickAndGetAllDocumentsAndFolders(); newEvents = !eventObserver.newEvents() .isEmpty(); } return results; } private SmbResult tickAndGetAllDocumentsAndFolders() { connectorManager.getCrawler() .crawlNTimes(1); return new SmbResult(connectorDocuments(), connectorFolders()); } private List<ConnectorSmbDocument> connectorDocuments() { return es.searchConnectorSmbDocuments(where(IDENTIFIER).isNotNull()); } private List<ConnectorSmbFolder> connectorFolders() { return es.searchConnectorSmbFolders(where(IDENTIFIER).isNotNull()); } private class SmbResult { List<ConnectorSmbDocument> documents; List<ConnectorSmbFolder> folders; public SmbResult(List<ConnectorSmbDocument> documents, List<ConnectorSmbFolder> folders) { this.documents = documents; this.folders = folders; } public List<ConnectorSmbDocument> getDocuments() { return documents; } public List<ConnectorSmbFolder> getFolders() { return folders; } } }