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/27 03:36:17 UTC

falcon git commit: FALCON-1202: Feed Wizard multiple tests contributed by Namit Maheshwari

Repository: falcon
Updated Branches:
  refs/heads/master 701347aa1 -> 05ee82e67


FALCON-1202: Feed Wizard multiple tests 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/05ee82e6
Tree: http://git-wip-us.apache.org/repos/asf/falcon/tree/05ee82e6
Diff: http://git-wip-us.apache.org/repos/asf/falcon/diff/05ee82e6

Branch: refs/heads/master
Commit: 05ee82e677587fad3cc3f1cddbde6405ded1bcef
Parents: 701347a
Author: Raghav Kumar Gautam <ra...@apache.org>
Authored: Tue May 26 18:31:41 2015 -0700
Committer: Raghav Kumar Gautam <ra...@apache.org>
Committed: Tue May 26 18:32:48 2015 -0700

----------------------------------------------------------------------
 falcon-regression/CHANGES.txt                   |   2 +
 .../falcon/regression/Entities/FeedMerlin.java  | 151 +++
 .../ui/search/AbstractSearchPage.java           |  15 +
 .../regression/ui/search/FeedWizardPage.java    | 311 ++++++-
 .../regression/searchUI/FeedSetupTest.java      | 913 ++++++++++++++++++-
 5 files changed, 1367 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/falcon/blob/05ee82e6/falcon-regression/CHANGES.txt
----------------------------------------------------------------------
diff --git a/falcon-regression/CHANGES.txt b/falcon-regression/CHANGES.txt
index b64f11e..85fef51 100644
--- a/falcon-regression/CHANGES.txt
+++ b/falcon-regression/CHANGES.txt
@@ -5,6 +5,8 @@ Trunk (Unreleased)
   INCOMPATIBLE CHANGES
 
   NEW FEATURES
+   FALCON-1222 Feed Wizard multiple tests (Namit Maheshwari)
+
    FALCON-1229 Tests for instance page on SearchUI (Ruslan Ostafiychuk)
 
    FALCON-1216 Cluster setup wizard multiple tests (Paul Isaychuk via Ruslan Ostafiychuk)

http://git-wip-us.apache.org/repos/asf/falcon/blob/05ee82e6/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java
index 91ba8a1..cf25802 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java
@@ -37,7 +37,11 @@ import org.apache.falcon.entity.v0.feed.Retention;
 import org.apache.falcon.entity.v0.feed.Validity;
 import org.apache.falcon.entity.v0.feed.Sla;
 import org.apache.falcon.regression.core.util.TimeUtil;
+import org.apache.falcon.regression.core.util.Util;
 import org.testng.Assert;
+import org.apache.log4j.Logger;
+import org.testng.asserts.SoftAssert;
+
 
 import javax.xml.bind.JAXBException;
 import java.io.StringWriter;
