blob: 4432472a6c417baac26530f5735fb57240bf1004 [file] [log] [blame]
/*
* 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;
}
}
}