/* MonkeyTalk - a cross-platform functional testing tool Copyright (C) 2012 Gorilla Logic, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.gorillalogic.monkeytalk.processor.tests; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; import static org.junit.matchers.JUnitMatchers.containsString; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.LinkedHashMap; import java.util.Map; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import com.gorillalogic.monkeytalk.agents.AgentManager; import com.gorillalogic.monkeytalk.api.js.tools.JSHelper; import com.gorillalogic.monkeytalk.processor.PlaybackResult; import com.gorillalogic.monkeytalk.processor.PlaybackStatus; import com.gorillalogic.monkeytalk.processor.Runner; import com.gorillalogic.monkeytalk.utils.FileUtils; import com.gorillalogic.monkeytalk.utils.TestHelper; public class JavascriptTest extends TestHelper { private static final String HOST = "localhost"; private static final int PORT = 18029; private ByteArrayOutputStream out; @Before public void before() { out = new ByteArrayOutputStream(); System.setOut(new PrintStream(out)); AgentManager.removeAllAgents(); } @After public void after() { out = null; } @AfterClass public static void afterClass() throws IOException { cleanup(); } @Test public void testRunJavascript() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Button FOO Tap", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function()")); assertThat(js, containsString("app.button(\"FOO\").tap();")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button FOO tap -> OK")); } @Test public void testRunIllegalJavascript() throws IOException { File dir = tempDir(); File foo = tempScript("1foo.mt", "Button 1FOO Tap", dir); File fooJS = new File(dir, "1foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.1foo.prototype.run = function()")); assertThat(js, containsString("app.button(\"1FOO\").tap();")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.ERROR)); assertThat( result.getMessage(), is("filename '1foo.js' is illegal -- filenames in JSProcessor must begin with a letter and contain only letters, numbers, and underscores")); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(0)); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("result: ERROR : filename '1foo.js' is illegal")); } @Test public void testRunJavascriptMultipleCommands() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Button FOO Tap\n" + "Input name EnterText \"Bo Bo\"\n" + "Label * Verify \"Welcome, Bo Bo!\"", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function()")); assertThat(js, containsString("app.button(\"FOO\").tap();")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(3)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); assertThat(server.getCommands().get(1).getCommand(), is("Input name enterText \"Bo Bo\"")); assertThat(server.getCommands().get(2).getCommand(), is("Label * verify \"Welcome, Bo Bo!\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button FOO tap -> OK")); assertThat(log, containsString("Input name enterText \"Bo Bo\" -> OK")); assertThat(log, containsString("Label * verify \"Welcome, Bo Bo!\" -> OK")); } @Test public void testRunJavascriptMultipleCommandsWithError() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Button FOO Tap\nButton JOE Tap\nButton BAR Tap", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function()")); assertThat(js, containsString("app.button(\"FOO\").tap();")); assertThat(js, containsString("app.button(\"JOE\").tap();")); assertThat(js, containsString("app.button(\"BAR\").tap();")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); ErrorOnJoeServer server = new ErrorOnJoeServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.ERROR)); assertThat(result.getMessage(), containsString("error on Joe")); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button FOO tap -> OK")); assertThat(log, containsString("Button JOE tap -> ERROR : error on Joe")); } @Test public void testRunJavascriptCommandsWithVars() throws IOException { File dir = tempDir(); File bar = tempScript("bar.mt", "Vars * Define x\nButton BAR Tap\nButton ${x} Tap", dir); File script = tempScript("myscript.mt", "Script bar.js Run \"Bo Bo\"", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(bar); String js = FileUtils.readFile(new File(dir, "bar.js")); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.bar.prototype.run = function(x)")); assertThat(js, containsString("x = (x != undefined && x != \"*\" ? x : \"<x>\");")); assertThat(js, containsString("app.button(\"BAR\").tap();")); assertThat(js, containsString("app.button(x).tap();")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(2)); assertThat(server.getCommands().get(0).getCommand(), is("Button BAR tap")); assertThat(server.getCommands().get(1).getCommand(), is("Button \"Bo Bo\" tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Script bar.js Run \"Bo Bo\"")); assertThat(log, containsString("Button BAR tap -> OK")); assertThat(log, containsString("Button \"Bo Bo\" tap -> OK")); assertThat(log, containsString("\n -> OK")); } @Test public void testRunJavascriptCommandsWithVarsAndArgs() throws IOException { File dir = tempDir(); File baz = tempScript("baz.mt", "Vars * Define name=Joe\nInput BAZ EnterText \"some ${name}\"", dir); File script = tempScript("myscript.mt", "Script baz.js Run \"Bo Bo\"", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(baz); String js = FileUtils.readFile(new File(dir, "baz.js")); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.baz.prototype.run = function(_name)")); assertThat(js, containsString("_name = (_name != undefined && _name != \"*\" ? _name : \"Joe\");")); assertThat(js, containsString("app.input(\"BAZ\").enterText(\"some \" + _name);")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Input BAZ enterText \"some Bo Bo\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Script baz.js Run \"Bo Bo\"")); assertThat(log, containsString("Input BAZ enterText \"some Bo Bo\" -> OK")); assertThat(log, containsString("\n -> OK")); } @Test public void testRunJavascriptCommandsWithVarsAndDefaultArgs() throws IOException { File dir = tempDir(); File baz = tempScript("baz.mt", "Vars * Define name=Joe\n" + "Input BAZ EnterText \"some ${name}\"", dir); File script = tempScript("myscript.mt", "Script baz.js Run", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(baz); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Input BAZ enterText \"some Joe\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Script baz.js Run")); assertThat(log, containsString("Input BAZ enterText \"some Joe\" -> OK")); assertThat(log, containsString("\n -> OK")); } @Test public void testRunJavascriptCommandsWithVarsAndStarArgs() throws IOException { File dir = tempDir(); File baz = tempScript("baz.mt", "Vars * Define name=Joe\n" + "Input BAZ EnterText \"some ${name}\"", dir); File script = tempScript("myscript.mt", "Script baz.js Run *", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(baz); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Input BAZ enterText \"some Joe\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Script baz.js Run")); assertThat(log, containsString("Input BAZ enterText \"some Joe\" -> OK")); assertThat(log, containsString("\n -> OK")); } @Test public void testRunJavascriptCommandsWithDataDrive() throws IOException { File dir = tempDir(); tempScript("data.csv", "x\nFOO\njoe\nBAR", dir); File foo = tempScript("foo.mt", "Vars * Define x\nButton ${x} Tap", dir); File script = tempScript("myscript.mt", "Script foo.js RunWith data.csv", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); ErrorOnJoeServer server = new ErrorOnJoeServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.ERROR)); assertThat(result.getMessage(), containsString("error on Joe")); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Script foo.js RunWith data.csv")); assertThat(log, containsString("Button FOO tap -> OK")); assertThat(log, containsString("Button joe tap -> ERROR : error on Joe")); assertThat(log, containsString("\n -> OK")); } @Test public void testRunJavascriptCustomCommand() throws IOException { File dir = tempDir(); File mycomp = tempScript("mycomp.myact.mt", "Button MY Tap", dir); File script = tempScript("myscript.mt", "MyComp * MyAct", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(mycomp); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button MY tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("MyComp * MyAct")); assertThat(log, containsString("Button MY tap -> OK")); assertThat(log, containsString("\n -> OK")); } @Test public void testRunJavascriptWithMultipleCustomCommand() throws IOException { File dir = tempDir(); File foo = tempScript("comp.foo.mt", "Button FOO Tap", dir); File bar = tempScript("comp.bar.mt", "Button BAR Tap", dir); File baz = tempScript("comp.baz.mt", "Button BAZ Tap", dir); File script = tempScript("myscript.mt", "Comp * Foo\nComp * Bar\nComp * Baz", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); JSHelper.genJS(bar); JSHelper.genJS(baz); String lib = FileUtils.readFile(new File(new File(dir, "libs"), "MyProj.js")); assertThat(lib, containsString("MyProj.comp.prototype.foo = function() {")); assertThat(lib, containsString("MT.CustomType.prototype.run.call(this, 'comp', 'foo');")); assertThat(lib, containsString("MyProj.comp.prototype.bar = function() {")); assertThat(lib, containsString("MT.CustomType.prototype.run.call(this, 'comp', 'bar');")); assertThat(lib, containsString("MyProj.comp.prototype.baz = function() {")); assertThat(lib, containsString("MT.CustomType.prototype.run.call(this, 'comp', 'baz');")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(3)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); assertThat(server.getCommands().get(1).getCommand(), is("Button BAR tap")); assertThat(server.getCommands().get(2).getCommand(), is("Button BAZ tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Comp * Foo")); assertThat(log, containsString("Button FOO tap -> OK")); assertThat(log, containsString("Comp * Bar")); assertThat(log, containsString("Button BAR tap -> OK")); assertThat(log, containsString("Comp * Baz")); assertThat(log, containsString("Button BAZ tap -> OK")); assertThat(log, containsString("\n -> OK")); } @Test public void testRunIllegalComponentTypeInJavascriptCustomCommand() throws IOException { File dir = tempDir(); File mycomp = tempScript("1mycomp.myact.mt", "Button MY Tap", dir); File script = tempScript("myscript.mt", "1MyComp * MyAct", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(mycomp); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.ERROR)); assertThat( result.getMessage(), is("filename '1mycomp.myact.js' has illegal component type -- both parts of custom commands in JSProcessor must begin with a letter and contain only letters, numbers, and underscores")); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(0)); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("1MyComp * MyAct")); assertThat( log, containsString("result: ERROR : filename '1mycomp.myact.js' has illegal component type")); } @Test public void testRunIllegalActionInJavascriptCustomCommand() throws IOException { File dir = tempDir(); File mycomp = tempScript("mycomp.1myact.mt", "Button MY Tap", dir); File script = tempScript("myscript.mt", "MyComp * 1MyAct", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(mycomp); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.ERROR)); assertThat( result.getMessage(), is("filename 'mycomp.1myact.js' has illegal action -- both parts of custom commands in JSProcessor must begin with a letter and contain only letters, numbers, and underscores")); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(0)); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("MyComp * 1MyAct")); assertThat(log, containsString("result: ERROR : filename 'mycomp.1myact.js' has illegal action")); } @Test public void testRunJavascriptCustomCommandWithArgs() throws IOException { File dir = tempDir(); File mycomp = tempScript("mycomp.myact.mt", "Vars * Define x\nButton ${x} Tap", dir); File script = tempScript("myscript.mt", "MyComp * MyAct MYFOO\nMyComp * MyAct MYBAR", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(mycomp); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(2)); assertThat(server.getCommands().get(0).getCommand(), is("Button MYFOO tap")); assertThat(server.getCommands().get(1).getCommand(), is("Button MYBAR tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("MyComp * MyAct MYFOO")); assertThat(log, containsString("Button MYFOO tap -> OK")); assertThat(log, containsString("MyComp * MyAct MYBAR")); assertThat(log, containsString("Button MYBAR tap -> OK")); assertThat(log, containsString("\n -> OK")); assertThat(log, containsString("result: OK")); } @Test public void testRunJavascriptCustomCommandFromJS() throws IOException { File dir = tempDir(); File mycomp = tempScript("mycomp.myact.mt", "Button MY Tap", dir); File foo = tempScript("foo.mt", "Button FOO Tap\nmycomp * myact\nButton BAR Tap", dir); File script = tempScript("myscript.mt", "Script foo.js Run", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(mycomp); JSHelper.genJS(foo); String lib = FileUtils.readFile(new File(new File(dir, "libs"), "MyProj.js")); assertThat(lib, containsString("MyProj.mycomp.prototype.myact = function() {")); assertThat(lib, containsString("MT.CustomType.prototype.run.call(this, 'mycomp', 'myact');")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(3)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); assertThat(server.getCommands().get(1).getCommand(), is("Button MY tap")); assertThat(server.getCommands().get(2).getCommand(), is("Button BAR tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("mycomp * myact")); assertThat(log, containsString("Button FOO tap -> OK")); assertThat(log, containsString("Button MY tap -> OK")); assertThat(log, containsString("Button BAR tap -> OK")); assertThat(log, containsString("\n -> OK")); assertThat(log, containsString("result: OK")); } @Test public void testRunJavascriptWithGet() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Button FOO Get foo\nInput name EnterText ${foo}", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function()")); assertThat(js, containsString("var foo = app.button(\"FOO\").get(\"foo\");")); assertThat(js, containsString("app.input(\"name\").enterText(foo);")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); GetServer server = new GetServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(2)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO get foo")); assertThat(server.getCommands().get(1).getCommand(), is("Input name enterText FOO")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button FOO get foo -> OK : FOO")); assertThat(log, containsString("Input name enterText FOO -> OK")); assertThat(log, containsString("result: OK")); } @Test public void testMTCallsJSCallsMT() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Vars * Define x\n" + "Input FOO EnterText \"some ${x}\"\n" + "Script bar.mt Run FOO${x}", dir); tempScript("bar.mt", "Vars * Define y\n" + "Input BAR EnterText \"other ${y}\"", dir); File script = tempScript("myscript.mt", "Script foo.js Run \"Bo Bo\"", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(new File(dir, "foo.js")); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function(x)")); assertThat(js, containsString("x = (x != undefined && x != \"*\" ? x : \"<x>\");")); assertThat(js, containsString("app.input(\"FOO\").enterText(\"some \" + x);")); assertThat(js, containsString("app.bar().run(\"FOO\" + x);")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(2)); assertThat(server.getCommands().get(0).getCommand(), is("Input FOO enterText \"some Bo Bo\"")); assertThat(server.getCommands().get(1).getCommand(), is("Input BAR EnterText \"other FOOBo Bo\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Script foo.js Run")); assertThat(log, containsString("Input FOO enterText \"some Bo Bo\" -> OK")); assertThat(log, containsString("Script bar.mt Run \"FOOBo Bo\"")); assertThat(log, containsString("Input BAR EnterText \"other FOOBo Bo\" -> OK")); assertThat(log, containsString("\n -> OK")); } @Test public void testMTCallsJSCallsJS() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Vars * Define x\n" + "Input FOO EnterText \"some ${x}\"\n" + "Script bar.js Run FOO${x}", dir); File bar = tempScript("bar.mt", "Vars * Define y\n" + "Input BAR EnterText \"other ${y}\"", dir); File script = tempScript("myscript.mt", "Script foo.js Run \"Bo Bo\"", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); JSHelper.genJS(bar); String js = FileUtils.readFile(new File(dir, "foo.js")); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function(x)")); assertThat(js, containsString("x = (x != undefined && x != \"*\" ? x : \"<x>\");")); assertThat(js, containsString("app.input(\"FOO\").enterText(\"some \" + x);")); assertThat(js, containsString("app.script(\"bar.js\").run(\"FOO\" + x);")); js = FileUtils.readFile(new File(dir, "bar.js")); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.bar.prototype.run = function(y)")); assertThat(js, containsString("y = (y != undefined && y != \"*\" ? y : \"<y>\");")); assertThat(js, containsString("app.input(\"BAR\").enterText(\"other \" + y);")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(2)); assertThat(server.getCommands().get(0).getCommand(), is("Input FOO enterText \"some Bo Bo\"")); assertThat(server.getCommands().get(1).getCommand(), is("Input BAR enterText \"other FOOBo Bo\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Script foo.js Run")); assertThat(log, containsString("Input FOO enterText \"some Bo Bo\" -> OK")); assertThat(log, containsString("Script bar.js Run \"FOOBo Bo\"")); assertThat(log, containsString("Input BAR enterText \"other FOOBo Bo\" -> OK")); assertThat(log, containsString("\n -> OK")); } @Test public void testMTCallsJSDataDrivesMT() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Script bar.mt RunWith data.csv", dir); tempScript("bar.mt", "Vars * Define x y\n" + "Input BAR EnterText \"${x} ${y}\"", dir); tempScript("data.csv", "x,y\n1234,5678\nJohn,\"Bo Bo\"\n-4.135,-104.55513", dir); File script = tempScript("myscript.mt", "Script foo.js Run", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(new File(dir, "foo.js")); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function()")); assertThat(js, containsString("app.bar().runWith(\"data.csv\");")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(3)); assertThat(server.getCommands().get(0).getCommand(), is("Input BAR EnterText \"1234 5678\"")); assertThat(server.getCommands().get(1).getCommand(), is("Input BAR EnterText \"John Bo Bo\"")); assertThat(server.getCommands().get(2).getCommand(), is("Input BAR EnterText \"-4.135 -104.55513\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Script foo.js Run")); assertThat(log, containsString("Script bar.mt RunWith data.csv")); assertThat(log, containsString("Input BAR EnterText \"1234 5678\" -> OK")); assertThat(log, containsString("Input BAR EnterText \"John Bo Bo\" -> OK")); assertThat(log, containsString("Input BAR EnterText \"-4.135 -104.55513\" -> OK")); } @Test public void testMTCallsJSDataDrivesJS() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Script bar.js RunWith data.csv", dir); File bar = tempScript("bar.mt", "Vars * Define x y\n" + "Input BAR EnterText \"${x} ${y}\"", dir); tempScript("data.csv", "x,y\n1234,5678\nJohn,\"Bo Bo\"\n-4.135,-104.55513", dir); File script = tempScript("myscript.mt", "Script foo.js Run", dir); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); JSHelper.genJS(bar); String js = FileUtils.readFile(new File(dir, "foo.js")); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function()")); assertThat(js, containsString("app.script(\"bar.js\").runWith(\"data.csv\");")); js = FileUtils.readFile(new File(dir, "bar.js")); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.bar.prototype.run = function(x, y)")); assertThat(js, containsString("x = (x != undefined && x != \"*\" ? x : \"<x>\");")); assertThat(js, containsString("y = (y != undefined && y != \"*\" ? y : \"<y>\");")); assertThat(js, containsString("app.input(\"BAR\").enterText(x + \" \" + y);")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(script, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(3)); assertThat(server.getCommands().get(0).getCommand(), is("Input BAR enterText \"1234 5678\"")); assertThat(server.getCommands().get(1).getCommand(), is("Input BAR enterText \"John Bo Bo\"")); assertThat(server.getCommands().get(2).getCommand(), is("Input BAR enterText \"-4.135 -104.55513\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Script foo.js Run")); assertThat(log, containsString("Script bar.js RunWith data.csv")); assertThat(log, containsString("Input BAR enterText \"1234 5678\" -> OK")); assertThat(log, containsString("Input BAR enterText \"John Bo Bo\" -> OK")); assertThat(log, containsString("Input BAR enterText \"-4.135 -104.55513\" -> OK")); } @Test public void testRunJavascriptWithIgnore() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Button FOO Tap\nButton BAR Tap %ignore=true\nButton BAZ Tap", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function()")); assertThat(js, containsString("app.button(\"FOO\").tap();")); assertThat(js, containsString("app.button(\"BAR\").tap({ignore:\"true\"});")); assertThat(js, containsString("app.button(\"BAZ\").tap();")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(2)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); assertThat(server.getCommands().get(1).getCommand(), is("Button BAZ tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button FOO tap -> OK")); assertThat(log, containsString("Button BAR tap %ignore=true -> OK : ignored")); assertThat(log, containsString("Button BAZ tap -> OK")); assertThat(log, containsString("result: OK")); } @Test public void testRunJavascriptWithTimeoutAndThinktime() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Button FOO Tap\n" + "Button BAR Tap %timeout=2345\n" + "Button BAZ Tap %thinktime=888", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");\n")); assertThat(js, containsString("MyProj.foo.prototype.run = function() {\n")); assertThat(js, containsString("app.button(\"FOO\").tap();\n")); assertThat(js, containsString("app.button(\"BAR\").tap({timeout:\"2345\"});\n")); assertThat(js, containsString("app.button(\"BAZ\").tap({thinktime:\"888\"});\n")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); runner.setGlobalTimeout(1234); runner.setGlobalThinktime(567); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(3)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap %thinktime=567 %timeout=1234")); assertThat(server.getCommands().get(1).getCommand(), is("Button BAR tap %thinktime=567 %timeout=2345")); assertThat(server.getCommands().get(2).getCommand(), is("Button BAZ tap %thinktime=888 %timeout=1234")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button FOO tap -> OK")); assertThat(log, containsString("Button BAR tap %timeout=2345 -> OK")); assertThat(log, containsString("Button BAZ tap %thinktime=888 -> OK")); assertThat(log, containsString("result: OK")); } @Test public void testRunJavascriptWithDebugPrint() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Button FOO Tap\nDebug * Print foo bar baz\nButton BAR Tap", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function()")); assertThat(js, containsString("app.button(\"FOO\").tap();")); assertThat(js, containsString("app.debug().print(\"foo\", \"bar\", \"baz\");")); assertThat(js, containsString("app.button(\"BAR\").tap();")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(2)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); assertThat(server.getCommands().get(1).getCommand(), is("Button BAR tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button FOO tap -> OK\n")); assertThat(log, not(containsString("Debug"))); assertThat(log, containsString("\nfoo bar baz\n")); assertThat(log, containsString("Button BAR tap -> OK\n")); assertThat(log, containsString("result: OK")); } @Test public void testRunJavascriptWithDebugVars() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Vars * Define foo=123 bar=\"Bo Bo\"\nDebug * Vars\nButton FOO Tap", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function(foo, bar) {")); assertThat(js, containsString("foo = (foo != undefined && foo != \"*\" ? foo : \"123\");\n")); assertThat(js, containsString("bar = (bar != undefined && bar != \"*\" ? bar : \"Bo Bo\");\n")); assertThat( js, containsString("app.debug().print(\"foo=\" + foo + \"\\n\" + \"bar=\" + bar + \"\\n\");\n")); assertThat(js, containsString("app.button(\"FOO\").tap();\n")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, not(containsString("Debug"))); assertThat(log, containsString("\nfoo=123\nbar=Bo Bo\n")); assertThat(log, containsString("Button FOO tap -> OK\n")); assertThat(log, containsString("result: OK")); } @Test public void testRunJavascriptWithDebugVarsAndMultipleVarDefines() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Vars * Define foo=123 bar=\"Bo Bo\"\nDebug * Vars\nButton FOO Tap\n" + "Vars * Define baz=abc\nDebug * Vars", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function(foo, bar, baz) {")); assertThat(js, containsString("foo = (foo != undefined && foo != \"*\" ? foo : \"123\");\n")); assertThat(js, containsString("bar = (bar != undefined && bar != \"*\" ? bar : \"Bo Bo\");\n")); assertThat( js, containsString("app.debug().print(\"foo=\" + foo + \"\\n\" + \"bar=\" + bar + \"\\n\");\n")); assertThat(js, containsString("baz = (baz != undefined && baz != \"*\" ? baz : \"abc\");\n")); assertThat( js, containsString("app.debug().print(\"foo=\" + foo + \"\\n\" + \"bar=\" + bar + \"\\n\" + \"baz=\" + baz + \"\\n\");\n")); assertThat(js, containsString("app.button(\"FOO\").tap();\n")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, not(containsString("Debug"))); assertThat(log, containsString("\nfoo=123\nbar=Bo Bo\n")); assertThat(log, containsString("Button FOO tap -> OK\n")); assertThat(log, containsString("result: OK")); } @Test public void testRunJavascriptWithVarsVerify() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Vars * Define f=123\nVars * Verify 123 f\nButton FOO Tap", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function(f) {")); assertThat(js, containsString("var app = this.app;\n")); assertThat(js, containsString("f = (f != undefined && f != \"*\" ? f : \"123\");\n")); assertThat(js, containsString("// NOT SUPPORTED YET: app.vars().verify(\"123\", f);\n")); assertThat(js, containsString("app.button(\"FOO\").tap();\n")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO tap")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button FOO tap -> OK\n")); assertThat(log, containsString("result: OK")); } @Test public void testRunJavascriptWithGlobals() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Button ${foo} Tap ${bar}", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function() {")); assertThat(js, containsString("var app = this.app;\n")); assertThat(js, containsString("app.button(foo).tap(bar);\n")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); Map<String, String> globals = new LinkedHashMap<String, String>(); globals.put("foo", "123"); globals.put("bar", "Bo Bo"); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, globals); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button 123 tap \"Bo Bo\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button 123 tap \"Bo Bo\" -> OK\n")); assertThat(log, containsString("result: OK")); } @Test public void testRunJavascriptWithGlobalsSet() throws IOException { File dir = tempDir(); File foo = tempScript("foo.mt", "Globals * Set foo=123 bar=\"Bo Bo\"\nButton ${foo} Tap ${bar}", dir); File fooJS = new File(dir, "foo.js"); JSHelper.genAPIAndLib(dir); JSHelper.genJS(foo); String js = FileUtils.readFile(fooJS); assertThat(js, containsString("load(\"libs/MyProj.js\");")); assertThat(js, containsString("MyProj.foo.prototype.run = function() {")); assertThat(js, containsString("var app = this.app;\n")); assertThat(js, containsString("app.globals().set('foo=\"123\"');")); assertThat(js, containsString("foo = '123';")); assertThat(js, containsString("app.globals().set('bar=\"Bo Bo\"');")); assertThat(js, containsString("bar = 'Bo Bo';")); assertThat(js, containsString("app.button(foo).tap(bar);")); Runner runner = new Runner("iOS", HOST, PORT); runner.setVerbose(true); File logger = new File(dir, "log.txt"); System.setOut(new PrintStream(new FileOutputStream(logger))); CommandServer server = new CommandServer(PORT); PlaybackResult result = runner.run(fooJS, null); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button 123 tap \"Bo Bo\"")); String log = FileUtils.readFile(logger); assertThat(log, containsString("www.gorillalogic.com")); assertThat(log, containsString("Button 123 tap \"Bo Bo\" -> OK\n")); assertThat(log, containsString("result: OK")); } }