19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.tools.layoutlib.create;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport static org.junit.Assert.assertArrayEquals;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.junit.After;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.junit.Before;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.junit.Test;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.URL;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unit tests for some methods of {@link AsmGenerator}.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AsmGeneratorTest {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MockLog mLog;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ArrayList<String> mOsJarPath;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mOsDestJar;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private File mTempFile;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Before
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setUp() throws Exception {
45bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mLog = new MockLog();
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URL url = this.getClass().getClassLoader().getResource("data/mock_android.jar");
47bc101806249eb883f89c4a770a8c27f9ac315837Raphael
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOsJarPath = new ArrayList<String>();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOsJarPath.add(url.getFile());
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTempFile = File.createTempFile("mock", "jar");
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOsDestJar = mTempFile.getAbsolutePath();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTempFile.deleteOnExit();
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @After
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void tearDown() throws Exception {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTempFile != null) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTempFile.delete();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTempFile = null;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Test
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClassRenaming() throws IOException, LogAbortException {
66bc101806249eb883f89c4a770a8c27f9ac315837Raphael
67bc101806249eb883f89c4a770a8c27f9ac315837Raphael        ICreateInfo ci = new ICreateInfo() {
6846d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet            @Override
69bc101806249eb883f89c4a770a8c27f9ac315837Raphael            public Class<?>[] getInjectedClasses() {
70bc101806249eb883f89c4a770a8c27f9ac315837Raphael                // classes to inject in the final JAR
71bc101806249eb883f89c4a770a8c27f9ac315837Raphael                return new Class<?>[0];
72bc101806249eb883f89c4a770a8c27f9ac315837Raphael            }
73bc101806249eb883f89c4a770a8c27f9ac315837Raphael
7446d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet            @Override
75bc101806249eb883f89c4a770a8c27f9ac315837Raphael            public String[] getDelegateMethods() {
76bc101806249eb883f89c4a770a8c27f9ac315837Raphael                return new String[0];
77bc101806249eb883f89c4a770a8c27f9ac315837Raphael            }
78bc101806249eb883f89c4a770a8c27f9ac315837Raphael
7946d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet            @Override
80bc101806249eb883f89c4a770a8c27f9ac315837Raphael            public String[] getDelegateClassNatives() {
81bc101806249eb883f89c4a770a8c27f9ac315837Raphael                return new String[0];
82bc101806249eb883f89c4a770a8c27f9ac315837Raphael            }
83bc101806249eb883f89c4a770a8c27f9ac315837Raphael
8446d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet            @Override
85bc101806249eb883f89c4a770a8c27f9ac315837Raphael            public String[] getOverriddenMethods() {
86bc101806249eb883f89c4a770a8c27f9ac315837Raphael                // methods to force override
87bc101806249eb883f89c4a770a8c27f9ac315837Raphael                return new String[0];
88bc101806249eb883f89c4a770a8c27f9ac315837Raphael            }
89bc101806249eb883f89c4a770a8c27f9ac315837Raphael
9046d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet            @Override
91bc101806249eb883f89c4a770a8c27f9ac315837Raphael            public String[] getRenamedClasses() {
92bc101806249eb883f89c4a770a8c27f9ac315837Raphael                // classes to rename (so that we can replace them)
93bc101806249eb883f89c4a770a8c27f9ac315837Raphael                return new String[] {
94bc101806249eb883f89c4a770a8c27f9ac315837Raphael                        "mock_android.view.View", "mock_android.view._Original_View",
95bc101806249eb883f89c4a770a8c27f9ac315837Raphael                        "not.an.actual.ClassName", "anoter.fake.NewClassName",
96bc101806249eb883f89c4a770a8c27f9ac315837Raphael                };
97bc101806249eb883f89c4a770a8c27f9ac315837Raphael            }
98bc101806249eb883f89c4a770a8c27f9ac315837Raphael
9946d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet            @Override
100bc101806249eb883f89c4a770a8c27f9ac315837Raphael            public String[] getDeleteReturns() {
101bc101806249eb883f89c4a770a8c27f9ac315837Raphael                 // methods deleted from their return type.
102bc101806249eb883f89c4a770a8c27f9ac315837Raphael                return new String[0];
103bc101806249eb883f89c4a770a8c27f9ac315837Raphael            }
104bc101806249eb883f89c4a770a8c27f9ac315837Raphael        };
105bc101806249eb883f89c4a770a8c27f9ac315837Raphael
106bc101806249eb883f89c4a770a8c27f9ac315837Raphael        AsmGenerator agen = new AsmGenerator(mLog, mOsDestJar, ci);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AsmAnalyzer aa = new AsmAnalyzer(mLog, mOsJarPath, agen,
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null,                 // derived from
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new String[] {        // include classes
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "**"
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                });
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        aa.analyze();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        agen.generate();
115bc101806249eb883f89c4a770a8c27f9ac315837Raphael
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Set<String> notRenamed = agen.getClassesNotRenamed();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertArrayEquals(new String[] { "not/an/actual/ClassName" }, notRenamed.toArray());
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
120