package jetbrains.mps.migration; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import jetbrains.mps.ide.ThreadUtils; import jetbrains.mps.migration.component.util.MigrationsUtil; import jetbrains.mps.migration.global.ProjectMigration; import jetbrains.mps.testbench.junit.suites.BaseProjectsTest; import jetbrains.mps.util.IterableUtil; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.jetbrains.mps.openapi.module.SModule; import org.junit.Assert; import org.junit.Test; import javax.swing.SwingUtilities; import jetbrains.mps.ide.migration.MigrationManager; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class NoPendingMigrationsTest extends BaseProjectsTest { private final static Logger LOG = LogManager.getLogger(NoPendingMigrationsTest.class); public NoPendingMigrationsTest(String projectDir) { super(projectDir); } @Test public void noMigrationNeeded() { VirtualFile projectDir = LocalFileSystem.getInstance().findFileByPath(getProjectDir()); assert projectDir != null; if (projectDir.findChild(".allow-pending-migrations") != null) { LOG.info("Project " + projectDir.getName() + ": migrations are allowed (.am file is present in project dir)"); return; } else { LOG.info("Project " + projectDir.getName() + ": should be tested"); } boolean[] migrationRequired = new boolean[1]; List<String> projectMigrations = new ArrayList<>(); List<String> moduleMigrations = new ArrayList<>(); Exception exception = ThreadUtils.runInUIThreadAndWait(() -> { MigrationManager migrationManager = getContextProject().getComponent(MigrationManager.class); migrationRequired[0] = migrationManager.isMigrationRequired(); if (migrationRequired[0]) { projectMigrations.addAll(IterableUtil.asCollection(migrationManager.getProjectMigrationsToApply()) .stream().map(ProjectMigration::getDescription) .collect(Collectors.toList())); List<SModule> modules = new ArrayList<>(); getContextProject().getModelAccess().runReadAction(() -> { modules.addAll(IterableUtil.asCollection(MigrationsUtil.getMigrateableModulesFromProject(getContextProject()))); moduleMigrations.addAll(migrationManager.getModuleMigrationsToApply(modules) .stream().map(it -> it.getScriptReference().resolve(false).getCaption()) .collect(Collectors.toList())); }); } }); if (exception != null) { throw new RuntimeException(exception); } StringBuilder message = new StringBuilder("Pending migrations:\n"); message.append("Project migrations:\n"); for (String pm : projectMigrations) { message.append(pm).append("\n"); } message.append("Module migrations:\n"); for (String mm : moduleMigrations) { message.append(mm).append("\n"); } Assert.assertFalse(message.toString(), migrationRequired[0]); } }