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/14 03:09:01 UTC
falcon git commit: FALCON-1210: Process Setup tests for testing
header and general step default scenario contributed by Raghav Kumar Gautam
Repository: falcon
Updated Branches:
refs/heads/master 3f23d783e -> eecf7f533
FALCON-1210: Process Setup tests for testing header and general step default scenario contributed by Raghav Kumar Gautam
Project: http://git-wip-us.apache.org/repos/asf/falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/falcon/commit/eecf7f53
Tree: http://git-wip-us.apache.org/repos/asf/falcon/tree/eecf7f53
Diff: http://git-wip-us.apache.org/repos/asf/falcon/diff/eecf7f53
Branch: refs/heads/master
Commit: eecf7f533f32ca9274666a9a545934dcc7bdb21b
Parents: 3f23d78
Author: Raghav Kumar Gautam <ra...@apache.org>
Authored: Wed May 13 18:08:49 2015 -0700
Committer: Raghav Kumar Gautam <ra...@apache.org>
Committed: Wed May 13 18:08:59 2015 -0700
----------------------------------------------------------------------
falcon-regression/CHANGES.txt | 2 +
.../ui/search/AbstractSearchPage.java | 1 +
.../regression/ui/search/NewProcessPage.java | 44 ----
.../falcon/regression/ui/search/PageHeader.java | 4 +-
.../regression/ui/search/ProcessWizardPage.java | 223 +++++++++++++++++++
.../regression/searchUI/ProcessSetupTest.java | 111 +++++++++
6 files changed, 339 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/falcon/blob/eecf7f53/falcon-regression/CHANGES.txt
----------------------------------------------------------------------
diff --git a/falcon-regression/CHANGES.txt b/falcon-regression/CHANGES.txt
index 2e9297a..00e4840 100644
--- a/falcon-regression/CHANGES.txt
+++ b/falcon-regression/CHANGES.txt
@@ -5,6 +5,8 @@ Trunk (Unreleased)
INCOMPATIBLE CHANGES
NEW FEATURES
+ FALCON-1210 Process Setup tests for testing header and general step default scenario (Raghav Kumar Gautam)
+
FALCON-1201 Feed Setup tests for testing header and default scenario (Namit Maheshwari)
FALCON-1198 Test buttons available on search results page (Ruslan Ostafiychuk)
http://git-wip-us.apache.org/repos/asf/falcon/blob/eecf7f53/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 161d545..e72ce67 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
@@ -30,6 +30,7 @@ import org.openqa.selenium.support.PageFactory;
public abstract class AbstractSearchPage extends Page {
public static final String UI_URL = MerlinConstants.PRISM_URL;
+ public static final long PAGELOAD_TIMEOUT_THRESHOLD = 10;
public AbstractSearchPage(WebDriver driver) {
super(driver);
http://git-wip-us.apache.org/repos/asf/falcon/blob/eecf7f53/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/NewProcessPage.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/NewProcessPage.java b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/NewProcessPage.java
deleted file mode 100644
index f7d5bad..0000000
--- a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/NewProcessPage.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.falcon.regression.ui.search;
-
-import org.apache.falcon.regression.core.util.UIAssert;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.FindBy;
-import org.openqa.selenium.support.FindBys;
-
-/** Page object of the Process creation page. */
-public class NewProcessPage extends AbstractSearchPage {
-
- @FindBys({
- @FindBy(className = "mainUIView"),
- @FindBy(className = "entityForm")
- })
- private WebElement processBox;
-
- public NewProcessPage(WebDriver driver) {
- super(driver);
- }
-
- @Override
- public void checkPage() {
- UIAssert.assertDisplayed(processBox, "Process box");
- }
-}
http://git-wip-us.apache.org/repos/asf/falcon/blob/eecf7f53/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 0a41a5e..c166eaf 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
@@ -184,12 +184,12 @@ public class PageHeader {
return feedPage;
}
- public NewProcessPage doCreateProcess() {
+ public ProcessWizardPage doCreateProcess() {
UIAssert.assertDisplayed(processCreateButton, "Process create button");
Assert.assertEquals(processCreateButton.getText(), "Process",
"Unexpected text on create process button");
processCreateButton.click();
- final NewProcessPage processPage = PageFactory.initElements(driver, NewProcessPage.class);
+ final ProcessWizardPage processPage = PageFactory.initElements(driver, ProcessWizardPage.class);
processPage.checkPage();
return processPage;
}
http://git-wip-us.apache.org/repos/asf/falcon/blob/eecf7f53/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ProcessWizardPage.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ProcessWizardPage.java b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ProcessWizardPage.java
new file mode 100644
index 0000000..e429a60
--- /dev/null
+++ b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ProcessWizardPage.java
@@ -0,0 +1,223 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.falcon.regression.ui.search;
+
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.StringUtils;
+import org.apache.falcon.entity.v0.process.ACL;
+import org.apache.falcon.entity.v0.process.Workflow;
+import org.apache.falcon.regression.Entities.ProcessMerlin;
+import org.apache.falcon.regression.core.util.UIAssert;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+import org.openqa.selenium.support.FindBys;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.Select;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.testng.Assert;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.TimeZone;
+
+/** Page object of the Process creation page. */
+public class ProcessWizardPage extends AbstractSearchPage {
+
+ @FindBys({
+ @FindBy(className = "mainUIView"),
+ @FindBy(className = "entityForm")
+ })
+ private WebElement processBox;
+
+ public ProcessWizardPage(WebDriver driver) {
+ super(driver);
+ }
+
+ @Override
+ public void checkPage() {
+ UIAssert.assertDisplayed(processBox, "Process box");
+ }
+
+ private WebElement getNextButton() {
+ return driver.findElement(By.id("nextButton"));
+ }
+
+ public void pressNext() {
+ getNextButton().click();
+ }
+
+ /*----- Step1 elements & operations ----*/
+ private WebElement getName() {
+ return driver.findElement(By.id("entityNameField"));
+ }
+
+ public void setName(String name) {
+ final WebElement nameElement = getName();
+ nameElement.clear();
+ for (String s : name.split("")) {
+ nameElement.sendKeys(s);
+ }
+ }
+ private WebElement getTagsSection() {
+ return driver.findElement(By.id("tagsSection"));
+ }
+
+ private WebElement getAddTagButton() {
+ return driver.findElement(By.className("formViewContainer"))
+ .findElement(By.xpath("./form/div[4]/button"));
+ }
+
+ private List<WebElement> getDeleteTagButtons() {
+ return getTagsSection().findElements(By.tagName("button"));
+ }
+
+ private List<WebElement> getTagTextFields() {
+ return getTagsSection().findElements(By.tagName("input"));
+ }
+
+ public void deleteTags() {
+ //delete all tags
+ final List<WebElement> deleteTagButtons = getDeleteTagButtons();
+ for (WebElement deleteTagButton : Lists.reverse(deleteTagButtons)) {
+ deleteTagButton.click();
+ }
+ for (WebElement textField : getTagTextFields()) {
+ textField.clear();
+ }
+ }
+
+ public void setTags(List<String> tags) {
+ deleteTags();
+ //create enough number of tag fields
+ final int numTags = tags.size();
+ for (int i = 0; i < numTags - 1; i++) {
+ getAddTagButton().click();
+ }
+ final List<WebElement> tagTextFields = getTagTextFields();
+ Assert.assertEquals(tagTextFields.size() % 2, 0,
+ "Number of text fields for tags should be even, found: " + tagTextFields.size());
+ for (int i = 0; i < (tagTextFields.size() / 2); i++) {
+ final String oneTag = tags.get(i);
+ final String[] tagParts = oneTag.split("=");
+ Assert.assertEquals(tagParts.length, 2,
+ "Each tag is expected to be of form key=value, found: " + oneTag);
+ String key = tagParts[0];
+ String val = tagParts[1];
+ tagTextFields.get(2 * i).sendKeys(key);
+ tagTextFields.get(2 * i + 1).sendKeys(val);
+ }
+ }
+
+ private WebElement getWfName() {
+ return driver.findElement(By.id("workflowNameField"));
+ }
+
+ private WebElement getOozieRadio() {
+ return driver.findElement(By.id("oozieEngineRadio"));
+ }
+
+ private WebElement getPigRadio() {
+ return driver.findElement(By.id("pigEngineRadio"));
+ }
+
+ private WebElement getHiveRadio() {
+ return driver.findElement(By.id("hiveEngineRadio"));
+ }
+
+ private Select getEngineVersion() {
+ return new Select(driver.findElement(By.id("engineVersionField")));
+ }
+
+ private WebElement getPath() {
+ return driver.findElement(By.id("pathField"));
+ }
+
+ public void setWorkflow(Workflow processWf) {
+ final WebElement wfName = getWfName();
+ wfName.clear();
+ wfName.sendKeys(processWf.getName());
+ switch (processWf.getEngine()) {
+ case OOZIE:
+ getOozieRadio().click();
+ break;
+ case PIG:
+ getPigRadio().click();
+ break;
+ case HIVE:
+ getHiveRadio().click();
+ break;
+ default:
+ Assert.fail("Unexpected workflow engine: " + processWf.getEngine());
+ }
+ final String version = processWf.getVersion();
+ if (StringUtils.isNotEmpty(version) && !version.equals("1.0")) {
+ getEngineVersion().selectByVisibleText(version);
+ }
+ final WebElement path = getPath();
+ path.clear();
+ path.sendKeys(processWf.getPath());
+ }
+
+ private WebElement getAclOwner() {
+ return driver.findElement(By.name("aclOwnerInput"));
+ }
+
+ private WebElement getAclGroup() {
+ return driver.findElement(By.name("aclGroupInput"));
+ }
+
+ private WebElement getAclPerm() {
+ return driver.findElement(By.name("aclPermissionsInput"));
+ }
+
+ public void setAcl(ACL acl) {
+ final WebElement aclOwner = getAclOwner();
+ aclOwner.clear();
+ aclOwner.sendKeys(acl.getOwner());
+ final WebElement aclGroup = getAclGroup();
+ aclGroup.clear();
+ aclGroup.sendKeys(acl.getGroup());
+ final WebElement aclPerm = getAclPerm();
+ aclPerm.clear();
+ aclPerm.sendKeys(acl.getPermission());
+ }
+
+ public void doStep1(ProcessMerlin process) {
+ setName(process.getName());
+ final String tags = StringUtils.trimToEmpty(process.getTags());
+ setTags(Arrays.asList(tags.split(",")));
+ setWorkflow(process.getWorkflow());
+ setAcl(process.getACL());
+ final WebElement step1Element = getName();
+ pressNext();
+ new WebDriverWait(driver, AbstractSearchPage.PAGELOAD_TIMEOUT_THRESHOLD).until(
+ ExpectedConditions.stalenessOf(step1Element));
+ }
+
+ /*----- Step2 elements & operations ----*/
+ private Select getTimezone() {
+ return new Select(driver.findElement(By.id("timeZoneSelect")));
+ }
+
+ public void setTimezone(TimeZone timezone) {
+ getTimezone().selectByValue(timezone.getDisplayName());
+ }
+}
http://git-wip-us.apache.org/repos/asf/falcon/blob/eecf7f53/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/ProcessSetupTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/ProcessSetupTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/ProcessSetupTest.java
new file mode 100644
index 0000000..4e1474c
--- /dev/null
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/ProcessSetupTest.java
@@ -0,0 +1,111 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.falcon.regression.searchUI;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.falcon.entity.v0.Frequency;
+import org.apache.falcon.regression.Entities.ProcessMerlin;
+import org.apache.falcon.regression.core.bundle.Bundle;
+import org.apache.falcon.regression.core.helpers.ColoHelper;
+import org.apache.falcon.regression.core.util.BundleUtil;
+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.LoginPage;
+import org.apache.falcon.regression.ui.search.ProcessWizardPage;
+import org.apache.falcon.regression.ui.search.SearchPage;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.log4j.Logger;
+import org.apache.oozie.client.OozieClient;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+/** UI tests for process creation. */
+@Test(groups = "search-ui")
+public class ProcessSetupTest extends BaseUITestClass {
+ private static final Logger LOGGER = Logger.getLogger(ProcessSetupTest.class);
+ private final ColoHelper cluster = servers.get(0);
+ private final FileSystem clusterFS = serverFS.get(0);
+ private final OozieClient clusterOC = serverOC.get(0);
+ private String baseTestHDFSDir = cleanAndGetTestDir();
+ private String aggregateWorkflowDir = baseTestHDFSDir + "/aggregator";
+ private String feedInputPath = baseTestHDFSDir + "/input" + MINUTE_DATE_PATTERN;
+ private String feedOutputPath = baseTestHDFSDir + "/output" + MINUTE_DATE_PATTERN;
+ private ProcessWizardPage processWizardPage = null;
+
+ @BeforeMethod(alwaysRun = true)
+ public void setup() throws IOException {
+ cleanAndGetTestDir();
+ HadoopUtil.uploadDir(serverFS.get(0), aggregateWorkflowDir, OSUtil.RESOURCES_OOZIE);
+ bundles[0] = BundleUtil.readELBundle();
+ bundles[0] = new Bundle(bundles[0], servers.get(0));
+ bundles[0].generateUniqueBundle(this);
+ bundles[0].setInputFeedDataPath(feedInputPath);
+ bundles[0].setProcessWorkflow(aggregateWorkflowDir);
+ bundles[0].setProcessValidity("2010-01-02T01:00Z", "2010-01-02T01:11Z");
+ bundles[0].setProcessInputStartEnd("now(0, 0)", "now(0, 0)");
+ bundles[0].setProcessPeriodicity(5, Frequency.TimeUnit.minutes);
+ bundles[0].setOutputFeedPeriodicity(5, Frequency.TimeUnit.minutes);
+ bundles[0].setOutputFeedLocationData(feedOutputPath);
+
+ openBrowser();
+ final LoginPage loginPage = LoginPage.open(getDriver());
+ SearchPage searchPage = loginPage.doDefaultLogin();
+ processWizardPage = searchPage.getPageHeader().doCreateProcess();
+ processWizardPage.checkPage();
+ }
+
+ @AfterMethod(alwaysRun = true)
+ public void tearDown() throws IOException {
+ removeTestClassEntities();
+ closeBrowser();
+ }
+
+ /**
+ * Test header of the EntityPage.
+ * Check that buttons (logout, entities, uploadXml, help, Falcon) are present, and names are
+ * correct.
+ * Check the user name on header.
+ * "Create an entity"/"upload an entity" headers.
+ * Check that each button navigates user to correct page.
+ * @throws Exception
+ */
+ @Test
+ public void testHeader() throws Exception {
+ processWizardPage.getPageHeader().checkHeader();
+ }
+
+ /**
+ * Populate fields with valid values (name, tag, workflow, engine, version, wf path)
+ * and check that user can go to the next step.
+ */
+ @Test
+ public void testGeneralStepDefaultScenario() throws Exception {
+ final ProcessMerlin process = bundles[0].getProcessObject();
+ final List<String> tags = Arrays.asList("first=yes", "second=yes", "third=yes", "wrong=no");
+ process.setTags(StringUtils.join(tags, ","));
+ processWizardPage.doStep1(process);
+ }
+
+}