/* 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.report.detail.tests;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.containsString;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import com.gorillalogic.monkeytalk.Command;
import com.gorillalogic.monkeytalk.processor.PlaybackListener;
import com.gorillalogic.monkeytalk.processor.PlaybackResult;
import com.gorillalogic.monkeytalk.processor.PlaybackStatus;
import com.gorillalogic.monkeytalk.processor.Scope;
import com.gorillalogic.monkeytalk.processor.ScriptProcessor;
import com.gorillalogic.monkeytalk.processor.report.detail.DetailReportHtml;
import com.gorillalogic.monkeytalk.processor.report.detail.ScriptReportHelper;
import com.gorillalogic.monkeytalk.sender.Response;
import com.gorillalogic.monkeytalk.utils.Base64;
import com.gorillalogic.monkeytalk.utils.TestHelper;
public class DetailReportScreenshotTest extends TestHelper {
private static final String HOST = "localhost";
private static final int PORT = 18027;
private static String output;
private static final PlaybackListener LISTENER_WITH_OUTPUT = new PlaybackListener() {
@Override
public void onStart(Scope scope) {
output += scope.getCurrentCommand();
}
@Override
public void onScriptStart(Scope scope) {
output += "START\n";
}
@Override
public void onScriptComplete(Scope scope, PlaybackResult r) {
output += "COMPLETE : " + r;
}
@Override
public void onComplete(Scope scope, Response resp) {
output += " -> " + resp + "\n";
}
@Override
public void onPrint(String message) {
output += message;
}
};
@Before
public void before() {
output = "";
}
@AfterClass
public static void afterClass() throws IOException {
cleanup();
}
@Test
public void testAfterScreenshot() throws Exception {
File dir = tempDir();
tempScript("foo.mt", "Button FOO Tap", dir);
ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir);
processor.setTakeAfterScreenshot(true);
CommandServer server = new ScreenshotServer(PORT);
processor.setPlaybackListener(LISTENER_WITH_OUTPUT);
PlaybackResult result = processor.runScript("foo.mt");
server.stop();
assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK));
List<Command> cmds = server.getCommands();
assertThat(cmds.size(), is(3));
assertThat(cmds.get(0).getCommand(), is("Device * Screenshot"));
assertThat(cmds.get(1).getCommand(), is("Button FOO Tap"));
assertThat(cmds.get(2).getCommand(), is("Device * Screenshot"));
assertThat(output, containsString("START\nButton FOO Tap -> OK\nCOMPLETE : OK"));
String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument();
assertThat(xml, containsString("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"));
assertThat(xml, containsString("beforeScreenshot=\"screenshots/"));
assertThat(xml, containsString("afterScreenshot=\"screenshots/"));
String html = new DetailReportHtml().createDetailReportHtml(result, xml);
assertThat(html, containsString("<title>DETAIL-foo.mt.html</title>"));
assertThat(html, containsString("<h1>DETAIL-foo.mt.html</h1>"));
assertThat(html, containsString("1</span><b>Script</b> foo.mt <b>Run</b>"));
assertThat(html, containsString("2</span><b>Button</b> FOO <b>Tap</b>"));
assertThat(html, not(containsString("<div id=\"extra1\"")));
assertThat(html, containsString("<div id=\"extra2\" style=\"display:none;\">"));
assertThat(
html,
containsString("<div class=\"offset2 span11\">\n<p class=\"extra\">before<br /><img src=\"screenshots/"));
assertThat(
html,
containsString("<div class=\"span11\">\n<p class=\"extra\">after<br /><img src=\"screenshots/"));
assertThat(html, not(containsString("battery")));
}
@Test
public void testAfterMetrics() throws Exception {
File dir = tempDir();
tempScript("foo.mt", "Button FOO Tap", dir);
ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir);
processor.setTakeAfterMetrics(true);
CommandServer server = new ScreenshotServer(PORT);
processor.setPlaybackListener(LISTENER_WITH_OUTPUT);
PlaybackResult result = processor.runScript("foo.mt");
server.stop();
assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK));
List<Command> cmds = server.getCommands();
assertThat(cmds.size(), is(2));
assertThat(cmds.get(0).getCommand(), is("Button FOO Tap"));
assertThat(cmds.get(1).getCommand(), is("Device * Get dummy allinfo"));
assertThat(output, containsString("START\nButton FOO Tap -> OK\nCOMPLETE : OK"));
String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument();
assertThat(xml, containsString("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"));
assertThat(xml, containsString("memory=\"12%\""));
assertThat(xml, containsString("cpu=\"34%\""));
assertThat(xml, containsString("diskspace=\"56%\""));
assertThat(xml, containsString("battery=\"78%\""));
String html = new DetailReportHtml().createDetailReportHtml(result, xml);
assertThat(html, containsString("<title>DETAIL-foo.mt.html</title>"));
assertThat(html, containsString("<h1>DETAIL-foo.mt.html</h1>"));
assertThat(html, containsString("1</span><b>Script</b> foo.mt <b>Run</b>"));
assertThat(html, containsString("2</span><b>Button</b> FOO <b>Tap</b>"));
assertThat(html, not(containsString("<div id=\"extra1\"")));
assertThat(html, containsString("<div id=\"extra2\" style=\"display:none;\">"));
assertThat(html, not(containsString("<p class=\"extra\">before")));
assertThat(html, not(containsString("<p class=\"extra\">after")));
assertThat(html, containsString("<div class=\"offset2 span22\">\n"
+ "<p class=\"extra\"><b>memory</b> 12% — <b>cpu</b> 34% — "
+ "<b>storage</b> 56% — <b>battery</b> 78%</p>\n</div>"));
}
@Test
public void testAfterScreenshotAndAfterMetrics() throws Exception {
File dir = tempDir();
tempScript("foo.mt", "Button FOO Tap", dir);
ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir);
processor.setTakeAfterScreenshot(true);
processor.setTakeAfterMetrics(true);
CommandServer server = new ScreenshotServer(PORT);
processor.setPlaybackListener(LISTENER_WITH_OUTPUT);
PlaybackResult result = processor.runScript("foo.mt");
server.stop();
assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK));
List<Command> cmds = server.getCommands();
assertThat(cmds.size(), is(4));
assertThat(cmds.get(0).getCommand(), is("Device * Screenshot"));
assertThat(cmds.get(1).getCommand(), is("Button FOO Tap"));
assertThat(cmds.get(2).getCommand(), is("Device * Get dummy allinfo"));
assertThat(cmds.get(3).getCommand(), is("Device * Screenshot"));
assertThat(output, containsString("START\nButton FOO Tap -> OK\nCOMPLETE : OK"));
String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument();
assertThat(xml, containsString("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"));
assertThat(xml, containsString("beforeScreenshot=\"screenshots/"));
assertThat(xml, containsString("afterScreenshot=\"screenshots/"));
String html = new DetailReportHtml().createDetailReportHtml(result, xml);
assertThat(html, containsString("<title>DETAIL-foo.mt.html</title>"));
assertThat(html, containsString("<h1>DETAIL-foo.mt.html</h1>"));
assertThat(html, containsString("1</span><b>Script</b> foo.mt <b>Run</b>"));
assertThat(html, containsString("2</span><b>Button</b> FOO <b>Tap</b>"));
assertThat(html, not(containsString("<div id=\"extra1\"")));
assertThat(html, containsString("<div id=\"extra2\" style=\"display:none;\">"));
assertThat(
html,
containsString("<div class=\"offset2 span11\">\n<p class=\"extra\">before<br /><img src=\"screenshots/"));
assertThat(
html,
containsString("<div class=\"span11\">\n<p class=\"extra\">after<br /><img src=\"screenshots/"));
assertThat(html, containsString("<div class=\"offset2 span22\">\n"
+ "<p class=\"extra\"><b>memory</b> 12% — <b>cpu</b> 34% — "
+ "<b>storage</b> 56% — <b>battery</b> 78%</p>\n</div>"));
}
private class ScreenshotServer extends TestHelper.CommandServer {
private String img;
public ScreenshotServer(int port) throws IOException {
super(port);
img = Base64.encodeFromFile("resources/test/base.png");
}
@Override
public Response serve(String uri, String method, Map<String, String> headers,
JSONObject json) {
Response resp = super.serve(uri, method, headers, json);
if (json.toString().toLowerCase().contains("screenshot")) {
return new Response(HttpStatus.OK, "{result:\"OK\", screenshot:\"" + img + "\"}");
} else if (json.toString().toLowerCase().contains("allinfo")) {
return new Response(HttpStatus.OK, "{result:\"OK\", message:\"12%,34%,56%,78%\"}");
} else {
return resp;
}
}
}
}