119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton/*
219536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton * Copyright 2017 The Android Open Source Project
319536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton *
419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton * Licensed under the Apache License, Version 2.0 (the "License");
519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton * you may not use this file except in compliance with the License.
619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton * You may obtain a copy of the License at
719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton *
819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton *      http://www.apache.org/licenses/LICENSE-2.0
919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton *
1019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton * Unless required by applicable law or agreed to in writing, software
1119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton * distributed under the License is distributed on an "AS IS" BASIS,
1219536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1319536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton * See the License for the specific language governing permissions and
1419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton * limitations under the License.
1519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton */
1619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
1719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonpackage androidx.webkit.internal.codegen;
1819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
1919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport static org.junit.Assert.assertEquals;
2019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
21281fe3f80128f029fa5c9eacdf53ac177a35f241Aurimas Liutikasimport androidx.webkit.internal.codegen.representations.ClassRepr;
22281fe3f80128f029fa5c9eacdf53ac177a35f241Aurimas Liutikasimport androidx.webkit.internal.codegen.representations.MethodRepr;
23281fe3f80128f029fa5c9eacdf53ac177a35f241Aurimas Liutikas
2419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport com.android.tools.lint.LintCoreProjectEnvironment;
2519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
2619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport com.intellij.psi.PsiClass;
2719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport com.intellij.psi.PsiFile;
2819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport com.intellij.psi.PsiJavaFile;
2919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport com.squareup.javapoet.JavaFile;
3019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
3119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport org.junit.After;
3219536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport org.junit.Before;
33281fe3f80128f029fa5c9eacdf53ac177a35f241Aurimas Liutikasimport org.junit.Ignore;
3419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport org.junit.Test;
3519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport org.junit.runner.RunWith;
3619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport org.junit.runners.JUnit4;
3719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
3819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonimport java.util.Arrays;
3919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
4019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton@RunWith(JUnit4.class)
4119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Senntonpublic class BoundaryInterfaceTest {
4219536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    private LintCoreProjectEnvironment mProjectEnv;
4319536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
4419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    @Before
4519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    public void setUp() throws Exception {
4619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        mProjectEnv = PsiProjectSetup.sProjectEnvironment;
4719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        // Add files required to resolve dependencies in the tests in this class. This is needed for
4819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        // example to identify a class as being an android.webkit class (and turn it into an
4919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        // InvocationHandler).
5019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        mProjectEnv.registerPaths(Arrays.asList(TestUtils.getTestDepsDir()));
5119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    }
5219536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
5319536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    @After
5419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    public void tearDown() throws Exception {
5519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    }
5619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
5719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    @Test
5819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    public void testSingleClassAndMethod() {
5919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        testBoundaryInterfaceGeneration("SingleClassAndMethod");
6019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    }
6119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
62281fe3f80128f029fa5c9eacdf53ac177a35f241Aurimas Liutikas    @Ignore
6319536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    @Test public void testWebkitReturnTypeGeneratesInvocationHandler() {
6419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        testBoundaryInterfaceGeneration("WebKitTypeAsMethodParameter");
6519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    }
6619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
67281fe3f80128f029fa5c9eacdf53ac177a35f241Aurimas Liutikas    @Ignore
6819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    @Test public void testWebkitMethodParameterTypeGeneratesInvocationHandler() {
6919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        testBoundaryInterfaceGeneration("WebKitTypeAsMethodReturn");
7019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    }
7119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
7219536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    /**
7319536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton     * Ensures methods are filtered correctly so only explicitly added methods are added to the
7419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton     * boundary interface.
7519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton     */
7619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    @Test public void testFilterMethods() {
7719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        PsiFile inputFile =
7819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton                TestUtils.getTestFile(mProjectEnv.getProject(), "FilterMethods");
7919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        PsiClass psiClass = TestUtils.getSingleClassFromFile(inputFile);
8019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        MethodRepr method2 =
8119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton                MethodRepr.fromPsiMethod(psiClass.findMethodsByName("method2", false)[0]);
8219536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        ClassRepr classRepr = new ClassRepr(Arrays.asList(method2), psiClass);
8319536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        JavaFile actualBoundaryInterface = BoundaryGeneration.createBoundaryInterface(classRepr);
8419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        assertBoundaryInterfaceCorrect(psiClass.getName(), actualBoundaryInterface);
8519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    }
8619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
8719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    // TODO(gsennton) add test case including a (static) inner class which should create a
8819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    // separate boundary interface file.
8919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
9019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    /**
9119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton     * Generates a boundary interface from the test-file with name {@param className}.java, and
9219536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton     * compares the result to the test-file {@param className}BoundaryInterface.java.
9319536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton     */
9419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    private void testBoundaryInterfaceGeneration(String className) {
9519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        PsiFile inputFile = TestUtils.getTestFile(mProjectEnv.getProject(), className);
9619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        ClassRepr classRepr = ClassRepr.fromPsiClass(TestUtils.getSingleClassFromFile(inputFile));
9719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
9819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        JavaFile actualBoundaryInterface = BoundaryGeneration.createBoundaryInterface(classRepr);
9919536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        assertBoundaryInterfaceCorrect(className, actualBoundaryInterface);
10019536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    }
10119536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton
10219536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    private void assertBoundaryInterfaceCorrect(String className,
10319536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton            JavaFile actualBoundaryInterface) {
10419536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        PsiJavaFile expectedBoundaryFile = TestUtils.getExpectedTestFile(mProjectEnv.getProject(),
10519536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton                className + "BoundaryInterface");
10619536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton        assertEquals(expectedBoundaryFile.getText(), actualBoundaryInterface.toString());
10719536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton    }
10819536e8c7f6b4c6ca8baca5429358a723a8a832aGustav Sennton}
109