/* * Copyright (C) 2015 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.ide.common.repository; import static com.android.SdkConstants.FN_PUBLIC_TXT; import static com.android.SdkConstants.FN_RESOURCE_TEXT; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import com.android.builder.model.AndroidArtifact; import com.android.builder.model.AndroidLibrary; import com.android.builder.model.AndroidProject; import com.android.builder.model.Dependencies; import com.android.builder.model.Variant; import com.android.ide.common.resources.ResourceUrl; import com.android.resources.ResourceType; import com.android.testutils.TestUtils; import com.google.common.base.Charsets; import com.google.common.io.Files; import junit.framework.TestCase; import org.easymock.IExpectationSetters; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.List; public class ResourceVisibilityLookupTest extends TestCase { public void test() throws IOException { AndroidLibrary library = createMockLibrary( "" + "int dimen activity_horizontal_margin 0x7f030000\n" + "int dimen activity_vertical_margin 0x7f030001\n" + "int id action_settings 0x7f060000\n" + "int layout activity_main 0x7f020000\n" + "int menu menu_main 0x7f050000\n" + "int string action_settings 0x7f040000\n" + "int string app_name 0x7f040001\n" + "int string hello_world 0x7f040002", "" + "" + "dimen activity_vertical\n" + "id action_settings\n" + "layout activity_main\n" ); ResourceVisibilityLookup visibility = ResourceVisibilityLookup.create(library); assertTrue(visibility.isPrivate(ResourceType.DIMEN, "activity_horizontal_margin")); assertFalse(visibility.isPrivate(ResourceType.ID, "action_settings")); assertFalse(visibility.isPrivate(ResourceType.LAYOUT, "activity_main")); //noinspection ConstantConditions assertTrue(visibility.isPrivate(ResourceUrl.parse("@dimen/activity_horizontal_margin"))); assertFalse(visibility.isPrivate(ResourceType.DIMEN, "activity_vertical")); // public assertFalse(visibility.isPrivate(ResourceType.DIMEN, "unknown")); // not in this library } public void testModelVersions() throws IOException { AndroidLibrary library = createMockLibrary( "" + "int dimen activity_horizontal_margin 0x7f030000\n" + "int dimen activity_vertical_margin 0x7f030001\n" + "int id action_settings 0x7f060000\n" + "int layout activity_main 0x7f020000\n" + "int menu menu_main 0x7f050000\n" + "int string action_settings 0x7f040000\n" + "int string app_name 0x7f040001\n" + "int string hello_world 0x7f040002", "" + "" + "dimen activity_vertical\n" + "id action_settings\n" + "layout activity_main\n" ); AndroidArtifact mockArtifact = createMockArtifact(Collections.singletonList(library)); Variant variant = createMockVariant(mockArtifact); AndroidProject project; project = createMockProject("1.0.1", 0); assertTrue(new ResourceVisibilityLookup.Provider().get(project, variant).isEmpty()); project = createMockProject("1.1", 0); assertTrue(new ResourceVisibilityLookup.Provider().get(project, variant).isEmpty()); project = createMockProject("1.2", 2); assertTrue(new ResourceVisibilityLookup.Provider().get(project, variant).isEmpty()); project = createMockProject("1.3.0", 3); assertFalse(new ResourceVisibilityLookup.Provider().get(project, variant).isEmpty()); project = createMockProject("2.5", 45); assertFalse(new ResourceVisibilityLookup.Provider().get(project, variant).isEmpty()); ResourceVisibilityLookup visibility =new ResourceVisibilityLookup.Provider().get(project, variant); assertTrue(visibility.isPrivate(ResourceType.DIMEN, "activity_horizontal_margin")); assertFalse(visibility.isPrivate(ResourceType.ID, "action_settings")); } public void testAllPrivate() throws IOException { AndroidLibrary library = createMockLibrary( "" + "int dimen activity_horizontal_margin 0x7f030000\n" + "int dimen activity_vertical_margin 0x7f030001\n" + "int id action_settings 0x7f060000\n" + "int layout activity_main 0x7f020000\n" + "int menu menu_main 0x7f050000\n" + "int string action_settings 0x7f040000\n" + "int string app_name 0x7f040001\n" + "int string hello_world 0x7f040002", "" ); ResourceVisibilityLookup visibility = ResourceVisibilityLookup.create(library); assertTrue(visibility.isPrivate(ResourceType.DIMEN, "activity_horizontal_margin")); assertTrue(visibility.isPrivate(ResourceType.ID, "action_settings")); assertTrue(visibility.isPrivate(ResourceType.LAYOUT, "activity_main")); assertTrue(visibility.isPrivate(ResourceType.DIMEN, "activity_vertical_margin")); assertFalse(visibility.isPrivate(ResourceType.DIMEN, "unknown")); // not in this library } public void testNotDeclared() throws IOException { AndroidLibrary library = createMockLibrary("", null); ResourceVisibilityLookup visibility = ResourceVisibilityLookup.create(library); assertFalse(visibility.isPrivate(ResourceType.DIMEN, "activity_horizontal_margin")); assertFalse(visibility.isPrivate(ResourceType.ID, "action_settings")); assertFalse(visibility.isPrivate(ResourceType.LAYOUT, "activity_main")); assertFalse(visibility.isPrivate(ResourceType.DIMEN, "activity_vertical")); assertFalse(visibility.isPrivate(ResourceType.DIMEN, "unknown")); // not in this library } public void testCombined() throws IOException { AndroidLibrary library1 = createMockLibrary( "" + "int dimen activity_horizontal_margin 0x7f030000\n" + "int dimen activity_vertical_margin 0x7f030001\n" + "int id action_settings 0x7f060000\n" + "int layout activity_main 0x7f020000\n" + "int menu menu_main 0x7f050000\n" + "int string action_settings 0x7f040000\n" + "int string app_name 0x7f040001\n" + "int string hello_world 0x7f040002", "" ); AndroidLibrary library2 = createMockLibrary( "" + "int layout foo 0x7f030001\n" + "int layout bar 0x7f060000\n", "" + "layout foo\n" ); List<AndroidLibrary> androidLibraries = Arrays.asList(library1, library2); ResourceVisibilityLookup visibility = ResourceVisibilityLookup .create(androidLibraries, null); assertTrue(visibility.isPrivate(ResourceType.DIMEN, "activity_horizontal_margin")); assertTrue(visibility.isPrivate(ResourceType.ID, "action_settings")); assertTrue(visibility.isPrivate(ResourceType.LAYOUT, "activity_main")); assertTrue(visibility.isPrivate(ResourceType.DIMEN, "activity_vertical_margin")); assertFalse(visibility.isPrivate(ResourceType.LAYOUT, "foo")); assertTrue(visibility.isPrivate(ResourceType.LAYOUT, "bar")); assertFalse(visibility.isPrivate(ResourceType.DIMEN, "unknown")); // not in this library } public void testDependency() throws IOException { AndroidLibrary library1 = createMockLibrary( "" + "int dimen activity_horizontal_margin 0x7f030000\n" + "int dimen activity_vertical_margin 0x7f030001\n" + "int id action_settings 0x7f060000\n" + "int layout activity_main 0x7f020000\n" + "int menu menu_main 0x7f050000\n" + "int string action_settings 0x7f040000\n" + "int string app_name 0x7f040001\n" + "int string hello_world 0x7f040002", "" ); AndroidLibrary library2 = createMockLibrary( "" + "int layout foo 0x7f030001\n" + "int layout bar 0x7f060000\n", "" + "layout foo\n", Collections.singletonList(library1) ); List<AndroidLibrary> androidLibraries = Arrays.asList(library1, library2); ResourceVisibilityLookup visibility = ResourceVisibilityLookup .create(androidLibraries, null); assertTrue(visibility.isPrivate(ResourceType.DIMEN, "activity_horizontal_margin")); assertTrue(visibility.isPrivate(ResourceType.ID, "action_settings")); assertTrue(visibility.isPrivate(ResourceType.LAYOUT, "activity_main")); assertTrue(visibility.isPrivate(ResourceType.DIMEN, "activity_vertical_margin")); assertFalse(visibility.isPrivate(ResourceType.LAYOUT, "foo")); assertTrue(visibility.isPrivate(ResourceType.LAYOUT, "bar")); assertFalse(visibility.isPrivate(ResourceType.DIMEN, "unknown")); // not in this library } public void testManager() throws IOException { AndroidLibrary library = createMockLibrary( "" + "int dimen activity_horizontal_margin 0x7f030000\n" + "int dimen activity_vertical_margin 0x7f030001\n" + "int id action_settings 0x7f060000\n" + "int layout activity_main 0x7f020000\n" + "int menu menu_main 0x7f050000\n" + "int string action_settings 0x7f040000\n" + "int string app_name 0x7f040001\n" + "int string hello_world 0x7f040002", "" ); ResourceVisibilityLookup.Provider provider = new ResourceVisibilityLookup.Provider(); assertSame(provider.get(library), provider.get(library)); assertTrue(provider.get(library).isPrivate(ResourceType.DIMEN, "activity_horizontal_margin")); AndroidArtifact artifact = createMockArtifact(Collections.singletonList(library)); assertSame(provider.get(artifact), provider.get(artifact)); assertTrue(provider.get(artifact).isPrivate(ResourceType.DIMEN, "activity_horizontal_margin")); } public static AndroidProject createMockProject(String modelVersion, int apiVersion) { AndroidProject project = createNiceMock(AndroidProject.class); expect(project.getApiVersion()).andReturn(apiVersion).anyTimes(); expect(project.getModelVersion()).andReturn(modelVersion).anyTimes(); replay(project); return project; } public static Variant createMockVariant(AndroidArtifact artifact) { Variant variant = createNiceMock(Variant.class); expect(variant.getMainArtifact()).andReturn(artifact).anyTimes(); replay(variant); return variant; } public static AndroidArtifact createMockArtifact(List<AndroidLibrary> libraries) { Dependencies dependencies = createNiceMock(Dependencies.class); expect(dependencies.getLibraries()).andReturn(libraries).anyTimes(); replay(dependencies); AndroidArtifact artifact = createNiceMock(AndroidArtifact.class); expect(artifact.getDependencies()).andReturn(dependencies).anyTimes(); replay(artifact); return artifact; } public static AndroidLibrary createMockLibrary(String allResources, String publicResources) throws IOException { return createMockLibrary(allResources, publicResources, Collections.<AndroidLibrary>emptyList()); } public static AndroidLibrary createMockLibrary(String allResources, String publicResources, List<AndroidLibrary> dependencies) throws IOException { final File tempDir = TestUtils.createTempDirDeletedOnExit(); Files.write(allResources, new File(tempDir, FN_RESOURCE_TEXT), Charsets.UTF_8); File publicTxtFile = new File(tempDir, FN_PUBLIC_TXT); if (publicResources != null) { Files.write(publicResources, publicTxtFile, Charsets.UTF_8); } AndroidLibrary library = createNiceMock(AndroidLibrary.class); expect(library.getPublicResources()).andReturn(publicTxtFile).anyTimes(); // Work around wildcard capture //expect(mock.getLibraryDependencies()).andReturn(dependencies).anyTimes(); IExpectationSetters setter = expect(library.getLibraryDependencies()); //noinspection unchecked setter.andReturn(dependencies); setter.anyTimes(); replay(library); return library; } }