| /* |
| * Copyright 2016 The Bazel Authors. All rights reserved. |
| * |
| * 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.google.idea.blaze.android.sync.model.idea; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| import static org.mockito.Mockito.mock; |
| import static org.mockito.Mockito.when; |
| |
| import com.android.builder.model.SourceProvider; |
| import com.google.common.collect.ImmutableCollection; |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.ImmutableMap; |
| import com.google.idea.blaze.base.BlazeTestCase; |
| import com.google.idea.blaze.base.actions.BlazeBuildService; |
| import com.google.idea.blaze.base.projectview.ProjectViewManager; |
| import com.google.idea.blaze.base.projectview.ProjectViewSet; |
| import com.google.idea.blaze.base.scope.BlazeContext; |
| import com.google.idea.blaze.base.settings.Blaze.BuildSystem; |
| import com.google.idea.blaze.base.settings.BlazeImportSettings; |
| import com.google.idea.blaze.base.settings.BlazeImportSettingsManager; |
| import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager; |
| import com.google.idea.blaze.base.sync.data.BlazeProjectDataManagerImpl; |
| import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver; |
| import com.google.idea.sdkcompat.android.model.AndroidModelAdapter; |
| import com.intellij.mock.MockFileDocumentManagerImpl; |
| import com.intellij.mock.MockModule; |
| import com.intellij.mock.MockPsiManager; |
| import com.intellij.mock.MockVirtualFile; |
| import com.intellij.openapi.fileEditor.FileDocumentManager; |
| import com.intellij.openapi.fileTypes.FileTypeManager; |
| import com.intellij.openapi.fileTypes.MockFileTypeManager; |
| import com.intellij.openapi.module.Module; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.vfs.JarFileSystem; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import com.intellij.openapi.vfs.VirtualFileManager; |
| import com.intellij.openapi.vfs.VirtualFileSystem; |
| import com.intellij.psi.JavaPsiFacade; |
| import com.intellij.psi.PsiClass; |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.PsiManager; |
| import com.intellij.psi.impl.JavaPsiFacadeImpl; |
| import com.intellij.psi.search.GlobalSearchScope; |
| import com.intellij.psi.search.ProjectScopeBuilder; |
| import com.intellij.psi.search.ProjectScopeBuilderImpl; |
| import javax.annotation.Nullable; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| /** Test cases for {@link BlazeAndroidModel}. */ |
| @RunWith(JUnit4.class) |
| public class BlazeAndroidModelTest extends BlazeTestCase { |
| private Module module; |
| private AndroidModelAdapter model; |
| private MockJavaPsiFacade facade; |
| |
| @Override |
| protected void initTest(Container applicationServices, Container projectServices) { |
| applicationServices.register(FileTypeManager.class, new MockFileTypeManager()); |
| applicationServices.register( |
| FileDocumentManager.class, new MockFileDocumentManagerImpl(null, null)); |
| applicationServices.register(VirtualFileManager.class, mock(VirtualFileManager.class)); |
| applicationServices.register(BlazeBuildService.class, new BlazeBuildService()); |
| projectServices.register(ProjectScopeBuilder.class, new ProjectScopeBuilderImpl(project)); |
| projectServices.register(ProjectViewManager.class, new MockProjectViewManager()); |
| projectServices.register( |
| BlazeProjectDataManager.class, new BlazeProjectDataManagerImpl(project)); |
| |
| BlazeImportSettingsManager manager = new BlazeImportSettingsManager(); |
| manager.setImportSettings(new BlazeImportSettings("", "", "", "", BuildSystem.Blaze)); |
| projectServices.register(BlazeImportSettingsManager.class, manager); |
| |
| facade = |
| new MockJavaPsiFacade( |
| project, |
| new MockPsiManager(project), |
| ImmutableList.of("com.google.example.Modified", "com.google.example.NotModified")); |
| |
| projectServices.register(JavaPsiFacade.class, facade); |
| module = new MockModule(() -> {}); |
| model = new BlazeAndroidModel(project, module, null, mock(SourceProvider.class), null, "", 0); |
| } |
| |
| @Test |
| public void testIsClassFileOutOfDate() { |
| VirtualFile modifiedJarFile = |
| new MockJarVirtualFile( |
| "/build/com/google/example/libmodified.jar", |
| facade.getTimestamp("com.google.example.Modified") - 100); |
| VirtualFile notModifiedJarFile = |
| new MockJarVirtualFile( |
| "/build/com/google/example/libnotmodified.jar", |
| facade.getTimestamp("com.google.example.NotModified") + 100); |
| VirtualFile modifiedClassFile = |
| new MockClassVirtualFile( |
| "/build/com/google/example/libmodified.jar!/com/google/example/Modified.class", |
| modifiedJarFile); |
| VirtualFile notModifiedClassFile = |
| new MockClassVirtualFile( |
| "/build/com/google/example/libnotmodified.jar!/com/google/example/NotModified.class", |
| notModifiedJarFile); |
| assertThat(model.isClassFileOutOfDate(module, "com.google.example.Modified", modifiedClassFile)) |
| .isTrue(); |
| assertThat( |
| model.isClassFileOutOfDate( |
| module, "com.google.example.NotModified", notModifiedClassFile)) |
| .isFalse(); |
| |
| BlazeBuildService.getInstance().buildProject(project); |
| assertThat(model.isClassFileOutOfDate(module, "com.google.example.Modified", modifiedClassFile)) |
| .isFalse(); |
| assertThat( |
| model.isClassFileOutOfDate( |
| module, "com.google.example.NotModified", notModifiedClassFile)) |
| .isFalse(); |
| } |
| |
| private static class MockJavaPsiFacade extends JavaPsiFacadeImpl { |
| private ImmutableMap<String, PsiClass> classes; |
| private ImmutableMap<String, Long> timestamps; |
| |
| MockJavaPsiFacade( |
| Project project, PsiManager psiManager, ImmutableCollection<String> classNames) { |
| super(project, psiManager, null, null); |
| ImmutableMap.Builder<String, PsiClass> classesBuilder = ImmutableMap.builder(); |
| ImmutableMap.Builder<String, Long> timestampsBuilder = ImmutableMap.builder(); |
| for (String className : classNames) { |
| VirtualFile virtualFile = |
| new MockVirtualFile("/src/" + className.replace('.', '/') + ".java"); |
| PsiFile psiFile = mock(PsiFile.class); |
| when(psiFile.getVirtualFile()).thenReturn(virtualFile); |
| PsiClass psiClass = mock(PsiClass.class); |
| when(psiClass.getContainingFile()).thenReturn(psiFile); |
| classesBuilder.put(className, psiClass); |
| timestampsBuilder.put(className, virtualFile.getTimeStamp()); |
| } |
| classes = classesBuilder.build(); |
| timestamps = timestampsBuilder.build(); |
| } |
| |
| @Nullable |
| @Override |
| public PsiClass findClass(String qualifiedName, GlobalSearchScope scope) { |
| if (scope.equals(GlobalSearchScope.projectScope(getProject()))) { |
| return classes.get(qualifiedName); |
| } |
| return null; |
| } |
| |
| long getTimestamp(String qualifiedName) { |
| return timestamps.get(qualifiedName); |
| } |
| } |
| |
| private static class MockClassVirtualFile extends MockVirtualFile { |
| private static JarFileSystem fileSystem = mock(JarFileSystem.class); |
| |
| MockClassVirtualFile(String name, VirtualFile jar) { |
| super(name); |
| when(fileSystem.getVirtualFileForJar(this)).thenReturn(jar); |
| } |
| |
| @Override |
| public VirtualFileSystem getFileSystem() { |
| return fileSystem; |
| } |
| } |
| |
| private static class MockJarVirtualFile extends MockVirtualFile { |
| private long timestamp; |
| |
| MockJarVirtualFile(String name, long timestamp) { |
| super(name); |
| this.timestamp = timestamp; |
| } |
| |
| @Override |
| public long getTimeStamp() { |
| return timestamp; |
| } |
| } |
| |
| private static class MockProjectViewManager extends ProjectViewManager { |
| private ProjectViewSet set = new ProjectViewSet(ImmutableList.of()); |
| |
| @Nullable |
| @Override |
| public ProjectViewSet getProjectViewSet() { |
| return set; |
| } |
| |
| @Nullable |
| @Override |
| public ProjectViewSet reloadProjectView( |
| BlazeContext context, WorkspacePathResolver workspacePathResolver) { |
| return null; |
| } |
| } |
| } |