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 "";
+ }
+}