// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.sdk.tests.system.runner;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
/**
* An implementation of {@link ICustom} that uses underlying UNIX framework,
* wget utility and a test kit jars in home directory.
*/
public class Custom implements ICustom {
private final String homeDir;
public Custom() {
homeDir = System.getenv().get("HOME");
}
@Override
public java.io.File downloadChrome(String url) {
String dirName = executeSimpleShellCommand("mktemp -d /tmp/chrometestbuild.XXXXXXXXXX").trim();
File tempDir = new File(dirName);
if (!tempDir.isDirectory()) {
throw new RuntimeException();
}
{
File urlFile = new File(tempDir, "url");
try {
OutputStream outputStream = new FileOutputStream(urlFile);
outputStream.write(url.getBytes());
outputStream.write('\n');
outputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
File archiveFile = new File(tempDir, "chrome-build.zip");
executeSimpleShellCommand("wget " + url + " --progress=dot -O" + archiveFile.getAbsolutePath());
if (!archiveFile.isFile()) {
throw new RuntimeException();
}
executeSimpleShellCommand("cd " + tempDir.getAbsolutePath() + " && unzip " +
archiveFile.getAbsolutePath());
if (homeDir == null) {
throw new RuntimeException("Home dir name not known");
}
String symbolicLinkName = homeDir + "/fresh_chrome";
executeSimpleShellCommand("ln -sfT " + tempDir.getAbsolutePath() + " " + symbolicLinkName);
return new File(tempDir, "chrome-linux/chrome");
}
private static final String KIT_DIR_IN_HOME = "java.sdk.test/kit";
private String getKitFileDirName() {
return homeDir + "/" + KIT_DIR_IN_HOME;
}
@Override
public String getKitWebPageUrl() {
return "file://" + getKitFileDirName() + "/web/main.html";
}
@Override
public void runTestKit(String testArgument, int port) {
String testJarPath = getKitFileDirName() + "/chromedevtools.systemtest.jar";
try {
executeSimpleShellCommand("java -jar " + testJarPath + " --protocol=" +
testArgument + " localhost " + port);
} catch (Exception e) {
throw new RuntimeException("Test failure", e);
}
}
private static String executeSimpleShellCommand(String cmdLine) {
ProcessRunner.ProcessOutput output = executeShell(cmdLine);
int returnCode = output.getReturnCode();
if (returnCode != 0) {
throw new RuntimeException("Command failure, exit_code=" + returnCode);
}
return output.getOutput();
}
private static ProcessRunner.ProcessOutput executeShell(String cmdLine) {
final String[] args = { "/bin/bash", "-c", cmdLine };
System.out.println("Executing: " + Arrays.toString(args));
ProcessRunner.ProcessFactory processFactory = new ProcessRunner.ProcessFactory() {
@Override
public Process create(Runtime runtime) throws IOException {
return runtime.exec(args);
}
};
return ProcessRunner.executeProcess(processFactory, true);
}
}