Add android-tests module.
Add run configuration for tests on android.
This commit is contained in:
Generated
+1
@@ -3,6 +3,7 @@
|
|||||||
<component name="ProjectModuleManager">
|
<component name="ProjectModuleManager">
|
||||||
<modules>
|
<modules>
|
||||||
<module fileurl="file://$PROJECT_DIR$/Kotlin.iml" filepath="$PROJECT_DIR$/Kotlin.iml" />
|
<module fileurl="file://$PROJECT_DIR$/Kotlin.iml" filepath="$PROJECT_DIR$/Kotlin.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/compiler/android-tests/android-tests.iml" filepath="$PROJECT_DIR$/compiler/android-tests/android-tests.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/compiler/backend/backend.iml" filepath="$PROJECT_DIR$/compiler/backend/backend.iml" />
|
<module fileurl="file://$PROJECT_DIR$/compiler/backend/backend.iml" filepath="$PROJECT_DIR$/compiler/backend/backend.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/build-tools/build-tools.iml" filepath="$PROJECT_DIR$/build-tools/build-tools.iml" />
|
<module fileurl="file://$PROJECT_DIR$/build-tools/build-tools.iml" filepath="$PROJECT_DIR$/build-tools/build-tools.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/compiler/cli/cli.iml" filepath="$PROJECT_DIR$/compiler/cli/cli.iml" />
|
<module fileurl="file://$PROJECT_DIR$/compiler/cli/cli.iml" filepath="$PROJECT_DIR$/compiler/cli/cli.iml" />
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="Codegen Tests on Android" type="JUnit" factoryName="JUnit">
|
||||||
|
<extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
|
||||||
|
<module name="android-tests" />
|
||||||
|
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
||||||
|
<option name="ALTERNATIVE_JRE_PATH" value="" />
|
||||||
|
<option name="PACKAGE_NAME" value="org.jetbrains.jet.compiler.android" />
|
||||||
|
<option name="MAIN_CLASS_NAME" value="org.jetbrains.jet.compiler.android.AndroidRunner" />
|
||||||
|
<option name="METHOD_NAME" value="" />
|
||||||
|
<option name="TEST_OBJECT" value="class" />
|
||||||
|
<option name="VM_PARAMETERS" value="-ea" />
|
||||||
|
<option name="PARAMETERS" value="" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
|
||||||
|
<option name="ENV_VARIABLES" />
|
||||||
|
<option name="PASS_PARENT_ENVS" value="true" />
|
||||||
|
<option name="TEST_SEARCH_SCOPE">
|
||||||
|
<value defaultName="moduleWithDependencies" />
|
||||||
|
</option>
|
||||||
|
<envs />
|
||||||
|
<patterns />
|
||||||
|
<RunnerSettings RunnerId="Debug">
|
||||||
|
<option name="DEBUG_PORT" value="" />
|
||||||
|
<option name="TRANSPORT" value="0" />
|
||||||
|
<option name="LOCAL" value="true" />
|
||||||
|
</RunnerSettings>
|
||||||
|
<RunnerSettings RunnerId="Run" />
|
||||||
|
<ConfigurationWrapper RunnerId="Debug" />
|
||||||
|
<ConfigurationWrapper RunnerId="Run" />
|
||||||
|
<method />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
<exclude-output />
|
<exclude-output />
|
||||||
<content url="file://$MODULE_DIR$">
|
<content url="file://$MODULE_DIR$">
|
||||||
<excludeFolder url="$MODULE_DIR$/libraries/out" />
|
<excludeFolder url="$MODULE_DIR$/libraries/out" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/android.tests.dependencies" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/dist" />
|
<excludeFolder url="file://$MODULE_DIR$/dist" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/ideaSDK/config" />
|
<excludeFolder url="file://$MODULE_DIR$/ideaSDK/config" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/ideaSDK/system" />
|
<excludeFolder url="file://$MODULE_DIR$/ideaSDK/system" />
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="org.jetbrains.jet.compiler.android"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
<!-- We add an application tag here just so that we can indicate that
|
||||||
|
this package needs to link against the android.test library,
|
||||||
|
which is needed when building test cases. -->
|
||||||
|
<application>
|
||||||
|
<uses-library android:name="android.test.runner" />
|
||||||
|
</application>
|
||||||
|
<!--
|
||||||
|
This declares that this application uses the instrumentation test runner targeting
|
||||||
|
the package of com.example. To execute the tests use the command:
|
||||||
|
"adb shell am instrument -w com.example.tests/android.test.InstrumentationTestRunner"
|
||||||
|
-->
|
||||||
|
<instrumentation android:name="android.test.InstrumentationTestRunner"
|
||||||
|
android:targetPackage="org.jetbrains.jet.compiler.android"
|
||||||
|
android:label="Tests for org.jetbrains.jet.compiler.android"/>
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# This file is used to override default values used by the Ant build system.
|
||||||
|
#
|
||||||
|
# This file must be checked into Version Control Systems, as it is
|
||||||
|
# integral to the build system of your project.
|
||||||
|
|
||||||
|
# This file is only used by the Ant script.
|
||||||
|
|
||||||
|
# You can use this to override default values such as
|
||||||
|
# 'source.dir' for the location of your java source folder and
|
||||||
|
# 'out.dir' for the location of your output folder.
|
||||||
|
|
||||||
|
# You can also use it define how the release builds are signed by declaring
|
||||||
|
# the following properties:
|
||||||
|
# 'key.store' for the location of your keystore and
|
||||||
|
# 'key.alias' for the name of the key to use.
|
||||||
|
# The password will be asked during the build when you use the 'release' target.
|
||||||
|
|
||||||
|
tested.project.dir=tested-module
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="testsForAndroid" default="help" basedir="">
|
||||||
|
|
||||||
|
<property file="local.properties"/>
|
||||||
|
|
||||||
|
<property file="ant.properties"/>
|
||||||
|
|
||||||
|
<loadproperties srcFile="project.properties"/>
|
||||||
|
|
||||||
|
<import file="custom_rules.xml" optional="true"/>
|
||||||
|
|
||||||
|
<import file="${sdk.dir}/tools/ant/build.xml"/>
|
||||||
|
|
||||||
|
<target name="pack_libraries">
|
||||||
|
<jar basedir="libs/codegen-test-output" destfile="libs/test.jar"/>
|
||||||
|
<delete dir="libs/codegen-test-output"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must *NOT* be checked into Version Control Systems,
|
||||||
|
# as it contains information specific to your local configuration.
|
||||||
|
|
||||||
|
# location of the SDK. This is only used by Ant
|
||||||
|
# For customization when using a Version Control System, please read the
|
||||||
|
# header note.
|
||||||
|
#sdk.dir=compiler/android-tests/android-module/android-sdk/android-sdk-windows
|
||||||
|
#sdk.dir.relative=android-sdk/android-sdk-windows
|
||||||
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# To enable ProGuard in your project, edit project.properties
|
||||||
|
# to define the proguard.config property as described in that file.
|
||||||
|
#
|
||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the ProGuard
|
||||||
|
# include property in project.properties.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system edit
|
||||||
|
# "ant.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
#
|
||||||
|
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||||
|
#proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
|
# Project target.
|
||||||
|
target=android-10
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.android;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class AbstractCodegenTestCaseOnAndroid extends TestCase {
|
||||||
|
|
||||||
|
protected void invokeBoxMethod(String filePath) throws Exception {
|
||||||
|
try {
|
||||||
|
Class clazz;
|
||||||
|
clazz = Class.forName(filePath.replaceAll("\\\\|-|\\.|/", "_") + ".namespace");
|
||||||
|
Method method;
|
||||||
|
method = clazz.getMethod("box");
|
||||||
|
assertEquals("OK", method.invoke(null));
|
||||||
|
}
|
||||||
|
catch (Throwable e) {
|
||||||
|
throw new RuntimeException("File: " + filePath, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="">
|
||||||
|
<application>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="jdk" jdkName="1.6" jdkType="JavaSDK" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
<orderEntry type="library" name="idea-full" level="project" />
|
||||||
|
<orderEntry type="module" module-name="cli" />
|
||||||
|
<orderEntry type="module" module-name="compiler-tests" />
|
||||||
|
<orderEntry type="module" module-name="frontend.java" />
|
||||||
|
<orderEntry type="module" module-name="frontend" />
|
||||||
|
<orderEntry type="module" module-name="backend" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
|
|
||||||
+221
@@ -0,0 +1,221 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler;
|
||||||
|
|
||||||
|
import com.intellij.openapi.Disposable;
|
||||||
|
import com.intellij.openapi.application.ApplicationManager;
|
||||||
|
import com.intellij.openapi.util.io.FileUtil;
|
||||||
|
import junit.framework.*;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.compiler.ant.AntRunner;
|
||||||
|
import org.jetbrains.jet.compiler.download.SDKDownloader;
|
||||||
|
import org.jetbrains.jet.compiler.emulator.Emulator;
|
||||||
|
import org.jetbrains.jet.compiler.run.PermissionManager;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class CodegenTestsOnAndroidRunner {
|
||||||
|
private static final Pattern ERROR_IN_TEST_OUTPUT_PATTERN =
|
||||||
|
Pattern.compile("([\\s]+at .*| Caused .*| java.lang.RuntimeException: File: .*|[\\s]+\\.\\.\\. .* more| Error in .*)");
|
||||||
|
private static final Pattern NUMBER_OF_TESTS_IF_FAILED = Pattern.compile("Tests run: ([0-9]*), Failures: ([0-9]*), Errors: ([0-9]*)");
|
||||||
|
private static final Pattern NUMBER_OF_TESTS_OK = Pattern.compile(" OK \\(([0-9]*) tests\\)");
|
||||||
|
|
||||||
|
private final PathManager pathManager;
|
||||||
|
|
||||||
|
public static TestSuite getTestSuite(PathManager pathManager) {
|
||||||
|
return new CodegenTestsOnAndroidRunner(pathManager).generateTestSuite();
|
||||||
|
}
|
||||||
|
|
||||||
|
private CodegenTestsOnAndroidRunner(PathManager pathManager) {
|
||||||
|
this.pathManager = pathManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TestSuite generateTestSuite() {
|
||||||
|
TestSuite suite = new TestSuite("MySuite");
|
||||||
|
|
||||||
|
String resultOutput = runTests();
|
||||||
|
// Test name -> stackTrace
|
||||||
|
final Map<String, String> resultMap = parseOutputForFailedTests(resultOutput);
|
||||||
|
final Statistics statistics;
|
||||||
|
|
||||||
|
// If map is empty => there are no failed tests
|
||||||
|
if (resultMap.isEmpty()) {
|
||||||
|
// Clear tmp folder where we run android tests
|
||||||
|
FileUtil.delete(new File(pathManager.getTmpFolder()));
|
||||||
|
|
||||||
|
statistics = parseOutputForTestsNumberIfTestsPassed(resultOutput);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
statistics = parseOutputForTestsNumberIfThereIsFailedTests(resultOutput);
|
||||||
|
|
||||||
|
for (final Map.Entry<String, String> entry : resultMap.entrySet()) {
|
||||||
|
|
||||||
|
suite.addTest(new TestCase("run") {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return entry.getKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void runTest() throws Throwable {
|
||||||
|
Assert.fail(entry.getValue() + "See more information in log above.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.assertNotNull("Cannot parse number of failed tests from final line", statistics);
|
||||||
|
Assert.assertEquals("Number of stackTraces != failed tests on the final line", resultMap.size(),
|
||||||
|
statistics.failed + statistics.errors);
|
||||||
|
|
||||||
|
suite.addTest(new TestCase("run") {
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "testAll: Total: " + statistics.total + ", Failures: " + statistics.failed + ", Errors: " + statistics.errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void runTest() throws Throwable {
|
||||||
|
Assert.assertTrue(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return suite;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Output example:
|
||||||
|
[exec] Error in testKt344:
|
||||||
|
[exec] java.lang.RuntimeException: File: compiler\testData\codegen\regressions\kt344.jet
|
||||||
|
[exec] at org.jetbrains.jet.compiler.android.AbstractCodegenTestCaseOnAndroid.invokeBoxMethod(AbstractCodegenTestCaseOnAndroid.java:38)
|
||||||
|
[exec] at org.jetbrains.jet.compiler.android.CodegenTestCaseOnAndroid.testKt344(CodegenTestCaseOnAndroid.java:595)
|
||||||
|
[exec] at java.lang.reflect.Method.invokeNative(Native Method)
|
||||||
|
[exec] at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
|
||||||
|
[exec] Caused by: java.lang.reflect.InvocationTargetException
|
||||||
|
[exec] at java.lang.reflect.Method.invokeNative(Native Method)
|
||||||
|
[exec] at org.jetbrains.jet.compiler.android.AbstractCodegenTestCaseOnAndroid.invokeBoxMethod(AbstractCodegenTestCaseOnAndroid.java:35)
|
||||||
|
[exec] ... 13 more
|
||||||
|
[exec] Caused by: java.lang.VerifyError: compiler_testData_codegen_regressions_kt344_jet.namespace$t6$foo$1
|
||||||
|
[exec] at compiler_testData_codegen_regressions_kt344_jet.namespace.t6(dummy.jet:94)
|
||||||
|
[exec] at compiler_testData_codegen_regressions_kt344_jet.namespace.box(dummy.jet:185)
|
||||||
|
[exec] ... 16 more
|
||||||
|
[exec] ...............
|
||||||
|
[exec] Error in testKt529:
|
||||||
|
*/
|
||||||
|
private Map<String, String> parseOutputForFailedTests(String output) {
|
||||||
|
Map<String, String> result = new HashMap<String, String>();
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
String failedTestNamePrefix = " Error in ";
|
||||||
|
String lastFailedTestName = "";
|
||||||
|
Matcher matcher = ERROR_IN_TEST_OUTPUT_PATTERN.matcher(output);
|
||||||
|
while (matcher.find()) {
|
||||||
|
String groupValue = matcher.group();
|
||||||
|
if (groupValue.startsWith(failedTestNamePrefix)) {
|
||||||
|
if (builder.length() > 0) {
|
||||||
|
result.put(lastFailedTestName, builder.toString());
|
||||||
|
builder.delete(0, builder.length());
|
||||||
|
}
|
||||||
|
lastFailedTestName = groupValue.substring(failedTestNamePrefix.length());
|
||||||
|
}
|
||||||
|
builder.append(groupValue);
|
||||||
|
builder.append("\n");
|
||||||
|
}
|
||||||
|
if (builder.length() > 0) {
|
||||||
|
result.put(lastFailedTestName, builder.toString());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//[exec] Tests run: 225, Failures: 0, Errors: 2
|
||||||
|
@Nullable
|
||||||
|
private Statistics parseOutputForTestsNumberIfThereIsFailedTests(String output) {
|
||||||
|
Matcher matcher = NUMBER_OF_TESTS_IF_FAILED.matcher(output);
|
||||||
|
if (matcher.find()) {
|
||||||
|
return new Statistics(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)),
|
||||||
|
Integer.parseInt(matcher.group(3)));
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//[exec] OK (223 tests)
|
||||||
|
@Nullable
|
||||||
|
private Statistics parseOutputForTestsNumberIfTestsPassed(String output) {
|
||||||
|
Matcher matcher = NUMBER_OF_TESTS_OK.matcher(output);
|
||||||
|
if (matcher.find()) {
|
||||||
|
return new Statistics(Integer.parseInt(matcher.group(1)), 0, 0);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String runTests() {
|
||||||
|
ApplicationManager.setApplication(null, new Disposable() {
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
File rootForAndroidDependencies = new File(pathManager.getDependenciesRoot());
|
||||||
|
if (!rootForAndroidDependencies.exists()) {
|
||||||
|
rootForAndroidDependencies.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
SDKDownloader downloader = new SDKDownloader(pathManager);
|
||||||
|
Emulator emulator = new Emulator(pathManager);
|
||||||
|
AntRunner antRunner = new AntRunner(pathManager);
|
||||||
|
downloader.downloadAll();
|
||||||
|
downloader.unzipAll();
|
||||||
|
|
||||||
|
PermissionManager.setPermissions(pathManager);
|
||||||
|
|
||||||
|
antRunner.packLibraries();
|
||||||
|
|
||||||
|
emulator.createEmulator();
|
||||||
|
emulator.startEmulator();
|
||||||
|
try {
|
||||||
|
emulator.waitEmulatorStart();
|
||||||
|
antRunner.cleanOutput();
|
||||||
|
antRunner.compileSources();
|
||||||
|
antRunner.installApplicationOnEmulator();
|
||||||
|
return antRunner.runTestsOnEmulator();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
emulator.stopEmulator();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Statistics {
|
||||||
|
public final int total;
|
||||||
|
public final int errors;
|
||||||
|
public final int failed;
|
||||||
|
|
||||||
|
private Statistics(int total, int failed, int errors) {
|
||||||
|
this.total = total;
|
||||||
|
this.failed = failed;
|
||||||
|
this.errors = errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class PathManager {
|
||||||
|
|
||||||
|
private final String tmpFolder;
|
||||||
|
private final String rootFolder;
|
||||||
|
|
||||||
|
public PathManager(String rootFolder, String tmpFolder) {
|
||||||
|
this.tmpFolder = tmpFolder;
|
||||||
|
this.rootFolder = rootFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPlatformFolderInAndroidSdk() {
|
||||||
|
return getAndroidSdkRoot() + "/platforms";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPlatformToolsFolderInAndroidSdk() {
|
||||||
|
return getAndroidSdkRoot() + "/platform-tools";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getToolsFolderInAndroidSdk() {
|
||||||
|
return getAndroidSdkRoot() + "/tools";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOutputForCompiledFiles() {
|
||||||
|
return tmpFolder + "/libs/codegen-test-output";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLibsFolderInAndroidTestedModuleTmpFolder() {
|
||||||
|
return tmpFolder + "/tested-module/libs";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLibsFolderInAndroidTmpFolder() {
|
||||||
|
return tmpFolder + "/libs";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSrcFolderInAndroidTmpFolder() {
|
||||||
|
return tmpFolder + "/src";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAndroidSdkRoot() {
|
||||||
|
return getDependenciesRoot() + "/android-sdk";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDependenciesRoot() {
|
||||||
|
return rootFolder + "/android.tests.dependencies";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRootForDownload() {
|
||||||
|
return getDependenciesRoot() + "/download";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAntBinDirectory() {
|
||||||
|
return getDependenciesRoot() + "/apache-ant-1.8.0/bin";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAndroidModuleRoot() {
|
||||||
|
return rootFolder + "/compiler/android-tests/android-module";
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTmpFolder() {
|
||||||
|
return tmpFolder;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.ant;
|
||||||
|
|
||||||
|
import com.intellij.execution.configurations.GeneralCommandLine;
|
||||||
|
import com.intellij.openapi.util.SystemInfo;
|
||||||
|
import org.jetbrains.jet.compiler.PathManager;
|
||||||
|
import org.jetbrains.jet.compiler.run.RunUtils;
|
||||||
|
import org.jetbrains.jet.compiler.run.result.RunResult;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class AntRunner {
|
||||||
|
private final List<String> listOfAntCommands;
|
||||||
|
|
||||||
|
public AntRunner(PathManager pathManager) {
|
||||||
|
listOfAntCommands = new ArrayList<String>();
|
||||||
|
String antCmdName = SystemInfo.isWindows ? "ant.bat" : "ant";
|
||||||
|
listOfAntCommands.add(pathManager.getAntBinDirectory() + "/" + antCmdName);
|
||||||
|
listOfAntCommands.add("-Dsdk.dir=" + pathManager.getAndroidSdkRoot());
|
||||||
|
listOfAntCommands.add("-buildfile");
|
||||||
|
listOfAntCommands.add(pathManager.getTmpFolder() + "/build.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pack compiled sources on first step to one jar file */
|
||||||
|
public void packLibraries() {
|
||||||
|
System.out.println("Pack libraries...");
|
||||||
|
RunResult result = RunUtils.execute(generateCommandLine("pack_libraries"));
|
||||||
|
if (!result.getStatus()) {
|
||||||
|
throw new RuntimeException(result.getOutput());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clean output directory */
|
||||||
|
public void cleanOutput() {
|
||||||
|
System.out.println("Clearing output directory...");
|
||||||
|
RunResult result = RunUtils.execute(generateCommandLine("clean"));
|
||||||
|
if (!result.getStatus()) {
|
||||||
|
throw new RuntimeException(result.getOutput());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void compileSources() {
|
||||||
|
System.out.println("Compiling sources...");
|
||||||
|
RunResult result = RunUtils.execute(generateCommandLine("debug"));
|
||||||
|
if (!result.getStatus()) {
|
||||||
|
throw new RuntimeException(result.getOutput());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void installApplicationOnEmulator() {
|
||||||
|
System.out.println("Installing apk...");
|
||||||
|
RunResult result = RunUtils.execute(generateCommandLine("installt"));
|
||||||
|
String resultOutput = result.getOutput();
|
||||||
|
if (!isInstallSuccessful(resultOutput)) {
|
||||||
|
installApplicationOnEmulator();
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
System.out.println(resultOutput);
|
||||||
|
}
|
||||||
|
if (!result.getStatus()) {
|
||||||
|
throw new RuntimeException(resultOutput);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String runTestsOnEmulator() {
|
||||||
|
System.out.println("Running tests...");
|
||||||
|
RunResult result = RunUtils.execute(generateCommandLine("test"));
|
||||||
|
String resultOutput = result.getOutput();
|
||||||
|
if (!result.getStatus()) {
|
||||||
|
throw new RuntimeException(resultOutput);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return resultOutput;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isInstallSuccessful(String output) {
|
||||||
|
if (output.contains("Is the system running?")) {
|
||||||
|
try {
|
||||||
|
System.out.println("Device not ready. Waiting for 20 sec.");
|
||||||
|
Thread.sleep(20000);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private GeneralCommandLine generateCommandLine(String taskName) {
|
||||||
|
GeneralCommandLine commandLine = new GeneralCommandLine(listOfAntCommands);
|
||||||
|
commandLine.addParameter(taskName);
|
||||||
|
return commandLine;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,224 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.download;
|
||||||
|
|
||||||
|
import com.intellij.openapi.util.SystemInfo;
|
||||||
|
import com.intellij.openapi.util.io.FileUtil;
|
||||||
|
import org.jetbrains.jet.compiler.PathManager;
|
||||||
|
import org.jetbrains.jet.compiler.run.RunUtils;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class SDKDownloader {
|
||||||
|
private final String platformZipPath;
|
||||||
|
private final String platformToolsZipPath;
|
||||||
|
private final String toolsZipPath;
|
||||||
|
private final String antZipPath;
|
||||||
|
|
||||||
|
private final PathManager pathManager;
|
||||||
|
|
||||||
|
public SDKDownloader(PathManager pathManager) {
|
||||||
|
this.pathManager = pathManager;
|
||||||
|
platformZipPath = pathManager.getRootForDownload() + "/platforms.zip";
|
||||||
|
platformToolsZipPath = pathManager.getRootForDownload() + "/platform-tools.zip";
|
||||||
|
toolsZipPath = pathManager.getRootForDownload() + "/tools.zip";
|
||||||
|
antZipPath = pathManager.getRootForDownload() + "/apache-ant-1.8.0.zip";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void downloadPlatform() {
|
||||||
|
download("https://dl-ssl.google.com/android/repository/android-2.3.3_r02-linux.zip", platformZipPath); //Same for all platforms
|
||||||
|
}
|
||||||
|
|
||||||
|
public void downloadPlatformTools() {
|
||||||
|
String downloadURL;
|
||||||
|
if (SystemInfo.isWindows) {
|
||||||
|
downloadURL = "http://dl-ssl.google.com/android/repository/platform-tools_r11-windows.zip";
|
||||||
|
}
|
||||||
|
else if (SystemInfo.isMac) {
|
||||||
|
downloadURL = "http://dl-ssl.google.com/android/repository/platform-tools_r11-macosx.zip";
|
||||||
|
}
|
||||||
|
else if (SystemInfo.isUnix) {
|
||||||
|
downloadURL = "http://dl-ssl.google.com/android/repository/platform-tools_r11-linux.zip";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new IllegalStateException("Your operating system doesn't supported yet.");
|
||||||
|
}
|
||||||
|
download(downloadURL, platformToolsZipPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void downloadTools() {
|
||||||
|
String downloadURL;
|
||||||
|
if (SystemInfo.isWindows) {
|
||||||
|
downloadURL = "http://dl.google.com/android/repository/tools_r19-windows.zip";
|
||||||
|
}
|
||||||
|
else if (SystemInfo.isMac) {
|
||||||
|
downloadURL = "http://dl.google.com/android/repository/tools_r19-macosx.zip";
|
||||||
|
}
|
||||||
|
else if (SystemInfo.isUnix) {
|
||||||
|
downloadURL = "http://dl.google.com/android/repository/tools_r19-linux.zip";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new IllegalStateException("Your operating system doesn't supported yet.");
|
||||||
|
}
|
||||||
|
download(downloadURL, toolsZipPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void downloadAnt() {
|
||||||
|
download("http://archive.apache.org/dist/ant/binaries/apache-ant-1.8.0-bin.zip", antZipPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void downloadAll() {
|
||||||
|
downloadTools();
|
||||||
|
downloadPlatform();
|
||||||
|
downloadPlatformTools();
|
||||||
|
downloadAnt();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unzipAll() {
|
||||||
|
unzip(platformZipPath, pathManager.getPlatformFolderInAndroidSdk());
|
||||||
|
unzip(platformToolsZipPath, pathManager.getAndroidSdkRoot());
|
||||||
|
unzip(toolsZipPath, pathManager.getAndroidSdkRoot());
|
||||||
|
unzip(antZipPath, pathManager.getDependenciesRoot());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteAll() {
|
||||||
|
delete(platformZipPath);
|
||||||
|
delete(platformToolsZipPath);
|
||||||
|
delete(toolsZipPath);
|
||||||
|
delete(antZipPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void download(String urlString, String output) {
|
||||||
|
System.out.println("Start downloading: " + urlString + " to " + output);
|
||||||
|
OutputStream outStream = null;
|
||||||
|
URLConnection urlConnection = null;
|
||||||
|
|
||||||
|
InputStream is = null;
|
||||||
|
try {
|
||||||
|
URL Url;
|
||||||
|
byte[] buf;
|
||||||
|
int read;
|
||||||
|
//int written = 0;
|
||||||
|
Url = new URL(urlString);
|
||||||
|
|
||||||
|
File outputFile = new File(output);
|
||||||
|
outputFile.getParentFile().mkdirs();
|
||||||
|
if (outputFile.exists()) {
|
||||||
|
System.out.println("File was already downloaded: " + output);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
outputFile.createNewFile();
|
||||||
|
FileOutputStream outputStream = new FileOutputStream(outputFile);
|
||||||
|
outStream = new BufferedOutputStream(outputStream);
|
||||||
|
|
||||||
|
urlConnection = Url.openConnection();
|
||||||
|
is = urlConnection.getInputStream();
|
||||||
|
buf = new byte[1024];
|
||||||
|
while ((read = is.read(buf)) != -1) {
|
||||||
|
outStream.write(buf, 0, read);
|
||||||
|
//written += read;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
RunUtils.close(outStream);
|
||||||
|
}
|
||||||
|
System.out.println("Finish downloading: " + urlString + " to " + output);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void unzip(String pathToFile, String outputFolder) {
|
||||||
|
System.out.println("Start unzipping: " + pathToFile + " to " + outputFolder);
|
||||||
|
String pathToUnzip;
|
||||||
|
if (outputFolder.equals(pathManager.getPlatformFolderInAndroidSdk())) {
|
||||||
|
pathToUnzip = outputFolder;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pathToUnzip = outputFolder + "/" + FileUtil.getNameWithoutExtension(new File(pathToFile));
|
||||||
|
}
|
||||||
|
if (new File(pathToUnzip).listFiles() != null) {
|
||||||
|
System.out.println("File was already unzipped: " + pathToFile);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
byte[] buf = new byte[1024];
|
||||||
|
ZipInputStream zipinputstream = null;
|
||||||
|
ZipEntry zipentry;
|
||||||
|
zipinputstream = new ZipInputStream(new FileInputStream(pathToFile));
|
||||||
|
|
||||||
|
zipentry = zipinputstream.getNextEntry();
|
||||||
|
try {
|
||||||
|
while (zipentry != null) {
|
||||||
|
String entryName = zipentry.getName();
|
||||||
|
int n;
|
||||||
|
File outputFile = new File(outputFolder + "/" + entryName);
|
||||||
|
|
||||||
|
if (zipentry.isDirectory()) {
|
||||||
|
outputFile.mkdirs();
|
||||||
|
zipinputstream.closeEntry();
|
||||||
|
zipentry = zipinputstream.getNextEntry();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
File parentFile = outputFile.getParentFile();
|
||||||
|
if (parentFile != null && !parentFile.exists()) {
|
||||||
|
parentFile.mkdirs();
|
||||||
|
}
|
||||||
|
outputFile.createNewFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
FileOutputStream fileoutputstream = new FileOutputStream(outputFile);
|
||||||
|
try {
|
||||||
|
while ((n = zipinputstream.read(buf, 0, 1024)) > -1) {
|
||||||
|
fileoutputstream.write(buf, 0, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
fileoutputstream.close();
|
||||||
|
}
|
||||||
|
zipinputstream.closeEntry();
|
||||||
|
zipentry = zipinputstream.getNextEntry();
|
||||||
|
}
|
||||||
|
|
||||||
|
zipinputstream.close();
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
System.err.println("Entry name: " + zipentry.getName());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.println("Finish unzipping: " + pathToFile + " to " + outputFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void delete(String filePath) {
|
||||||
|
File file = new File(filePath);
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.emulator;
|
||||||
|
|
||||||
|
import com.intellij.execution.configurations.GeneralCommandLine;
|
||||||
|
import com.intellij.openapi.util.SystemInfo;
|
||||||
|
import org.jetbrains.jet.compiler.PathManager;
|
||||||
|
import org.jetbrains.jet.compiler.run.RunUtils;
|
||||||
|
import org.jetbrains.jet.compiler.run.result.RunResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class Emulator {
|
||||||
|
|
||||||
|
private final PathManager pathManager;
|
||||||
|
|
||||||
|
public Emulator(PathManager pathManager) {
|
||||||
|
this.pathManager = pathManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
private GeneralCommandLine getCreateCommand() {
|
||||||
|
GeneralCommandLine commandLine = new GeneralCommandLine();
|
||||||
|
String androidCmdName = SystemInfo.isWindows ? "android.bat" : "android";
|
||||||
|
commandLine.setExePath(pathManager.getToolsFolderInAndroidSdk() + "/" + androidCmdName);
|
||||||
|
commandLine.addParameter("create");
|
||||||
|
commandLine.addParameter("avd");
|
||||||
|
commandLine.addParameter("--force");
|
||||||
|
commandLine.addParameter("-n");
|
||||||
|
commandLine.addParameter("my_avd");
|
||||||
|
commandLine.addParameter("-t");
|
||||||
|
commandLine.addParameter("1");
|
||||||
|
return commandLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
private GeneralCommandLine getStartCommand() {
|
||||||
|
GeneralCommandLine commandLine = new GeneralCommandLine();
|
||||||
|
String emulatorCmdName = SystemInfo.isWindows ? "emulator.exe" : "emulator";
|
||||||
|
commandLine.setExePath(pathManager.getToolsFolderInAndroidSdk() + "/" + emulatorCmdName);
|
||||||
|
commandLine.addParameter("-avd");
|
||||||
|
commandLine.addParameter("my_avd");
|
||||||
|
commandLine.addParameter("-no-audio");
|
||||||
|
commandLine.addParameter("-no-window");
|
||||||
|
return commandLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
private GeneralCommandLine getWaitCommand() {
|
||||||
|
GeneralCommandLine commandLine = new GeneralCommandLine();
|
||||||
|
String adbCmdName = SystemInfo.isWindows ? "adb.exe" : "adb";
|
||||||
|
commandLine.setExePath(pathManager.getPlatformToolsFolderInAndroidSdk() + "/" + adbCmdName);
|
||||||
|
commandLine.addParameter("wait-for-device");
|
||||||
|
return commandLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
private GeneralCommandLine getStopCommandForAdb() {
|
||||||
|
GeneralCommandLine commandLine = new GeneralCommandLine();
|
||||||
|
String adbCmdName = SystemInfo.isWindows ? "adb.exe" : "adb";
|
||||||
|
commandLine.setExePath(pathManager.getPlatformToolsFolderInAndroidSdk() + "/" + adbCmdName);
|
||||||
|
commandLine.addParameter("kill-server");
|
||||||
|
return commandLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
private GeneralCommandLine getStopCommand() {
|
||||||
|
GeneralCommandLine commandLine = new GeneralCommandLine();
|
||||||
|
if (SystemInfo.isWindows) {
|
||||||
|
commandLine.setExePath("taskkill");
|
||||||
|
commandLine.addParameter("/F");
|
||||||
|
commandLine.addParameter("/IM");
|
||||||
|
commandLine.addParameter("emulator-arm.exe");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
commandLine.setExePath(pathManager.getPlatformToolsFolderInAndroidSdk() + "/adb");
|
||||||
|
commandLine.addParameter("emu");
|
||||||
|
commandLine.addParameter("kill");
|
||||||
|
}
|
||||||
|
return commandLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createEmulator() {
|
||||||
|
System.out.println("Creating emulator...");
|
||||||
|
checkResult(RunUtils.execute(getCreateCommand(), "no"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void startEmulator() {
|
||||||
|
System.out.println("Starting emulator...");
|
||||||
|
checkResult(RunUtils.executeOnSeparateThread(getStartCommand(), false));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void waitEmulatorStart() {
|
||||||
|
System.out.println("Waiting for emulator start...");
|
||||||
|
checkResult(RunUtils.execute(getWaitCommand()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopEmulator() {
|
||||||
|
System.out.println("Stopping emulator...");
|
||||||
|
checkResult(RunUtils.execute(getStopCommand()));
|
||||||
|
System.out.println("Stopping adb...");
|
||||||
|
checkResult(RunUtils.execute(getStopCommandForAdb()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkResult(RunResult result) {
|
||||||
|
if (!result.getStatus()) {
|
||||||
|
throw new RuntimeException(result.getOutput());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.run;
|
||||||
|
|
||||||
|
import com.intellij.execution.configurations.GeneralCommandLine;
|
||||||
|
import com.intellij.openapi.util.SystemInfo;
|
||||||
|
import org.jetbrains.jet.compiler.PathManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class PermissionManager {
|
||||||
|
private PermissionManager() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setPermissions(PathManager pathManager) {
|
||||||
|
if (!SystemInfo.isWindows) {
|
||||||
|
RunUtils.execute(generateChmodCmd(pathManager.getPlatformToolsFolderInAndroidSdk() + "/aapt"));
|
||||||
|
RunUtils.execute(generateChmodCmd(pathManager.getPlatformToolsFolderInAndroidSdk() + "/adb"));
|
||||||
|
RunUtils.execute(generateChmodCmd(pathManager.getPlatformToolsFolderInAndroidSdk() + "/dx"));
|
||||||
|
RunUtils.execute(generateChmodCmd(pathManager.getToolsFolderInAndroidSdk() + "/emulator"));
|
||||||
|
RunUtils.execute(generateChmodCmd(pathManager.getToolsFolderInAndroidSdk() + "/tools/ddms"));
|
||||||
|
RunUtils.execute(generateChmodCmd(pathManager.getToolsFolderInAndroidSdk() + "/tools/android"));
|
||||||
|
RunUtils.execute(generateChmodCmd(pathManager.getToolsFolderInAndroidSdk() + "/tools/emulator-arm"));
|
||||||
|
RunUtils.execute(generateChmodCmd(pathManager.getToolsFolderInAndroidSdk() + "/tools/zipalign"));
|
||||||
|
RunUtils.execute(generateChmodCmd(pathManager.getAntBinDirectory() + "/ant"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static GeneralCommandLine generateChmodCmd(String path) {
|
||||||
|
GeneralCommandLine commandLine = new GeneralCommandLine();
|
||||||
|
commandLine.setExePath("chmod");
|
||||||
|
commandLine.addParameter("u+x");
|
||||||
|
commandLine.addParameter(path);
|
||||||
|
return commandLine;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.run;
|
||||||
|
|
||||||
|
import com.google.common.base.Charsets;
|
||||||
|
import com.intellij.execution.ExecutionException;
|
||||||
|
import com.intellij.execution.configurations.GeneralCommandLine;
|
||||||
|
import com.intellij.execution.process.OSProcessHandler;
|
||||||
|
import com.intellij.execution.process.ProcessAdapter;
|
||||||
|
import com.intellij.execution.process.ProcessEvent;
|
||||||
|
import com.intellij.execution.process.ProcessOutputTypes;
|
||||||
|
import com.intellij.openapi.progress.ProcessCanceledException;
|
||||||
|
import com.intellij.openapi.util.Key;
|
||||||
|
import com.intellij.openapi.util.Ref;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.compiler.run.result.RunResult;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RunUtils {
|
||||||
|
private RunUtils() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RunResult execute(final GeneralCommandLine commandLine) {
|
||||||
|
return run(commandLine, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RunResult execute(final GeneralCommandLine commandLine, @Nullable String input) {
|
||||||
|
return run(commandLine, input);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RunResult executeOnSeparateThread(final GeneralCommandLine commandLine, boolean waitForEnd) {
|
||||||
|
return executeOnSeparateThread(commandLine, waitForEnd, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RunResult executeOnSeparateThread(final GeneralCommandLine commandLine,
|
||||||
|
boolean waitForEnd,
|
||||||
|
@Nullable final String input) {
|
||||||
|
final Ref<RunResult> resultRef = new Ref<RunResult>();
|
||||||
|
Thread t = new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
resultRef.set(RunUtils.run(commandLine, input));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
t.start();
|
||||||
|
|
||||||
|
if (waitForEnd) {
|
||||||
|
try {
|
||||||
|
t.wait(300000);
|
||||||
|
return resultRef.get();
|
||||||
|
}
|
||||||
|
catch (InterruptedException e) {
|
||||||
|
new RunResult(false, getStackTrace(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new RunResult(true, "OK");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RunResult run(final GeneralCommandLine commandLine, @Nullable final String input) {
|
||||||
|
final StringBuilder stdOut = new StringBuilder();
|
||||||
|
final StringBuilder stdErr = new StringBuilder();
|
||||||
|
|
||||||
|
final OSProcessHandler handler;
|
||||||
|
try {
|
||||||
|
handler = new OSProcessHandler(commandLine.createProcess(), commandLine.getCommandLineString(), Charsets.UTF_8);
|
||||||
|
if (input != null) {
|
||||||
|
handler.getProcessInput().write(input.getBytes());
|
||||||
|
}
|
||||||
|
close(handler.getProcessInput());
|
||||||
|
}
|
||||||
|
catch (ExecutionException e) {
|
||||||
|
return new RunResult(false, getStackTrace(e));
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
return new RunResult(false, getStackTrace(e));
|
||||||
|
}
|
||||||
|
|
||||||
|
final ProcessAdapter listener = new ProcessAdapter() {
|
||||||
|
@Override
|
||||||
|
public void onTextAvailable(final ProcessEvent event, final Key outputType) {
|
||||||
|
String str = event.getText();
|
||||||
|
if (outputType == ProcessOutputTypes.STDOUT || outputType == ProcessOutputTypes.SYSTEM) {
|
||||||
|
stdOut.append(str);
|
||||||
|
if (!commandLine.getCommandLineString().contains("install")) {
|
||||||
|
System.out.print(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (outputType == ProcessOutputTypes.STDERR) {
|
||||||
|
stdErr.append(str);
|
||||||
|
System.err.print(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
handler.addProcessListener(listener);
|
||||||
|
handler.startNotify();
|
||||||
|
|
||||||
|
try {
|
||||||
|
handler.waitFor(300000);
|
||||||
|
}
|
||||||
|
catch (ProcessCanceledException e) {
|
||||||
|
return new RunResult(false, getStackTrace(e));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!handler.isProcessTerminated()) {
|
||||||
|
return new RunResult(false, "Timeout exception: execution was terminated after 5 min.");
|
||||||
|
}
|
||||||
|
|
||||||
|
handler.removeProcessListener(listener);
|
||||||
|
|
||||||
|
int exitCode = handler.getProcess().exitValue();
|
||||||
|
|
||||||
|
if (exitCode != 0) {
|
||||||
|
return new RunResult(false, builderToString(stdOut) + builderToString(stdErr));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
String output = builderToString(stdOut) + builderToString(stdErr);
|
||||||
|
if (!isResultOk(output)) {
|
||||||
|
return new RunResult(false, output);
|
||||||
|
}
|
||||||
|
return new RunResult(true, output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String builderToString(StringBuilder builder) {
|
||||||
|
return builder.length() > 0 ? builder.toString() : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void close(Closeable closeable) {
|
||||||
|
try {
|
||||||
|
if (closeable != null) {
|
||||||
|
closeable.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getStackTrace(Throwable t) {
|
||||||
|
StringWriter writer = new StringWriter();
|
||||||
|
PrintWriter printWriter = new PrintWriter(writer);
|
||||||
|
try {
|
||||||
|
printWriter.write(t.getMessage());
|
||||||
|
printWriter.write("\n");
|
||||||
|
t.printStackTrace(printWriter);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
close(printWriter);
|
||||||
|
}
|
||||||
|
return writer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isResultOk(String output) {
|
||||||
|
if (output.contains("BUILD FAILED")
|
||||||
|
|| output.contains("Build failed")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.run.result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RunResult {
|
||||||
|
private final boolean status;
|
||||||
|
private final String output;
|
||||||
|
|
||||||
|
public RunResult(boolean ok, String output) {
|
||||||
|
status = ok;
|
||||||
|
this.output = output;
|
||||||
|
}
|
||||||
|
|
||||||
|
//true - ok
|
||||||
|
//false - fail
|
||||||
|
public boolean getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOutput() {
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.android;
|
||||||
|
|
||||||
|
import com.google.common.io.Files;
|
||||||
|
import com.intellij.openapi.util.io.FileUtil;
|
||||||
|
import junit.framework.TestSuite;
|
||||||
|
import org.jetbrains.jet.compiler.CodegenTestsOnAndroidRunner;
|
||||||
|
import org.jetbrains.jet.compiler.PathManager;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class AndroidRunner extends TestSuite {
|
||||||
|
|
||||||
|
public static TestSuite suite() throws Throwable {
|
||||||
|
File tmpFolder = Files.createTempDir();
|
||||||
|
System.out.println("Created temporary folder for running android tests: " + tmpFolder.getAbsolutePath());
|
||||||
|
File rootFolder = new File("");
|
||||||
|
PathManager pathManager = new PathManager(rootFolder.getAbsolutePath(), tmpFolder.getAbsolutePath());
|
||||||
|
|
||||||
|
FileUtil.copyDir(new File(pathManager.getAndroidModuleRoot()), new File(pathManager.getTmpFolder()));
|
||||||
|
|
||||||
|
try {
|
||||||
|
CodegenTestsOnAndroidGenerator.generate(pathManager);
|
||||||
|
}
|
||||||
|
catch(Throwable e) {
|
||||||
|
FileUtil.delete(new File(pathManager.getTmpFolder()));
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("Run tests on android...");
|
||||||
|
return CodegenTestsOnAndroidRunner.getTestSuite(pathManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+203
@@ -0,0 +1,203 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.android;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.intellij.openapi.util.io.FileUtil;
|
||||||
|
import com.intellij.openapi.util.text.StringUtil;
|
||||||
|
import com.intellij.testFramework.UsefulTestCase;
|
||||||
|
import junit.framework.Assert;
|
||||||
|
import org.jetbrains.jet.JetTestUtils;
|
||||||
|
import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil;
|
||||||
|
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
|
||||||
|
import org.jetbrains.jet.codegen.*;
|
||||||
|
import org.jetbrains.jet.compiler.PathManager;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetPsiFactory;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
|
||||||
|
import org.jetbrains.jet.test.generator.Printer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class CodegenTestsOnAndroidGenerator extends UsefulTestCase {
|
||||||
|
|
||||||
|
private final PathManager pathManager;
|
||||||
|
private final String testClassPackage = "org.jetbrains.jet.compiler.android";
|
||||||
|
private final String testClassName = "CodegenTestCaseOnAndroid";
|
||||||
|
private final String baseTestClassPackage = "org.jetbrains.jet.compiler.android";
|
||||||
|
private final String baseTestClassName = "AbstractCodegenTestCaseOnAndroid";
|
||||||
|
private final String generatorName = "CodegenTestsOnAndroidGenerator";
|
||||||
|
|
||||||
|
private JetCoreEnvironment environmentWithMockJdk = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS);
|
||||||
|
private JetCoreEnvironment environmentWithFullJdk = JetTestUtils.createEnvironmentWithFullJdk(myTestRootDisposable);
|
||||||
|
|
||||||
|
private final Pattern packagePattern = Pattern.compile("package (.*)");
|
||||||
|
|
||||||
|
private final List<String> generatedTestNames = Lists.newArrayList();
|
||||||
|
|
||||||
|
public static void generate(PathManager pathManager) throws Throwable {
|
||||||
|
new CodegenTestsOnAndroidGenerator(pathManager).generateOutputFiles();
|
||||||
|
}
|
||||||
|
|
||||||
|
private CodegenTestsOnAndroidGenerator(PathManager pathManager) {
|
||||||
|
this.pathManager = pathManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateOutputFiles() throws Throwable {
|
||||||
|
prepareAndroidModule();
|
||||||
|
generateAndSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void prepareAndroidModule() throws IOException {
|
||||||
|
System.out.println("Copying kotlin-runtime.jar in android module...");
|
||||||
|
copyKotlinRuntimeJar();
|
||||||
|
|
||||||
|
System.out.println("Check \"libs\" folder in tested android module...");
|
||||||
|
File libsFolderInTestedModule = new File(pathManager.getLibsFolderInAndroidTestedModuleTmpFolder());
|
||||||
|
if (!libsFolderInTestedModule.exists()) {
|
||||||
|
libsFolderInTestedModule.mkdirs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyKotlinRuntimeJar() throws IOException {
|
||||||
|
File kotlinRuntimeJar = new File(pathManager.getLibsFolderInAndroidTmpFolder() + "/kotlin-runtime.jar");
|
||||||
|
File kotlinRuntimeInDist = new File("dist/kotlinc/lib/kotlin-runtime.jar");
|
||||||
|
Assert.assertTrue("kotlin-runtime.jar in dist/kotlnc/lib/ doesn't exists. Run dist ant task before generating test for android.",
|
||||||
|
kotlinRuntimeInDist.exists());
|
||||||
|
FileUtil.copy(kotlinRuntimeInDist, kotlinRuntimeJar);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateAndSave() throws Throwable {
|
||||||
|
System.out.println("Generating test files...");
|
||||||
|
StringBuilder out = new StringBuilder();
|
||||||
|
Printer p = new Printer(out);
|
||||||
|
|
||||||
|
p.print(FileUtil.loadFile(new File("injector-generator/copyright.txt")));
|
||||||
|
p.println("package " + testClassPackage + ";");
|
||||||
|
p.println();
|
||||||
|
p.println("import ", baseTestClassPackage, ".", baseTestClassName, ";");
|
||||||
|
p.println();
|
||||||
|
p.println("/* This class is generated by " + generatorName + ". DO NOT MODIFY MANUALLY */");
|
||||||
|
p.println("public class ", testClassName, " extends ", baseTestClassName, " {");
|
||||||
|
p.pushIndent();
|
||||||
|
|
||||||
|
File testDataSources = new File("compiler/testData/codegen/");
|
||||||
|
generateTestMethodsForDirectory(p, testDataSources);
|
||||||
|
|
||||||
|
p.popIndent();
|
||||||
|
p.println("}");
|
||||||
|
|
||||||
|
String testSourceFilePath =
|
||||||
|
pathManager.getSrcFolderInAndroidTmpFolder() + "/" + testClassPackage.replace(".", "/") + "/" + testClassName + ".java";
|
||||||
|
FileUtil.writeToFile(new File(testSourceFilePath), out.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateTestMethodsForDirectory(Printer p, File dir) throws IOException {
|
||||||
|
File[] files = dir.listFiles();
|
||||||
|
Assert.assertNotNull("Folder with testData is empty: " + dir.getAbsolutePath(), files);
|
||||||
|
Set<String> excludedFiles = SpecialFiles.getExcludedFiles();
|
||||||
|
Set<String> filesCompiledWithoutStdLib = SpecialFiles.getFilesCompiledWithoutStdLib();
|
||||||
|
for (File file : files) {
|
||||||
|
if (excludedFiles.contains(file.getName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
generateTestMethodsForDirectory(p, file);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
String text = FileUtil.loadFile(file, true);
|
||||||
|
|
||||||
|
if (hasBoxMethod(text)) {
|
||||||
|
String generatedTestName = generateTestName(file.getName());
|
||||||
|
String packageName = file.getPath().replaceAll("\\\\|-|\\.|/", "_");
|
||||||
|
text = changePackage(packageName, text);
|
||||||
|
final ClassFileFactory factory;
|
||||||
|
if (filesCompiledWithoutStdLib.contains(file.getName())) {
|
||||||
|
factory = getFactoryFromText(file.getAbsolutePath(), text, environmentWithMockJdk);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
factory = getFactoryFromText(file.getAbsolutePath(), text, environmentWithFullJdk);
|
||||||
|
}
|
||||||
|
|
||||||
|
generateTestMethod(p, generatedTestName, StringUtil.escapeStringCharacters(file.getPath()));
|
||||||
|
File outputDir = new File(pathManager.getOutputForCompiledFiles());
|
||||||
|
if (!outputDir.exists()) {
|
||||||
|
outputDir.mkdirs();
|
||||||
|
}
|
||||||
|
Assert.assertTrue("Cannot create directory for compiled files", outputDir.exists());
|
||||||
|
|
||||||
|
CompileEnvironmentUtil.writeToOutputDirectory(factory, outputDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ClassFileFactory getFactoryFromText(String filePath, String text, JetCoreEnvironment jetEnvironment) {
|
||||||
|
JetFile psiFile = JetPsiFactory.createFile(jetEnvironment.getProject(), text);
|
||||||
|
ClassFileFactory factory;
|
||||||
|
try {
|
||||||
|
factory = GenerationUtils.compileFileGetClassFileFactoryForTest(psiFile, jetEnvironment.getCompilerDependencies().getCompilerSpecialMode());
|
||||||
|
}
|
||||||
|
catch (Throwable e) {
|
||||||
|
throw new RuntimeException("Cannot compile: " + filePath + "\n" + text, e);
|
||||||
|
}
|
||||||
|
return factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasBoxMethod(String text) {
|
||||||
|
return text.contains("fun box()");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String changePackage(String testName, String text) {
|
||||||
|
if (text.contains("package ")) {
|
||||||
|
Matcher matcher = packagePattern.matcher(text);
|
||||||
|
return matcher.replaceAll("package " + testName);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return "package " + testName + ";\n" + text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateTestMethod(Printer p, String testName, String namespace) {
|
||||||
|
p.println("public void test" + testName + "() throws Exception {");
|
||||||
|
p.pushIndent();
|
||||||
|
p.println("invokeBoxMethod(\"" + namespace + "\");");
|
||||||
|
p.popIndent();
|
||||||
|
p.println("}");
|
||||||
|
p.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generateTestName(String fileName) {
|
||||||
|
String result = FileUtil.getNameWithoutExtension(StringUtil.capitalize(fileName));
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while (generatedTestNames.contains(result)) {
|
||||||
|
result += "_" + i++;
|
||||||
|
}
|
||||||
|
generatedTestNames.add(result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed 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 org.jetbrains.jet.compiler.android;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Natalia.Ukhorskaya
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class SpecialFiles {
|
||||||
|
private static final Set<String> excludedFiles = Sets.newHashSet();
|
||||||
|
private static final Set<String> filesCompiledWithoutStdLib = Sets.newHashSet();
|
||||||
|
|
||||||
|
static {
|
||||||
|
fillExcludedFiles();
|
||||||
|
fillFilesCompiledWithoutStdLib();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> getExcludedFiles() {
|
||||||
|
return excludedFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> getFilesCompiledWithoutStdLib() {
|
||||||
|
return filesCompiledWithoutStdLib;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void fillFilesCompiledWithoutStdLib() {
|
||||||
|
filesCompiledWithoutStdLib.add("kt1953_class.kt"); // Exception in code
|
||||||
|
filesCompiledWithoutStdLib.add("basicmethodSuperClass.jet"); // Exception in code
|
||||||
|
filesCompiledWithoutStdLib.add("kt1980.kt"); // OVERLOAD_RESOLUTION_AMBIGUITY
|
||||||
|
filesCompiledWithoutStdLib.add("kt503.jet"); // OVERLOAD_RESOLUTION_AMBIGUITY
|
||||||
|
filesCompiledWithoutStdLib.add("kt504.jet"); // OVERLOAD_RESOLUTION_AMBIGUITY
|
||||||
|
filesCompiledWithoutStdLib.add("kt772.jet"); // OVERLOAD_RESOLUTION_AMBIGUITY
|
||||||
|
filesCompiledWithoutStdLib.add("kt773.jet"); // OVERLOAD_RESOLUTION_AMBIGUITY
|
||||||
|
filesCompiledWithoutStdLib.add("kt796_797.jet"); // OVERLOAD_RESOLUTION_AMBIGUITY
|
||||||
|
filesCompiledWithoutStdLib.add("kt950.jet"); // OVERLOAD_RESOLUTION_AMBIGUITY
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void fillExcludedFiles() {
|
||||||
|
excludedFiles.add("referencesStaticInnerClassMethod.kt"); // Must compile Java files before
|
||||||
|
excludedFiles.add("referencesStaticInnerClassMethodL2.kt"); // Must compile Java files before
|
||||||
|
excludedFiles.add("namespaceQualifiedMethod.jet"); // Cannot change package name
|
||||||
|
excludedFiles.add("kt1482_2279.kt"); // Cannot change package name
|
||||||
|
excludedFiles.add("kt1482.kt"); // Cannot change package name
|
||||||
|
excludedFiles.add("importFromClassObject.jet"); // Cannot find usages in Codegen tests
|
||||||
|
excludedFiles.add("withtypeparams.jet"); // Cannot find usages in Codegen tests
|
||||||
|
excludedFiles.add("kt1113.kt"); // Commented
|
||||||
|
excludedFiles.add("kt326.jet"); // Commented
|
||||||
|
excludedFiles.add("kt694.jet"); // Commented
|
||||||
|
excludedFiles.add("kt285.jet"); // Commented
|
||||||
|
excludedFiles.add("kt857.jet"); // Commented
|
||||||
|
excludedFiles.add("kt1120.kt"); // Commented
|
||||||
|
excludedFiles.add("kt1213.kt"); // Commented
|
||||||
|
excludedFiles.add("kt882.jet"); // Commented
|
||||||
|
excludedFiles.add("kt789.jet"); // Commented
|
||||||
|
excludedFiles.add("isTypeParameter.jet"); // Commented
|
||||||
|
excludedFiles.add("nullability.jet"); // Commented
|
||||||
|
excludedFiles.add("genericFunction.jet"); // Commented
|
||||||
|
excludedFiles.add("forwardTypeParameter.jet"); // Commented
|
||||||
|
excludedFiles.add("kt259.jet"); // Commented
|
||||||
|
excludedFiles.add("classObjectMethod.jet"); // Commented
|
||||||
|
excludedFiles.add("kt1592.kt"); // Codegen don't execute blackBoxFile() on it
|
||||||
|
|
||||||
|
excludedFiles.add("box.kt"); // MultiFileTest
|
||||||
|
|
||||||
|
excludedFiles.add("kt684.jet"); // StackOverflow with StringBuilder (escape())
|
||||||
|
|
||||||
|
excludedFiles.add("kt1199.kt"); // Bug KT-2202
|
||||||
|
excludedFiles.add("kt344.jet"); // Bug KT-2251
|
||||||
|
excludedFiles.add("kt529.kt"); // Bug
|
||||||
|
}
|
||||||
|
|
||||||
|
private SpecialFiles() {
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user