} | } | ||||
dependency 'org.junit.platform:junit-platform-suite-api:1.10.2' | dependency 'org.junit.platform:junit-platform-suite-api:1.10.2' | ||||
dependency 'org.junit.platform:junit-platform-suite-engine:1.10.2' | dependency 'org.junit.platform:junit-platform-suite-engine:1.10.2' | ||||
dependency 'org.sonarsource.update-center:sonar-update-center-common:1.31.0.1207' | |||||
dependency 'org.sonarsource.update-center:sonar-update-center-common:1.32.0.2424' | |||||
dependency("org.springframework:spring-context:${springVersion}") { | dependency("org.springframework:spring-context:${springVersion}") { | ||||
exclude 'commons-logging:commons-logging' | exclude 'commons-logging:commons-logging' | ||||
} | } |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2024 SonarSource SA | |||||
* mailto:info AT sonarsource DOT com | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.server.platform.ws; | |||||
import com.google.common.collect.Lists; | |||||
import java.util.Calendar; | |||||
import java.util.Comparator; | |||||
import java.util.Date; | |||||
import java.util.List; | |||||
import java.util.SortedSet; | |||||
import org.sonar.api.utils.System2; | |||||
import org.sonar.core.platform.SonarQubeVersion; | |||||
import org.sonar.updatecenter.common.Release; | |||||
import org.sonar.updatecenter.common.UpdateCenter; | |||||
import org.sonar.updatecenter.common.Version; | |||||
public class ActiveVersionEvaluator { | |||||
private static final Comparator<Version> COMPARATOR = Comparator.comparingInt((Version v) -> Integer.parseInt(v.getMajor())) | |||||
.thenComparingInt((Version v) -> Integer.parseInt(v.getMinor())); | |||||
private final SonarQubeVersion sonarQubeVersion; | |||||
private final System2 system2; | |||||
public ActiveVersionEvaluator(SonarQubeVersion sonarQubeVersion, System2 system2) { | |||||
this.sonarQubeVersion = sonarQubeVersion; | |||||
this.system2 = system2; | |||||
} | |||||
public boolean evaluateIfActiveVersion(UpdateCenter updateCenter) { | |||||
Version installedVersion = Version.create(sonarQubeVersion.get().toString()); | |||||
if (compareWithoutPatchVersion(installedVersion, updateCenter.getSonar().getLtaVersion().getVersion()) == 0) { | |||||
return true; | |||||
} | |||||
SortedSet<Release> allReleases = updateCenter.getSonar().getAllReleases(); | |||||
if (compareWithoutPatchVersion(installedVersion, updateCenter.getSonar().getPastLtaVersion().getVersion()) == 0) { | |||||
Release initialLtaRelease = findInitialVersionOfMajorRelease(allReleases, updateCenter.getSonar().getLtaVersion().getVersion()); | |||||
Date initialLtaReleaseDate = initialLtaRelease.getDate(); | |||||
if (initialLtaReleaseDate == null) { | |||||
throw new IllegalStateException("Initial Major release date is missing in releases"); | |||||
} | |||||
// date of the latest major release should be within 6 months | |||||
Calendar c = Calendar.getInstance(); | |||||
c.setTime(new Date(system2.now())); | |||||
c.add(Calendar.MONTH, -6); | |||||
return initialLtaReleaseDate.after(c.getTime()); | |||||
} else { | |||||
return compareWithoutPatchVersion(installedVersion, findPreviousReleaseIgnoringPatch(allReleases).getVersion()) >= 0; | |||||
} | |||||
} | |||||
private static int compareWithoutPatchVersion(Version v1, Version v2) { | |||||
return COMPARATOR.compare(v1, v2); | |||||
} | |||||
private static Release findInitialVersionOfMajorRelease(SortedSet<Release> releases, Version referenceVersion) { | |||||
return releases.stream() | |||||
.filter(release -> release.getVersion().getMajor().equals(referenceVersion.getMajor()) | |||||
&& release.getVersion().getMinor().equals(referenceVersion.getMinor())) | |||||
.min(Comparator.comparing(r -> Integer.parseInt(r.getVersion().getPatch()))) | |||||
.orElseThrow(() -> new IllegalStateException("Unable to find initial major release for version " + referenceVersion + " in releases")); | |||||
} | |||||
private static Release findPreviousReleaseIgnoringPatch(SortedSet<Release> releases) { | |||||
Release refRelease = releases.last(); | |||||
List<Release> sublist = Lists.reverse(releases.stream().toList()); | |||||
for (Release release : sublist) { | |||||
if (compareWithoutPatchVersion(release.getVersion(), refRelease.getVersion()) < 0) { | |||||
return release; | |||||
} | |||||
} | |||||
throw new IllegalStateException("Unable to find previous release in releases"); | |||||
} | |||||
} |
RestartAction.class, | RestartAction.class, | ||||
StatusAction.class, | StatusAction.class, | ||||
UpgradesAction.class, | UpgradesAction.class, | ||||
SystemWs.class | |||||
SystemWs.class, | |||||
ActiveVersionEvaluator.class | |||||
); | ); | ||||
} | } |
import com.google.common.io.Resources; | import com.google.common.io.Resources; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import org.sonar.api.server.ws.Change; | |||||
import org.sonar.api.server.ws.Request; | import org.sonar.api.server.ws.Request; | ||||
import org.sonar.api.server.ws.Response; | import org.sonar.api.server.ws.Response; | ||||
import org.sonar.api.server.ws.WebService; | import org.sonar.api.server.ws.WebService; | ||||
private static final String ARRAY_UPGRADES = "upgrades"; | private static final String ARRAY_UPGRADES = "upgrades"; | ||||
private static final String PROPERTY_UPDATE_CENTER_LTS = "latestLTS"; | private static final String PROPERTY_UPDATE_CENTER_LTS = "latestLTS"; | ||||
private static final String PROPERTY_UPDATE_CENTER_LTA = "latestLTA"; | |||||
private static final String PROPERTY_UPDATE_CENTER_REFRESH = "updateCenterRefresh"; | private static final String PROPERTY_UPDATE_CENTER_REFRESH = "updateCenterRefresh"; | ||||
private static final String PROPERTY_VERSION = "version"; | private static final String PROPERTY_VERSION = "version"; | ||||
private static final String PROPERTY_DESCRIPTION = "description"; | private static final String PROPERTY_DESCRIPTION = "description"; | ||||
private static final String PROPERTY_ISSUE_TRACKER_URL = "issueTrackerUrl"; | private static final String PROPERTY_ISSUE_TRACKER_URL = "issueTrackerUrl"; | ||||
private static final String PROPERTY_EDITION_BUNDLED = "editionBundled"; | private static final String PROPERTY_EDITION_BUNDLED = "editionBundled"; | ||||
private static final String PROPERTY_TERMS_AND_CONDITIONS_URL = "termsAndConditionsUrl"; | private static final String PROPERTY_TERMS_AND_CONDITIONS_URL = "termsAndConditionsUrl"; | ||||
public static final String INSTALLED_VERSION_ACTIVE = "installedVersionActive"; | |||||
private final UpdateCenterMatrixFactory updateCenterFactory; | private final UpdateCenterMatrixFactory updateCenterFactory; | ||||
private final ActiveVersionEvaluator activeVersionEvaluator; | |||||
public UpgradesAction(UpdateCenterMatrixFactory updateCenterFactory) { | |||||
public UpgradesAction(UpdateCenterMatrixFactory updateCenterFactory, ActiveVersionEvaluator activeVersionEvaluator) { | |||||
this.updateCenterFactory = updateCenterFactory; | this.updateCenterFactory = updateCenterFactory; | ||||
this.activeVersionEvaluator = activeVersionEvaluator; | |||||
} | } | ||||
private static void writeMetadata(JsonWriter jsonWriter, Release release) { | private static void writeMetadata(JsonWriter jsonWriter, Release release) { | ||||
"is provided in the response.") | "is provided in the response.") | ||||
.setSince("5.2") | .setSince("5.2") | ||||
.setHandler(this) | .setHandler(this) | ||||
.setResponseExample(Resources.getResource(this.getClass(), "example-upgrades_plugins.json")); | |||||
.setResponseExample(Resources.getResource(this.getClass(), "example-upgrades_plugins.json")) | |||||
.setChangelog(new Change("10.5", "The field 'ltsVersion' is deprecated from the response")) | |||||
.setChangelog(new Change("10.5", "The field 'ltaVersion' is added to indicate the Long-Term Active Version")) | |||||
.setChangelog(new Change("10.5", "The field 'installedVersionActive' is added to indicate if the installed version is an active version")); | |||||
} | } | ||||
@Override | @Override | ||||
private void writeResponse(JsonWriter jsonWriter) { | private void writeResponse(JsonWriter jsonWriter) { | ||||
jsonWriter.beginObject(); | jsonWriter.beginObject(); | ||||
Optional<UpdateCenter> updateCenter = updateCenterFactory.getUpdateCenter(DO_NOT_FORCE_REFRESH); | |||||
writeUpgrades(jsonWriter, updateCenter); | |||||
if (updateCenter.isPresent()) { | |||||
Release ltsRelease = updateCenter.get().getSonar().getLtsRelease(); | |||||
if (ltsRelease != null) { | |||||
Version ltsVersion = ltsRelease.getVersion(); | |||||
String latestLTS = String.format("%s.%s", ltsVersion.getMajor(), ltsVersion.getMinor()); | |||||
jsonWriter.prop(PROPERTY_UPDATE_CENTER_LTS, latestLTS); | |||||
} | |||||
jsonWriter.propDateTime(PROPERTY_UPDATE_CENTER_REFRESH, updateCenter.get().getDate()); | |||||
Optional<UpdateCenter> updateCenterOpt = updateCenterFactory.getUpdateCenter(DO_NOT_FORCE_REFRESH); | |||||
writeUpgrades(jsonWriter, updateCenterOpt); | |||||
if (updateCenterOpt.isPresent()) { | |||||
UpdateCenter updateCenter = updateCenterOpt.get(); | |||||
writeLatestLtsVersion(jsonWriter, updateCenter); | |||||
writeLatestLtaVersion(jsonWriter, updateCenter); | |||||
jsonWriter.propDateTime(PROPERTY_UPDATE_CENTER_REFRESH, updateCenter.getDate()); | |||||
jsonWriter.prop(INSTALLED_VERSION_ACTIVE, activeVersionEvaluator.evaluateIfActiveVersion(updateCenter)); | |||||
} | } | ||||
jsonWriter.endObject(); | jsonWriter.endObject(); | ||||
} | } | ||||
private static void writeLatestLtsVersion(JsonWriter jsonWriter, UpdateCenter updateCenter) { | |||||
Release ltsRelease = updateCenter.getSonar().getLtsRelease(); | |||||
if (ltsRelease != null) { | |||||
Version ltsVersion = ltsRelease.getVersion(); | |||||
String latestLTS = String.format("%s.%s", ltsVersion.getMajor(), ltsVersion.getMinor()); | |||||
jsonWriter.prop(PROPERTY_UPDATE_CENTER_LTS, latestLTS); | |||||
} | |||||
} | |||||
private static void writeLatestLtaVersion(JsonWriter jsonWriter, UpdateCenter updateCenter) { | |||||
Release ltaRelease = updateCenter.getSonar().getLtaVersion(); | |||||
if (ltaRelease != null) { | |||||
Version ltaVersion = ltaRelease.getVersion(); | |||||
String latestLTA = String.format("%s.%s", ltaVersion.getMajor(), ltaVersion.getMinor()); | |||||
jsonWriter.prop(PROPERTY_UPDATE_CENTER_LTA, latestLTA); | |||||
} | |||||
} | |||||
private static void writeUpgrades(JsonWriter jsonWriter, Optional<UpdateCenter> updateCenter) { | private static void writeUpgrades(JsonWriter jsonWriter, Optional<UpdateCenter> updateCenter) { | ||||
jsonWriter.name(ARRAY_UPGRADES).beginArray(); | jsonWriter.name(ARRAY_UPGRADES).beginArray(); | ||||
} | } | ||||
], | ], | ||||
"latestLTS": "8.9", | "latestLTS": "8.9", | ||||
"latestLTA": "8.9", | |||||
"installedVersionActive": true, | |||||
"updateCenterRefresh": "2015-04-24T16:08:36+0200" | "updateCenterRefresh": "2015-04-24T16:08:36+0200" | ||||
} | } |
/* | |||||
* SonarQube | |||||
* Copyright (C) 2009-2024 SonarSource SA | |||||
* mailto:info AT sonarsource DOT com | |||||
* | |||||
* This program is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 3 of the License, or (at your option) any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program; if not, write to the Free Software Foundation, | |||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||||
*/ | |||||
package org.sonar.server.platform.ws; | |||||
import java.util.Calendar; | |||||
import java.util.SortedSet; | |||||
import java.util.TreeSet; | |||||
import org.junit.jupiter.api.BeforeEach; | |||||
import org.junit.jupiter.api.Test; | |||||
import org.sonar.api.utils.DateUtils; | |||||
import org.sonar.api.utils.System2; | |||||
import org.sonar.core.platform.SonarQubeVersion; | |||||
import org.sonar.updatecenter.common.Release; | |||||
import org.sonar.updatecenter.common.Sonar; | |||||
import org.sonar.updatecenter.common.UpdateCenter; | |||||
import org.sonar.updatecenter.common.Version; | |||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
import static org.assertj.core.api.Assertions.assertThatThrownBy; | |||||
import static org.mockito.Mockito.mock; | |||||
import static org.mockito.Mockito.when; | |||||
import static org.sonar.api.utils.Version.parse; | |||||
class ActiveVersionEvaluatorTest { | |||||
private final SonarQubeVersion sonarQubeVersion = mock(SonarQubeVersion.class); | |||||
private final UpdateCenter updateCenter = mock(UpdateCenter.class); | |||||
private static final Sonar sonar = mock(Sonar.class); | |||||
private final System2 system2 = mock(System2.class); | |||||
private final ActiveVersionEvaluator underTest = new ActiveVersionEvaluator(sonarQubeVersion, system2); | |||||
@BeforeEach | |||||
void setup() { | |||||
when(updateCenter.getSonar()).thenReturn(sonar); | |||||
when(updateCenter.getDate()).thenReturn(DateUtils.parseDateTime("2015-04-24T16:08:36+0200")); | |||||
when(sonar.getLtaVersion()).thenReturn(new Release(sonar, Version.create("9.9.4"))); | |||||
when(sonar.getPastLtaVersion()).thenReturn(new Release(sonar, Version.create("8.9.10"))); | |||||
} | |||||
@Test | |||||
void evaluateIfActiveVersion_whenInstalledVersionIsLatestLta_shouldReturnActiveVersion() { | |||||
when(updateCenter.getSonar().getAllReleases()).thenReturn(getReleases()); | |||||
when(sonarQubeVersion.get()).thenReturn(parse("9.9.2")); | |||||
assertThat(underTest.evaluateIfActiveVersion(updateCenter)).isTrue(); | |||||
} | |||||
@Test | |||||
void evaluateIfActiveVersion_whenInstalledVersionIsPastLtaAndWithinSixMonthFromLta_shouldReturnVersionIsActive() { | |||||
Calendar calendar = Calendar.getInstance(); | |||||
calendar.add(Calendar.MONTH, -5); | |||||
calendar.set(Calendar.DAY_OF_MONTH, 1); | |||||
when(sonarQubeVersion.get()).thenReturn(parse("8.9.5")); | |||||
SortedSet<Release> releases = getReleases(); | |||||
releases.stream().filter(r -> r.getVersion().equals(Version.create("9.9"))).findFirst().get().setDate(calendar.getTime()); | |||||
when(sonar.getAllReleases()).thenReturn(releases); | |||||
assertThat(underTest.evaluateIfActiveVersion(updateCenter)).isTrue(); | |||||
} | |||||
@Test | |||||
void evaluateIfActiveVersion_whenInstalledVersionIsPastLtaAndAfterSixMonthFromLta_shouldReturnVersionNotActive() { | |||||
Calendar calendar = Calendar.getInstance(); | |||||
calendar.add(Calendar.MONTH, -7); | |||||
calendar.set(Calendar.DAY_OF_MONTH, 1); | |||||
when(system2.now()).thenCallRealMethod(); | |||||
when(sonarQubeVersion.get()).thenReturn(parse("8.9.5")); | |||||
SortedSet<Release> releases = getReleases(); | |||||
releases.stream().filter(r -> r.getVersion().equals(Version.create("9.9"))).findFirst().get().setDate(calendar.getTime()); | |||||
when(sonar.getAllReleases()).thenReturn(releases); | |||||
assertThat(underTest.evaluateIfActiveVersion(updateCenter)).isFalse(); | |||||
} | |||||
@Test | |||||
void evaluateIfActiveVersion_whenInstalledVersionIsPastLtaAndReleaseDateIsMissing_shouldThrowIllegalStateException() { | |||||
when(sonarQubeVersion.get()).thenReturn(parse("8.9.5")); | |||||
SortedSet<Release> releases = getReleases(); | |||||
when(sonar.getAllReleases()).thenReturn(releases); | |||||
assertThatThrownBy(() -> underTest.evaluateIfActiveVersion(updateCenter)) | |||||
.isInstanceOf(IllegalStateException.class) | |||||
.hasMessageContaining("Initial Major release date is missing in releases"); | |||||
} | |||||
@Test | |||||
void evaluateIfActiveVersion_whenNoPreviousReleasesFound_shouldThrowIllegalStateException() { | |||||
when(sonarQubeVersion.get()).thenReturn(parse("10.4.1")); | |||||
TreeSet<Release> releases = new TreeSet<>(); | |||||
releases.add(new Release(sonar, Version.create("10.4.1"))); | |||||
when(sonar.getAllReleases()).thenReturn(releases); | |||||
assertThatThrownBy(() -> underTest.evaluateIfActiveVersion(updateCenter)) | |||||
.isInstanceOf(IllegalStateException.class) | |||||
.hasMessageContaining("Unable to find previous release in releases"); | |||||
} | |||||
@Test | |||||
void evaluateIfActiveVersion_whenInstalledVersionIsLatestMinusOne_shouldReturnVersionIsActive() { | |||||
when(sonarQubeVersion.get()).thenReturn(parse("10.9")); | |||||
when(updateCenter.getSonar().getAllReleases()).thenReturn(getReleases()); | |||||
assertThat(underTest.evaluateIfActiveVersion(updateCenter)).isTrue(); | |||||
} | |||||
@Test | |||||
void evaluateIfActiveVersion_whenInstalledVersionIsSnapshot_shouldReturnVersionIsActive() { | |||||
when(sonarQubeVersion.get()).thenReturn(parse("10.11-SNAPSHOT")); | |||||
when(updateCenter.getSonar().getAllReleases()).thenReturn(getReleases()); | |||||
assertThat(underTest.evaluateIfActiveVersion(updateCenter)).isTrue(); | |||||
} | |||||
public static SortedSet<Release> getReleases() { | |||||
TreeSet<Release> releases = new TreeSet<>(); | |||||
releases.add(new Release(sonar, Version.create("9.9"))); | |||||
releases.add(new Release(sonar, Version.create("9.9.1"))); | |||||
releases.add(new Release(sonar, Version.create("9.9.2"))); | |||||
releases.add(new Release(sonar, Version.create("9.9.3"))); | |||||
releases.add(new Release(sonar, Version.create("9.9.4"))); | |||||
releases.add(new Release(sonar, Version.create("10.0"))); | |||||
releases.add(new Release(sonar, Version.create("10.1"))); | |||||
releases.add(new Release(sonar, Version.create("10.2"))); | |||||
releases.add(new Release(sonar, Version.create("10.2.1"))); | |||||
releases.add(new Release(sonar, Version.create("10.3"))); | |||||
releases.add(new Release(sonar, Version.create("10.4"))); | |||||
releases.add(new Release(sonar, Version.create("10.4.1"))); | |||||
releases.add(new Release(sonar, Version.create("10.9.1"))); | |||||
releases.add(new Release(sonar, Version.create("10.10.1"))); | |||||
releases.add(new Release(sonar, Version.create("10.10.2"))); | |||||
releases.add(new Release(sonar, Version.create("10.10.3"))); | |||||
return releases; | |||||
} | |||||
} |
public void verify_count_of_added_components() { | public void verify_count_of_added_components() { | ||||
ListContainer container = new ListContainer(); | ListContainer container = new ListContainer(); | ||||
new SystemWsModule().configure(container); | new SystemWsModule().configure(container); | ||||
assertThat(container.getAddedObjects()).hasSize(15); | |||||
assertThat(container.getAddedObjects()).hasSize(16); | |||||
} | } | ||||
} | } |
package org.sonar.server.platform.ws; | package org.sonar.server.platform.ws; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import org.junit.Before; | |||||
import org.junit.Test; | |||||
import org.junit.jupiter.api.BeforeEach; | |||||
import org.junit.jupiter.api.Test; | |||||
import org.sonar.api.server.ws.WebService; | import org.sonar.api.server.ws.WebService; | ||||
import org.sonar.api.utils.DateUtils; | import org.sonar.api.utils.DateUtils; | ||||
import org.sonar.api.utils.System2; | |||||
import org.sonar.core.platform.SonarQubeVersion; | |||||
import org.sonar.server.plugins.UpdateCenterMatrixFactory; | import org.sonar.server.plugins.UpdateCenterMatrixFactory; | ||||
import org.sonar.server.ws.TestResponse; | import org.sonar.server.ws.TestResponse; | ||||
import org.sonar.server.ws.WsActionTester; | import org.sonar.server.ws.WsActionTester; | ||||
import static org.mockito.ArgumentMatchers.anyBoolean; | import static org.mockito.ArgumentMatchers.anyBoolean; | ||||
import static org.mockito.Mockito.mock; | import static org.mockito.Mockito.mock; | ||||
import static org.mockito.Mockito.when; | import static org.mockito.Mockito.when; | ||||
import static org.sonar.api.utils.Version.parse; | |||||
import static org.sonar.server.platform.ws.ActiveVersionEvaluatorTest.getReleases; | |||||
import static org.sonar.test.JsonAssert.assertJson; | import static org.sonar.test.JsonAssert.assertJson; | ||||
public class UpgradesActionTest { | |||||
class UpgradesActionTest { | |||||
private static final String JSON_EMPTY_UPGRADE_LIST = "{" + | private static final String JSON_EMPTY_UPGRADE_LIST = "{" + | ||||
" \"upgrades\":" + "[]" + | " \"upgrades\":" + "[]" + | ||||
"}"; | "}"; | ||||
private UpdateCenterMatrixFactory updateCenterFactory = mock(UpdateCenterMatrixFactory.class); | |||||
private UpdateCenter updateCenter = mock(UpdateCenter.class); | |||||
private Sonar sonar = mock(Sonar.class); | |||||
private UpgradesAction underTest = new UpgradesAction(updateCenterFactory); | |||||
private final UpdateCenterMatrixFactory updateCenterFactory = mock(UpdateCenterMatrixFactory.class); | |||||
private final SonarQubeVersion sonarQubeVersion = mock(SonarQubeVersion.class); | |||||
private final UpdateCenter updateCenter = mock(UpdateCenter.class); | |||||
private final Sonar sonar = mock(Sonar.class); | |||||
private final System2 system2 = mock(System2.class); | |||||
private WsActionTester tester = new WsActionTester(underTest); | |||||
private final ActiveVersionEvaluator activeVersionEvaluator = new ActiveVersionEvaluator(sonarQubeVersion, system2); | |||||
private final UpgradesAction underTest = new UpgradesAction(updateCenterFactory, activeVersionEvaluator); | |||||
private final WsActionTester tester = new WsActionTester(underTest); | |||||
private static SonarUpdate createSonar_51_update() { | private static SonarUpdate createSonar_51_update() { | ||||
Plugin brandingPlugin = Plugin.factory("branding") | Plugin brandingPlugin = Plugin.factory("branding") | ||||
Plugin viewsPlugin = Plugin.factory("views") | Plugin viewsPlugin = Plugin.factory("views") | ||||
.setName("Views") | .setName("Views") | ||||
.setCategory("Governance") | .setCategory("Governance") | ||||
.setDescription("Create aggregation trees to group projects. Projects can for instance be grouped by applications, applications by team, teams by department.") | |||||
.setDescription("Create aggregation trees to group projects. Projects can for instance be grouped by applications, applications " + | |||||
"by team, teams by department.") | |||||
.setHomepageUrl("https://redirect.sonarsource.com/plugins/views.html") | .setHomepageUrl("https://redirect.sonarsource.com/plugins/views.html") | ||||
.setLicense("Commercial") | .setLicense("Commercial") | ||||
.setOrganization("SonarSource") | .setOrganization("SonarSource") | ||||
return sonarUpdate; | return sonarUpdate; | ||||
} | } | ||||
@Before | |||||
public void wireMocks() { | |||||
@BeforeEach | |||||
void setup() { | |||||
when(updateCenterFactory.getUpdateCenter(anyBoolean())).thenReturn(Optional.of(updateCenter)); | when(updateCenterFactory.getUpdateCenter(anyBoolean())).thenReturn(Optional.of(updateCenter)); | ||||
when(updateCenter.getSonar()).thenReturn(sonar); | when(updateCenter.getSonar()).thenReturn(sonar); | ||||
when(updateCenter.getDate()).thenReturn(DateUtils.parseDateTime("2015-04-24T16:08:36+0200")); | when(updateCenter.getDate()).thenReturn(DateUtils.parseDateTime("2015-04-24T16:08:36+0200")); | ||||
when(sonar.getLtaVersion()).thenReturn(new Release(sonar, Version.create("9.9.4"))); | |||||
when(sonar.getPastLtaVersion()).thenReturn(new Release(sonar, Version.create("8.9.10"))); | |||||
} | } | ||||
@Test | @Test | ||||
public void action_updates_is_defined() { | |||||
void action_updates_is_defined() { | |||||
WebService.Action def = tester.getDef(); | WebService.Action def = tester.getDef(); | ||||
assertThat(def.key()).isEqualTo("upgrades"); | assertThat(def.key()).isEqualTo("upgrades"); | ||||
} | } | ||||
@Test | @Test | ||||
public void empty_array_is_returned_when_there_is_no_upgrade_available() { | |||||
void empty_array_is_returned_when_there_is_no_upgrade_available() { | |||||
when(updateCenter.getSonar().getAllReleases()).thenReturn(getReleases()); | |||||
when(sonarQubeVersion.get()).thenReturn(parse("9.9.2")); | |||||
TestResponse response = tester.newRequest().execute(); | TestResponse response = tester.newRequest().execute(); | ||||
assertJson(response.getInput()).withStrictArrayOrder().isSimilarTo(JSON_EMPTY_UPGRADE_LIST); | assertJson(response.getInput()).withStrictArrayOrder().isSimilarTo(JSON_EMPTY_UPGRADE_LIST); | ||||
} | } | ||||
@Test | @Test | ||||
public void empty_array_is_returned_when_update_center_is_unavailable() { | |||||
void empty_array_is_returned_when_update_center_is_unavailable() { | |||||
when(updateCenterFactory.getUpdateCenter(anyBoolean())).thenReturn(Optional.empty()); | when(updateCenterFactory.getUpdateCenter(anyBoolean())).thenReturn(Optional.empty()); | ||||
TestResponse response = tester.newRequest().execute(); | TestResponse response = tester.newRequest().execute(); | ||||
} | } | ||||
@Test | @Test | ||||
public void verify_JSON_response_against_example() { | |||||
void verify_JSON_response_against_example() { | |||||
SonarUpdate sonarUpdate = createSonar_51_update(); | SonarUpdate sonarUpdate = createSonar_51_update(); | ||||
when(sonarQubeVersion.get()).thenReturn(parse("8.9.0")); | |||||
when(sonar.getLtsRelease()).thenReturn(new Release(sonar, Version.create("8.9.2"))); | when(sonar.getLtsRelease()).thenReturn(new Release(sonar, Version.create("8.9.2"))); | ||||
when(sonar.getLtaVersion()).thenReturn(new Release(sonar, Version.create("8.9.2"))); | |||||
when(updateCenter.findSonarUpdates()).thenReturn(of(sonarUpdate)); | when(updateCenter.findSonarUpdates()).thenReturn(of(sonarUpdate)); | ||||
when(updateCenter.getSonar().getAllReleases()).thenReturn(getReleases()); | |||||
TestResponse response = tester.newRequest().execute(); | TestResponse response = tester.newRequest().execute(); | ||||
assertJson(response.getInput()).withStrictArrayOrder() | assertJson(response.getInput()).withStrictArrayOrder() | ||||
.isSimilarTo(tester.getDef().responseExampleAsString()); | .isSimilarTo(tester.getDef().responseExampleAsString()); | ||||
} | } | ||||
} | } |