You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@falcon.apache.org by ro...@apache.org on 2015/05/07 09:16:26 UTC
falcon git commit: FALCON-1198 Test buttons available on search
results page. Contributed by Ruslan Ostafiychuk
Repository: falcon
Updated Branches:
refs/heads/master 9da286574 -> 7f9a77fbc
FALCON-1198 Test buttons available on search results page. Contributed by Ruslan Ostafiychuk
Project: http://git-wip-us.apache.org/repos/asf/falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/falcon/commit/7f9a77fb
Tree: http://git-wip-us.apache.org/repos/asf/falcon/tree/7f9a77fb
Diff: http://git-wip-us.apache.org/repos/asf/falcon/diff/7f9a77fb
Branch: refs/heads/master
Commit: 7f9a77fbcfd2dec29bf01044d295d1e39a8ec6a7
Parents: 9da2865
Author: Ruslan Ostafiychuk <ro...@apache.org>
Authored: Wed May 6 17:40:51 2015 +0300
Committer: Ruslan Ostafiychuk <ro...@apache.org>
Committed: Thu May 7 10:11:47 2015 +0300
----------------------------------------------------------------------
falcon-regression/CHANGES.txt | 2 +
.../core/enumsAndConstants/MerlinConstants.java | 6 +-
.../org/apache/falcon/request/BaseRequest.java | 3 +-
.../org/apache/falcon/request/RequestKeys.java | 2 -
.../falcon/regression/ui/search/SearchPage.java | 61 +++++++++-
.../searchUI/EntitiesTableReflectionTest.java | 116 ++++++++++++++++---
6 files changed, 167 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/falcon/blob/7f9a77fb/falcon-regression/CHANGES.txt
----------------------------------------------------------------------
diff --git a/falcon-regression/CHANGES.txt b/falcon-regression/CHANGES.txt
index 5d2400c..56827be 100644
--- a/falcon-regression/CHANGES.txt
+++ b/falcon-regression/CHANGES.txt
@@ -5,6 +5,8 @@ Trunk (Unreleased)
INCOMPATIBLE CHANGES
NEW FEATURES
+ FALCON-1198 Test buttons available on search results page (Ruslan Ostafiychuk)
+
FALCON-1187 Test that changes made via API are reflected on UI (Ruslan Ostafiychuk
via Raghav Kumar Gautam)
http://git-wip-us.apache.org/repos/asf/falcon/blob/7f9a77fb/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/enumsAndConstants/MerlinConstants.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/enumsAndConstants/MerlinConstants.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/enumsAndConstants/MerlinConstants.java
index 7f0f5c7..299be67 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/enumsAndConstants/MerlinConstants.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/enumsAndConstants/MerlinConstants.java
@@ -19,7 +19,6 @@
package org.apache.falcon.regression.core.enumsAndConstants;
import org.apache.falcon.regression.core.util.Config;
-import org.apache.falcon.request.RequestKeys;
import org.apache.hadoop.conf.Configuration;
import org.testng.Assert;
import org.apache.log4j.Logger;
@@ -54,7 +53,8 @@ public final class MerlinConstants {
"https://repo1.maven.org/maven2/org/apache/oozie/oozie-examples/4.1.0/oozie-examples-4.1.0.jar");
/** the user that is going to run tests. */
- public static final String CURRENT_USER_NAME = System.getProperty("user.name");
+ public static final String CURRENT_USER_NAME = Config.getProperty("current_user_name",
+ System.getProperty("user.name"));
/** keytab of current user. */
private static final String CURRENT_USER_KEYTAB_STR = "current_user_keytab";
/** group of the current user. */
@@ -80,8 +80,6 @@ public final class MerlinConstants {
public static final String USER2_NAME;
private static HashMap<String, String> keyTabMap;
private static HashMap<String, String> passwordMap;
- public static final String ACL_OWNER = Config.getProperty("ACL.OWNER", RequestKeys.CURRENT_USER);
- public static final String ACL_GROUP = Config.getProperty("ACL.GROUP", "default");
public static final String USER_REALM = Config.getProperty("USER.REALM", "");
public static final String WASB_CONTAINER = Config.getProperty("wasb.container", "");
public static final String WASB_SECRET = Config.getProperty("wasb.secret", "");
http://git-wip-us.apache.org/repos/asf/falcon/blob/7f9a77fb/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/BaseRequest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/BaseRequest.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/BaseRequest.java
index a70ceeb..7157111 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/BaseRequest.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/BaseRequest.java
@@ -19,6 +19,7 @@
package org.apache.falcon.request;
import org.apache.commons.net.util.TrustManagerUtils;
+import org.apache.falcon.regression.core.enumsAndConstants.MerlinConstants;
import org.apache.falcon.regression.core.helpers.entity.AbstractEntityHelper;
import org.apache.falcon.security.FalconAuthorizationToken;
import org.apache.hadoop.security.authentication.client.AuthenticatedURL;
@@ -96,7 +97,7 @@ public class BaseRequest {
this.method = method;
this.url = url;
this.requestData = null;
- this.user = (null == user) ? RequestKeys.CURRENT_USER : user;
+ this.user = (null == user) ? MerlinConstants.CURRENT_USER_NAME : user;
this.uri = new URI(url);
target = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme());
this.headers = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/falcon/blob/7f9a77fb/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/RequestKeys.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/RequestKeys.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/RequestKeys.java
index 3232978..b2e38b2 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/RequestKeys.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/request/RequestKeys.java
@@ -32,6 +32,4 @@ public final class RequestKeys {
public static final String COOKIE = "Cookie";
public static final String WWW_AUTHENTICATE = "WWW-Authenticate";
public static final String NEGOTIATE = "Negotiate";
- public static final String CURRENT_USER = System
- .getProperty("user.name");
}
http://git-wip-us.apache.org/repos/asf/falcon/blob/7f9a77fb/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/SearchPage.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/SearchPage.java b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/SearchPage.java
index 9ad2591..aabd9ca 100644
--- a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/SearchPage.java
+++ b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/SearchPage.java
@@ -18,6 +18,7 @@
package org.apache.falcon.regression.ui.search;
+import org.apache.falcon.regression.core.util.TimeUtil;
import org.apache.falcon.regression.core.util.UIAssert;
import org.apache.log4j.Logger;
import org.openqa.selenium.By;
@@ -31,10 +32,16 @@ import org.testng.Assert;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.EnumSet;
import java.util.List;
+import java.util.Set;
/** Page object for the Search Page. */
public class SearchPage extends AbstractSearchPage {
+
+ private static final String CLASS_OF_SELECTED_ROW = "rowSelected";
+ private static final int ANIMATION_DELAY = 2;
+
public SearchPage(WebDriver driver) {
super(driver);
}
@@ -78,8 +85,7 @@ public class SearchPage extends AbstractSearchPage {
final SearchResult searchResult = SearchResult.create(entityName);
final String[] allClasses = oneResultElement.getAttribute("class").split(" ");
- final String classOfSelectedRow = "rowSelected";
- if (Arrays.asList(allClasses).contains(classOfSelectedRow)) {
+ if (Arrays.asList(allClasses).contains(CLASS_OF_SELECTED_ROW)) {
searchResult.withChecked(true);
}
@@ -162,6 +168,26 @@ public class SearchPage extends AbstractSearchPage {
UIAssert.assertNotDisplayed(resultBlock, "Search result block");
}
+ public void selectRow(int row) {
+ changeRowClickedStatus(row, true);
+ }
+
+ public void deselectRow(int row) {
+ changeRowClickedStatus(row, false);
+ }
+
+ private void changeRowClickedStatus(int row, boolean checked) {
+ WebElement checkboxBlock = resultBlock.findElements(By.className("entityRow")).get(row - 1);
+ if (checked != checkboxBlock.getAttribute("class").contains(CLASS_OF_SELECTED_ROW)) {
+ checkboxBlock.findElement(By.xpath("./td/input")).click();
+ }
+ }
+
+ public void clickSelectAll() {
+ resultBlock.findElement(By.xpath(".//input[@ng-model='selectedAll']")).click();
+ }
+
+
/** Class representing search query displayed in the search box. */
public static final class SearchQuery {
private WebElement searchBlock;
@@ -254,6 +280,37 @@ public class SearchPage extends AbstractSearchPage {
}
}
+ public Set<Button> getButtons(boolean active) {
+ List<WebElement> buttons = resultBlock.findElement(By.className("buttonsRow"))
+ .findElements(By.className("btn"));
+ Set<Button> result = EnumSet.noneOf(Button.class);
+ for (WebElement button : buttons) {
+ if ((button.getAttribute("disabled") == null) == active) {
+ result.add(Button.valueOf(button.getText()));
+ }
+ }
+ return result;
+ }
+
+ public void clickButton(Button button) {
+ resultBlock.findElement(By.className("buttonsRow"))
+ .findElements(By.className("btn")).get(button.ordinal()).click();
+ TimeUtil.sleepSeconds(ANIMATION_DELAY);
+ }
+
+ /**
+ * Buttons available for entities in result box.
+ */
+ public enum Button {
+ Schedule,
+ Resume,
+ Suspend,
+ Edit,
+ Copy,
+ Delete,
+ XML
+ }
+
/** Class representing search result displayed on the entity table page. */
public static final class SearchResult {
private boolean isChecked = false;
http://git-wip-us.apache.org/repos/asf/falcon/blob/7f9a77fb/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/EntitiesTableReflectionTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/EntitiesTableReflectionTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/EntitiesTableReflectionTest.java
index 8d64a0e..cbad93a 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/EntitiesTableReflectionTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/EntitiesTableReflectionTest.java
@@ -18,24 +18,31 @@
package org.apache.falcon.regression.searchUI;
+import org.apache.falcon.regression.Entities.ProcessMerlin;
import org.apache.falcon.regression.core.bundle.Bundle;
import org.apache.falcon.regression.core.util.AssertUtil;
import org.apache.falcon.regression.core.util.BundleUtil;
import org.apache.falcon.regression.core.util.OSUtil;
-import org.apache.falcon.regression.core.util.Util;
import org.apache.falcon.regression.testHelper.BaseUITestClass;
import org.apache.falcon.regression.ui.pages.Page.EntityStatus;
import org.apache.falcon.regression.ui.search.LoginPage;
import org.apache.falcon.regression.ui.search.SearchPage;
+import org.apache.falcon.regression.ui.search.SearchPage.Button;
import org.apache.hadoop.security.authentication.client.AuthenticationException;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import javax.xml.bind.JAXBException;
import java.io.IOException;
import java.net.URISyntaxException;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
/** UI tests for entities table with search results. */
@Test(groups = "search-ui")
@@ -44,20 +51,37 @@ public class EntitiesTableReflectionTest extends BaseUITestClass {
private String aggregateWorkflowDir = baseTestDir + "/aggregator";
private SearchPage searchPage = null;
+ private String twoProcessesNameStart;
+ private Map<String, String> processesMap = new TreeMap<>();
@BeforeClass(alwaysRun = true)
- public void setup()
- throws URISyntaxException, IOException, AuthenticationException, InterruptedException,
- JAXBException {
+ public void setup() throws IOException {
uploadDirToClusters(aggregateWorkflowDir, OSUtil.RESOURCES_OOZIE);
openBrowser();
searchPage = LoginPage.open(getDriver()).doDefaultLogin();
+ }
+
+ @BeforeMethod(alwaysRun = true)
+ public void submitEntities()
+ throws URISyntaxException, IOException, AuthenticationException, InterruptedException,
+ JAXBException {
bundles[0] = BundleUtil.readELBundle();
bundles[0] = new Bundle(bundles[0], servers.get(0));
bundles[0].generateUniqueBundle(this);
bundles[0].setProcessWorkflow(aggregateWorkflowDir);
- bundles[0].submitBundle(prism);
-
+ bundles[0].submitClusters(prism);
+ bundles[0].submitFeeds(prism);
+
+ ProcessMerlin process = bundles[0].getProcessObject();
+ twoProcessesNameStart = process.getName() + '-';
+ process.setName(twoProcessesNameStart + 1);
+ bundles[0].setProcessData(process.toString());
+ prism.getProcessHelper().submitEntity(process.toString());
+ processesMap.put(process.getName(), process.toString());
+
+ process.setName(twoProcessesNameStart + 2);
+ prism.getProcessHelper().submitEntity(process.toString());
+ processesMap.put(process.getName(), process.toString());
}
@Test
@@ -96,20 +120,84 @@ public class EntitiesTableReflectionTest extends BaseUITestClass {
}
@Test
+ public void testActionButtonsNotScheduled() {
+ Assert.assertEquals(searchPage.doSearch(twoProcessesNameStart).size(), 2,
+ "Two results should be present");
+
+ Assert.assertEquals(searchPage.getButtons(true), EnumSet.noneOf(Button.class),
+ "There should be zero active buttons");
+ Assert.assertEquals(searchPage.getButtons(false), EnumSet.allOf(Button.class),
+ "All buttons should be disabled");
+
+ searchPage.selectRow(1);
+ Assert.assertEquals(searchPage.getButtons(false), EnumSet.of(Button.Resume, Button.Suspend),
+ "List of disabled buttons is not correct");
+ searchPage.selectRow(2);
+ Assert.assertEquals(searchPage.getButtons(true), EnumSet.of(Button.Schedule, Button.Delete),
+ "List of active buttons is not correct");
+ searchPage.deselectRow(2);
+ Assert.assertEquals(searchPage.getButtons(false), EnumSet.of(Button.Resume, Button.Suspend),
+ "List of disabled buttons is not correct");
+ }
+
+ @Test
public void testActionsPauseResume() throws URISyntaxException,
- AuthenticationException, InterruptedException, IOException, JAXBException {
- String processName = Util.readEntityName(bundles[0].getProcessData());
- Assert.assertEquals(searchPage.doSearch(processName).size(), 1,
- "One result should be present");
- Assert.assertEquals(searchPage.doSearch(processName).get(0).getStatus(),
- EntityStatus.SUBMITTED, "Status of process should be SUBMITTED");
+ AuthenticationException, InterruptedException, IOException {
+ Assert.assertEquals(searchPage.doSearch(twoProcessesNameStart).size(), 2,
+ "Two results should be present after deletion");
+
+ //select first process
+ searchPage.selectRow(1);
+ searchPage.clickButton(Button.Schedule);
+ List<SearchPage.SearchResult> results = searchPage.getSearchResults();
+ String firstProcess = processesMap.get(results.get(0).getEntityName());
+ String secondProcess = processesMap.get(results.get(1).getEntityName());
+
+ Assert.assertEquals(results.get(0).getStatus(), EntityStatus.RUNNING,
+ "Status of scheduled process should be RUNNING");
+ Assert.assertTrue(prism.getProcessHelper().getStatus(firstProcess).getMessage()
+ .contains("RUNNING"), "First process should be RUNNING via API");
+ //select two processes
+ searchPage.clickSelectAll();
+ Assert.assertEquals(searchPage.getButtons(true), EnumSet.of(Button.Delete),
+ "Only 'Delete' should be available for processes with different statuses");
+
+ searchPage.deselectRow(1);
+ searchPage.clickButton(Button.Schedule);
+
+ Assert.assertEquals(searchPage.getSearchResults().get(1).getStatus(), EntityStatus.RUNNING,
+ "Status of scheduled process should be RUNNING");
+ Assert.assertTrue(prism.getProcessHelper().getStatus(secondProcess).getMessage()
+ .contains("RUNNING"), "Second process should be RUNNING via API");
+
+ searchPage.selectRow(1);
+ searchPage.selectRow(2);
+ searchPage.clickButton(Button.Suspend);
+
+ Assert.assertEquals(searchPage.getSearchResults().get(0).getStatus(), EntityStatus.SUSPENDED,
+ "Status of scheduled process should be SUSPENDED");
+ Assert.assertTrue(prism.getProcessHelper().getStatus(firstProcess).getMessage()
+ .contains("SUSPENDED"), "First process should be SUSPENDED via API");
+
+ Assert.assertEquals(results.get(1).getStatus(), EntityStatus.SUSPENDED,
+ "Status of scheduled process should be RUNNING");
+ Assert.assertTrue(prism.getProcessHelper().getStatus(secondProcess).getMessage()
+ .contains("SUSPENDED"), "Second process should be SUSPENDED via API");
+
+ searchPage.clickSelectAll();
+ Assert.assertEquals(searchPage.getButtons(true), EnumSet.of(Button.Resume, Button.Delete),
+ "List of active buttons is not correct after selecting two SUSPENDED processes");
}
- @AfterClass(alwaysRun = true)
+ @AfterMethod(alwaysRun = true)
public void tearDown() {
removeTestClassEntities();
- closeBrowser();
}
+
+ @AfterClass(alwaysRun = true)
+ public void tearDownClass() {
+ closeBrowser();
+ }
}