]> source.dussan.org Git - sonarqube.git/blob
023793635c69140f4982388166dae376d41e0f6d
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2017 SonarSource SA
4  * mailto:info AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 package org.sonar.server.platform.db.migration.version.v60;
21
22 import java.sql.SQLException;
23 import java.util.Map;
24 import javax.annotation.Nullable;
25 import org.junit.Rule;
26 import org.junit.Test;
27 import org.sonar.api.resources.Qualifiers;
28 import org.sonar.db.CoreDbTester;
29
30 import static java.lang.String.valueOf;
31 import static org.assertj.core.api.Assertions.assertThat;
32
33 public class PopulateAnalysisUuidOnMeasuresTest {
34
35   private static final String TABLE_MEASURES = "project_measures";
36   private static final String TABLE_SNAPSHOTS = "snapshots";
37
38   @Rule
39   public CoreDbTester db = CoreDbTester.createForSchema(PopulateAnalysisUuidOnMeasuresTest.class,
40     "old_measures.sql");
41
42   private PopulateAnalysisUuidOnMeasures underTest = new PopulateAnalysisUuidOnMeasures(db.database());
43
44   @Test
45   public void migration_has_no_effect_on_empty_tables() throws SQLException {
46     underTest.execute();
47
48     assertThat(db.countRowsOfTable(TABLE_MEASURES)).isEqualTo(0);
49   }
50
51   @Test
52   public void migration_populates_analysis_uuids() throws SQLException {
53     insertSnapshot(1, "U1", Qualifiers.PROJECT, null);
54     insertSnapshot(2, "U2", Qualifiers.DIRECTORY, 1L);
55     insertSnapshot(3, "U3", Qualifiers.FILE, 1L);
56     insertMeasure(21, 1);
57     insertMeasure(22, 2);
58     insertMeasure(23, 3);
59
60     underTest.execute();
61
62     verifyAnalysisUuid(21, "U1");
63     verifyAnalysisUuid(22, "U1");
64     verifyAnalysisUuid(23, "U1");
65   }
66
67   @Test
68   public void migration_is_reentrant() throws SQLException {
69     insertSnapshot(1, "U1", Qualifiers.PROJECT, 1L);
70     insertMeasure(21, 1);
71
72     underTest.execute();
73     verifyAnalysisUuid(21, "U1");
74
75     underTest.execute();
76     verifyAnalysisUuid(21, "U1");
77   }
78
79   private void verifyAnalysisUuid(int measureId, @Nullable String expectedAnalysisUuid) {
80     Map<String, Object> rows = db.selectFirst("select analysis_uuid as \"analysisUuid\" from project_measures where id=" + measureId);
81     assertThat(rows.get("analysisUuid")).isEqualTo(expectedAnalysisUuid);
82   }
83
84   private String insertSnapshot(long id, String uuid, String qualifier, @Nullable Long rootSnapshotId) {
85     int depth;
86     switch (qualifier) {
87       case "TRK":
88         depth = 0;
89         break;
90       case "BRC":
91         depth = 1;
92         break;
93       case "DIR":
94         depth = 2;
95         break;
96       case "FIL":
97         depth = 3;
98         break;
99       default:
100         throw new IllegalArgumentException();
101     }
102     db.executeInsert(
103       TABLE_SNAPSHOTS,
104       "ID", valueOf(id),
105       "UUID", uuid,
106       "COMPONENT_UUID", valueOf(id + 10),
107       "ROOT_COMPONENT_UUID", valueOf(id + 10),
108       "ROOT_SNAPSHOT_ID", rootSnapshotId != null ? valueOf(rootSnapshotId) : null,
109       "QUALIFIER", qualifier,
110       "DEPTH", valueOf(depth));
111     return uuid;
112   }
113
114   private void insertMeasure(long id, long snapshotId) {
115     db.executeInsert(
116       TABLE_MEASURES,
117       "ID", valueOf(id),
118       "SNAPSHOT_ID", valueOf(snapshotId),
119       "METRIC_ID", valueOf(id + 100),
120       "VALUE", valueOf(id + 200),
121       "COMPONENT_UUID", valueOf(id + 300));
122   }
123 }