Skip to content

Commit

Permalink
SONAR-10223 add optional organization to PostProjectAnalysisTask
Browse files Browse the repository at this point in the history
  • Loading branch information
sns-seb authored and Janos Gyerik committed Jan 5, 2018
1 parent b2aeb17 commit 902fabc
Show file tree
Hide file tree
Showing 8 changed files with 203 additions and 14 deletions.
Expand Up @@ -109,6 +109,7 @@
import org.sonar.server.notification.email.EmailNotificationChannel;
import org.sonar.server.organization.BillingValidationsProxyImpl;
import org.sonar.server.organization.DefaultOrganizationProviderImpl;
import org.sonar.server.organization.OrganizationFlagsImpl;
import org.sonar.server.permission.GroupPermissionChanger;
import org.sonar.server.permission.PermissionTemplateService;
import org.sonar.server.permission.PermissionUpdater;
Expand Down Expand Up @@ -312,7 +313,8 @@ private static void populateLevel3(ComponentContainer container) {
UriReader.class,
ServerImpl.class,
DefaultOrganizationProviderImpl.class,
SynchronousAsyncExecution.class);
SynchronousAsyncExecution.class,
OrganizationFlagsImpl.class);
}

private static void populateLevel4(ComponentContainer container, Props props) {
Expand Down
Expand Up @@ -65,7 +65,7 @@ public class ComputeEngineContainerImplTest {
private ComputeEngineContainerImpl underTest;

@Before
public void setUp() throws Exception {
public void setUp() {
underTest = new ComputeEngineContainerImpl();
underTest.setComputeEngineStatus(mock(ComputeEngineStatus.class));
}
Expand Down Expand Up @@ -105,7 +105,7 @@ public void test_real_start() throws IOException {
);
assertThat(picoContainer.getParent().getComponentAdapters()).hasSize(
CONTAINER_ITSELF
+ 6 // level 3
+ 7 // level 3
);
assertThat(picoContainer.getParent().getParent().getComponentAdapters()).hasSize(
CONTAINER_ITSELF
Expand Down
Expand Up @@ -29,6 +29,7 @@
import org.sonar.api.ce.posttask.Analysis;
import org.sonar.api.ce.posttask.Branch;
import org.sonar.api.ce.posttask.CeTask;
import org.sonar.api.ce.posttask.Organization;
import org.sonar.api.ce.posttask.PostProjectAnalysisTask;
import org.sonar.api.ce.posttask.Project;
import org.sonar.api.ce.posttask.QualityGate;
Expand Down Expand Up @@ -116,6 +117,7 @@ private static void executeTask(ProjectAnalysisImpl projectAnalysis, PostProject

private ProjectAnalysisImpl createProjectAnalysis(CeTask.Status status) {
return new ProjectAnalysisImpl(
createOrganization(),
new CeTaskImpl(this.ceTask.getUuid(), status),
createProject(this.ceTask),
getAnalysis().orElse(null),
Expand All @@ -125,6 +127,15 @@ private ProjectAnalysisImpl createProjectAnalysis(CeTask.Status status) {
createBranch());
}

@CheckForNull
private Organization createOrganization() {
org.sonar.server.computation.task.projectanalysis.analysis.Organization organization = analysisMetadataHolder.getOrganization();
if (organization.isOrganizationsEnabled()) {
return new OrganizationImpl(organization.getName(), organization.getKey());
}
return null;
}

private Optional<Analysis> getAnalysis() {
Long analysisDate = getAnalysisDate();

Expand Down Expand Up @@ -196,6 +207,8 @@ private static Collection<QualityGate.Condition> convert(Set<Condition> conditio
}

private static class ProjectAnalysisImpl implements PostProjectAnalysisTask.ProjectAnalysis {
@Nullable
private final Organization organization;
private final CeTask ceTask;
private final Project project;
private final long date;
Expand All @@ -207,9 +220,10 @@ private static class ProjectAnalysisImpl implements PostProjectAnalysisTask.Proj
@Nullable
private final Analysis analysis;

private ProjectAnalysisImpl(CeTask ceTask, Project project,
private ProjectAnalysisImpl(@Nullable Organization organization, CeTask ceTask, Project project,
@Nullable Analysis analysis, long date,
ScannerContext scannerContext, @Nullable QualityGate qualityGate, @Nullable Branch branch) {
this.organization = organization;
this.ceTask = requireNonNull(ceTask, "ceTask can not be null");
this.project = requireNonNull(project, "project can not be null");
this.analysis = analysis;
Expand All @@ -219,6 +233,11 @@ private ProjectAnalysisImpl(CeTask ceTask, Project project,
this.branch = branch;
}

@Override
public Optional<Organization> getOrganization() {
return Optional.ofNullable(organization);
}

@Override
public CeTask getCeTask() {
return ceTask;
Expand Down Expand Up @@ -293,4 +312,24 @@ public Date getDate() {
return new Date(date);
}
}

private static class OrganizationImpl implements Organization {
private final String name;
private final String key;

private OrganizationImpl(String name, String key) {
this.name = requireNonNull(name, "name can't be null");
this.key = requireNonNull(key, "key can't be null");
}

@Override
public String getName() {
return name;
}

@Override
public String getKey() {
return key;
}
}
}
Expand Up @@ -26,6 +26,7 @@
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import javax.annotation.Nullable;
import org.apache.commons.lang.RandomStringUtils;
import org.junit.Before;
Expand All @@ -39,9 +40,11 @@
import org.sonar.api.utils.System2;
import org.sonar.ce.queue.CeTask;
import org.sonar.db.component.BranchType;
import org.sonar.db.organization.OrganizationDto;
import org.sonar.scanner.protocol.output.ScannerReport;
import org.sonar.server.computation.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
import org.sonar.server.computation.task.projectanalysis.analysis.Branch;
import org.sonar.server.computation.task.projectanalysis.analysis.Organization;
import org.sonar.server.computation.task.projectanalysis.batch.BatchReportReaderRule;
import org.sonar.server.computation.task.projectanalysis.component.DefaultBranchImpl;
import org.sonar.server.computation.task.projectanalysis.metric.Metric;
Expand Down Expand Up @@ -79,10 +82,13 @@ public class PostProjectAnalysisTasksExecutorTest {
@Rule
public BatchReportReaderRule reportReader = new BatchReportReaderRule();

private String organizationUuid = "org1";
private String organizationKey = organizationUuid + "_key";
private String organizationName = organizationUuid + "_name";
private System2 system2 = mock(System2.class);
private ArgumentCaptor<PostProjectAnalysisTask.ProjectAnalysis> projectAnalysisArgumentCaptor = ArgumentCaptor.forClass(PostProjectAnalysisTask.ProjectAnalysis.class);
private CeTask ceTask = new CeTask.Builder()
.setOrganizationUuid("org1")
.setOrganizationUuid(organizationUuid)
.setType("type")
.setUuid("uuid")
.setComponentKey("component key")
Expand All @@ -104,6 +110,9 @@ public void setUp() throws Exception {
Branch branch = mock(Branch.class);
when(branch.getType()).thenReturn(BranchType.LONG);
analysisMetadataHolder.setBranch(branch);
analysisMetadataHolder.setOrganization(Organization.from(
new OrganizationDto().setKey(organizationKey).setName(organizationName).setUuid(organizationUuid).setDefaultQualityGateUuid("foo"),
new Random().nextBoolean()));
}

@Test
Expand All @@ -123,7 +132,7 @@ public void finished_calls_all_PostProjectAnalysisTask_in_order_of_the_array_and
new PostProjectAnalysisTasksExecutor(
ceTask, analysisMetadataHolder, qualityGateHolder, qualityGateStatusHolder, reportReader,
system2, new PostProjectAnalysisTask[] {postProjectAnalysisTask1, postProjectAnalysisTask2})
.finished(allStepsExecuted);
.finished(allStepsExecuted);

inOrder.verify(postProjectAnalysisTask1).finished(projectAnalysisArgumentCaptor.capture());
inOrder.verify(postProjectAnalysisTask2).finished(projectAnalysisArgumentCaptor.capture());
Expand All @@ -134,6 +143,34 @@ public void finished_calls_all_PostProjectAnalysisTask_in_order_of_the_array_and
assertThat(allValues.get(0)).isSameAs(allValues.get(1));
}

@Test
@UseDataProvider("booleanValues")
public void organization_is_null_when_organization_are_disabled(boolean allStepsExecuted) {
analysisMetadataHolder.setOrganization(Organization.from(
new OrganizationDto().setKey(organizationKey).setName(organizationName).setUuid(organizationUuid).setDefaultQualityGateUuid("foo"),
false));
underTest.finished(allStepsExecuted);

verify(postProjectAnalysisTask).finished(projectAnalysisArgumentCaptor.capture());

assertThat(projectAnalysisArgumentCaptor.getValue().getOrganization()).isEmpty();
}

@Test
@UseDataProvider("booleanValues")
public void organization_is_not_null_when_organization_are_enabled(boolean allStepsExecuted) {
analysisMetadataHolder.setOrganization(Organization.from(
new OrganizationDto().setKey(organizationKey).setName(organizationName).setUuid(organizationUuid).setDefaultQualityGateUuid("foo"),
true));
underTest.finished(allStepsExecuted);

verify(postProjectAnalysisTask).finished(projectAnalysisArgumentCaptor.capture());

org.sonar.api.ce.posttask.Organization organization = projectAnalysisArgumentCaptor.getValue().getOrganization().get();
assertThat(organization.getKey()).isEqualTo(organizationKey);
assertThat(organization.getName()).isEqualTo(organizationName);
}

@Test
@UseDataProvider("booleanValues")
public void CeTask_status_depends_on_finished_method_argument_is_true_or_false(boolean allStepsExecuted) {
Expand Down Expand Up @@ -325,7 +362,7 @@ public void finished_does_not_fail_if_listener_throws_exception_and_execute_subs
new PostProjectAnalysisTasksExecutor(
ceTask, analysisMetadataHolder, qualityGateHolder, qualityGateStatusHolder, reportReader,
system2, new PostProjectAnalysisTask[] {postProjectAnalysisTask1, postProjectAnalysisTask2, postProjectAnalysisTask3})
.finished(allStepsExecuted);
.finished(allStepsExecuted);

inOrder.verify(postProjectAnalysisTask1).finished(projectAnalysisArgumentCaptor.capture());
inOrder.verify(postProjectAnalysisTask2).finished(projectAnalysisArgumentCaptor.capture());
Expand Down
@@ -0,0 +1,26 @@
/*
* SonarQube
* Copyright (C) 2009-2017 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.api.ce.posttask;

public interface Organization {
String getName();

String getKey();
}
Expand Up @@ -52,6 +52,14 @@ public interface PostProjectAnalysisTask {
* @since 5.5
*/
interface ProjectAnalysis {
/**
* When organizations are enabled in SonarQube, the organization the project belongs to.
*
* @since 7.0
* @return a non empty value when organizations are enabled, otherwise empty
*/
Optional<Organization> getOrganization();

/**
* Details of the Compute Engine task in which the project analysis was run.
*/
Expand Down

0 comments on commit 902fabc

Please sign in to comment.