package husaccttest.analyse; import husacct.ServiceProvider; import husacct.analyse.IAnalyseService; import husacct.common.dto.AnalysisStatisticsDTO; import husacct.common.dto.DependencyDTO; import husacct.common.dto.UmlLinkDTO; import husacct.control.ControlServiceImpl; import husacct.control.task.MainController; import husacct.control.task.WorkspaceController; import husaccttest.TestResourceFinder; import java.io.File; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.TreeMap; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class ExportImportAnalysedModelTest { private static String workspacePath; private static ControlServiceImpl controlService; private static MainController mainController; private static WorkspaceController workspaceController; private final static String workspace = "AccuracyTest-Java-2013-06-11.xml"; private static Logger logger; private static IAnalyseService analyseService = null; private static final String exportFileName = "ExportFileAnalysedModel.xml"; private static String exportFilePath; private static File exportFile; private static AnalysisStatisticsDTO analyseStatisticsBeforeExport; private static AnalysisStatisticsDTO analyseStatisticsAfterImport; @BeforeClass public static void beforeClass() { try { setLog4jConfiguration(); logger.info(String.format(" Start: Analyse - ExportImport AnalysedModel Test")); workspacePath = TestResourceFinder.findHusacctWorkspace("java", workspace); controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService(); mainController = controlService.getMainController(); workspaceController = mainController.getWorkspaceController(); loadWorkspace(workspacePath); analyseApplication(); //analyseApplication() starts a different Thread, and needs some time boolean isAnalysing = true; controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService(); mainController = controlService.getMainController(); while(isAnalysing){ try { Thread.sleep(10); } catch (InterruptedException e) {} isAnalysing = mainController.getStateController().isAnalysing(); } analyseStatisticsBeforeExport = getAnalyseStatistics(); exportFilePath = TestResourceFinder.findHusacctExportFile("java", exportFileName); exportFile = new File(exportFilePath); exportAnalysisModel(); controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService(); mainController = controlService.getMainController(); workspaceController = mainController.getWorkspaceController(); workspaceController.closeWorkspace(); loadWorkspace(workspacePath); getAnalyseStatistics(); //Needed to show statistics data in console importAnalysisModel(); analyseStatisticsAfterImport = getAnalyseStatistics(); } catch (Exception e){ String errorMessage = "Exception: " + e.getMessage(); logger.warn(errorMessage); } } @AfterClass public static void tearDown(){ try { workspaceController.closeWorkspace(); exportFile.delete(); logger.info(String.format(" Finished: Analyse - ExportImport AnalysedModel Test")); } catch (Exception e){ String errorMessage = "Exception: " + e.getMessage(); logger.warn(errorMessage); } } // TESTS @Test public void ImportPackages(){ Assert.assertTrue(analyseStatisticsAfterImport.totalNrOfPackages == analyseStatisticsBeforeExport.totalNrOfPackages); } @Test public void ImportClasses(){ Assert.assertTrue(analyseStatisticsAfterImport.totalNrOfClasses == analyseStatisticsBeforeExport.totalNrOfClasses); } @Test public void ImportDependencies(){ Assert.assertTrue(analyseStatisticsAfterImport.totalNrOfDependencies == analyseStatisticsBeforeExport.totalNrOfDependencies); } @Test public void ImportLinesOfCode(){ Assert.assertTrue(analyseStatisticsAfterImport.totalNrOfLinesOfCode == analyseStatisticsBeforeExport.totalNrOfLinesOfCode); } @Test public void ImportUmlLinks(){ Assert.assertTrue(analyseStatisticsAfterImport.totalNrOfUmlLinks == analyseStatisticsBeforeExport.totalNrOfUmlLinks); } // Tests Dependency Detection after Import @Test public void AccessClassVariableConstant(){ String fromClass = "domain.direct.violating.AccessClassVariableConstant"; String toClass = "technology.direct.dao.UserDAO"; ArrayList<String> typesToFind = new ArrayList<String>(); typesToFind.add("Access"); Assert.assertTrue(areDependencyTypesDetected(fromClass, toClass, typesToFind, "Class Variable Constant", false)); } @Test public void AccessObjectReferenceAsParameter(){ String fromClass = "domain.direct.violating.AccessObjectReferenceAsParameter"; String toClass = "technology.direct.dao.ProfileDAO"; ArrayList<String> typesToFind = new ArrayList<String>(); typesToFind.add("Reference"); Assert.assertTrue(areDependencyTypesDetected(fromClass, toClass, typesToFind, "Type of Variable", false)); } @Test public void AnnotationDependency(){ String fromClass = "domain.direct.violating.AnnotationDependency"; String toClass = "technology.direct.dao.SettingsAnnotation"; ArrayList<String> typesToFind = new ArrayList<String>(); typesToFind.add("Annotation"); Assert.assertTrue(areDependencyTypesDetected(fromClass, toClass, typesToFind, "", false)); } @Test public void CallInstanceInnerInterface(){ String fromClass = "domain.direct.violating.CallInstanceInnerInterface"; String toClass = "technology.direct.dao.CallInstanceOuterClassDAO.CallInstanceInnerInterfaceDAO"; ArrayList<String> typesToFind = new ArrayList<String>(); typesToFind.add("Call"); Assert.assertTrue(areDependencyTypesDetected(fromClass, toClass, typesToFind, "Interface Method", false)); } @Test public void DeclarationOuterClassByStaticNestedClass(){ String fromClass = "technology.direct.dao.CallInstanceOuterClassDAO.StaticNestedClass"; String toClass = "technology.direct.dao.CallInstanceOuterClassDAO"; ArrayList<String> typesToFind = new ArrayList<String>(); typesToFind.add("Declaration"); Assert.assertTrue(areDependencyTypesDetected(fromClass, toClass, typesToFind, "Instance Variable", false)); } @Test public void ImportDependencyStatic(){ String fromClass = "domain.direct.violating.ImportDependencyStatic"; String toClass = "technology.direct.dao.AccountDAO"; ArrayList<String> typesToFind = new ArrayList<String>(); typesToFind.add("Import"); Assert.assertTrue(areDependencyTypesDetected(fromClass, toClass, typesToFind, false)); } @Test public void InheritanceExtends(){ String fromClass = "domain.direct.violating.InheritanceExtends"; String toClass = "technology.direct.dao.HistoryDAO"; ArrayList<String> typesToFind = new ArrayList<String>(); typesToFind.add("Inheritance"); Assert.assertTrue(areDependencyTypesDetected(fromClass, toClass, typesToFind, "Extends Class", false)); } // UmlLinkTypes: Positive @Test public void UmlLinkType_InstanceVariableDeclaration_NotComposite(){ String fromClass = "domain.direct.violating.DeclarationVariableInstance"; String toClass = "technology.direct.dao.ProfileDAO"; String fromAttribute = "pdao"; boolean isComposite = false; String typeToFind = "Attribute"; Assert.assertTrue(isUmlLinkDetected(fromClass, toClass, fromAttribute, isComposite, typeToFind)); } @Test public void UmlLinkType_InstanceVariableDeclaration_Composite_Array(){ String fromClass = "domain.direct.violating.DeclarationVariableInstance_GenericType_OneTypeParameter"; String toClass = "technology.direct.dao.AccountDAO"; String fromAttribute = "aDao"; boolean isComposite = true; String typeToFind = "Attribute"; Assert.assertTrue(isUmlLinkDetected(fromClass, toClass, fromAttribute, isComposite, typeToFind)); } @Test public void UmlLinkType_InstanceVariableDeclaration_Composite_List(){ String fromClass = "domain.direct.violating.DeclarationVariableInstance_GenericType_OneTypeParameter"; String toClass = "technology.direct.dao.BadgesDAO"; String fromAttribute = "bDao"; boolean isComposite = true; String typeToFind = "Attribute"; Assert.assertTrue(isUmlLinkDetected(fromClass, toClass, fromAttribute, isComposite, typeToFind)); } // //private helpers // private static void setLog4jConfiguration() { URL propertiesFile = Class.class.getResource("/husacct/common/resources/log4j.properties"); PropertyConfigurator.configure(propertiesFile); logger = Logger.getLogger(ExportImportAnalysedModelTest.class); } private static void loadWorkspace(String location) { logger.info(String.format("Loading workspace %s", location)); File file = new File(location); if(file.exists()){ HashMap<String, Object> dataValues = new HashMap<String, Object>(); dataValues.put("file", file); workspaceController.loadWorkspace("Xml", dataValues); if(workspaceController.isAWorkspaceOpened()){ logger.info(String.format("Workspace %s loaded", location)); } else { logger.warn(String.format("Unable to open workspace %s", file.getAbsoluteFile())); } } else { logger.warn(String.format("Unable to locate %s", file.getAbsoluteFile())); } } private static void analyseApplication() { controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService(); mainController = controlService.getMainController(); mainController.getApplicationController().analyseApplication(); } private static AnalysisStatisticsDTO getAnalyseStatistics() { analyseService = ServiceProvider.getInstance().getAnalyseService(); AnalysisStatisticsDTO statistics = analyseService.getAnalysisStatistics(null); logger.info(String.format("Statistics - Packages: " + statistics.totalNrOfPackages + ", Classes: " + statistics.totalNrOfClasses + ", Dependencies: " + statistics.totalNrOfDependencies)); return statistics; } private static void exportAnalysisModel() { controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService(); mainController = controlService.getMainController(); mainController.getExportImportController().exportAnalysisModel(exportFile); } private static void importAnalysisModel() { controlService = (ControlServiceImpl) ServiceProvider.getInstance().getControlService(); mainController = controlService.getMainController(); mainController.getExportImportController().importAnalysisModel(exportFile); } private boolean areDependencyTypesDetected(String moduleFrom, String moduleTo, ArrayList<String> dependencyTypes, boolean isIndirect) { return areDependencyTypesDetected(moduleFrom, moduleTo, dependencyTypes, "", isIndirect); } private boolean areDependencyTypesDetected(String fromClass, String toClass, ArrayList<String> dependencyTypes, String subType, boolean isIndirect) { boolean dependencyTypesDetected = false; TreeMap<String, Boolean> foundDependencyTypes = new TreeMap<String, Boolean>(); analyseService = ServiceProvider.getInstance().getAnalyseService(); DependencyDTO[] foundDependencies = analyseService.getDependenciesFromClassToClass(fromClass, toClass); int numberOfDependencies = foundDependencies.length; for (String dependencyType : dependencyTypes) { boolean found = false; for (int i=0 ; i < numberOfDependencies; i++){ if (foundDependencies[i].type.equals(dependencyType) && (foundDependencies[i].isIndirect) == isIndirect) { if (!subType.equals("")) { if (foundDependencies[i].subType.equals(subType)) { found = true; } } else { found = true; } } } foundDependencyTypes.put(dependencyType,found); } if (!foundDependencyTypes.containsValue(false)){ dependencyTypesDetected = true; } return dependencyTypesDetected; } private boolean isUmlLinkDetected(String classFrom, String classTo, String attributeFrom, boolean isComposite, String linkType) { boolean umlLinkDetected = false; analyseService = ServiceProvider.getInstance().getAnalyseService(); UmlLinkDTO[] umlLinkDTOs = analyseService.getUmlLinksFromClassToToClass(classFrom, classTo); for (UmlLinkDTO linkDTO : umlLinkDTOs) { if (linkDTO.from.equals(classFrom) && linkDTO.to.equals(classTo) && linkDTO.attributeFrom.equals(attributeFrom) && (linkDTO.isComposite == isComposite) && linkDTO.type.equals(linkType)) { umlLinkDetected = true; } } return umlLinkDetected; } }