aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@sonarsource.com>2016-07-20 22:17:16 +0200
committerSimon Brandhof <simon.brandhof@sonarsource.com>2016-07-24 20:39:36 +0200
commitea220db926b379040128da5683e5a2223c7bdab1 (patch)
tree07a37ceac85300c8643b8bebfbe72be297919459
parent784b8e543c4236d0df5e416013d1559140b3f0d1 (diff)
downloadsonarqube-ea220db926b379040128da5683e5a2223c7bdab1.tar.gz
sonarqube-ea220db926b379040128da5683e5a2223c7bdab1.zip
Ability to use selenide and phantomjs in ITs
* selenide should replace Selenese HTML tests * phantomjs should replace Firefox in environments that require XVFB
-rw-r--r--.travis.yml1
-rw-r--r--it/it-tests/pom.xml10
-rw-r--r--it/it-tests/src/test/java/it/Category4Suite.java2
-rw-r--r--it/it-tests/src/test/java/it/lite/LiteTest.java23
-rw-r--r--it/it-tests/src/test/java/it/measure/ProjectOverviewTest.java11
-rw-r--r--it/it-tests/src/test/java/it/qualityProfile/QualityProfilesPageTest.java17
-rw-r--r--it/it-tests/src/test/java/it/ui/UiTest.java32
-rw-r--r--it/it-tests/src/test/java/it/updateCenter/UpdateCenterTest.java1
-rw-r--r--it/it-tests/src/test/java/it/user/AuthenticationTest.java61
-rw-r--r--it/it-tests/src/test/java/pageobjects/LoginPage.java53
-rw-r--r--it/it-tests/src/test/java/pageobjects/Navigation.java112
-rw-r--r--it/it-tests/src/test/java/pageobjects/RuleItem.java41
-rw-r--r--it/it-tests/src/test/java/pageobjects/RulesPage.java52
-rw-r--r--it/it-tests/src/test/java/pageobjects/SelenideConfig.java49
-rw-r--r--it/it-tests/src/test/java/util/ItUtils.java34
-rw-r--r--it/it-tests/src/test/resources/measure/ProjectOverviewTest/should-display-nice-error-on-unknown-project.html24
-rw-r--r--it/it-tests/src/test/resources/qualityProfile/QualityProfilesPageTest/not_found.html24
-rw-r--r--it/it-tests/src/test/resources/ui/UiTest/footer.html28
-rwxr-xr-xtravis.sh26
19 files changed, 492 insertions, 109 deletions
diff --git a/.travis.yml b/.travis.yml
index 25114af6581..063a3632829 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,6 +18,7 @@ cache:
- server/sonar-web/node
- server/sonar-web/node_modules
- $HOME/jvm
+ - $HOME/phantomjs
before_cache:
# remove all the artifacts (JAR, ZIP) that are installed in local repo because of mvn deploy
diff --git a/it/it-tests/pom.xml b/it/it-tests/pom.xml
index c70e2d7d1b8..f13d10e223c 100644
--- a/it/it-tests/pom.xml
+++ b/it/it-tests/pom.xml
@@ -45,6 +45,12 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>com.codeborne</groupId>
+ <artifactId>selenide</artifactId>
+ <version>3.7</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
@@ -116,7 +122,9 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
- <argLine>-Xmx128m -Dsonar.runtimeVersion=${project.version} -Dmaven.localRepository=${settings.localRepository}</argLine>
+ <argLine>-Xmx128m -Dsonar.runtimeVersion=${project.version}
+ -Dmaven.localRepository=${settings.localRepository}
+ </argLine>
<skipTests>${skipIts}</skipTests>
<includes>
<include>*/${category}Suite.java</include>
diff --git a/it/it-tests/src/test/java/it/Category4Suite.java b/it/it-tests/src/test/java/it/Category4Suite.java
index 3596a72be42..15474220cbd 100644
--- a/it/it-tests/src/test/java/it/Category4Suite.java
+++ b/it/it-tests/src/test/java/it/Category4Suite.java
@@ -37,6 +37,7 @@ import it.qualityProfile.QualityProfilesPageTest;
import it.serverSystem.ServerSystemTest;
import it.ui.UiTest;
import it.uiExtension.UiExtensionsTest;
+import it.user.AuthenticationTest;
import it.user.BaseIdentityProviderTest;
import it.user.FavouriteTest;
import it.user.ForceAuthenticationTest;
@@ -60,6 +61,7 @@ import static util.ItUtils.xooPlugin;
MyAccountPageTest.class,
FavouriteTest.class,
// authentication
+ AuthenticationTest.class,
ForceAuthenticationTest.class,
LocalAuthenticationTest.class,
BaseIdentityProviderTest.class,
diff --git a/it/it-tests/src/test/java/it/lite/LiteTest.java b/it/it-tests/src/test/java/it/lite/LiteTest.java
index f013e3a5c95..02c423e6d05 100644
--- a/it/it-tests/src/test/java/it/lite/LiteTest.java
+++ b/it/it-tests/src/test/java/it/lite/LiteTest.java
@@ -19,6 +19,8 @@
*/
package it.lite;
+import com.codeborne.selenide.CollectionCondition;
+import com.codeborne.selenide.Condition;
import com.sonar.orchestrator.Orchestrator;
import org.junit.BeforeClass;
import org.junit.ClassRule;
@@ -31,8 +33,13 @@ import org.sonarqube.ws.client.component.TreeWsRequest;
import org.sonarqube.ws.client.issue.SearchWsRequest;
import org.sonarqube.ws.client.measure.ComponentTreeWsRequest;
import org.sonarqube.ws.client.measure.ComponentWsRequest;
+import pageobjects.Navigation;
+import pageobjects.RuleItem;
+import pageobjects.RulesPage;
import util.ItUtils;
+import static com.codeborne.selenide.Condition.hasText;
+import static com.codeborne.selenide.Condition.or;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
@@ -98,4 +105,20 @@ public class LiteTest {
assertThat(c.getMeasuresList()).extracting(m -> m.getMetric()).containsOnly("lines", "ncloc");
});
}
+
+ @Test
+ public void open_page_rules() {
+ RulesPage rulesPage = Navigation.get(ORCHESTRATOR)
+ .openHomepage()
+ .clickOnRules();
+
+ // wait for rules to be displayed
+ rulesPage.getRules().shouldHave(CollectionCondition.sizeGreaterThan(0));
+
+ assertThat(rulesPage.getTotal()).isGreaterThan(0);
+ for (RuleItem ruleItem : rulesPage.getRulesAsItems()) {
+ ruleItem.getTitle().should(Condition.visible);
+ ruleItem.getMetadata().should(or("have type", hasText("Bug"), hasText("Code Smell"), hasText("Vulnerability")));
+ }
+ }
}
diff --git a/it/it-tests/src/test/java/it/measure/ProjectOverviewTest.java b/it/it-tests/src/test/java/it/measure/ProjectOverviewTest.java
index cdcf92f1e1c..96f27688ea1 100644
--- a/it/it-tests/src/test/java/it/measure/ProjectOverviewTest.java
+++ b/it/it-tests/src/test/java/it/measure/ProjectOverviewTest.java
@@ -26,8 +26,10 @@ import it.Category1Suite;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
+import pageobjects.Navigation;
import util.selenium.SeleneseTest;
+import static com.codeborne.selenide.Condition.text;
import static util.ItUtils.projectDir;
public class ProjectOverviewTest {
@@ -51,10 +53,11 @@ public class ProjectOverviewTest {
}
@Test
- public void should_display_a_nice_error_when_requesting_unknown_project() {
- Selenese selenese = Selenese.builder().setHtmlTestsInClasspath("should_display_a_nice_error_when_requesting_unknown_project",
- "/measure/ProjectOverviewTest/should-display-nice-error-on-unknown-project.html").build();
- orchestrator.executeSelenese(selenese);
+ public void display_a_nice_error_when_requesting_unknown_project() {
+ Navigation nav = Navigation.get(orchestrator);
+ nav.open("/dashboard/index?id=unknown");
+ nav.getErrorMessage().should(text("The requested project does not exist. Either it has never been analyzed successfully or it has been deleted."));
+ // TODO verify that on global homepage
}
private void executeBuild(String projectLocation, String projectKey, String projectName) {
diff --git a/it/it-tests/src/test/java/it/qualityProfile/QualityProfilesPageTest.java b/it/it-tests/src/test/java/it/qualityProfile/QualityProfilesPageTest.java
index d9ffc805ad6..cd182dfe47d 100644
--- a/it/it-tests/src/test/java/it/qualityProfile/QualityProfilesPageTest.java
+++ b/it/it-tests/src/test/java/it/qualityProfile/QualityProfilesPageTest.java
@@ -19,16 +19,23 @@
*/
package it.qualityProfile;
+import com.codeborne.selenide.Condition;
import com.sonar.orchestrator.Orchestrator;
import com.sonar.orchestrator.build.SonarScanner;
import com.sonar.orchestrator.selenium.Selenese;
import it.Category4Suite;
-import org.junit.*;
-import org.junit.experimental.categories.Category;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Ignore;
+import org.junit.Test;
import org.sonarqube.ws.client.PostRequest;
import org.sonarqube.ws.client.WsClient;
+import pageobjects.Navigation;
import util.selenium.SeleneseTest;
+import static com.codeborne.selenide.Selenide.$;
import static util.ItUtils.newAdminWsClient;
import static util.ItUtils.projectDir;
@@ -82,9 +89,9 @@ public class QualityProfilesPageTest {
@Test
public void testNotFound() {
- Selenese selenese = Selenese.builder().setHtmlTestsInClasspath("test_not_found",
- "/qualityProfile/QualityProfilesPageTest/not_found.html").build();
- orchestrator.executeSelenese(selenese);
+ Navigation nav = Navigation.get(orchestrator);
+ nav.open("/profiles/show?key=unknown");
+ $(".quality-profile-not-found").should(Condition.visible);
}
@Test
diff --git a/it/it-tests/src/test/java/it/ui/UiTest.java b/it/it-tests/src/test/java/it/ui/UiTest.java
index 7e3a84526be..c4960f9192e 100644
--- a/it/it-tests/src/test/java/it/ui/UiTest.java
+++ b/it/it-tests/src/test/java/it/ui/UiTest.java
@@ -20,24 +20,38 @@
package it.ui;
import com.sonar.orchestrator.Orchestrator;
-import com.sonar.orchestrator.selenium.Selenese;
import it.Category4Suite;
+import java.util.Map;
import org.junit.ClassRule;
+import org.junit.Rule;
import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import util.selenium.SeleneseTest;
+import org.sonarqube.ws.client.GetRequest;
+import org.sonarqube.ws.client.WsResponse;
+import pageobjects.Navigation;
+import util.ItUtils;
+
+import static com.codeborne.selenide.Condition.hasText;
public class UiTest {
@ClassRule
- public static Orchestrator orchestrator = Category4Suite.ORCHESTRATOR;
+ public static final Orchestrator ORCHESTRATOR = Category4Suite.ORCHESTRATOR;
+
+ @Rule
+ public Navigation nav = Navigation.get(ORCHESTRATOR);
@Test
- public void test_footer() {
- new SeleneseTest(
- Selenese.builder().setHtmlTestsInClasspath("ui-footer",
- "/ui/UiTest/footer.html"
- ).build()).runOn(orchestrator);
+ public void footer_contains_information() {
+ nav.getFooter()
+ .should(hasText("Documentation"))
+ .should(hasText("SonarSource SA"));
}
+ @Test
+ public void footer_contains_version() {
+ WsResponse status = ItUtils.newAdminWsClient(ORCHESTRATOR).wsConnector().call(new GetRequest("api/system/status"));
+ Map<String, Object> statusMap = ItUtils.jsonToMap(status.content());
+
+ nav.getFooter().should(hasText((String) statusMap.get("version")));
+ }
}
diff --git a/it/it-tests/src/test/java/it/updateCenter/UpdateCenterTest.java b/it/it-tests/src/test/java/it/updateCenter/UpdateCenterTest.java
index 1fea840524b..04eaadb5de1 100644
--- a/it/it-tests/src/test/java/it/updateCenter/UpdateCenterTest.java
+++ b/it/it-tests/src/test/java/it/updateCenter/UpdateCenterTest.java
@@ -25,7 +25,6 @@ import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.junit.ClassRule;
import org.junit.Test;
-import org.junit.experimental.categories.Category;
import org.sonar.wsclient.services.Plugin;
import org.sonar.wsclient.services.UpdateCenterQuery;
import util.selenium.SeleneseTest;
diff --git a/it/it-tests/src/test/java/it/user/AuthenticationTest.java b/it/it-tests/src/test/java/it/user/AuthenticationTest.java
new file mode 100644
index 00000000000..e15c6af1081
--- /dev/null
+++ b/it/it-tests/src/test/java/it/user/AuthenticationTest.java
@@ -0,0 +1,61 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact 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 it.user;
+
+import com.codeborne.selenide.Condition;
+import com.sonar.orchestrator.Orchestrator;
+import it.Category4Suite;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import pageobjects.LoginPage;
+import pageobjects.Navigation;
+
+public class AuthenticationTest {
+
+ @ClassRule
+ public static Orchestrator ORCHESTRATOR = Category4Suite.ORCHESTRATOR;
+
+ @Rule
+ public Navigation nav = Navigation.get(ORCHESTRATOR);
+
+ @Test
+ public void log_in_with_correct_credentials_then_log_out() {
+ nav.shouldNotBeLoggedIn();
+
+ Navigation page = nav.logIn().submitCredentials("admin", "admin");
+ page.getRightBar().shouldHave(Condition.text("Administrator"));
+ nav.shouldBeLoggedIn();
+
+ nav.logOut();
+ nav.shouldNotBeLoggedIn();
+ }
+
+ @Test
+ public void log_in_with_wrong_credentials() {
+ LoginPage page = nav
+ .logIn()
+ .submitWrongCredentials("admin", "wrong");
+ page.getErrorMessage().shouldHave(Condition.text("Authentication failed"));
+
+ nav.openHomepage();
+ nav.shouldNotBeLoggedIn();
+ }
+}
diff --git a/it/it-tests/src/test/java/pageobjects/LoginPage.java b/it/it-tests/src/test/java/pageobjects/LoginPage.java
new file mode 100644
index 00000000000..bf946b27afa
--- /dev/null
+++ b/it/it-tests/src/test/java/pageobjects/LoginPage.java
@@ -0,0 +1,53 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact 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 pageobjects;
+
+import com.codeborne.selenide.Condition;
+import com.codeborne.selenide.SelenideElement;
+import org.openqa.selenium.By;
+
+import static com.codeborne.selenide.Selenide.$;
+import static com.codeborne.selenide.Selenide.page;
+
+public class LoginPage {
+
+ public LoginPage() {
+ $("#login_form").should(Condition.exist);
+ }
+
+ public Navigation submitCredentials(String login, String password) {
+ return submitCredentials(login, password, Navigation.class);
+ }
+
+ public LoginPage submitWrongCredentials(String login, String password) {
+ return submitCredentials(login, password, LoginPage.class);
+ }
+
+ public SelenideElement getErrorMessage() {
+ return $(By.cssSelector("#login_form .alert"));
+ }
+
+ private <T> T submitCredentials(String login, String password, Class<T> expectedResultPage) {
+ $("#login").val(login);
+ $("#password").val(password);
+ $(By.name("commit")).click();
+ return page(expectedResultPage);
+ }
+}
diff --git a/it/it-tests/src/test/java/pageobjects/Navigation.java b/it/it-tests/src/test/java/pageobjects/Navigation.java
new file mode 100644
index 00000000000..395509c5fad
--- /dev/null
+++ b/it/it-tests/src/test/java/pageobjects/Navigation.java
@@ -0,0 +1,112 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact 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 pageobjects;
+
+import com.codeborne.selenide.Condition;
+import com.codeborne.selenide.Selenide;
+import com.codeborne.selenide.SelenideElement;
+import com.codeborne.selenide.WebDriverRunner;
+import com.sonar.orchestrator.Orchestrator;
+import org.junit.rules.ExternalResource;
+import org.openqa.selenium.By;
+
+import static com.codeborne.selenide.Selenide.$;
+import static com.codeborne.selenide.Selenide.page;
+
+public class Navigation extends ExternalResource {
+
+ public static Navigation get(Orchestrator orchestrator) {
+ String browser = orchestrator.getConfiguration().getString("orchestrator.browser", "firefox");
+ SelenideConfig.INSTANCE
+ .setBrowser(browser)
+ .setBaseUrl(orchestrator.getServer().getUrl());
+ return new Navigation();
+ }
+
+ @Override
+ protected void before() throws Throwable {
+ WebDriverRunner.getWebDriver().manage().deleteAllCookies();
+ openHomepage();
+ }
+
+ public Navigation openHomepage() {
+ return open("/", Navigation.class);
+ }
+
+ public void open(String relativeUrl) {
+ Selenide.open(relativeUrl);
+ }
+
+ public <P> P open(String relativeUrl, Class<P> pageObjectClassClass) {
+ return Selenide.open(relativeUrl, pageObjectClassClass);
+ }
+
+ public void shouldBeLoggedIn() {
+ loggedInDropdown().should(Condition.visible);
+ }
+
+ public void shouldNotBeLoggedIn() {
+ logInLink().should(Condition.visible);
+ }
+
+ public LoginPage logIn() {
+ logInLink().click();
+ return Selenide.page(LoginPage.class);
+ }
+
+ public Navigation logOut() {
+ SelenideElement dropdown = loggedInDropdown();
+ // click must be on the <a> but not on the dropdown <li>
+ // for compatibility with phantomjs
+ dropdown.find(".dropdown-toggle").click();
+ dropdown.find(By.linkText("Log out")).click();
+ return this;
+ }
+
+ public RulesPage clickOnRules() {
+ $(By.linkText("Rules")).click();
+ return page(RulesPage.class);
+ }
+
+ public SelenideElement clickOnQualityProfiles() {
+ return $(By.linkText("Quality Profiles"));
+ }
+
+ public SelenideElement getRightBar() {
+ return $("#global-navigation .navbar-right");
+ }
+
+ public SelenideElement getFooter() {
+ return $("#footer");
+ }
+
+ public SelenideElement getErrorMessage() {
+ return $("#error");
+ }
+
+ private SelenideElement logInLink() {
+ return $(By.linkText("Log in"));
+ }
+
+ private SelenideElement loggedInDropdown() {
+ return $(".js-user-authenticated");
+ }
+
+}
diff --git a/it/it-tests/src/test/java/pageobjects/RuleItem.java b/it/it-tests/src/test/java/pageobjects/RuleItem.java
new file mode 100644
index 00000000000..454b04617ed
--- /dev/null
+++ b/it/it-tests/src/test/java/pageobjects/RuleItem.java
@@ -0,0 +1,41 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact 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 pageobjects;
+
+import com.codeborne.selenide.SelenideElement;
+
+public class RuleItem {
+
+ private final SelenideElement elt;
+
+ public RuleItem(SelenideElement elt) {
+ this.elt = elt;
+ }
+
+ public SelenideElement getTitle() {
+ return elt.$(".coding-rule-title");
+ }
+
+ public SelenideElement getMetadata() {
+ return elt.$(".coding-rule-meta");
+ }
+
+
+}
diff --git a/it/it-tests/src/test/java/pageobjects/RulesPage.java b/it/it-tests/src/test/java/pageobjects/RulesPage.java
new file mode 100644
index 00000000000..6d5d1343fd7
--- /dev/null
+++ b/it/it-tests/src/test/java/pageobjects/RulesPage.java
@@ -0,0 +1,52 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact 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 pageobjects;
+
+import com.codeborne.selenide.Condition;
+import com.codeborne.selenide.ElementsCollection;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.openqa.selenium.By;
+
+import static com.codeborne.selenide.Selenide.$;
+import static com.codeborne.selenide.Selenide.$$;
+
+public class RulesPage {
+
+ public RulesPage() {
+ $(By.cssSelector(".coding-rules")).should(Condition.exist);
+ }
+
+ public ElementsCollection getRules() {
+ return $$(".coding-rules .coding-rule");
+ }
+
+ public List<RuleItem> getRulesAsItems() {
+ return getRules()
+ .stream()
+ .map(elt -> new RuleItem(elt))
+ .collect(Collectors.toList());
+ }
+
+ public int getTotal() {
+ // warning - number is localized
+ return Integer.parseInt($("#coding-rules-total").text());
+ }
+}
diff --git a/it/it-tests/src/test/java/pageobjects/SelenideConfig.java b/it/it-tests/src/test/java/pageobjects/SelenideConfig.java
new file mode 100644
index 00000000000..a7e9bcf6ed1
--- /dev/null
+++ b/it/it-tests/src/test/java/pageobjects/SelenideConfig.java
@@ -0,0 +1,49 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2016 SonarSource SA
+ * mailto:contact 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 pageobjects;
+
+import com.codeborne.selenide.Configuration;
+import com.google.common.collect.ImmutableSet;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+enum SelenideConfig {
+ INSTANCE;
+
+ private static final Set<String> SUPPORTED_BROWSERS = ImmutableSet.of("firefox", "phantomjs");
+
+ SelenideConfig() {
+ Configuration.reportsFolder = "target/screenshots";
+ }
+
+ public SelenideConfig setBrowser(String browser) {
+ checkArgument(SUPPORTED_BROWSERS.contains(requireNonNull(browser)), "Browser is not supported: %s", browser);
+ Configuration.browser = browser;
+ return this;
+ }
+
+ public SelenideConfig setBaseUrl(String s) {
+ Configuration.baseUrl = requireNonNull(s);
+ return this;
+ }
+
+}
diff --git a/it/it-tests/src/test/java/util/ItUtils.java b/it/it-tests/src/test/java/util/ItUtils.java
index 50a2fc1d414..795def12588 100644
--- a/it/it-tests/src/test/java/util/ItUtils.java
+++ b/it/it-tests/src/test/java/util/ItUtils.java
@@ -24,6 +24,8 @@ import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
import com.sonar.orchestrator.Orchestrator;
import com.sonar.orchestrator.build.BuildResult;
import com.sonar.orchestrator.build.SonarRunner;
@@ -31,10 +33,12 @@ import com.sonar.orchestrator.container.Server;
import com.sonar.orchestrator.locator.FileLocation;
import java.io.File;
import java.io.IOException;
+import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
+import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
@@ -280,18 +284,24 @@ public class ItUtils {
public static List<String> extractCeTaskIds(BuildResult buildResult) {
String logs = buildResult.getLogs();
return from(LINE_SPLITTER.split(logs))
- .filter(new Predicate<String>() {
- @Override
- public boolean apply(String s) {
- return s.contains("More about the report processing at");
- }
- }).transform(new Function<String, String>() {
- @Nullable
- @Override
- public String apply(String s) {
- return s.substring(s.length() - 20, s.length());
- }
- }).toList();
+ .filter(new Predicate<String>() {
+ @Override
+ public boolean apply(String s) {
+ return s.contains("More about the report processing at");
+ }
+ }).transform(new Function<String, String>() {
+ @Nullable
+ @Override
+ public String apply(String s) {
+ return s.substring(s.length() - 20, s.length());
+ }
+ }).toList();
}
+ public static Map<String, Object> jsonToMap(String json) {
+ Gson gson = new Gson();
+ Type type = new TypeToken<Map<String, Object>>() {
+ }.getType();
+ return gson.fromJson(json, type);
+ }
}
diff --git a/it/it-tests/src/test/resources/measure/ProjectOverviewTest/should-display-nice-error-on-unknown-project.html b/it/it-tests/src/test/resources/measure/ProjectOverviewTest/should-display-nice-error-on-unknown-project.html
deleted file mode 100644
index 3cbf2bf44fa..00000000000
--- a/it/it-tests/src/test/resources/measure/ProjectOverviewTest/should-display-nice-error-on-unknown-project.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <title>static-files</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<tbody>
-<tr>
- <td>open</td>
- <td>/dashboard/index?id=unknown</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForText</td>
- <td>error</td>
- <td>*The requested project does not exist. Either it has never been analyzed successfully or it has been deleted.*</td>
-</tr>
-</tbody>
-</table>
-</body>
-</html>
diff --git a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesPageTest/not_found.html b/it/it-tests/src/test/resources/qualityProfile/QualityProfilesPageTest/not_found.html
deleted file mode 100644
index 220d39856d6..00000000000
--- a/it/it-tests/src/test/resources/qualityProfile/QualityProfilesPageTest/not_found.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <title>not_found</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
- <tbody>
- <tr>
- <td>open</td>
- <td>/profiles/show?key=unknown</td>
- <td></td>
- </tr>
- <tr>
- <td>waitForElementPresent</td>
- <td>css=.quality-profile-not-found</td>
- <td></td>
- </tr>
- </tbody>
-</table>
-</body>
-</html> \ No newline at end of file
diff --git a/it/it-tests/src/test/resources/ui/UiTest/footer.html b/it/it-tests/src/test/resources/ui/UiTest/footer.html
deleted file mode 100644
index 4fea7c4a5d9..00000000000
--- a/it/it-tests/src/test/resources/ui/UiTest/footer.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
- <thead>
- <tr>
- <td rowspan="1" colspan="3">footer</td>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>open</td>
- <td>/</td>
- <td></td>
-</tr>
-<tr>
- <td>waitForText</td>
- <td>footer</td>
- <td>*SonarSource SA*</td>
-</tr>
-</tbody>
-</table>
-</body>
-</html>
diff --git a/travis.sh b/travis.sh
index 4af83f56364..6ac9d81517f 100755
--- a/travis.sh
+++ b/travis.sh
@@ -2,6 +2,20 @@
set -euo pipefail
+function installPhantomJs {
+ echo "Setup PhantomJS 2.1"
+ mkdir -p ~/phantomjs
+ pushd ~/phantomjs > /dev/null
+ if [ ! -d "phantomjs-2.1.1-linux-x86_64" ]; then
+ wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 -O phantomjs-2.1.1-linux-x86_64.tar.bz2
+ tar -xf phantomjs-2.1.1-linux-x86_64.tar.bz2
+ rm phantomjs-2.1.1-linux-x86_64.tar.bz2
+ fi
+ popd > /dev/null
+ export PHANTOMJS_HOME=~/phantomjs/phantomjs-2.1.1-linux-x86_64
+ export PATH=$PHANTOMJS_HOME/bin:$PATH
+}
+
function configureTravis {
mkdir ~/.local
curl -sSL https://github.com/SonarSource/travis-utils/tarball/v31 | tar zx --strip-components 1 -C ~/.local
@@ -21,6 +35,14 @@ CI)
set_maven_build_version $TRAVIS_BUILD_NUMBER
fi
+ if [[ $INITIAL_VERSION =~ "-SNAPSHOT" ]]; then
+ echo "======= Found SNAPSHOT version ======="
+ # Do not deploy a SNAPSHOT version but the release version related to this build
+ set_maven_build_version $TRAVIS_BUILD_NUMBER
+ else
+ echo "======= Found RELEASE version ======="
+ fi
+
if [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
echo 'Analyse and trigger QA of master branch'
@@ -68,7 +90,9 @@ CI)
-Dsource.skip=true
fi
- ./run-integration-tests.sh "Lite" ""
+
+ installPhantomJs
+ ./run-integration-tests.sh "Lite" "" -Dorchestrator.browser=phantomjs
;;
WEB)