blob: 192b55440ecfcaa9bb4dcb91662f2f461fd2b3c6 [file] [log] [blame]
// 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.internal;
import static com.android.tools.r8.ToolHelper.DEFAULT_PROGUARD_MAP_FILE;
import com.android.tools.r8.Disassemble;
import com.android.tools.r8.utils.FileUtils;
import java.io.OutputStream;
import java.io.PrintStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.Collectors;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
// Invoke R8 on the dex files extracted from GMSCore.apk to disassemble the dex code.
@RunWith(Parameterized.class)
public class R8DisassemblerTest {
static final String APP_DIR = "third_party/gmscore/v5/";
@Parameters(name = "deobfuscate: {0} smali: {1}")
public static Iterable<Object[]> data() {
return Arrays
.asList(new Object[][]{{false, false}, {false, true}, {true, false}, {true, true}});
}
@Parameter(0)
public boolean deobfuscate;
@Parameter(1)
public boolean smali;
@Test
public void testDisassemble() throws Exception {
// This test only ensures that we do not break disassembling of dex code. It does not
// check the generated code. To make it fast, we get rid of the output.
PrintStream originalOut = System.out;
System.setOut(new PrintStream(new OutputStream() {
public void write(int b) { /* ignore*/ }
}));
try {
Disassemble.DisassembleCommand.Builder builder = Disassemble.DisassembleCommand.builder();
builder.setUseSmali(smali);
if (deobfuscate) {
builder.setProguardMapFile(Paths.get(APP_DIR, DEFAULT_PROGUARD_MAP_FILE));
}
builder.addProgramFiles(
Files.list(Paths.get(APP_DIR))
.filter(FileUtils::isDexFile)
.collect(Collectors.toList()));
Disassemble.DisassembleCommand command = builder.build();
Disassemble.disassemble(command);
} finally {
// Restore System.out for good measure.
System.setOut(originalOut);
}
}
}