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