@@ -48,6 +52,7 @@ import java.util.Map;
 
 /** Class for representing a feed xml. */
 public class FeedMerlin extends Feed {
+    private static final Logger LOGGER = Logger.getLogger(FeedMerlin.class);
 
     public FeedMerlin(String feedData) {
         this((Feed) TestEntityUtil.fromString(EntityType.FEED, feedData));
@@ -389,4 +394,150 @@ public class FeedMerlin extends Feed {
         return EntityType.FEED;
     }
 
+    public void assertGeneralProperties(FeedMerlin newFeed){
+
+        LOGGER.info(String.format("Comparing General Properties: source: %n%s%n and feed: %n%n%s",
+            Util.prettyPrintXml(toString()), Util.prettyPrintXml(newFeed.toString())));
+
+        SoftAssert softAssert = new SoftAssert();
+
+        // Assert all the the General Properties
+        softAssert.assertEquals(newFeed.getName(), getName(),
+            "Feed Name is different");
+        softAssert.assertEquals(newFeed.getDescription(), getDescription(),
+            "Feed Description is different");
+        softAssert.assertEquals(newFeed.getTags(), getTags(),
+            "Feed Tags is different");
+        softAssert.assertEquals(newFeed.getGroups(), getGroups(),
+            "Feed Groups is different");
+        softAssert.assertEquals(newFeed.getACL().getOwner(), getACL().getOwner(),
+            "Feed ACL Owner is different");
+        softAssert.assertEquals(newFeed.getACL().getGroup(), getACL().getGroup(),
+            "Feed ACL Group is different");
+        softAssert.assertEquals(newFeed.getACL().getPermission(), getACL().getPermission(),
+            "Feed ACL Permission is different");
+        softAssert.assertEquals(newFeed.getSchema().getLocation(), getSchema().getLocation(),
+            "Feed Schema Location is different");
+        softAssert.assertEquals(newFeed.getSchema().getProvider(), getSchema().getProvider(),
+            "Feed Schema Provider is different");
+        softAssert.assertAll();
+
+    }
+
+    public void assertPropertiesInfo(FeedMerlin newFeed){
+
+        LOGGER.info(String.format("Comparing Properties Info: source: %n%s%n and feed: %n%n%s",
+            Util.prettyPrintXml(toString()), Util.prettyPrintXml(newFeed.toString())));
+
+        SoftAssert softAssert = new SoftAssert();
+
+        // Assert all the Properties Info
+        softAssert.assertEquals(newFeed.getFrequency().getFrequency(),
+            getFrequency().getFrequency(),
+            "Feed Frequency is different");
+        softAssert.assertEquals(newFeed.getFrequency().getTimeUnit().toString(),
+            getFrequency().getTimeUnit().toString(),
+            "Feed Frequency Unit is different");
+        softAssert.assertEquals(newFeed.getLateArrival().getCutOff().getFrequencyAsInt(),
+            getLateArrival().getCutOff().getFrequencyAsInt(),
+            "Feed CutOff is different");
+        softAssert.assertEquals(newFeed.getLateArrival().getCutOff().getTimeUnit(),
+            getLateArrival().getCutOff().getTimeUnit(),
+            "Feed CutOff Unit is different");
+        softAssert.assertEquals(newFeed.getAvailabilityFlag(),
+            getAvailabilityFlag(),
+            "Feed Availability Flag is different");
+        softAssert.assertEquals(newFeed.getProperties().getProperties().get(5).getName(),
+            getProperties().getProperties().get(0).getName(),
+            "Feed Property1 Name is different");
+        softAssert.assertEquals(newFeed.getProperties().getProperties().get(5).getValue(),
+            getProperties().getProperties().get(0).getValue(),
+            "Feed Property1 Value is different");
+        softAssert.assertEquals(newFeed.getProperties().getProperties().get(6).getName(),
+            getProperties().getProperties().get(1).getName(),
+            "Feed Property2 Name is different");
+        softAssert.assertEquals(newFeed.getProperties().getProperties().get(6).getValue(),
+            getProperties().getProperties().get(1).getValue(),
+            "Feed Property2 Value is different");
+
+        softAssert.assertAll();
+    }
+
+    public void assertLocationInfo(FeedMerlin newFeed){
+
+        LOGGER.info(String.format("Comparing Location Info: source: %n%s%n and feed: %n%n%s",
+            Util.prettyPrintXml(toString()), Util.prettyPrintXml(newFeed.toString())));
+
+        SoftAssert softAssert = new SoftAssert();
+
+        // Assert all the Location Properties
+        softAssert.assertEquals(newFeed.getLocations().getLocations().get(0).getPath(),
+            getLocations().getLocations().get(0).getPath(),
+            "Feed Location Data Path is different");
+        softAssert.assertEquals(newFeed.getLocations().getLocations().get(1).getPath(),
+            getLocations().getLocations().get(1).getPath(),
+            "Feed Location Stats Path is different");
+        softAssert.assertEquals(newFeed.getLocations().getLocations().get(2).getPath(),
+            getLocations().getLocations().get(2).getPath(),
+            "Feed Location Meta Path is different");
+
+        softAssert.assertAll();
+
+    }
+
+    public void assertClusterInfo(FeedMerlin newFeed){
+
+        LOGGER.info(String.format("Comparing Feed Cluster Info: source: %n%s%n and feed: %n%n%s",
+            Util.prettyPrintXml(toString()), Util.prettyPrintXml(newFeed.toString())));
+
+        SoftAssert softAssert = new SoftAssert();
+
+        // Assert all the Cluster Properties
+        softAssert.assertEquals(newFeed.getClusters().getClusters().get(0)
+                .getName(),
+            getClusters().getClusters().get(0).getName(),
+            "Feed Cluster Name is different");
+        softAssert.assertEquals(newFeed.getClusters().getClusters().get(0)
+                .getLocations().getLocations().get(0).getPath(),
+            getLocations().getLocations().get(0).getPath(),
+            "Feed Cluster Data Path is different");
+        softAssert.assertEquals(newFeed.getClusters().getClusters().get(0)
+                .getLocations().getLocations().get(1).getPath(),
+            getLocations().getLocations().get(1).getPath(),
+            "Feed Cluster Stats Path is different");
+        softAssert.assertEquals(newFeed.getClusters().getClusters().get(0)
+                .getLocations().getLocations().get(2).getPath(),
+            getLocations().getLocations().get(2).getPath(),
+            "Feed Cluster Meta Path is different");
+        softAssert.assertEquals(newFeed.getClusters().getClusters().get(0)
+                .getValidity().getStart(),
+            getClusters().getClusters().get(0).getValidity().getStart(),
+            "Feed Cluster Start Date is different");
+        softAssert.assertEquals(newFeed.getClusters().getClusters().get(0)
+                .getValidity().getEnd(),
+            getClusters().getClusters().get(0).getValidity().getEnd(),
+            "Feed Cluster End Date is different");
+        // Asserting on hardcoded value of 99, due to UI bug which only support till two digits.
+        softAssert.assertEquals(newFeed.getClusters().getClusters().get(0)
+                .getRetention().getLimit().getFrequency(), "99",
+            "Feed Retention is different");
+        softAssert.assertEquals(newFeed.getClusters().getClusters().get(0)
+                .getRetention().getLimit().getTimeUnit().name(),
+            getClusters().getClusters().get(0).getRetention().getLimit().getTimeUnit().name(),
+            "Feed Retention Unit is different");
+
+        softAssert.assertAll();
+
+    }
+
+    public void assertEquals(FeedMerlin newFeed) {
+
+        assertGeneralProperties(newFeed);
+        assertPropertiesInfo(newFeed);
+        assertLocationInfo(newFeed);
+        assertClusterInfo(newFeed);
+    }
+
+
+
 }

http://git-wip-us.apache.org/repos/asf/falcon/blob/05ee82e6/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 2778dcc..0c054e4 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
@@ -28,6 +28,10 @@ import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.FindBy;
 import org.openqa.selenium.support.PageFactory;
+import org.openqa.selenium.support.ui.Select;
+
+import java.util.ArrayList;
+import java.util.List;
 
 import java.util.List;
 
@@ -70,6 +74,17 @@ public abstract class AbstractSearchPage extends Page {
 
     }
 
+    // Utility method to get Dropdown Values
+    public List<String> getDropdownValues(Select element){
+        List<WebElement> allOptions = element.getOptions();
+        List<String> values = new ArrayList<>();
+        for (WebElement option:allOptions){
+            values.add(option.getText());
+        }
+        return values;
+    }
+
+
     protected void waitForAngularToFinish() {
         final String javaScript = "return (window.angular != null) && "
             + "(angular.element(document).injector() != null) && "

http://git-wip-us.apache.org/repos/asf/falcon/blob/05ee82e6/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/FeedWizardPage.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/FeedWizardPage.java b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/FeedWizardPage.java
index 6eed4ce..9b68c95 100644
--- a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/FeedWizardPage.java
+++ b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/FeedWizardPage.java
@@ -20,19 +20,24 @@ package org.apache.falcon.regression.ui.search;
 
 import org.apache.falcon.regression.Entities.FeedMerlin;
 import org.apache.falcon.regression.core.util.UIAssert;
+import org.apache.log4j.Logger;
 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.Select;
+import org.testng.Assert;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.List;
 
 /** Page object of the Feed creation page. */
 public class FeedWizardPage extends AbstractSearchPage {
 
+    private static final Logger LOGGER = Logger.getLogger(FeedWizardPage.class);
+
     @FindBys({
         @FindBy(className = "mainUIView"),
         @FindBy(className = "feedForm")
@@ -47,20 +52,48 @@ public class FeedWizardPage extends AbstractSearchPage {
     private WebElement nextButton;
 
     @FindBys({
+        @FindBy(className = "mainUIView"),
+        @FindBy(className = "feedForm"),
+        @FindBy(className = "prevBtn")
+    })
+    private WebElement previousButton;
+
+    @FindBys({
             @FindBy(xpath = "//button[contains(.,'add tag')]")
     })
     private WebElement addTagButton;
 
     @FindBys({
+        @FindBy(xpath = "//button[contains(.,'delete')]")
+    })
+    private WebElement deleteButton;
+
+    @FindBys({
             @FindBy(xpath = "//button[contains(.,'add property')]")
     })
     private WebElement addPropertyButton;
 
     @FindBys({
+        @FindBy(xpath = "//button[contains(.,'Catalog Storage')]")
+    })
+    private WebElement catalogStorageButton;
+
+    @FindBys({
             @FindBy(id = "feed.step5")
     })
     private WebElement saveFeedButton;
 
+    @FindBys({
+        @FindBy(id = "feed.editXML")
+    })
+    private WebElement editXmlButton;
+
+    @FindBy(xpath = "//a[contains(.,'Cancel')]")
+    private WebElement cancelButton;
+
+    @FindBy(xpath = "//textarea[@ng-model='prettyXml']")
+    private WebElement feedXml;
+
     public FeedWizardPage(WebDriver driver) {
         super(driver);
     }
@@ -104,8 +137,8 @@ public class FeedWizardPage extends AbstractSearchPage {
     private WebElement getFeedFrequencyQuantity() {
         return feedBox.findElement(By.xpath("//input[@ng-model='feed.frequency.quantity']"));
     }
-    private WebElement getFeedFrequencyUnit() {
-        return feedBox.findElement(By.xpath("//select[@ng-model='feed.frequency.unit']"));
+    private Select getFeedFrequencyUnit() {
+        return new Select(feedBox.findElement(By.xpath("//select[@ng-model='feed.frequency.unit']")));
     }
     private WebElement getFeedLateArrivalCheckBox() {
         return feedBox.findElement(By.xpath("//input[@ng-model='feed.lateArrival.active']"));
@@ -113,8 +146,8 @@ public class FeedWizardPage extends AbstractSearchPage {
     private WebElement getFeedLateArrivalCutOffQuantity() {
         return feedBox.findElement(By.xpath("//input[@ng-model='feed.lateArrival.cutOff.quantity']"));
     }
-    private WebElement getFeedLateArrivalCutOffUnit() {
-        return feedBox.findElement(By.xpath("//select[@ng-model='feed.lateArrival.cutOff.unit']"));
+    private Select getFeedLateArrivalCutOffUnit() {
+        return new Select(feedBox.findElement(By.xpath("//select[@ng-model='feed.lateArrival.cutOff.unit']")));
     }
     private WebElement getFeedAvailabilityFlag() {
         return feedBox.findElement(By.xpath("//input[@ng-model='feed.availabilityFlag']"));
@@ -122,6 +155,36 @@ public class FeedWizardPage extends AbstractSearchPage {
     private Select getFeedTimeZone() {
         return new Select(feedBox.findElement(By.xpath("//time-zone-select[@ng-model='feed.timezone']/select")));
     }
+
+    private WebElement getQueueName() {
+        return feedBox.findElement(By.xpath("//label[.='queueName']/following-sibling::div/input"));
+    }
+
+    private Select getJobPriority() {
+        return new Select(feedBox.findElement(By.xpath("//label[.='jobPriority']/following-sibling::div/select")));
+    }
+
+    private WebElement getTimeoutQuantity() {
+        return feedBox.findElement(By.xpath("//label[.='timeout']/following-sibling::div/input"));
+    }
+
+    private Select getTimeoutUnit() {
+        return new Select(feedBox.findElement(By.xpath("//label[.='timeout']/following-sibling::div/select")));
+    }
+
+    private WebElement getParallel() {
+        return feedBox.findElement(By.xpath("//label[.='parallel']/following-sibling::div/input"));
+    }
+
+    private WebElement getMaxMaps() {
+        return feedBox.findElement(By.xpath("//label[.='maxMaps']/following-sibling::div/input"));
+    }
+
+    private WebElement getMapBandwidthKB() {
+        return feedBox.findElement(
+            By.xpath("//label[.='mapBandwidthKB']/following-sibling::div/input"));
+    }
+
     private WebElement getFeedPropertyKey(int index) {
         return feedBox.findElements(By.xpath("//input[@ng-model='property.key']")).get(index);
     }
@@ -134,6 +197,11 @@ public class FeedWizardPage extends AbstractSearchPage {
         return feedBox.findElements(By.xpath("//input[@ng-model='location.path']")).get(index);
     }
 
+    private WebElement getFeedCatalogTableUri() {
+        return feedBox.findElement(
+            By.xpath("//input[@ng-model='feed.storage.catalog.catalogTable.uri']"));
+    }
+
     private Select getFeedClusterSource() {
         return new Select(feedBox.findElement(By.id("clusterNameSelect")));
     }
@@ -142,8 +210,8 @@ public class FeedWizardPage extends AbstractSearchPage {
         return feedBox.findElement(By.xpath("//input[@ng-model='cluster.retention.quantity']"));
     }
 
-    private WebElement getFeedClusterRetentionUnit() {
-        return feedBox.findElement(By.xpath("//select[@ng-model='cluster.retention.unit']"));
+    private Select getFeedClusterRetentionUnit() {
+        return new Select(feedBox.findElement(By.xpath("//select[@ng-model='cluster.retention.unit']")));
     }
 
     private WebElement getFeedClusterValidityStartDate() {
@@ -166,6 +234,106 @@ public class FeedWizardPage extends AbstractSearchPage {
         return feedBox.findElement(By.xpath("//input[@ng-model='cluster.validity.end.date']"));
     }
 
+    public List<String> getFeedFrequencyUnitValues(){
+        return getDropdownValues(getFeedFrequencyUnit());
+    }
+
+    public List<String> getFeedLateArrivalCutOffUnitValues(){
+        return getDropdownValues(getFeedLateArrivalCutOffUnit());
+    }
+
+    public List<String> getFeedClusterSourceValues(){
+        return getDropdownValues(getFeedClusterSource());
+    }
+
+    public List<String> getFeedClusterRetentionUnitValues(){
+        return getDropdownValues(getFeedClusterRetentionUnit());
+    }
+
+    public List<String> getJobPriorityValues(){
+        return getDropdownValues(getJobPriority());
+    }
+
+    public List<String> getTimeoutUnitValues(){
+        return getDropdownValues(getTimeoutUnit());
+    }
+
+    public void isFeedFrequencyDisplayed(boolean isDisplayed) {
+        if (isDisplayed){
+            UIAssert.assertDisplayed(getFeedFrequencyQuantity(), "Frequency Quantity");
+        }else {
+            try{
+                getFeedFrequencyQuantity();
+                Assert.fail("Frequency Quantity found");
+            } catch (Exception ex){
+                LOGGER.info("Frequency Quantity not found");
+            }
+        }
+    }
+
+    public void isFeedDataPathDisplayed(boolean isDisplayed) {
+        if (isDisplayed){
+            UIAssert.assertDisplayed(getFeedPath(0), "Feed Data Path");
+        }else {
+            try{
+                getFeedPath(0);
+                Assert.fail("Feed Data Path found");
+            } catch (Exception ex){
+                LOGGER.info("Feed Data Path not found");
+            }
+        }
+    }
+
+    public void isFeedClusterRetentionDisplayed(boolean isDisplayed) {
+        if (isDisplayed){
+            UIAssert.assertDisplayed(getFeedClusterRetentionLimit(), "Cluster Retention Limit");
+        }else {
+            try{
+                getFeedClusterRetentionLimit();
+                Assert.fail("Cluster Retention Limit found");
+            } catch (Exception ex){
+                LOGGER.info("Cluster Retention Limit not found");
+            }
+        }
+    }
+
+    public void isSaveFeedButtonDisplayed(boolean isDisplayed) {
+        if (isDisplayed){
+            UIAssert.assertDisplayed(saveFeedButton, "Save Button");
+        }else {
+            try{
+                getSaveFeedButton();
+                Assert.fail("Save Button found");
+            } catch (Exception ex){
+                LOGGER.info("Save Button not found");
+            }
+        }
+    }
+
+    private WebElement getSaveFeedButton(){
+        return saveFeedButton;
+    }
+
+    public void clickNext(){
+        nextButton.click();
+    }
+
+    public void clickPrevious(){
+        previousButton.click();
+    }
+
+    public void clickCancel(){
+        cancelButton.click();
+    }
+
+    public void clickEditXml(){
+        editXmlButton.click();
+    }
+
+    public void clickCatalogStorageButton(){
+        catalogStorageButton.click();
+    }
+
     public void setFeedName(String name){
         sendKeysSlowly(getFeedName(), name);
     }
@@ -178,6 +346,7 @@ public class FeedWizardPage extends AbstractSearchPage {
     public void setFeedTagValue(int index, String tagValue){
         getFeedTagValue(index).sendKeys(tagValue);
     }
+
     // Tags are in the format, "first=yes","second=yes","third=yes". Need a separate method to handle this
     public void setFeedTags(String tagsStr){
         if (tagsStr == null){
@@ -194,9 +363,91 @@ public class FeedWizardPage extends AbstractSearchPage {
         }
     }
 
+    public void isTagsDisplayed(int index, boolean isDisplayed){
+        if (isDisplayed){
+            UIAssert.assertDisplayed(getFeedTagKey(index), "Tag Key Index - " + index);
+            UIAssert.assertDisplayed(getFeedTagValue(index), "Tag Value Index - " + index);
+        }else{
+            try{
+                getFeedTagKey(index);
+                Assert.fail("Tag Key Index - " + index + " found");
+            } catch (Exception ex){
+                LOGGER.info("Tag Key Index - " + index + " not found");
+            }
+            try{
+                getFeedTagValue(index);
+                Assert.fail("Tag Key Value - " + index + " found");
+            } catch (Exception ex){
+                LOGGER.info("Tag Key Value - " + index + " not found");
+            }
+        }
+    }
+
+    public String getFeedTagKeyText(int index){
+        return getFeedTagKey(index).getAttribute("value");
+    }
+
+    public String getFeedTagValueText(int index){
+        return getFeedTagValue(index).getAttribute("value");
+    }
+
+    public String getFeedGroupsText(){
+        return getFeedGroups().getAttribute("value");
+    }
+
+    public String getFeedFrequencyQuantityText(){
+        return getFeedFrequencyQuantity().getAttribute("value");
+    }
+
+    public String getFeedLateArrivalCutOffQuantityText(){
+        return getFeedLateArrivalCutOffQuantity().getAttribute("value");
+    }
+
+    public String getFeedPathText(int index){
+        return getFeedPath(index).getAttribute("value");
+    }
+
+    public String getFeedClusterRetentionLimitText(){
+        return getFeedClusterRetentionLimit().getAttribute("value");
+    }
+
+    public String getFeedClusterRetentionUnitText(){
+        return getFeedClusterRetentionUnit().getFirstSelectedOption().getText();
+    }
+
+    public void addProperty(){
+        addPropertyButton.click();
+    }
+
+    public void isPropertyDisplayed(int index, boolean isDisplayed){
+        if (isDisplayed){
+            UIAssert.assertDisplayed(getFeedPropertyKey(index), "Property Key Index - " + index);
+            UIAssert.assertDisplayed(getFeedPropertyValue(index), "Property Value Index - " + index);
+        }else{
+            try{
+                getFeedTagKey(index);
+                Assert.fail("Property Key Index - " + index + " found");
+            } catch (Exception ex){
+                LOGGER.info("Property Key Index - " + index + " not found");
+            }
+            try{
+                getFeedTagValue(index);
+                Assert.fail("Property Key Value - " + index + " found");
+            } catch (Exception ex){
+                LOGGER.info("Property Key Value - " + index + " not found");
+            }
+        }
+    }
+
+
+    public void deleteTagOrProperty(){
+        deleteButton.click();
+    }
+
     public void setFeedGroups(String feedGroups){
         getFeedGroups().sendKeys(feedGroups);
     }
+
     public void setFeedACLOwner(String feedACLOwner){
         getFeedACLOwner().clear();
         getFeedACLOwner().sendKeys(feedACLOwner);
@@ -220,8 +471,9 @@ public class FeedWizardPage extends AbstractSearchPage {
         getFeedFrequencyQuantity().sendKeys(frequencyQuantity);
     }
     public void setFeedFrequencyUnit(String frequencyUnit){
-        getFeedFrequencyUnit().sendKeys(frequencyUnit);
+        getFeedFrequencyUnit().selectByVisibleText(frequencyUnit);
     }
+
     public void setFeedLateArrivalCheckBox(){
         getFeedLateArrivalCheckBox().click();
     }
@@ -229,7 +481,7 @@ public class FeedWizardPage extends AbstractSearchPage {
         getFeedLateArrivalCutOffQuantity().sendKeys(Integer.toString(lateArrivalCutOffQuantity));
     }
     public void setFeedLateArrivalCutOffUnit(String lateArrivalCutOffUnit){
-        getFeedLateArrivalCutOffUnit().sendKeys(lateArrivalCutOffUnit);
+        getFeedLateArrivalCutOffUnit().selectByVisibleText(lateArrivalCutOffUnit);
     }
     public void setFeedAvailabilityFlag(String availabilityFlag){
         getFeedAvailabilityFlag().sendKeys(availabilityFlag);
@@ -238,6 +490,32 @@ public class FeedWizardPage extends AbstractSearchPage {
         String timeZone = "GMT+00:00";
         getFeedTimeZone().selectByValue(timeZone);
     }
+    public void setQueueName(String queueName){
+        getQueueName().clear();
+        getQueueName().sendKeys(queueName);
+    }
+    public void setJobPriority(String jobPriority) {
+        getJobPriority().selectByVisibleText(jobPriority);
+    }
+    public void setTimeoutQuantity(String timeoutQuantity){
+        getTimeoutQuantity().clear();
+        getTimeoutQuantity().sendKeys(timeoutQuantity);
+    }
+    public void setTimeoutUnit(String timeoutUnit) {
+        getTimeoutUnit().selectByVisibleText(timeoutUnit);
+    }
+    public void setParallel(String parallel){
+        getParallel().clear();
+        getParallel().sendKeys(parallel);
+    }
+    public void setMaxMaps(String maxMaps){
+        getMaxMaps().clear();
+        getMaxMaps().sendKeys(maxMaps);
+    }
+    public void setMapBandwidthKB(String mapBandwidthKB){
+        getMapBandwidthKB().clear();
+        getMapBandwidthKB().sendKeys(mapBandwidthKB);
+    }
     public void setFeedPropertyKey(int index, String propertyKey){
         getFeedPropertyKey(index).sendKeys(propertyKey);
     }
@@ -246,9 +524,14 @@ public class FeedWizardPage extends AbstractSearchPage {
     }
 
     public void setFeedPath(int index, String path){
+        getFeedPath(index).clear();
         getFeedPath(index).sendKeys(path);
     }
 
+    public void setFeedCatalogTableUri(String catalogTableUri){
+        getFeedCatalogTableUri().sendKeys(catalogTableUri);
+    }
+
     public void setFeedClusterSource(String clusterSource){
         getFeedClusterSource().selectByVisibleText(clusterSource);
     }
@@ -259,7 +542,7 @@ public class FeedWizardPage extends AbstractSearchPage {
     }
 
     public void setFeedClusterRetentionUnit(String clusterRetentionUnit){
-        getFeedClusterRetentionUnit().sendKeys(clusterRetentionUnit);
+        getFeedClusterRetentionUnit().selectByVisibleText(clusterRetentionUnit);
     }
 
     public void setFeedClusterValidityStartDate(String clusterValidityStartDate){
@@ -360,4 +643,14 @@ public class FeedWizardPage extends AbstractSearchPage {
         saveFeedButton.click();
     }
 
+    public FeedMerlin getFeedMerlinFromFeedXml() throws Exception{
+        waitForAngularToFinish();
+        return FeedMerlin.fromString(feedXml.getAttribute("value"));
+    }
+
+    public void setFeedXml(String xml) throws Exception{
+        feedXml.clear();
+        feedXml.sendKeys(xml);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/falcon/blob/05ee82e6/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/FeedSetupTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/FeedSetupTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/FeedSetupTest.java
index 8920f41..c09cfad 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/FeedSetupTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/searchUI/FeedSetupTest.java
@@ -19,6 +19,9 @@
 package org.apache.falcon.regression.searchUI;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.falcon.entity.v0.Frequency;
+import org.apache.falcon.entity.v0.feed.LateArrival;
+import org.apache.falcon.regression.Entities.ClusterMerlin;
 import org.apache.falcon.regression.Entities.FeedMerlin;
 import org.apache.falcon.regression.core.bundle.Bundle;
 import org.apache.falcon.regression.core.helpers.ColoHelper;
@@ -31,12 +34,15 @@ 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.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Random;
 
@@ -53,7 +59,12 @@ public class FeedSetupTest extends BaseUITestClass{
     private String aggregateWorkflowDir = baseTestHDFSDir + "/aggregator";
     private String feedInputPath = baseTestHDFSDir + "/input" + MINUTE_DATE_PATTERN;
     private FeedMerlin feed;
-    private String[] tags = {"first=yes", "second=yes", "third=yes", "wrong=no"};
+    private ClusterMerlin clusterFromBundle;
+    private final String[] tags = {"first=yes", "second=yes", "third=yes", "wrong=no"};
+    private final List<String> timeUnits = new ArrayList<>(Arrays.asList("minutes", "hours", "days", "months"));
+    private final List<String> jobPriorities = new ArrayList<>(Arrays.asList("-Select job-",
+        "Very high", "High", "Normal", "Low", "Very Low"));
+    private final String catalogUri = "catalog:default:test_input_table#dt=${YEAR}-${MONTH}-${DAY}-${HOUR}-${MINUTE}";
 
     private String getRandomTags() {
         List<String> tagsList = new ArrayList<>();
@@ -67,6 +78,9 @@ public class FeedSetupTest extends BaseUITestClass{
         if (r.nextInt(2) == 0) {
             tagsList.add(tags[2]);
         }
+        if (tagsList.isEmpty()){
+            return null;
+        }
         return StringUtils.join(tagsList, ',');
     }
 
@@ -81,6 +95,7 @@ public class FeedSetupTest extends BaseUITestClass{
         bundle.setInputFeedDataPath(feedInputPath);
         bundle.submitClusters(prism);
         feed = FeedMerlin.fromString(bundle.getInputFeedFromBundle());
+        clusterFromBundle = bundle.getClusterElement();
     }
 
     @AfterMethod(alwaysRun = true)
@@ -89,35 +104,901 @@ public class FeedSetupTest extends BaseUITestClass{
         closeBrowser();
     }
 
-    /*
-    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
+    /**
+     * 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 {
         feedWizardPage.getPageHeader().checkHeader();
     }
 
-    /*
-    Run full feed creation scenario.
+    /**
+     * Run full feed creation scenario.
+     * @throws Exception
      */
     @Test
     public void testWizardDefaultScenario() throws Exception {
-        // Set few values in feed, if they are null (Currently null in the FeedMerlin)
-        if (feed.getTags() == null){
-            feed.setTags(getRandomTags());
-        }
-        if (feed.getGroups() == null){
-            feed.setGroups("groups");
+        feed.setTags(getRandomTags());
+        feed.setGroups("groups");
+        feed.setAvailabilityFlag("_SUCCESS");
+        feedWizardPage.setFeed(feed);
+        //Check the response to validate if the feed creation went successfully
+        ServiceResponse response = prism.getFeedHelper().getEntityDefinition(feed.toString());
+        AssertUtil.assertSucceeded(response);
+    }
+
+    /**
+     * Click Cancel on each page. Check that user was navigated to Home page.
+     * @throws Exception
+     */
+    @Test
+    public void testWizardCancel() throws Exception {
+        // Step 1 - Check cancel on the first page - General Info Page
+        feedWizardPage.clickCancel();
+        searchPage.checkPage();
+
+        // Step 2 - Check cancel on the second page - Properties Info Page
+        feedWizardPage = searchPage.getPageHeader().doCreateFeed();
+        feedWizardPage.setFeedGeneralInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.clickCancel();
+        searchPage.checkPage();
+
+        // Step 3 - Check cancel on the third page - Location Info Page
+        feedWizardPage = searchPage.getPageHeader().doCreateFeed();
+        feedWizardPage.setFeedGeneralInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.clickCancel();
+        searchPage.checkPage();
+
+        // Step 4 - Check cancel on the fourth page - Cluster Info Page
+        feedWizardPage = searchPage.getPageHeader().doCreateFeed();
+        feedWizardPage.setFeedGeneralInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.clickCancel();
+        searchPage.checkPage();
+
+        // Step 5 - Check cancel on the fifth page - Summary Page
+        feedWizardPage = searchPage.getPageHeader().doCreateFeed();
+        feedWizardPage.setFeedGeneralInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedClustersInfo(feed);
+        feedWizardPage.clickNext();
+        feedWizardPage.clickCancel();
+        searchPage.checkPage();
+
+    }
+
+    /**
+     * Check that XML Preview reflects changes correctly.
+     * @throws Exception
+     */
+    @Test
+    public void testWizardXmlPreview() throws Exception{
+
+        feed.setTags(getRandomTags());
+        feed.setGroups("groups");
+        feed.setAvailabilityFlag("_SUCCESS");
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert all the values entered on the General Info Page
+        feed.assertGeneralProperties(feedFromXML);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+        feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert all the values entered on the Properties Info Page
+        feed.assertPropertiesInfo(feedFromXML);
+
+        // Set values on the Location Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+        feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert all the values entered on the Location Info Page
+        feed.assertLocationInfo(feedFromXML);
+
+
+        // Set values on the Cluster Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedClustersInfo(feed);
+        feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+
+        // Assert all the values entered on the Cluster Info Page
+        feed.assertClusterInfo(feedFromXML);
+
+    }
+
+    /**
+     * Add few properties to the feed (tag, group).
+     * Click edit XML. Remove both properties from XML.
+     * Check that properties were removed from matching fields.
+     * Now click Edit XML again. Add new tag, group to the XML.
+     * Check that changes have been reflected on wizard page.
+     * @throws Exception
+     */
+    @Test
+    public void testGeneralStepEditXml() throws Exception{
+
+        feed.setTags("first=yes,second=yes");
+        feed.setGroups("groups");
+
+        // Set tag and group on the Wizard
+        feedWizardPage.setFeedTags(feed.getTags());
+        feedWizardPage.setFeedGroups(feed.getGroups());
+
+        // Get XML, and set tag and group back to null
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+        feedFromXML.setTags(null);
+        feedFromXML.setGroups(null);
+
+        // Now click EditXML and set the updated XML here
+        feedWizardPage.clickEditXml();
+        String xmlToString = feedFromXML.toString();
+        feedWizardPage.setFeedXml(xmlToString);
+        feedWizardPage.clickEditXml();
+
+        // Assert that there is only one Tag on the Wizard window
+        feedWizardPage.isTagsDisplayed(0, true);
+        feedWizardPage.isTagsDisplayed(1, false);
+
+        // Assert that the Tag value is empty on the Wizard window
+        Assert.assertEquals(feedWizardPage.getFeedTagKeyText(0), "",
+            "Tag Key Should be empty on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedTagValueText(0), "",
+            "Tag Value Should be empty on the Wizard window");
+
+        // Assert that the Group value is empty on the Wizard window now
+        Assert.assertEquals(feedWizardPage.getFeedGroupsText(), "",
+            "Group Should be empty on the Wizard window");
+
+        // Set Tag and Group values
+        feedFromXML.setTags("third=yes,fourth=no");
+        feedFromXML.setGroups("groups_new");
+
+        // Now click EditXML and set the updated XML here
+        feedWizardPage.clickEditXml();
+        xmlToString = feedFromXML.toString();
+        feedWizardPage.setFeedXml(xmlToString);
+        feedWizardPage.clickEditXml();
+
+        // Assert that there are two Tags on the Wizard window
+        feedWizardPage.isTagsDisplayed(0, true);
+        feedWizardPage.isTagsDisplayed(1, true);
+
+        // Assert that the Tag values are correct on the Wizard window
+        Assert.assertEquals(feedWizardPage.getFeedTagKeyText(0), "third",
+            "Unexpected Tag1 Key on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedTagValueText(0), "yes",
+            "Unexpected Tag1 Value on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedTagKeyText(1), "fourth",
+            "Unexpected Tag2 Key on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedTagValueText(1), "no",
+            "Unexpected Tag2 Value on the Wizard window");
+
+        // Assert that the Group value is correct on the Wizard window
+        Assert.assertEquals(feedWizardPage.getFeedGroupsText(), "groups_new",
+            "Unexpected Group on the Wizard window");
+
+    }
+
+    /**
+     * Populate fields with valid values (name, description, tag, groups, ACL, schema).
+     * Check that user can go to the next step (click next)"
+     * @throws Exception
+     */
+    @Test
+    public void testGeneralStepDefaultScenario() throws Exception{
+
+        feed.setTags(getRandomTags());
+        feed.setGroups("groups");
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+        feedWizardPage.clickNext();
+
+        // Assert on the click of next, the Page moves to the next page
+        feedWizardPage.isFeedFrequencyDisplayed(true);
+
+    }
+
+    /**
+     * Populate fields with valid values (name, description, tag, groups, ACL, schema)\
+     * Check that they are reflected on XML preview.
+     * @throws Exception
+     */
+    @Test
+    public void testGeneralStepXmlPreview() throws Exception{
+
+        feed.setTags(getRandomTags());
+        feed.setGroups("groups");
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert all the values entered on the General Info Page
+        feed.assertGeneralProperties(feedFromXML);
+
+    }
+
+    /**
+     * Add two tags to the feed. Check that they are present.
+     * Check XML preview has it.
+     * Delete one tag. Check that it has been removed from wizard window as well as from XML preview.
+     * @throws Exception
+     */
+    @Test
+    public void testGeneralStepAddRemoveTag() throws Exception{
+
+        // Set Tags in feed
+        feed.setTags("first=yes,second=yes");
+
+        // Set Tag on the General Info Page
+        feedWizardPage.setFeedTags(feed.getTags());
+
+        // Assert two tags are present on the Wizard window
+        feedWizardPage.isTagsDisplayed(0, true);
+        feedWizardPage.isTagsDisplayed(1, true);
+
+        // Get feed from XML Preview
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert Tag values in the XML Preview
+        Assert.assertEquals(feedFromXML.getTags(), feed.getTags());
+
+        // Delete the Tag
+        feedWizardPage.deleteTagOrProperty();
+
+        // Assert that there is only one Tag on the Wizard window
+        feedWizardPage.isTagsDisplayed(0, true);
+        feedWizardPage.isTagsDisplayed(1, false);
+
+        // Get feed from XML Preview
+        feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+        // Assert that there are is only one Tag in the XML Preview
+        Assert.assertEquals(feedFromXML.getTags(), "first=yes",
+            "Unexpected Tags on the XML preview");
+
+    }
+
+
+    /**
+     * Make sure that optional fields are actually optional i.e. keep blank for the
+     * optional fields for this test user should be able to go to next step.
+     * @throws Exception
+     */
+    @Test
+    public void testGeneralStepBlankOptionalFields() throws Exception{
+
+        // Only setting the required fields
+        feedWizardPage.setFeedName(feed.getName());
+        feedWizardPage.setFeedACLOwner(feed.getACL().getOwner());
+        feedWizardPage.setFeedACLGroup(feed.getACL().getGroup());
+        feedWizardPage.setFeedACLPermissions(feed.getACL().getPermission());
+        feedWizardPage.setFeedSchemaLocation(feed.getSchema().getLocation());
+        feedWizardPage.setFeedSchemaProvider(feed.getSchema().getProvider());
+        feedWizardPage.clickNext();
+
+        // Assert that user is able to go to next page using only required fields
+        feedWizardPage.isFeedFrequencyDisplayed(true);
+    }
+
+    /**
+     * Populate all fields with valid values (frequency, parallel...).
+     * Check that user can go to the next step.
+     * @throws Exception
+     */
+    @Test
+    public void testTimingStepDefaultScenario() throws Exception{
+
+        feed.setAvailabilityFlag("_SUCCESS");
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedFrequencyQuantity(feed.getFrequency().getFrequency());
+        feedWizardPage.setFeedFrequencyUnit(feed.getFrequency().getTimeUnit().toString());
+        feedWizardPage.setFeedLateArrivalCheckBox();
+        feedWizardPage.setFeedLateArrivalCutOffQuantity(
+            feed.getLateArrival().getCutOff().getFrequencyAsInt());
+        feedWizardPage.setFeedLateArrivalCutOffUnit(
+            feed.getLateArrival().getCutOff().getTimeUnit().toString());
+        feedWizardPage.setFeedAvailabilityFlag(feed.getAvailabilityFlag());
+        feedWizardPage.setFeedTimeZone();
+        feedWizardPage.setQueueName("Default");
+        feedWizardPage.setJobPriority("High");
+        feedWizardPage.setTimeoutQuantity("30");
+        feedWizardPage.setTimeoutUnit("minutes");
+        feedWizardPage.setParallel("4");
+        feedWizardPage.setMaxMaps("7");
+        feedWizardPage.setMapBandwidthKB("2048");
+        feedWizardPage.setFeedPropertyKey(0, feed.getProperties().getProperties().get(0).getName());
+        feedWizardPage.setFeedPropertyValue(0,
+            feed.getProperties().getProperties().get(0).getValue());
+        feedWizardPage.addProperty();
+        feedWizardPage.setFeedPropertyKey(1, feed.getProperties().getProperties().get(1).getName());
+        feedWizardPage.setFeedPropertyValue(1,
+            feed.getProperties().getProperties().get(1).getValue());
+
+        feedWizardPage.clickNext();
+
+        // Assert user is able to go on the next page
+        feedWizardPage.isFeedDataPathDisplayed(true);
+
+    }
+
+    /**
+     * Populate fields with valid values (frequency, late arrival, availability flag, so on)
+     * Check that they are reflected on XML preview.
+     * @throws Exception
+     */
+    @Test
+    public void testTimingStepXmlPreview() throws Exception{
+
+        feed.setAvailabilityFlag("_SUCCESS");
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert all the values entered on the Properties Info Page
+        feed.assertPropertiesInfo(feedFromXML);
+
+    }
+
+    /**
+     * Add some properties to the feed (frequency, late arrival).
+     * Click edit XML. Remove both properties from XML.
+     * Check that properties were removed from matching fields.
+     * Now click Edit XML again. Add new properties to the XML.
+     * Check that changes have been reflected on wizard page.
+     * @throws Exception
+     */
+    @Test
+    public void testTimingStepEditXml() throws Exception{
+
+        feedWizardPage.setFeedGeneralInfo(feed);
+        feedWizardPage.clickNext();
+
+        // Set Frequency and Late Arrival on the Wizard
+        feedWizardPage.setFeedFrequencyQuantity(feed.getFrequency().getFrequency());
+        feedWizardPage.setFeedFrequencyUnit(feed.getFrequency().getTimeUnit().toString());
+        feedWizardPage.setFeedLateArrivalCheckBox();
+        feedWizardPage.setFeedLateArrivalCutOffQuantity(feed.getLateArrival().getCutOff().getFrequencyAsInt());
+        feedWizardPage.setFeedLateArrivalCutOffUnit(feed.getLateArrival().getCutOff().getTimeUnit().toString());
+
+        // Get XML, and set Frequency and Late Arrival back to null
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+        feedFromXML.setFrequency(null);
+        feedFromXML.setLateArrival(null);
+
+        // Now click EditXML and set the updated XML here
+        feedWizardPage.clickEditXml();
+        String xmlToString = feedFromXML.toString();
+        feedWizardPage.setFeedXml(xmlToString);
+        feedWizardPage.clickEditXml();
+
+        // Assert that the Frequency value is empty on the Wizard window
+        Assert.assertEquals(feedWizardPage.getFeedFrequencyQuantityText(), "",
+            "Frequency Quantity Should be empty on the Wizard window");
+
+        // Assert that the Late Arrival value is empty on the Wizard window
+        Assert.assertEquals(feedWizardPage.getFeedLateArrivalCutOffQuantityText(), "",
+            "CutOff Quantity Should be empty on the Wizard window");
+
+        // Set Frequency and Late Arrival values
+        feedFromXML.setFrequency(new Frequency("5", Frequency.TimeUnit.minutes));
+        feedFromXML.setLateArrival(new LateArrival());
+        feedFromXML.getLateArrival().setCutOff(new Frequency("1", Frequency.TimeUnit.days));
+
+        // Now click EditXML and set the updated XML here
+        feedWizardPage.clickEditXml();
+        xmlToString = feedFromXML.toString();
+        feedWizardPage.setFeedXml(xmlToString);
+        feedWizardPage.clickEditXml();
+
+        // Assert that the Frequency values are correct on the Wizard window
+        Assert.assertEquals(feedWizardPage.getFeedFrequencyQuantityText(), "5",
+            "Unexpected Frequency on the XML preview");
+
+        // Assert that the Late Arrival value is correct on the Wizard window
+        Assert.assertEquals(feedWizardPage.getFeedLateArrivalCutOffQuantityText(), "1",
+            "Unexpected CutOff on the XML preview");
+
+    }
+
+    /**
+     * Check that frequency, late arrival and timeout drop downs contain correct items (timeunits).
+     * Check that jobPriority dropDown contains valid priorities.
+     * @throws Exception
+     */
+    @Test
+    public void testTimingStepDropDownLists() throws Exception{
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+        feedWizardPage.clickNext();
+
+        List<String> dropdownValues = feedWizardPage.getFeedFrequencyUnitValues();
+        Assert.assertEquals(timeUnits, dropdownValues, "Frequency Unit Values Are Not Equal");
+
+        dropdownValues = feedWizardPage.getFeedLateArrivalCutOffUnitValues();
+        Assert.assertEquals(timeUnits, dropdownValues, "Late Arrival Unit Values Are Not Equal");
+
+        dropdownValues = feedWizardPage.getJobPriorityValues();
+        Assert.assertEquals(jobPriorities, dropdownValues, "Job Priority Unit Values Are Not Equal");
+
+        dropdownValues = feedWizardPage.getTimeoutUnitValues();
+        Assert.assertEquals(timeUnits, dropdownValues, "Timeout Unit Values Are Not Equal");
+    }
+
+
+    /**
+     * Add two properties to the feed. Check that they are present (as separate element) on the
+     * page.
+     * Check XML preview has it. Delete one property. Check that it has been removed from wizard
+     * window as well as from XML preview.
+     * @throws Exception
+     */
+    @Test
+    public void testTimingStepAddDeleteProperties() throws Exception{
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+        feedWizardPage.clickNext();
+        // Set first property
+        feedWizardPage.setFeedPropertyKey(0, feed.getProperties().getProperties().get(0).getName());
+        feedWizardPage.setFeedPropertyValue(0,
+            feed.getProperties().getProperties().get(0).getValue());
+        // Click add property button
+        feedWizardPage.addProperty();
+        // Set second property
+        feedWizardPage.setFeedPropertyKey(1, feed.getProperties().getProperties().get(1).getName());
+        feedWizardPage.setFeedPropertyValue(1,
+            feed.getProperties().getProperties().get(1).getValue());
+
+        // Assert two Properties are present on the Wizard window
+        feedWizardPage.isPropertyDisplayed(0, true);
+        feedWizardPage.isPropertyDisplayed(1, true);
+
+        // Get feed from XML Preview
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert Property values in the XML Preview
+        Assert.assertEquals(feedFromXML.getProperties().getProperties().get(5).getName(),
+            feed.getProperties().getProperties().get(0).getName(),
+            "Unexpected Property1 Name on the XML preview");
+        Assert.assertEquals(feedFromXML.getProperties().getProperties().get(5).getValue(),
+            feed.getProperties().getProperties().get(0).getValue(),
+            "Unexpected Property1 Value on the XML preview");
+        Assert.assertEquals(feedFromXML.getProperties().getProperties().get(6).getName(),
+            feed.getProperties().getProperties().get(1).getName(),
+            "Unexpected Property2 Name on the XML preview");
+        Assert.assertEquals(feedFromXML.getProperties().getProperties().get(6).getValue(),
+            feed.getProperties().getProperties().get(1).getValue(),
+            "Unexpected Property2 Value on the XML preview");
+
+
+        // Delete one Property
+        feedWizardPage.deleteTagOrProperty();
+
+        // Assert only one Property is present on the Wizard window
+        feedWizardPage.isPropertyDisplayed(0, true);
+        feedWizardPage.isPropertyDisplayed(1, false);
+
+
+        // Get feed from XML Preview
+        feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert Property value in the XML Preview
+        Assert.assertEquals(feedFromXML.getProperties().getProperties().get(5).getName(),
+            feed.getProperties().getProperties().get(0).getName(),
+            "Unexpected Property1 Name on the XML preview");
+        Assert.assertEquals(feedFromXML.getProperties().getProperties().get(5).getValue(),
+            feed.getProperties().getProperties().get(0).getValue(),
+            "Unexpected Property1 Value on the XML preview");
+        try{
+            feedFromXML.getProperties().getProperties().get(6);
+            Assert.fail("Second Property found in the XML Preview");
+        } catch (Exception ex){
+            LOGGER.info("Second Property not found in the XML Preview");
         }
-        if (feed.getAvailabilityFlag() == null){
-            feed.setAvailabilityFlag("_SUCCESS");
+
+    }
+
+
+    /**
+     * Populate locations with valid values.
+     * Check that user can go to the next step.
+     * @throws Exception
+     */
+    @Test
+    public void testLocationStepValidValuesFS() throws Exception{
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+
+        // Set values on the Location Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+
+        feedWizardPage.clickNext();
+        // Assert user is able to go on the next page
+        feedWizardPage.isFeedClusterRetentionDisplayed(true);
+
+    }
+
+    /**
+     * Select Catalog Storage and populate it with valid value.
+     * Check that user is allowed to go to the next step.
+     * @throws Exception
+     */
+    @Test
+    public void testLocationStepValidCatalogStorage() throws Exception{
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+
+        // Select Catalog Storage and Set Table Uri on the Location Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.clickCatalogStorageButton();
+        feedWizardPage.setFeedCatalogTableUri(catalogUri);
+
+        feedWizardPage.clickNext();
+
+        // Assert user is able to go to the next Page
+        feedWizardPage.isFeedClusterRetentionDisplayed(true);
+    }
+
+    /**
+     * Populate locations fields with values as well as Catalog table uri.
+     * Check that user is not allowed to go to the next step and is notified with an appropriate alert.
+     * @throws Exception
+     */
+    @Test
+    public void testLocationStepBothLocationsAndTableUri() throws Exception{
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+
+        // Set values on the Location Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+
+        // Select Catalog Storage and Set Table Uri on the Location Info Page
+        feedWizardPage.clickCatalogStorageButton();
+        feedWizardPage.setFeedCatalogTableUri(catalogUri);
+
+        feedWizardPage.clickNext();
+
+        // Assert user should not be able to go to the next Page
+        feedWizardPage.isFeedClusterRetentionDisplayed(false);
+
+    }
+
+    /**
+     * Populate locations with valid values and check that they are reflected on XML preview.
+     * Click edit XML. Change locations. Check that changes are reflected on XML as well as on wizard page.
+     * @throws Exception
+     */
+    @Test
+    public void testLocationStepEditXml() throws Exception{
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+
+        // Set values on the Location Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+
+        // Get feed from XML Preview
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert all the values entered on the Location Info Page
+        feed.assertLocationInfo(feedFromXML);
+        // Set new Location Paths
+        feedFromXML.getLocations().getLocations().get(0).setPath(
+            baseTestHDFSDir + "/newInput/${YEAR}/${MONTH}/${DAY}/${HOUR}/${MINUTE}");
+        feedFromXML.getLocations().getLocations().get(1).setPath(baseTestHDFSDir + "/newFalcon/clicksStats");
+        feedFromXML.getLocations().getLocations().get(2).setPath(baseTestHDFSDir + "/newFalcon/clicksMetaData");
+
+        // Now click EditXML and set the updated XML here
+        feedWizardPage.clickEditXml();
+        String xmlToString = feedFromXML.toString();
+        feedWizardPage.setFeedXml(xmlToString);
+        feedWizardPage.clickEditXml();
+
+        // Get feed from XML Preview
+        feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+        // Assert all the values on the Location Info Page
+        Assert.assertEquals(feedFromXML.getLocations().getLocations().get(0).getPath(),
+            baseTestHDFSDir + "/newInput/${YEAR}/${MONTH}/${DAY}/${HOUR}/${MINUTE}");
+        Assert.assertEquals(feedFromXML.getLocations().getLocations().get(1).getPath(),
+            baseTestHDFSDir + "/newFalcon/clicksStats");
+        Assert.assertEquals(feedFromXML.getLocations().getLocations().get(2).getPath(),
+            baseTestHDFSDir + "/newFalcon/clicksMetaData");
+
+        // Assert that the Location Path values are correct on the Wizard window
+        Assert.assertEquals(feedWizardPage.getFeedPathText(0),
+            baseTestHDFSDir + "/newInput/${YEAR}/${MONTH}/${DAY}/${HOUR}/${MINUTE}",
+            "Unexpected Cluster Data Location on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedPathText(1),
+            baseTestHDFSDir + "/newFalcon/clicksStats",
+            "Unexpected Cluster Stats Location on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedPathText(2),
+            baseTestHDFSDir +"/newFalcon/clicksMetaData",
+            "Unexpected Cluster Meta Location on the Wizard window");
+
+
+    }
+
+    /**
+     * Populate each field with correct values (cluster, validity ...).
+     * Check that user can go to the next step.
+     * @throws Exception
+     */
+    @Test
+    public void testClustersStepDefaultScenario() throws Exception{
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+
+        // Set values on the Location Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+
+        // Set values on the Cluster Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedClustersInfo(feed);
+
+        feedWizardPage.clickNext();
+
+        // Assert user is able to go to the next Page
+        feedWizardPage.isSaveFeedButtonDisplayed(true);
+    }
+
+    /**
+     * Submit few clusters. Check that cluster list contains all clusters.
+     * Check that retention drop down lists contains valid time units.
+     * @throws Exception
+     */
+    @Test
+    public void testClustersStepDropDownLists() throws Exception{
+
+        List<String> allClusters = new ArrayList<>();
+        // Add four more clusters
+        for (int i=0; i< 4; i++){
+            ClusterMerlin newCluster = new ClusterMerlin(clusterFromBundle.toString());
+            newCluster.setName(clusterFromBundle.getName() + "-" + i);
+            AssertUtil.assertSucceeded(prism.getClusterHelper().submitEntity(newCluster.toString()));
+            allClusters.add(newCluster.getName());
         }
+        // Also add base cluster and -Select cluster- to allCluster array
+        allClusters.add(feed.getClusters().getClusters().get(0).getName());
+        allClusters.add("-Select cluster-");
+        Collections.sort(allClusters);
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+
+        // Set values on the Location Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+
+        feedWizardPage.clickNext();
+        // Assert cluster source drop down contains all the clusters
+        List<String> dropdownValues = feedWizardPage.getFeedClusterSourceValues();
+        Collections.sort(dropdownValues);
+        Assert.assertEquals(allClusters, dropdownValues,
+            "Cluster Source Values Are Not Equal");
+
+        // Assert retention drop down time units
+        dropdownValues = feedWizardPage.getFeedClusterRetentionUnitValues();
+        Assert.assertEquals(timeUnits, dropdownValues, "Retention Unit Values Are Not Equal");
+
+    }
+
+    /**
+     * Populate FS locations on previous step. Don't populate any values on the current step.
+     * Go to the next one. Check that XML preview has locations provided on Location step.
+     * Repeat the same for Catalog URI.
+     * @throws Exception
+     */
+    @Test
+    public void testClustersStepDefaultLocations() throws Exception{
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+
+        // Set values on the Location Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+
+        feedWizardPage.clickNext();
+        // Get feed from XML Preview
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert all the values entered on the Location Info Page
+        feed.assertLocationInfo(feedFromXML);
+
+        feedWizardPage.clickPrevious();
+        // Clear all the Location Info
+        feedWizardPage.setFeedPath(0, "");
+        feedWizardPage.setFeedPath(1, "");
+        feedWizardPage.setFeedPath(2, "");
+
+        // Select Catalog Storage and Set Table Uri on the Location Info Page
+        feedWizardPage.clickCatalogStorageButton();
+        feedWizardPage.setFeedCatalogTableUri(catalogUri);
+
+        feedWizardPage.clickNext();
+
+        // Get feed from XML Preview
+        feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert the Table Uri value entered on the Location Info Page
+        Assert.assertEquals(feedFromXML.getTable().getUri(), catalogUri,
+            "Unexpected Cluster URI on the XML preview");
+
+    }
+
+    /**
+     * Populate all fields with valid values and check that they are reflected on XML preview.
+     * Click edit XML. Change retention and locations.
+     * Check that changes are reflected on XML as well as on wizard page.
+     * @throws Exception
+     */
+    @Test
+    public void testClusterStepEditXml() throws Exception{
+
+        // Set values on the General Info Page
+        feedWizardPage.setFeedGeneralInfo(feed);
+
+        // Set values on the Properties Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedPropertiesInfo(feed);
+
+        // Set values on the Location Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedLocationInfo(feed);
+
+        // Set values on the Cluster Info Page
+        feedWizardPage.clickNext();
+        feedWizardPage.setFeedClustersInfo(feed);
+
+        // Get feed from XML Preview
+        FeedMerlin feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+
+        // Assert all the values on the Cluster Info Page
+        feed.assertClusterInfo(feedFromXML);
+
+
+        // Set new Location and Retention
+        feedFromXML.getClusters().getClusters().get(0).getLocations().getLocations().get(0).setPath(
+            baseTestHDFSDir + "/newInput/${YEAR}/${MONTH}/${DAY}/${HOUR}/${MINUTE}");
+        feedFromXML.getClusters().getClusters().get(0).getLocations().getLocations().get(1).setPath(
+            baseTestHDFSDir + "/newFalcon/clicksStats");
+        feedFromXML.getClusters().getClusters().get(0).getLocations().getLocations().get(2).setPath(
+            baseTestHDFSDir + "/newFalcon/clicksMetaData");
+        feedFromXML.getClusters().getClusters().get(0).getRetention().
+            setLimit(new Frequency("60", Frequency.TimeUnit.minutes));
+
+
+        // Now click EditXML and set the updated XML here
+        feedWizardPage.clickEditXml();
+        String xmlToString = feedFromXML.toString();
+        feedWizardPage.setFeedXml(xmlToString);
+        feedWizardPage.clickEditXml();
+
+        // Get feed from XML Preview
+        feedFromXML = feedWizardPage.getFeedMerlinFromFeedXml();
+        // Assert all the values on the Location Info Page
+        Assert.assertEquals(feedFromXML.getClusters().getClusters().get(0)
+                .getLocations().getLocations().get(0).getPath(),
+            baseTestHDFSDir + "/newInput/${YEAR}/${MONTH}/${DAY}/${HOUR}/${MINUTE}",
+            "Unexpected Cluster Data Path on the XML preview");
+        Assert.assertEquals(feedFromXML.getClusters().getClusters().get(0)
+                .getLocations().getLocations().get(1).getPath(),
+            baseTestHDFSDir + "/newFalcon/clicksStats",
+            "Unexpected Cluster Stats Path on the XML preview");
+        Assert.assertEquals(feedFromXML.getClusters().getClusters().get(0)
+                .getLocations().getLocations().get(2).getPath(),
+            baseTestHDFSDir + "/newFalcon/clicksMetaData",
+            "Unexpected Cluster Meta Path on the XML preview");
+        Assert.assertEquals(feedFromXML.getClusters().getClusters().get(0)
+            .getRetention().getLimit().getFrequency(), "60",
+            "Unexpected Retention on the XML preview");
+        Assert.assertEquals(feedFromXML.getClusters().getClusters().get(0)
+                .getRetention().getLimit().getTimeUnit().name(), "minutes",
+            "Unexpected Retention Unit on the XML preview");
+
+
+        // Assert that the Location and Retention values are correct on the Wizard window
+        Assert.assertEquals(feedWizardPage.getFeedPathText(0),
+            baseTestHDFSDir + "/newInput/${YEAR}/${MONTH}/${DAY}/${HOUR}/${MINUTE}",
+            "Unexpected Cluster Data Location on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedPathText(1),
+            baseTestHDFSDir + "/newFalcon/clicksStats",
+            "Unexpected Cluster Stats Location on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedPathText(2),
+            baseTestHDFSDir + "/newFalcon/clicksMetaData",
+            "Unexpected Cluster Meta Location on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedClusterRetentionLimitText(), "60",
+            "Unexpected Retention Limit on the Wizard window");
+        Assert.assertEquals(feedWizardPage.getFeedClusterRetentionUnitText(), "minutes",
+            "Unexpected Retention Unit on the Wizard window");
+
+
+    }
+
+    /**
+     * Create feed. Using API check that feed was created.
+     * @throws Exception
+     */
+    @Test
+    public void testSummaryStepDefaultScenario() throws Exception{
+
         feedWizardPage.setFeed(feed);
-        //Check the response to validate if the feed creation went successfully
+        //Check the response using API to validate if the feed creation went successfully
         ServiceResponse response = prism.getFeedHelper().getEntityDefinition(feed.toString());
         AssertUtil.assertSucceeded(response);
+
     }
 
+
 }