/* * Copyright (C) 2014 The Android Open Source Project * * 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 com.android.jack.test.helper; import com.android.jack.test.comparator.Comparator; import com.android.jack.test.comparator.ComparatorDex; import com.android.jack.test.toolchain.AbstractTestTools; import com.android.jack.test.toolchain.AndroidToolchain; import java.io.File; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; /** * This class is a {@link GenericComparisonTestHelper} where the two compilers perform * a source-to-dex compilation. */ public class SourceToDexComparisonTestHelper extends GenericComparisonTestHelper { @Nonnull private File candidateDexDir; @Nonnull protected File candidateDex; @Nonnull private File refDexDir; @Nonnull protected File refDex; @Nonnull private File[] candidateClasspath; @Nonnull private File[] referenceClasspath; @Nonnull private File fileOrSourceList; @CheckForNull private File jarjarRulesFile = null; @Nonnull private File[] proguardFlagFiles = new File[0]; @Nonnull private AndroidToolchain candidateTestTools; @Nonnull private AndroidToolchain referenceTestTools; protected boolean withDebugInfos = false; public SourceToDexComparisonTestHelper(@Nonnull File fileOrSourceList) throws Exception { this.fileOrSourceList = fileOrSourceList; candidateTestTools = getCandidateToolchain(); referenceTestTools = getReferenceToolchain(); candidateClasspath = candidateTestTools.getDefaultBootClasspath(); referenceClasspath = referenceTestTools.getDefaultBootClasspath(); candidateDexDir = AbstractTestTools.createTempDir(); refDexDir = AbstractTestTools.createTempDir(); candidateDex = new File(candidateDexDir, candidateTestTools.getBinaryFileName()); refDex = new File(refDexDir, referenceTestTools.getBinaryFileName()); } @Nonnull protected AndroidToolchain getCandidateToolchain() { return AbstractTestTools.getCandidateToolchain(AndroidToolchain.class); } @Nonnull protected AndroidToolchain getReferenceToolchain() { return AbstractTestTools.getReferenceToolchain(AndroidToolchain.class); } @Nonnull public SourceToDexComparisonTestHelper setCandidateTestTools( @Nonnull AndroidToolchain candidateTestTools) { this.candidateTestTools = candidateTestTools; return this; } @Nonnull public SourceToDexComparisonTestHelper setReferenceTestTools( @Nonnull AndroidToolchain referenceTestTools) { this.referenceTestTools = referenceTestTools; return this; } @Nonnull public SourceToDexComparisonTestHelper setCandidateClasspath(@Nonnull File[] classpath) { candidateClasspath = classpath; return this; } @Nonnull public SourceToDexComparisonTestHelper setReferenceClasspath(@Nonnull File[] classpath) { referenceClasspath = classpath; return this; } @Nonnull public SourceToDexComparisonTestHelper setWithDebugInfo(boolean withDebugInfo) { this.withDebugInfos = withDebugInfo; return this; } @Nonnull public Comparator createDexFileComparator() { ComparatorDex comparator = new ComparatorDex(candidateDex, refDex); comparator.setWithDebugInfo(withDebugInfos); comparator.setStrict(false); comparator.setCompareDebugInfoBinary(false); comparator.setCompareInstructionNumber(false); comparator.setInstructionNumberTolerance(0f); return comparator; } @Nonnull public SourceToDexComparisonTestHelper setJarjarRulesFile(@Nonnull File jarjarRulesFile) { this.jarjarRulesFile = jarjarRulesFile; return this; } @Nonnull public SourceToDexComparisonTestHelper setProguardFlags(@Nonnull File[] proguardFlags) { this.proguardFlagFiles = proguardFlags; return this; } @Override @Nonnull protected void executeCandidateToolchain() throws Exception { if (jarjarRulesFile != null) { candidateTestTools.setJarjarRules(jarjarRulesFile); } candidateTestTools.addProguardFlags(proguardFlagFiles).srcToExe( AbstractTestTools.getClasspathAsString(candidateClasspath), candidateDexDir, fileOrSourceList); } @Override @Nonnull protected void executeReferenceToolchain() throws Exception { if (jarjarRulesFile != null) { referenceTestTools.setJarjarRules(jarjarRulesFile); } referenceTestTools.addProguardFlags(proguardFlagFiles).srcToExe( AbstractTestTools.getClasspathAsString(referenceClasspath), refDexDir, fileOrSourceList); } }