|  | // Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | package com.android.tools.r8.smali; | 
|  |  | 
|  | import static org.junit.Assert.assertEquals; | 
|  |  | 
|  | import com.android.tools.r8.CompilationFailedException; | 
|  | import com.android.tools.r8.ToolHelper; | 
|  | import com.android.tools.r8.origin.EmbeddedOrigin; | 
|  | import com.android.tools.r8.utils.AndroidApp; | 
|  | import com.android.tools.r8.utils.codeinspector.ClassSubject; | 
|  | import com.android.tools.r8.utils.codeinspector.CodeInspector; | 
|  | import java.io.IOException; | 
|  | import java.util.concurrent.ExecutionException; | 
|  | import org.junit.Test; | 
|  |  | 
|  | public class SmaliBuildTest extends SmaliTestBase { | 
|  |  | 
|  | private void checkJavaLangString(AndroidApp application, boolean present) { | 
|  | try { | 
|  | CodeInspector inspector = new CodeInspector(application); | 
|  | ClassSubject clazz = inspector.clazz("java.lang.String"); | 
|  | assertEquals(present, clazz.isPresent()); | 
|  | } catch (IOException | ExecutionException e) { | 
|  | throw new RuntimeException(e); | 
|  | } | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void buildWithoutLibrary() throws CompilationFailedException { | 
|  | // Build simple "Hello, world!" application. | 
|  | SmaliBuilder builder = new SmaliBuilder(DEFAULT_CLASS_NAME); | 
|  | builder.addMainMethod( | 
|  | 2, | 
|  | "    sget-object         v0, Ljava/lang/System;->out:Ljava/io/PrintStream;", | 
|  | "    const-string        v1, \"Hello, world!\"", | 
|  | "    invoke-virtual      { v0, v1 }, Ljava/io/PrintStream;->println(Ljava/lang/String;)V", | 
|  | "    return-void" | 
|  | ); | 
|  |  | 
|  | // No libraries added - java.lang.String is not present. | 
|  | AndroidApp originalApplication = buildApplication(builder); | 
|  | checkJavaLangString(originalApplication, false); | 
|  |  | 
|  | AndroidApp processedApplication = processApplication(originalApplication); | 
|  | checkJavaLangString(processedApplication, false); | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void buildWithLibrary() throws Throwable { | 
|  | // Build simple "Hello, world!" application. | 
|  | SmaliBuilder builder = new SmaliBuilder(DEFAULT_CLASS_NAME); | 
|  | builder.addMainMethod( | 
|  | 2, | 
|  | "    sget-object         v0, Ljava/lang/System;->out:Ljava/io/PrintStream;", | 
|  | "    const-string        v1, \"Hello, world!\"", | 
|  | "    invoke-virtual      { v0, v1 }, Ljava/io/PrintStream;->println(Ljava/lang/String;)V", | 
|  | "    return-void" | 
|  | ); | 
|  |  | 
|  | AndroidApp originalApp = | 
|  | AndroidApp.builder() | 
|  | .addDexProgramData(builder.compile(), EmbeddedOrigin.INSTANCE) | 
|  | .addLibraryFiles(ToolHelper.getDefaultAndroidJar()) | 
|  | .build(); | 
|  |  | 
|  | // Java standard library added - java.lang.String is present. | 
|  | checkJavaLangString(originalApp, true); | 
|  |  | 
|  | AndroidApp processedApplication = processApplication(originalApp); | 
|  |  | 
|  | // The library method is not part of the output. | 
|  | checkJavaLangString(processedApplication, false); | 
|  | } | 
|  | } |