You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2017/09/22 05:47:40 UTC

[09/24] git commit: [flex-asjs] [refs/heads/packaging] - reorg mustella java files

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/SetProperty.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/SetProperty.java b/mustella/src/main/java/marmotinni/SetProperty.java
new file mode 100644
index 0000000..b05c419
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/SetProperty.java
@@ -0,0 +1,119 @@
+/*
+ *
+ * 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 marmotinni;
+
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import org.xml.sax.Attributes;
+
+/** 
+ * SetProperty
+ *
+ * Set a property
+ */
+public class SetProperty extends TestStep { 
+
+	public SetProperty () { 
+	}
+
+    /**
+     *  Set the target's property to the specified value
+     */
+	@Override
+    protected void doStep()
+    {
+		String valueString = null;
+		if (valueExpression != null)
+			valueString = ((JavascriptExecutor)webDriver).executeScript(valueExpression).toString();
+		else if (value != null)
+		{
+			if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("true"))
+				valueString = value;
+			else {				
+				try {
+					Double.parseDouble(value);
+					valueString = value;
+				}
+				catch (Exception e) {
+					valueString = "'" + value + "'";
+				}
+			}
+		}
+		else
+			valueString = "null";
+		
+		StringBuilder setScript = new StringBuilder();
+		insertTargetScript(setScript, target);
+		setScript.append("if (typeof(target['set_' + '" + propertyName + "']) == 'function') target['set_' + '" + propertyName + "'](" + valueString + ");");
+		setScript.append(" else target['" + propertyName + "']=" + valueString + ";");
+		if (TestStep.showScripts)
+			System.out.println(setScript.toString());
+		((JavascriptExecutor)webDriver).executeScript(setScript.toString());
+    }
+	
+	/**
+	 *  The object to set a property on
+	 */
+	public String target;
+	
+	/**
+	 *  The name of the property to set
+	 */
+	public String propertyName;
+	
+	/**
+	 *  The value to set
+	 */
+	public String value;
+	
+	/**
+	 *  The value to set
+	 */
+	public String valueExpression;
+	
+    /**
+     *  customize string representation
+     */
+	@Override
+    public String toString()
+    {
+		String s = "SetProperty";
+		if (target != null)
+			s += ": target = " + target.toString();
+		if (propertyName != null)
+			s += ": propertyName = " + propertyName.toString();
+		if (value != null)
+			s += ": value = " + value;
+		return s;
+	}
+
+	@Override
+	public void populateFromAttributes(Attributes attributes)
+	{
+		target = attributes.getValue("target");
+		propertyName = attributes.getValue("propertyName");
+		value = attributes.getValue("value");
+		valueExpression = attributes.getValue("valueExpression");
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/TestCase.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/TestCase.java b/mustella/src/main/java/marmotinni/TestCase.java
new file mode 100644
index 0000000..06e0e80
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/TestCase.java
@@ -0,0 +1,293 @@
+/*
+ *
+ * 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 marmotinni;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Date;
+
+import org.openqa.selenium.WebDriver;
+
+import org.xml.sax.Attributes;
+
+/** 
+ * TestCase
+ *
+ * A set of TestSteps.
+ */
+public class TestCase { 
+
+	public static boolean showSteps = false;
+	
+	/**
+	 *  The history of bugs that this test case has encountered
+	 */
+	public List<String> bugs;
+	
+	/**
+	 *  The sequence of TestSteps that comprise the test setup
+	 */
+	public List<TestStep> setup;
+	
+	/**
+	 *  The sequence of TestSteps that comprise the test
+	 */
+	public List<TestStep> body;
+	
+	/**
+	 *  The sequence of TestSteps that restore the test environment
+	 */
+	public List<TestStep> cleanup;
+	
+	/**
+	 *  An identifier for the test
+	 */
+	public String testID;
+	
+	/**
+	 *  A description of the test 
+	 */
+	public String description;
+	
+	/**
+	 *  keywords, summarizing the tests
+	 */
+	public String keywords;
+	
+	/**
+	 *  frequency, an estimate of the tests's intersection with real-world
+	 *  usage. 1 = most frequent usage; 2 somewhat common; 3 = unusual
+	 */
+	public String frequency;
+	
+	/**
+	 *  The current set of steps (setup, body, cleanup) we are executing
+	 */
+	private List<TestStep> currentSteps;
+	
+	/**
+	 *  Which step we're currently executing (or waiting on an event for)
+	 */
+	private int currentIndex = 0;
+	
+	/**
+	 *  Number of steps in currentSteps
+	 */
+	private int numSteps = 0;
+	
+	/**
+	 *  Storage for the cleanupAsserts
+	 */
+	private List<AssertStep> cleanupAsserts;
+	
+	/**
+	 *  Steps we have to review at the end of the body to see if
+	 *  they failed or not.  These steps monitor activity like
+	 *  checking for duplicate events or making sure unwanted events
+	 *  don't fire.
+	 */
+	public List<AssertStep> getCleanupAsserts()
+	{
+		return cleanupAsserts;
+	}
+	
+	/**
+	 *  Storage for this tests's result
+	 */
+	private TestResult testResult;
+	
+	/**
+	 *  This tests's result
+	 */
+	public TestResult getTestResult() 
+	{ 
+		testResult.testID = testID;
+		return testResult;
+	}
+	
+	/**
+	 * Constructor. Create the TestResult associated with this TestCase
+	 */
+	public TestCase() {
+		
+		testResult = new TestResult();
+		testResult.testID = testID;
+		
+		cleanupAsserts = new ArrayList<AssertStep>();
+	}
+	
+	/**
+	 *  Called when it is time to execute
+	 *  this test case.
+	 *
+	 */
+	public boolean runTest(WebDriver webDriver)
+	{
+		testResult.beginTime = new Date().getTime();
+						
+		return runSetup(webDriver);
+	}
+	
+	/**
+	 *  Execute the setup portion of the test
+	 */
+	private boolean runSetup(WebDriver webDriver)
+	{
+		if (!testResult.hasStatus()) 
+		{ 
+			if (setup != null)
+			{
+				testResult.phase = TestResult.SETUP;
+				currentIndex = 0;
+				currentSteps = setup;
+				numSteps = setup.size();
+				// return if we need to wait for something
+				if (!runSteps(webDriver))
+					return false;
+				
+			}
+		}
+		return runBody(webDriver);
+	}
+	
+	/**
+	 *  Execute the body portion of the test
+	 */
+	private boolean runBody(WebDriver webDriver)
+	{
+		if (!testResult.hasStatus()) 
+		{ 
+			if (body != null)
+			{
+				testResult.phase = TestResult.BODY;
+				currentIndex = 0;
+				currentSteps = body;
+				numSteps = body.size();
+				// return if we need to wait for something
+				if (!runSteps(webDriver))
+					return false;
+				
+			}
+		}
+		return runCleanup(webDriver);
+	}
+	
+	/**
+	 *  Execute the cleanup portion of the test
+	 */
+	private boolean runCleanup(WebDriver webDriver)
+	{
+		if (!testResult.hasStatus()) 
+		{ 
+			if (cleanup != null)
+			{
+				testResult.phase = TestResult.CLEANUP;
+				currentIndex = 0;
+				currentSteps = cleanup;
+				numSteps = cleanup.size();
+				// return if we need to wait for something
+				if (!runSteps(webDriver))
+					return false;
+				
+			}
+		}
+		return runComplete();
+	}
+	
+	/**
+	 *  Clean up when all three phases are done.  Sends an event
+	 *  to the UnitTester harness to tell it that it can run
+	 *  the next test case.
+	 */
+	private boolean runComplete()
+	{
+		int n = cleanupAsserts.size();
+		for (int i = 0; i < n; i++)
+		{
+			AssertStep asrt = cleanupAsserts.get(i);
+			asrt.cleanup();
+		}
+		testResult.endTime = new Date().getTime();
+		return true;
+	}
+	
+	/**
+	 *  Go through the currentSteps, executing each one.
+	 *  Returns true if no test steps required waiting.
+	 *  Returns false if we have to wait for an event before
+	 *  continuing.
+	 */
+	private boolean runSteps(WebDriver webDriver)
+	{
+		while (currentIndex < numSteps)
+		{
+			// return if a step failed
+			if (testResult.hasStatus()) 
+				return true;
+			
+			TestStep step = currentSteps.get(currentIndex);
+			if (!(step instanceof AssertStep))
+			{
+				// look at subsequent steps for Asserts and set them up early
+				for (int j = currentIndex + 1; j < numSteps; j++)
+				{
+					// scan following asserts for AssertEvents and set them up early
+					TestStep nextStep = currentSteps.get(j);
+					if (nextStep instanceof AssertStep)
+					{
+						((AssertStep)nextStep).preview(webDriver, this, testResult);
+						/* TODO: (aharui) re-enable when we need these asserts
+						// do a check to be sure folks are using AssertEventPropertyValue correctly
+						if (nextStep instanceof AssertEventPropertyValue)
+						{
+							// AEPV must follow an AssertEvent or another AEPV
+							if (j == 0 || !(currentSteps[j-1] instanceof AssertEvent || currentSteps[j-1] instanceof AssertEventPropertyValue))
+								TestOutput.logResult("WARNING: AssertEventPropertyValue may be missing preceding AssertEvent");
+						}
+						else if (nextStep instanceof AssertError)
+						{
+							if (step instanceof SetProperty)
+								SetProperty(step).expectError = true;
+						}
+						*/
+					}
+					else
+						break;
+				}
+			}
+			if (TestCase.showSteps)
+				System.out.println(step.toString());
+			step.execute(webDriver, this, testResult);
+			currentIndex++;
+		}
+		return true;
+	}
+				
+	public void populateFromAttributes(Attributes attributes)
+	{
+		description = attributes.getValue("description");
+		testID = attributes.getValue("testID");
+		keywords = attributes.getValue("keywords");
+		frequency = attributes.getValue("frequency");
+		
+	}
+	
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/TestOutput.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/TestOutput.java b/mustella/src/main/java/marmotinni/TestOutput.java
new file mode 100644
index 0000000..4b63f10
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/TestOutput.java
@@ -0,0 +1,36 @@
+/*
+ *
+ * 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 marmotinni;
+
+/**
+ *  The class that collects TestResults for a TestCase
+ */
+public class TestOutput 
+{
+	
+	/** 
+	 *  get printable version of phase
+	 */
+	public static void logResult(String message) { 
+		System.out.println(message);
+	}
+	
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/TestResult.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/TestResult.java b/mustella/src/main/java/marmotinni/TestResult.java
new file mode 100644
index 0000000..1d64bae
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/TestResult.java
@@ -0,0 +1,151 @@
+/*
+ *
+ * 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 marmotinni;
+
+import java.util.Date;
+
+/**
+ *  The class that collects TestResults for a TestCase
+ */
+public class TestResult 
+{
+	
+	public static final int PASS = 0;
+	public static final int FAIL = 1;
+	public static final int ERROR = 2;
+	
+	public static final int SETUP = 0;
+	public static final int BODY = 1;
+	public static final int CLEANUP = 2;
+	
+	/** 
+	 *  testID
+	 */
+	public String testID;
+	
+	/** 
+	 *  begin time
+	 */
+	public long beginTime;
+	
+	/** 
+	 *  end time
+	 */
+	public long endTime;
+	
+	/** 
+	 *  result
+	 */
+	public int result = -1;  // "pass", "fail", "error"
+	
+	/** 
+	 *  message. Failures often have messages
+	 */
+	public String message = "";
+	
+	/** 
+	 *  extraInfo: failures may have a file associated 
+	 */
+	public String extraInfo = "";
+	
+	/** 
+	 *  Name of the Script associated with this result
+	 */
+	public String scriptName = "";
+	
+	/** 
+	 *  phase. how far the test finished. setup, body, cleanup
+	 */
+	public int phase = -1;
+	
+	/** 
+	 *  get printable version of phase
+	 */
+	public static String getPhaseString(int val) { 
+		if (val == CLEANUP) {
+			return "cleanup";
+		}else if (val == BODY) {
+			return "body";
+		}else if (val == SETUP) {
+			return "setup";
+			
+		}
+		return "no phase set";
+	}
+	
+	/** 
+	 *  get printable version of result
+	 */
+	public static String getResultString(int val) { 
+		if (val == PASS) {
+			return "pass";
+		}else if (val == FAIL) {
+			return "fail";
+		}else if (val == ERROR) {
+			return "error";
+		}
+		return null;
+	}
+	
+	
+	/** 
+	 *  default output look
+	 */
+	public String toString() 
+	{ 
+		return "RESULT: scriptName=" + scriptName + " id=" + testID + " result=" + getResultString(result)  + " elapsed=" + (endTime-beginTime) + " phase=" + getPhaseString(phase) + " started=" + beginTime + " extraInfo=" + extraInfo + " msg=" + message ;
+	}
+	
+	
+	public boolean hasStatus() { 
+		return (result != -1);
+	}
+	
+	
+	public void doFail (String msg) {
+		doFail(msg, null, null, 0);
+	}
+	
+	public void doFail (String msg, String extraInfo) { 
+		doFail(msg, extraInfo, null, 0);
+	}
+	
+	public void doFail (String msg, String extraInfo, TestStep lastStep, int lastStepLine) { 
+		// first failure is the one we keep
+		if (this.result != FAIL)
+		{
+			this.result = FAIL;
+			// this.message = msg;
+			if (lastStep != null)
+			{ 
+				String tmp = lastStep.toString().substring(0, lastStep.toString().indexOf (":")) + "(" + getPhaseString(phase) + ":step " + (lastStepLine + 1) + ") ";
+				this.message = tmp + " " + msg;
+			} 
+			else 
+			{
+				this.message = msg;
+			}
+			this.extraInfo = extraInfo;
+		}
+	}
+	
+	
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/TestStep.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/TestStep.java b/mustella/src/main/java/marmotinni/TestStep.java
new file mode 100644
index 0000000..23eb1b3
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/TestStep.java
@@ -0,0 +1,124 @@
+/*
+ *
+ * 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 marmotinni;
+
+import org.openqa.selenium.WebDriver;
+
+import org.xml.sax.Attributes;
+
+/** 
+ * TestStep
+ *
+ * Base class for test steps like DispatchMouseEvent and AssertPropertyValue, etc.
+ */
+public class TestStep { 
+
+	public static boolean showScripts = false;
+
+	public TestStep () { 
+	}
+
+	public boolean execute(WebDriver webDriver, TestCase testCase, TestResult testResult)
+	{
+		this.webDriver = webDriver;
+		this.testCase = testCase;
+		this.testResult = testResult;
+				
+		doStep();
+		
+		// if test failed, don't bother waiting, just bail
+		if (testResult.hasStatus())
+		{
+			if (waitEvent != null)
+			{
+				/* TODO: figure out how to wait */
+			}
+		}
+		
+		return true;
+	}
+	
+	/**
+	 *  The name of the object to listen for an event we're waiting on
+	 */
+	public String waitTarget;
+	
+	/**
+	 *  The name of the event to listen for on the waitTarget
+	 */
+	public String waitEvent;
+	
+	/**
+	 *  The number of milliseconds to wait before giving up
+	 */
+	public int timeout = 3000;
+	
+	/**
+	 *  The TestResult for this TestCase
+	 */
+	protected TestResult testResult;
+	
+	/**
+	 *  The TestCase that this step belongs to
+	 */
+	protected TestCase testCase;
+
+	/**
+	 *  The WebDriver for this session
+	 */
+	protected WebDriver webDriver;
+	
+	/**
+	 *  The method that gets called when it is time to perform the work in the step.
+	 */
+	protected void doStep()
+	{
+	}
+	
+	public void populateFromAttributes(Attributes attributes) throws Exception
+	{
+		waitTarget = attributes.getValue("waitTarget");
+		waitEvent = attributes.getValue("waitEvent");
+	}
+	
+	protected void insertTargetScript(StringBuilder sb, String target)
+	{
+		sb.append("var target = document.getElementsByTagName('body')[0];");
+		sb.append("target = target.flexjs_wrapper;");
+		sb.append("target = target.initialView;");
+		if (target == null || target.length() == 0)
+		{
+			return;
+		}
+		String parts[] = target.split("\\.");
+		int n = parts.length;
+		for (int i = 0; i < n; i++)
+		{
+			sb.append("target = target['" + parts[i] + "'];");
+		}
+
+	}
+	
+	public String toString()
+	{
+		return "";
+	}
+}