You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@falcon.apache.org by ra...@apache.org on 2015/05/30 02:08:21 UTC
falcon git commit: FALCON-1242: Search UI test for entity upload
button contributed by Namit Maheshwari
Repository: falcon
Updated Branches:
refs/heads/master 5d6f957ca -> 4e81193f4
FALCON-1242: Search UI test for entity upload button contributed by Namit Maheshwari
Project: http://git-wip-us.apache.org/repos/asf/falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/falcon/commit/4e81193f
Tree: http://git-wip-us.apache.org/repos/asf/falcon/tree/4e81193f
Diff: http://git-wip-us.apache.org/repos/asf/falcon/diff/4e81193f
Branch: refs/heads/master
Commit: 4e81193f418dadef9f04417f3ec29dde997424dc
Parents: 5d6f957
Author: Raghav Kumar Gautam <ra...@apache.org>
Authored: Fri May 29 17:08:20 2015 -0700
Committer: Raghav Kumar Gautam <ra...@apache.org>
Committed: Fri May 29 17:08:20 2015 -0700
----------------------------------------------------------------------
falcon-regression/CHANGES.txt | 2 +
.../ui/search/AbstractSearchPage.java | 4 +-
.../regression/ui/search/ClusterWizardPage.java | 19 +++
.../falcon/regression/ui/search/PageHeader.java | 26 +++-
.../regression/searchUI/HomePageTest.java | 122 ++++++++++++++++++-
5 files changed, 168 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/falcon/blob/4e81193f/falcon-regression/CHANGES.txt
----------------------------------------------------------------------
diff --git a/falcon-regression/CHANGES.txt b/falcon-regression/CHANGES.txt
index 27a4157..c581415 100644
--- a/falcon-regression/CHANGES.txt
+++ b/falcon-regression/CHANGES.txt
@@ -5,6 +5,8 @@ Trunk (Unreleased)
INCOMPATIBLE CHANGES
NEW FEATURES
+ FALCON-1242 Search UI test for entity upload button (Namit Maheshwari)
+
FALCON-1222 Feed Wizard multiple tests (Namit Maheshwari)
FALCON-1229 Tests for instance page on SearchUI (Ruslan Ostafiychuk)
http://git-wip-us.apache.org/repos/asf/falcon/blob/4e81193f/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/AbstractSearchPage.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/AbstractSearchPage.java b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/AbstractSearchPage.java
index 780cd0c..7c1f7ad 100644
--- a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/AbstractSearchPage.java
+++ b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/AbstractSearchPage.java
@@ -98,8 +98,8 @@ public abstract class AbstractSearchPage extends Page {
}
public String getActiveAlertText() {
- WebElement alertsBlock = driver.findElement(By.className("messages-to-show"));
- List<WebElement> alerts = alertsBlock.findElements(By.className("ng-animate"));
+ WebElement alertsBlock = driver.findElement(By.className("messages"));
+ List<WebElement> alerts = alertsBlock.findElements(By.className("message"));
if (!alerts.isEmpty()) {
WebElement last = alerts.get(alerts.size() - 1);
if (last.isDisplayed()) {
http://git-wip-us.apache.org/repos/asf/falcon/blob/4e81193f/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java
index 300a3d6..92b1ee5 100644
--- a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java
+++ b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java
@@ -446,4 +446,23 @@ public class ClusterWizardPage extends AbstractSearchPage {
WebElement version = clusterBox.findElement(By.xpath("(//input[@ng-model='_interface._version'])[6]"));
return endpoint.isEnabled() && version.isEnabled();
}
+
+ private WebElement getNameUnavailable(){
+ return clusterBox.findElement(By.xpath(
+ "//div[contains(@class, 'nameInputDisplay') and contains(@class, 'custom-danger')]"));
+ }
+
+ public void checkNameUnavailableDisplayed(boolean isDisplayed) {
+ if (isDisplayed){
+ UIAssert.assertDisplayed(getNameUnavailable(), "Name Unavailable not displayed");
+ }else {
+ try{
+ getNameUnavailable();
+ Assert.fail("Name Unavailable found");
+ } catch (Exception ex){
+ LOGGER.info("Name Unavailable not found");
+ }
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/falcon/blob/4e81193f/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/PageHeader.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/PageHeader.java b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/PageHeader.java
index c84cfe5..6524ccf 100644
--- a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/PageHeader.java
+++ b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/PageHeader.java
@@ -20,9 +20,11 @@ package org.apache.falcon.regression.ui.search;
import org.apache.falcon.regression.core.enumsAndConstants.MerlinConstants;
import org.apache.falcon.regression.core.util.AssertUtil;
+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;
+import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
@@ -32,6 +34,7 @@ import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -180,6 +183,12 @@ public class PageHeader {
driver.get(oldUrl);
}
+ public void uploadXml(String filePath) throws IOException {
+ final WebElement uploadEntityTextBox = uploadEntityBox.findElement(By.id("files"));
+ uploadEntityTextBox.sendKeys(filePath);
+ waitForAngularToFinish();
+ }
+
public ClusterWizardPage doCreateCluster() {
UIAssert.assertDisplayed(clusterCreateButton, "Cluster create button");
Assert.assertEquals(clusterCreateButton.getText(), "Cluster",
@@ -233,7 +242,7 @@ public class PageHeader {
}
private WebElement getLogoutButton() {
- return loginHeaderBox.findElement(By.tagName("button"));
+ return loginHeaderBox.findElement(By.xpath("//button[contains(.,'Logout')]"));
}
public LoginPage doLogout() {
@@ -244,4 +253,19 @@ public class PageHeader {
return loginPage;
}
+ protected void waitForAngularToFinish() {
+ final String javaScript = "return (window.angular != null) && "
+ + "(angular.element(document).injector() != null) && "
+ + "(angular.element(document).injector().get('$http').pendingRequests.length === 0)";
+ boolean isLoaded = false;
+ for (int i = 0; i < AbstractSearchPage.PAGELOAD_TIMEOUT_THRESHOLD && !isLoaded; i++) {
+ final Object output = ((JavascriptExecutor) driver).executeScript(javaScript);
+ isLoaded = Boolean.valueOf(output.toString());
+ LOGGER.info(i+1 + ". waiting on angular to finish.");
+ TimeUtil.sleepSeconds(1);
+ }
+ LOGGER.info("angular is done continuing...");
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/falcon/blob/4e81193f/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/HomePageTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/HomePageTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/HomePageTest.java
index b752a86..f71739d 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/HomePageTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/HomePageTest.java
@@ -22,16 +22,23 @@ import org.apache.falcon.regression.core.bundle.Bundle;
import org.apache.falcon.regression.core.helpers.ColoHelper;
import org.apache.falcon.regression.core.util.AssertUtil;
import org.apache.falcon.regression.core.util.BundleUtil;
+import org.apache.falcon.regression.core.util.FileUtil;
+import org.apache.falcon.regression.core.util.HadoopUtil;
+import org.apache.falcon.regression.core.util.OSUtil;
import org.apache.falcon.regression.testHelper.BaseUITestClass;
+import org.apache.falcon.regression.ui.search.ClusterWizardPage;
import org.apache.falcon.regression.ui.search.LoginPage;
import org.apache.falcon.regression.ui.search.SearchPage;
+import org.apache.hadoop.fs.FileSystem;
import org.apache.log4j.Logger;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
+import java.io.File;
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.List;
/** UI tests for Search UI Homepage. */
@@ -39,6 +46,11 @@ import java.util.List;
public class HomePageTest extends BaseUITestClass {
private static final Logger LOGGER = Logger.getLogger(HomePageTest.class);
private SearchPage homePage = null;
+ private ColoHelper cluster = servers.get(0);
+ private FileSystem clusterFS = serverFS.get(0);
+ private String baseTestHDFSDir = cleanAndGetTestDir();
+ private String aggregateWorkflowDir = baseTestHDFSDir + "/aggregator";
+ private String feedInputPath = baseTestHDFSDir + "/input" + MINUTE_DATE_PATTERN;
@BeforeMethod(alwaysRun = true)
public void setup() {
@@ -61,8 +73,8 @@ public class HomePageTest extends BaseUITestClass {
public void testNavigationToEntitiesTable() throws Exception {
homePage.checkNoResult();
bundles[0] = BundleUtil.readELBundle();
- ColoHelper cluster = servers.get(0);
- bundles[0] = new Bundle(bundles[0], cluster);
+ ColoHelper coloHelper = servers.get(0);
+ bundles[0] = new Bundle(bundles[0], coloHelper);
bundles[0].generateUniqueBundle(this);
String pigTestDir = cleanAndGetTestDir();
String inputPath = pigTestDir + "/input" + MINUTE_DATE_PATTERN;
@@ -81,4 +93,110 @@ public class HomePageTest extends BaseUITestClass {
Assert.assertEquals(searchResults.size(), 0, "Expecting no search results");
}
+ /**
+ * Upload cluster, feed, process entity through upload entity button.
+ * The entity should get created.
+ * @throws Exception
+ */
+ @Test
+ public void testUploadEntity() throws Exception{
+
+ HadoopUtil.uploadDir(clusterFS, aggregateWorkflowDir, OSUtil.RESOURCES_OOZIE);
+ Bundle bundle = BundleUtil.readELBundle();
+ bundle.generateUniqueBundle(this);
+ bundle = new Bundle(bundle, cluster);
+ bundle.setInputFeedDataPath(feedInputPath);
+ bundle.setProcessWorkflow(aggregateWorkflowDir);
+
+
+ final String clusterXml = bundle.getClusterElement().toString();
+ homePage.getPageHeader().uploadXml(FileUtil.writeEntityToFile(clusterXml));
+ AssertUtil.assertSucceeded(prism.getClusterHelper().getEntityDefinition(clusterXml));
+
+ final String feedXml = bundle.getInputFeedFromBundle();
+ homePage.getPageHeader().uploadXml(FileUtil.writeEntityToFile(feedXml));
+ AssertUtil.assertSucceeded(prism.getFeedHelper().getEntityDefinition(feedXml));
+
+ final String outputFeedXml = bundle.getOutputFeedFromBundle();
+ homePage.getPageHeader().uploadXml(FileUtil.writeEntityToFile(outputFeedXml));
+ AssertUtil.assertSucceeded(prism.getFeedHelper().getEntityDefinition(outputFeedXml));
+
+ final String processXml = bundle.getProcessObject().toString();
+ homePage.getPageHeader().uploadXml(FileUtil.writeEntityToFile(processXml));
+ AssertUtil.assertSucceeded(prism.getProcessHelper().getEntityDefinition(processXml));
+
+ }
+
+ /**
+ * Upload bad cluster, feed, process entity through upload entity button.
+ * We should get an error.
+ * @throws Exception
+ */
+ @Test
+ public void testUploadBadEntity() throws Exception{
+
+ HadoopUtil.uploadDir(clusterFS, aggregateWorkflowDir, OSUtil.RESOURCES_OOZIE);
+ Bundle bundle = BundleUtil.readELBundle();
+ bundle.generateUniqueBundle(this);
+ bundle = new Bundle(bundle, cluster);
+ bundle.setInputFeedDataPath(feedInputPath);
+ bundle.setProcessWorkflow(aggregateWorkflowDir);
+
+ // Create a text file, with some text
+ File textFile = new File("invalid.txt");
+ PrintWriter writer = new PrintWriter(textFile, "UTF-8");
+ String text = "Some random text";
+ writer.println(text);
+ writer.close();
+ homePage.getPageHeader().uploadXml(textFile.getAbsolutePath());
+ String alertText = homePage.getActiveAlertText();
+ Assert.assertEquals(alertText, "Invalid xml. File not uploaded",
+ "Text file was allowed to be uploaded");
+
+ // Create a xml file with proper name, but invalid text contents
+ File xmlFile = new File("cluster.xml");
+ writer = new PrintWriter(xmlFile, "UTF-8");
+ text = "The first line\nThe second line";
+ writer.println(text);
+ writer.close();
+
+ homePage.getPageHeader().uploadXml(xmlFile.getAbsolutePath());
+ Thread.sleep(1000);
+ alertText = homePage.getActiveAlertText();
+ Assert.assertEquals(alertText, "Invalid xml. File not uploaded",
+ "XML file with invalid text was allowed to be uploaded");
+
+
+ }
+
+ /**
+ * Submit cluster with name e.g. myCluster.
+ * Select "create cluster". Try to populate name field with the name of previously submitted cluster.
+ * Check that "name unavailable" has appeared.
+ * @throws Exception
+ */
+ @Test
+ public void clusterSetupNameAvailability() throws Exception{
+
+ HadoopUtil.uploadDir(clusterFS, aggregateWorkflowDir, OSUtil.RESOURCES_OOZIE);
+ Bundle bundle = BundleUtil.readELBundle();
+ bundle.generateUniqueBundle(this);
+ bundle = new Bundle(bundle, cluster);
+
+ // Submit Cluster
+ final String clusterXml = bundle.getClusterElement().toString();
+ homePage.getPageHeader().uploadXml(FileUtil.writeEntityToFile(clusterXml));
+ AssertUtil.assertSucceeded(prism.getClusterHelper().getEntityDefinition(clusterXml));
+
+ // Get cluster name and try to set it again
+ String clusterName = bundle.getClusterElement().getName();
+ ClusterWizardPage clusterWizardPage = homePage.getPageHeader().doCreateCluster();
+ clusterWizardPage.setName(clusterName);
+
+ // Assert that name unavailable is displayed
+ clusterWizardPage.checkNameUnavailableDisplayed(true);
+ }
+
+
+
}