import com.sonar.orchestrator.Orchestrator;
import com.sonar.orchestrator.OrchestratorBuilder;
import com.sonar.orchestrator.build.MavenBuild;
-import com.sonar.orchestrator.config.Configuration;
import com.sonar.orchestrator.container.Server;
import com.sonar.orchestrator.locator.FileLocation;
import com.sonar.orchestrator.version.Version;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
-import java.util.stream.Stream;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Test;
public class UpgradeTest {
private static final String PROJECT_KEY = "org.apache.struts:struts-parent";
- private static final String SQ_VERSION_DEV = "DEV";
private static final String LATEST_JAVA_RELEASE = "LATEST_RELEASE";
private Orchestrator orchestrator;
@Test
public void test_upgrade_from_5_6_1() {
- testDatabaseUpgrade("3.14", Version.create("5.6.1"));
+ testDatabaseUpgrade(Version.create("5.6.1"));
}
@Test
public void test_upgrade_from_5_2_via_5_6() {
- testDatabaseUpgrade("3.14", Version.create("5.2"), Version.create("5.6"));
+ testDatabaseUpgrade(Version.create("5.2"), Version.create("5.6"));
}
- private void testDatabaseUpgrade(String javaVersion, Version fromVersion, Version... intermediaryVersions) {
- startOldServer(fromVersion, javaVersion);
+ @Test
+ public void test_upgrade_from_6_0() {
+ testDatabaseUpgrade(Version.create("6.0"));
+ }
+
+ @Test
+ public void test_upgrade_from_6_1() {
+ testDatabaseUpgrade(Version.create("6.1"));
+ }
+
+ private void testDatabaseUpgrade(Version fromVersion, Version... intermediaryVersions) {
+ startOldVersionServer(fromVersion, false);
scanProject();
int files = countFiles(PROJECT_KEY);
assertThat(files).isGreaterThan(0);
stopServer();
- Stream.concat(Arrays.stream(intermediaryVersions).map(Version::toString), Stream.of(SQ_VERSION_DEV))
- .forEach((sqVersion) -> {
- upgradeTo(sqVersion, javaVersion);
+ Arrays.stream(intermediaryVersions).forEach((sqVersion) -> {
+ startOldVersionServer(sqVersion, true);
+ upgrade();
+ verifyAnalysis(files);
+ stopServer();
+ });
- assertThat(countFiles(PROJECT_KEY)).isEqualTo(files);
- scanProject();
- assertThat(countFiles(PROJECT_KEY)).isEqualTo(files);
- browseWebapp();
+ startDevServer();
+ upgrade();
+ verifyAnalysis(files);
+ stopServer();
+ }
- stopServer();
- });
+ private void verifyAnalysis(int expectedNumberOfFiles) {
+ assertThat(countFiles(PROJECT_KEY)).isEqualTo(expectedNumberOfFiles);
+ scanProject();
+ assertThat(countFiles(PROJECT_KEY)).isEqualTo(expectedNumberOfFiles);
+ browseWebapp();
}
- private void upgradeTo(String sqVersion, String javaVersion) {
- startNewServer(sqVersion, SQ_VERSION_DEV.equals(sqVersion) ? LATEST_JAVA_RELEASE : javaVersion);
+ private void upgrade() {
checkSystemStatus(ServerStatusResponse.Status.DB_MIGRATION_NEEDED);
- checkUrlsBeforeUpgrade(sqVersion);
-
- upgrade();
+ checkUrlsBeforeUpgrade();
+ ServerMigrationResponse serverMigrationResponse = new ServerMigrationCall(orchestrator).callAndWait();
+ assertThat(serverMigrationResponse.getStatus()).isEqualTo(ServerMigrationResponse.Status.MIGRATION_SUCCEEDED);
checkSystemStatus(ServerStatusResponse.Status.UP);
checkUrlsAfterUpgrade();
}
assertThat(serverStatusResponse.getStatus()).isEqualTo(serverStatus);
}
- private void checkUrlsBeforeUpgrade(String sqVersion) {
+ private void checkUrlsBeforeUpgrade() {
// These urls should be available when system requires a migration
checkUrlIsReturningOk("/api/system/status");
checkUrlIsReturningOk("/api/system/db_migration_status");
testUrl("/profiles");
}
- private void upgrade() {
- ServerMigrationResponse serverMigrationResponse = new ServerMigrationCall(orchestrator).callAndWait();
-
- assertThat(serverMigrationResponse.getStatus()).isEqualTo(ServerMigrationResponse.Status.MIGRATION_SUCCEEDED);
- }
-
- private void startOldServer(Version sqVersion, String javaVersion) {
- String jdbcUrl = MssqlConfig.fixUrl(Configuration.createEnv(), sqVersion);
- orchestrator = Orchestrator.builderEnv()
- .setOrchestratorProperty("sonar.jdbc.url", jdbcUrl)
+ private void startOldVersionServer(Version sqVersion, boolean keepDatabase) {
+ OrchestratorBuilder builder = Orchestrator.builderEnv()
.setSonarVersion(sqVersion.toString())
- .setOrchestratorProperty("orchestrator.keepDatabase", "false")
- .restoreProfileAtStartup(FileLocation.ofClasspath("/sonar-way-5.1.xml"))
- .setOrchestratorProperty("javaVersion", javaVersion)
- .addPlugin("java").build();
+ .setOrchestratorProperty("orchestrator.keepDatabase", String.valueOf(keepDatabase))
+ .setOrchestratorProperty("javaVersion", "3.14")
+ .addPlugin("java")
+ .setStartupLogWatcher(log -> log.contains("Process[web] is up"));
+ orchestrator = builder.build();
orchestrator.start();
initSelenide(orchestrator);
}
- private void startNewServer(String sqVersion, String javaVersion) {
+ private void startDevServer() {
OrchestratorBuilder builder = Orchestrator.builderEnv()
- .setSonarVersion(sqVersion)
+ .setZipFile(FileLocation.byWildcardMavenFilename(new File("../../sonar-application/target"), "sonar*.zip").getFile())
.setOrchestratorProperty("orchestrator.keepDatabase", "true")
- .setOrchestratorProperty("javaVersion", javaVersion)
- .setStartupLogWatcher(log -> log.contains("Process[web] is up"))
- .addPlugin("java");
+ .setOrchestratorProperty("javaVersion", LATEST_JAVA_RELEASE)
+ .addPlugin("java")
+ .setStartupLogWatcher(log -> log.contains("Process[web] is up"));
orchestrator = builder.build();
orchestrator.start();
initSelenide(orchestrator);
.setCleanSonarGoals()
.setProperty("sonar.dynamicAnalysis", "false")
.setProperty("sonar.scm.disabled", "true")
- .setProperty("sonar.cpd.cross_project", "true")
- .setProperty("sonar.profile", "sonar-way-5.1");
+ .setProperty("sonar.cpd.cross_project", "true");
orchestrator.executeBuild(build);
}
newWsClient(orchestrator).wsConnector().call(new GetRequest(url)).failIfNotSuccessful();
}
- // Some urls are available during migration only recently
- private void checkUrlIsReturningOkOnlyForDevVersion(String url, String sqVersion) {
- if (sqVersion.equals(SQ_VERSION_DEV)) {
- WsResponse wsResponse = newWsClient(orchestrator).wsConnector().call(new GetRequest(url));
- assertThat(wsResponse.isSuccessful()).as("SQ version %s", sqVersion).isTrue();
- }
- }
-
private void checkUrlIsReturningNotFound(String url) {
WsResponse response = newWsClient(orchestrator).wsConnector().call(new GetRequest(url));
assertThat(response.code()).isEqualTo(HttpURLConnection.HTTP_NOT_FOUND);