/* * Copyright 2015 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.ide.eclipse.main.plugin.project; import static com.google.common.collect.Lists.newArrayList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.swt.widgets.Display; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.rf.ide.core.fileWatcher.IWatchEventHandler; import org.rf.ide.core.project.RobotProjectConfig; import org.rf.ide.core.project.RobotProjectConfig.LibraryType; import org.rf.ide.core.project.RobotProjectConfig.ReferencedLibrary; import org.robotframework.ide.eclipse.main.plugin.model.RobotProject; import org.robotframework.ide.eclipse.main.plugin.project.library.KeywordSpecification; import org.robotframework.ide.eclipse.main.plugin.project.library.LibrarySpecification; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimap; public class LibrariesWatchHandlerTest { @ClassRule public static TemporaryFolder testFolder = new TemporaryFolder(); private static final String PYTHON_LIBRARY_NAME = "libTest"; private static final String PYTHON_LIBRARY_FILE_NAME = "libTest.py"; private static final String PYTHON_MODULE_LIBRARY_NAME = "moduleLib"; private static final String PYTHON_MODULE_LIBRARY_INIT_FILE_NAME = "__init__.py"; private static final String PYTHON_MODULE_LIBRARY_FILE_NAME = "moduleClass.py"; private static final String JAVA_LIBRARY_NAME = "jlibTest"; private static final String JAVA_LIBRARY_FILE_NAME = "jlibTest.java"; private static File pythonLibraryFile = null; private static File pythonModuleLibraryFolder = null; private static File pythonModuleLibraryInitFile = null; private static File pythonModuleLibraryFile = null; private static File javaLibraryFile = null; @BeforeClass public static void setUp() throws IOException { pythonLibraryFile = testFolder.newFile(PYTHON_LIBRARY_FILE_NAME); pythonModuleLibraryFolder = testFolder.newFolder(PYTHON_MODULE_LIBRARY_NAME); pythonModuleLibraryInitFile = testFolder .newFile(PYTHON_MODULE_LIBRARY_NAME + File.separator + PYTHON_MODULE_LIBRARY_INIT_FILE_NAME); pythonModuleLibraryFile = testFolder .newFile(PYTHON_MODULE_LIBRARY_NAME + File.separator + PYTHON_MODULE_LIBRARY_FILE_NAME); testFolder.newFile(PYTHON_MODULE_LIBRARY_NAME + File.separator + "someFileInModule.txt"); javaLibraryFile = testFolder.newFile(JAVA_LIBRARY_FILE_NAME); } @Test public void testRegisterPythonLibrary_whenLibraryPathIsNotDirectory() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); final ReferencedLibrary referencedLibrary = createNewReferencedLibrary(PYTHON_LIBRARY_NAME, pythonLibraryFile.getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); final Map<String, String> registeredPaths = librariesWatchHandler.getRegisteredPaths(); assertFalse(registeredPaths.isEmpty()); assertEquals(pythonLibraryFile.getParentFile().getPath(), registeredPaths.get(PYTHON_LIBRARY_FILE_NAME)); assertEquals(new Path(pythonLibraryFile.getPath()).toPortableString(), librariesWatchHandler.getRegisteredRefLibraries().get(referencedLibrary)); assertEquals(newArrayList(pythonLibraryFile.getName()), librariesWatchHandler.getLibrarySpecifications().get(libSpec)); } @Test public void testRegisterPythonLibrary_whenLibraryPathIsDirectory() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); final ReferencedLibrary referencedLibrary = createNewReferencedLibrary(PYTHON_LIBRARY_NAME, pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); final Map<String, String> registeredPaths = librariesWatchHandler.getRegisteredPaths(); assertFalse(registeredPaths.isEmpty()); assertEquals(pythonLibraryFile.getParentFile().getPath(), registeredPaths.get(PYTHON_LIBRARY_FILE_NAME)); assertEquals(new Path(pythonLibraryFile.getPath()).toPortableString(), librariesWatchHandler.getRegisteredRefLibraries().get(referencedLibrary)); assertEquals(newArrayList(pythonLibraryFile.getName()), librariesWatchHandler.getLibrarySpecifications().get(libSpec)); } @Test public void testRegisterPythonLibrary_whenMultipleClassesFromLibraryAreUsed() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); final ReferencedLibrary referencedLibrary1 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME, pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec1 = createNewLibSpec(referencedLibrary1); final ReferencedLibrary referencedLibrary2 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass1", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec2 = createNewLibSpec(referencedLibrary2); final ReferencedLibrary referencedLibrary3 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass2", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec3 = createNewLibSpec(referencedLibrary3); librariesWatchHandler.registerLibrary(referencedLibrary1, libSpec1); librariesWatchHandler.registerLibrary(referencedLibrary2, libSpec2); librariesWatchHandler.registerLibrary(referencedLibrary3, libSpec3); final Map<String, String> registeredPaths = librariesWatchHandler.getRegisteredPaths(); assertFalse(registeredPaths.isEmpty()); assertEquals(pythonLibraryFile.getParentFile().getPath(), registeredPaths.get(PYTHON_LIBRARY_FILE_NAME)); assertEquals(new Path(pythonLibraryFile.getPath()).toPortableString(), librariesWatchHandler.getRegisteredRefLibraries().get(referencedLibrary1)); assertEquals(new Path(pythonLibraryFile.getPath()).toPortableString(), librariesWatchHandler.getRegisteredRefLibraries().get(referencedLibrary2)); assertEquals(new Path(pythonLibraryFile.getPath()).toPortableString(), librariesWatchHandler.getRegisteredRefLibraries().get(referencedLibrary3)); assertEquals(newArrayList(pythonLibraryFile.getName()), librariesWatchHandler.getLibrarySpecifications().get(libSpec1)); assertEquals(newArrayList(pythonLibraryFile.getName()), librariesWatchHandler.getLibrarySpecifications().get(libSpec2)); assertEquals(newArrayList(pythonLibraryFile.getName()), librariesWatchHandler.getLibrarySpecifications().get(libSpec3)); } @Test public void testRegisterPythonLibrary_whenLibraryIsModule() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); final ReferencedLibrary referencedLibrary = createNewReferencedLibrary(PYTHON_MODULE_LIBRARY_NAME, pythonModuleLibraryFolder.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); final Map<String, String> registeredPaths = librariesWatchHandler.getRegisteredPaths(); assertTrue(registeredPaths.size() == 2); assertEquals(pythonModuleLibraryFolder.getPath(), registeredPaths.get(PYTHON_MODULE_LIBRARY_INIT_FILE_NAME)); assertEquals(pythonModuleLibraryFolder.getPath(), registeredPaths.get(PYTHON_MODULE_LIBRARY_FILE_NAME)); assertEquals(new Path(pythonModuleLibraryInitFile.getPath()).toPortableString(), librariesWatchHandler.getRegisteredRefLibraries().get(referencedLibrary)); final List<String> moduleFilesNames = librariesWatchHandler.getLibrarySpecifications().get(libSpec); assertTrue(moduleFilesNames.size() == 2); assertTrue(moduleFilesNames.contains(pythonModuleLibraryFile.getName())); assertTrue(moduleFilesNames.contains(pythonModuleLibraryInitFile.getName())); } @Test public void testRegisterJavaLibrary() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); final ReferencedLibrary referencedLibrary = createNewReferencedLibrary(JAVA_LIBRARY_NAME, javaLibraryFile.getParentFile().getPath(), LibraryType.JAVA); final LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); final Map<String, String> registeredPaths = librariesWatchHandler.getRegisteredPaths(); assertFalse(registeredPaths.isEmpty()); assertEquals(javaLibraryFile.getParentFile().getPath(), registeredPaths.get(JAVA_LIBRARY_FILE_NAME)); assertEquals(new Path(javaLibraryFile.getPath()).toPortableString(), librariesWatchHandler.getRegisteredRefLibraries().get(referencedLibrary)); assertEquals(newArrayList(javaLibraryFile.getName()), librariesWatchHandler.getLibrarySpecifications().get(libSpec)); } @Test public void testRegisterVirtualLibrary() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); final ReferencedLibrary referencedLibrary = createNewReferencedLibrary("virtualLibTest", "", LibraryType.VIRTUAL); librariesWatchHandler.registerLibrary(referencedLibrary, new LibrarySpecification()); assertTrue(librariesWatchHandler.getRegisteredPaths().isEmpty()); assertTrue(librariesWatchHandler.getRegisteredRefLibraries().isEmpty()); assertTrue(librariesWatchHandler.getLibrarySpecifications().isEmpty()); } @Test public void testRegisterNonExistenceLibrary() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); final ReferencedLibrary referencedLibrary = createNewReferencedLibrary("libTest", pythonModuleLibraryFolder.getPath() + "/libTest.py", LibraryType.PYTHON); librariesWatchHandler.registerLibrary(referencedLibrary, new LibrarySpecification()); assertTrue(librariesWatchHandler.getRegisteredPaths().isEmpty()); assertTrue(librariesWatchHandler.getRegisteredRefLibraries().isEmpty()); assertTrue(librariesWatchHandler.getLibrarySpecifications().isEmpty()); } @Test public void testRegisterPythonLibrary_whenTheSameLibSpecWithDifferentKeywordsIsRegistered() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); ReferencedLibrary referencedLibrary = createNewReferencedLibrary(PYTHON_LIBRARY_NAME, pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); referencedLibrary = createNewReferencedLibrary(PYTHON_LIBRARY_NAME, pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); libSpec = createNewLibSpec(referencedLibrary); final KeywordSpecification kwSpec = createNewKeywordSpec("someNewKeyword", newArrayList("arg")); libSpec.setKeywords(newArrayList(kwSpec)); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); final Map<String, String> registeredPaths = librariesWatchHandler.getRegisteredPaths(); assertFalse(registeredPaths.isEmpty()); assertEquals(pythonLibraryFile.getParentFile().getPath(), registeredPaths.get(PYTHON_LIBRARY_FILE_NAME)); final Map<ReferencedLibrary, String> registeredRefLibraries = librariesWatchHandler.getRegisteredRefLibraries(); assertTrue(registeredRefLibraries.size() == 1); assertEquals(new Path(pythonLibraryFile.getPath()).toPortableString(), registeredRefLibraries.get(referencedLibrary)); final ListMultimap<LibrarySpecification, String> librarySpecifications = librariesWatchHandler .getLibrarySpecifications(); assertTrue(librarySpecifications.size() == 1); assertEquals(newArrayList(pythonLibraryFile.getName()), librarySpecifications.get(libSpec)); assertEquals(kwSpec, librarySpecifications.keySet().iterator().next().getKeywords().get(0)); } @Test public void testUnregisterLibraries() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); final ReferencedLibrary referencedLibrary1 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass1", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec1 = createNewLibSpec(referencedLibrary1); librariesWatchHandler.registerLibrary(referencedLibrary1, libSpec1); final ReferencedLibrary referencedLibrary2 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass2", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec2 = createNewLibSpec(referencedLibrary2); librariesWatchHandler.registerLibrary(referencedLibrary2, libSpec2); librariesWatchHandler.unregisterLibraries(newArrayList(referencedLibrary1, referencedLibrary2)); final List<String> unregisteredFiles = librariesWatchHandler.getUnregisteredFiles(); assertTrue(unregisteredFiles.size() == 2); assertEquals(pythonLibraryFile.getName(), unregisteredFiles.get(0)); assertEquals(pythonLibraryFile.getName(), unregisteredFiles.get(1)); assertTrue(librariesWatchHandler.getRegisteredRefLibraries().isEmpty()); assertTrue(librariesWatchHandler.getLibrarySpecifications().isEmpty()); } @Test public void testUnregisterModuleLibrary() { final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(null); final ReferencedLibrary referencedLibrary = createNewReferencedLibrary(PYTHON_MODULE_LIBRARY_NAME, pythonModuleLibraryFolder.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); librariesWatchHandler.unregisterLibraries(newArrayList(referencedLibrary)); final List<String> unregisteredFiles = librariesWatchHandler.getUnregisteredFiles(); assertTrue(unregisteredFiles.size() == 2); assertTrue(unregisteredFiles.contains(pythonModuleLibraryFile.getName())); assertTrue(unregisteredFiles.contains(pythonModuleLibraryInitFile.getName())); assertTrue(librariesWatchHandler.getRegisteredRefLibraries().isEmpty()); assertTrue(librariesWatchHandler.getLibrarySpecifications().isEmpty()); } @Test public void testHandleModifyEvent_whenAutoReloadIsEnabled() { final IProject project = createNewProjectMock(true); final RobotProject robotProject = createNewRobotProjectMock(project, true); final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(robotProject); final ReferencedLibrary referencedLibrary1 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass1", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec1 = createNewLibSpec(referencedLibrary1); librariesWatchHandler.registerLibrary(referencedLibrary1, libSpec1); final ReferencedLibrary referencedLibrary2 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass2", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec2 = createNewLibSpec(referencedLibrary2); librariesWatchHandler.registerLibrary(referencedLibrary2, libSpec2); librariesWatchHandler.setRebuildTasksQueueSizeBeforeBuilderInvoke(1); librariesWatchHandler.handleModifyEvent(PYTHON_LIBRARY_FILE_NAME); librariesWatchHandler.execAllAwaitingMessages(); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().size() == 2); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().get(project).contains(libSpec1)); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().get(project).contains(libSpec2)); assertTrue(librariesWatchHandler.getRebuildTasksQueueSize() == 0); } @Test public void testHandleModifyEvent_whenAutoReloadIsEnabledAndLibraryIsModule() { final IProject project = createNewProjectMock(true); final RobotProject robotProject = createNewRobotProjectMock(project, true); final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(robotProject); final ReferencedLibrary referencedLibrary = createNewReferencedLibrary(PYTHON_MODULE_LIBRARY_NAME, pythonModuleLibraryFolder.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); librariesWatchHandler.setRebuildTasksQueueSizeBeforeBuilderInvoke(1); librariesWatchHandler.handleModifyEvent(PYTHON_MODULE_LIBRARY_INIT_FILE_NAME); librariesWatchHandler.execAllAwaitingMessages(); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().size() == 1); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().get(project).contains(libSpec)); assertTrue(librariesWatchHandler.getRebuildTasksQueueSizeAfterEachBuilderInvoke().equals(newArrayList(1))); assertTrue(librariesWatchHandler.getRebuildTasksQueueSize() == 0); librariesWatchHandler.getSpecificationsToRebuild().clear(); librariesWatchHandler.handleModifyEvent(PYTHON_MODULE_LIBRARY_FILE_NAME); librariesWatchHandler.execAllAwaitingMessages(); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().size() == 1); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().get(project).contains(libSpec)); assertTrue(librariesWatchHandler.getRebuildTasksQueueSizeAfterEachBuilderInvoke().equals(newArrayList(1, 1))); assertTrue(librariesWatchHandler.getRebuildTasksQueueSize() == 0); } @Test public void testHandleModifyEvent_whenAutoReloadIsEnabledAndDuplicatedTasksAreRemoved() { final IProject project = createNewProjectMock(true); final RobotProject robotProject = createNewRobotProjectMock(project, true); final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(robotProject); final ReferencedLibrary referencedLibrary1 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME, pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec1 = createNewLibSpec(referencedLibrary1); librariesWatchHandler.registerLibrary(referencedLibrary1, libSpec1); final ReferencedLibrary referencedLibrary2 = createNewReferencedLibrary(PYTHON_MODULE_LIBRARY_NAME, pythonModuleLibraryFolder.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec2 = createNewLibSpec(referencedLibrary2); librariesWatchHandler.registerLibrary(referencedLibrary2, libSpec2); librariesWatchHandler.setRebuildTasksQueueSizeBeforeBuilderInvoke(8); librariesWatchHandler.handleModifyEvent(PYTHON_MODULE_LIBRARY_FILE_NAME); for (int i = 1; i <= 7; i++) { librariesWatchHandler.handleModifyEvent(PYTHON_LIBRARY_FILE_NAME); } librariesWatchHandler.execAllAwaitingMessages(); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().size() == 2); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().get(project).contains(libSpec1)); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().get(project).contains(libSpec2)); assertTrue(librariesWatchHandler.getRebuildTasksQueueSizeAfterEachBuilderInvoke().equals(newArrayList(8, 1))); assertTrue(librariesWatchHandler.getRebuildTasksQueueSize() == 0); } @Test public void testHandleModifyEvent_whenAutoReloadIsDisabled() { final ReferencedLibrary referencedLibrary1 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass1", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec1 = createNewLibSpec(referencedLibrary1); final ReferencedLibrary referencedLibrary2 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass2", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec2 = createNewLibSpec(referencedLibrary2); final Map<ReferencedLibrary, LibrarySpecification> refLibs = new HashMap<>(); refLibs.put(referencedLibrary1, libSpec1); refLibs.put(referencedLibrary2, libSpec2); final IProject project = createNewProjectMock(true); final RobotProject robotProject = createNewRobotProjectMock(project, false, refLibs); final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(robotProject); librariesWatchHandler.registerLibrary(referencedLibrary1, libSpec1); librariesWatchHandler.registerLibrary(referencedLibrary2, libSpec2); librariesWatchHandler.handleModifyEvent(PYTHON_LIBRARY_FILE_NAME); librariesWatchHandler.execAllAwaitingMessages(); assertTrue(librariesWatchHandler.isLibSpecDirty(libSpec1)); assertTrue(librariesWatchHandler.isLibSpecDirty(libSpec2)); assertTrue(libSpec1.isModified()); assertTrue(libSpec2.isModified()); } @Test public void testHandleModifyEvent_whenAutoReloadIsDisabledAndDuplicatedEventsAreHandled() { final ReferencedLibrary referencedLibrary1 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass1", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec1 = createNewLibSpec(referencedLibrary1); final ReferencedLibrary referencedLibrary2 = createNewReferencedLibrary(PYTHON_LIBRARY_NAME + ".PythonClass2", pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec2 = createNewLibSpec(referencedLibrary2); final Map<ReferencedLibrary, LibrarySpecification> refLibs = new HashMap<>(); refLibs.put(referencedLibrary1, libSpec1); refLibs.put(referencedLibrary2, libSpec2); final IProject project = createNewProjectMock(true); final RobotProject robotProject = createNewRobotProjectMock(project, false, refLibs); final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(robotProject); librariesWatchHandler.registerLibrary(referencedLibrary1, libSpec1); librariesWatchHandler.registerLibrary(referencedLibrary2, libSpec2); for (int i = 1; i <= 5; i++) { librariesWatchHandler.handleModifyEvent(PYTHON_LIBRARY_FILE_NAME); } librariesWatchHandler.execAllAwaitingMessages(); assertTrue(librariesWatchHandler.isLibSpecDirty(libSpec1)); assertTrue(librariesWatchHandler.isLibSpecDirty(libSpec2)); assertTrue(libSpec1.isModified()); assertTrue(libSpec2.isModified()); verify(robotProject, times(1)).getReferencedLibraries(); } @Test public void testHandleModifyEvent_whenAutoReloadIsDisabledAndLibraryIsModule() { final ReferencedLibrary referencedLibrary = createNewReferencedLibrary(PYTHON_MODULE_LIBRARY_NAME, pythonModuleLibraryFolder.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); final Map<ReferencedLibrary, LibrarySpecification> refLibs = new HashMap<>(); refLibs.put(referencedLibrary, libSpec); final IProject project = createNewProjectMock(true); final RobotProject robotProject = createNewRobotProjectMock(project, false, refLibs); final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(robotProject); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); librariesWatchHandler.handleModifyEvent(PYTHON_MODULE_LIBRARY_INIT_FILE_NAME); librariesWatchHandler.handleModifyEvent(PYTHON_MODULE_LIBRARY_FILE_NAME); librariesWatchHandler.execAllAwaitingMessages(); assertTrue(librariesWatchHandler.isLibSpecDirty(libSpec)); assertTrue(libSpec.isModified()); verify(robotProject, times(1)).getReferencedLibraries(); } @Test public void testRemoveDirtySpecs() { final ReferencedLibrary referencedLibrary = createNewReferencedLibrary(PYTHON_MODULE_LIBRARY_NAME, pythonModuleLibraryFolder.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); final Map<ReferencedLibrary, LibrarySpecification> refLibs = new HashMap<>(); refLibs.put(referencedLibrary, libSpec); final IProject project = createNewProjectMock(true); final RobotProject robotProject = createNewRobotProjectMock(project, false, refLibs); final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(robotProject); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); librariesWatchHandler.handleModifyEvent(PYTHON_MODULE_LIBRARY_INIT_FILE_NAME); librariesWatchHandler.execAllAwaitingMessages(); assertTrue(librariesWatchHandler.isLibSpecDirty(libSpec)); assertTrue(libSpec.isModified()); librariesWatchHandler.removeDirtySpecs(refLibs.values()); assertFalse(librariesWatchHandler.isLibSpecDirty(libSpec)); } @Test public void testHandleModifyEvent_whenProjectNotExists() { final IProject project = createNewProjectMock(false); final RobotProject robotProject = createNewRobotProjectMock(project, true); final DummyLibrariesWatchHandler librariesWatchHandler = new DummyLibrariesWatchHandler(robotProject); final ReferencedLibrary referencedLibrary = createNewReferencedLibrary(PYTHON_LIBRARY_NAME, pythonLibraryFile.getParentFile().getPath(), LibraryType.PYTHON); final LibrarySpecification libSpec = createNewLibSpec(referencedLibrary); librariesWatchHandler.registerLibrary(referencedLibrary, libSpec); librariesWatchHandler.handleModifyEvent(PYTHON_LIBRARY_FILE_NAME); assertTrue(librariesWatchHandler.getSpecificationsToRebuild().isEmpty()); assertTrue(librariesWatchHandler.getLibrarySpecifications().isEmpty()); assertTrue(librariesWatchHandler.getRegisteredRefLibraries().isEmpty()); } private IProject createNewProjectMock(final boolean projectExists) { final IProject project = mock(IProject.class); when(project.exists()).thenReturn(projectExists); return project; } private RobotProject createNewRobotProjectMock(final IProject project, final boolean isAutoReloadEnabled, final Map<ReferencedLibrary, LibrarySpecification> referencedLibraries) { final RobotProject robotProject = createNewRobotProjectMock(project, isAutoReloadEnabled); when(robotProject.getReferencedLibraries()).thenReturn(referencedLibraries); return robotProject; } private RobotProject createNewRobotProjectMock(final IProject project, final boolean isAutoReloadEnabled) { final RobotProject robotProject = mock(RobotProject.class); when(robotProject.getProject()).thenReturn(project); final RobotProjectConfig projectConfig = mock(RobotProjectConfig.class); when(projectConfig.isReferencedLibrariesAutoReloadEnabled()).thenReturn(isAutoReloadEnabled); when(robotProject.getRobotProjectConfig()).thenReturn(projectConfig); return robotProject; } private ReferencedLibrary createNewReferencedLibrary(final String name, final String path, final LibraryType type) { return ReferencedLibrary.create(type, name, path); } private LibrarySpecification createNewLibSpec(final ReferencedLibrary referencedLibrary) { return createNewLibSpec(referencedLibrary.getName(), referencedLibrary); } private LibrarySpecification createNewLibSpec(final String name, final ReferencedLibrary referencedLibrary) { final LibrarySpecification libSpec = new LibrarySpecification(); libSpec.setName(name); libSpec.setSecondaryKey(""); final KeywordSpecification keywordSpec = createNewKeywordSpec("keyword1", newArrayList("arg1")); libSpec.setKeywords(newArrayList(keywordSpec)); libSpec.setReferenced(referencedLibrary); libSpec.setRemoteLocation(null); libSpec.setIsModified(false); return libSpec; } private KeywordSpecification createNewKeywordSpec(final String name, final List<String> args) { final KeywordSpecification keywordSpec = new KeywordSpecification(); keywordSpec.setName(name); keywordSpec.setArguments(args); return keywordSpec; } static class DummyLibrariesWatchHandler extends LibrariesWatchHandler { private final Map<String, String> registeredPaths = new HashMap<>(); private final List<String> unregisteredFiles = newArrayList(); private final Multimap<IProject, LibrarySpecification> specificationsToRebuild = LinkedHashMultimap.create(); private final List<Integer> rebuildTasksQueueSizeAfterEachBuilderInvoke = newArrayList(); private int rebuildTasksQueueSizeBeforeBuilderInvoke = 0; public DummyLibrariesWatchHandler(final RobotProject robotProject) { super(robotProject); } @Override public void registerPath(final java.nio.file.Path dir, final String fileName, final IWatchEventHandler handler) { registeredPaths.put(fileName, dir.toString()); } @Override public void unregisterFile(final String fileName, final IWatchEventHandler handler) { unregisteredFiles.add(fileName); } @Override protected void invokeLibrariesBuilder(final IProgressMonitor monitor, final Multimap<IProject, LibrarySpecification> groupedSpecifications) { int sleepCounter = 0; while (sleepCounter < 20 && getRebuildTasksQueueSize() < rebuildTasksQueueSizeBeforeBuilderInvoke && specificationsToRebuild.isEmpty()) { sleep(100); sleepCounter++; } specificationsToRebuild.putAll(groupedSpecifications); rebuildTasksQueueSizeAfterEachBuilderInvoke.add(getRebuildTasksQueueSize()); } public Map<String, String> getRegisteredPaths() { return registeredPaths; } public List<String> getUnregisteredFiles() { return unregisteredFiles; } public Multimap<IProject, LibrarySpecification> getSpecificationsToRebuild() { return specificationsToRebuild; } public void execAllAwaitingMessages() { while (Display.getDefault().readAndDispatch()) { // nothing to do } } private void sleep(final long millis) { try { Thread.sleep(millis); } catch (final InterruptedException e) { throw new IllegalStateException("Shouldn't be interrupted!", e); } } public void setRebuildTasksQueueSizeBeforeBuilderInvoke(final int rebuildTasksQueueSizeBeforeBuilderInvoke) { this.rebuildTasksQueueSizeBeforeBuilderInvoke = rebuildTasksQueueSizeBeforeBuilderInvoke; } public List<Integer> getRebuildTasksQueueSizeAfterEachBuilderInvoke() { return rebuildTasksQueueSizeAfterEachBuilderInvoke; } } }