aswb/querysync/javatests/com/google/idea/blaze/qsync/PartialProjectRefreshTest.kt (225 lines of code) (raw):

/* * Copyright 2023 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.qsync import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableSet import com.google.common.truth.Truth import com.google.common.truth.Truth8 import com.google.idea.blaze.common.Label import com.google.idea.blaze.qsync.project.PostQuerySyncData import com.google.idea.blaze.qsync.query.Query import com.google.idea.blaze.qsync.query.QueryData import com.google.idea.blaze.qsync.query.QuerySummary import com.google.idea.blaze.qsync.query.QuerySummaryImpl import java.nio.file.Path import java.util.Optional import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 @RunWith(JUnit4::class) class PartialProjectRefreshTest { @Test fun testApplyDelta_replacePackage() { val base = QuerySummaryImpl.newBuilder() .putRules( QueryData.Rule.createForTests(label = Label.of("//my/build/package1:rule")).copy( ruleClass = "java_library", sources = listOf(Label.of("//my/build/package1:Class1.java")) ) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package1:Class1.java"), listOf()) ) .putSourceFiles( QueryData.SourceFile( Label.of("//my/build/package1:subpackage/AnotherClass.java"), listOf() ) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package1:BUILD"), listOf()) ) .putRules( QueryData.Rule.createForTests(label = Label.of("//my/build/package2:rule")).copy( ruleClass = "java_library", sources = listOf(Label.of("//my/build/package2:Class2.java")) ) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package2:Class2.java"), listOf()) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package2:BUILD"), listOf()) ) .build() val baseProject = PostQuerySyncData.EMPTY.toBuilder().setQuerySummary(base).build() val delta = QuerySummaryImpl.newBuilder() .putRules( QueryData.Rule.createForTests(label = Label.of("//my/build/package1:newrule")).copy( ruleClass = "java_library", sources = listOf(Label.of("//my/build/package1:NewClass.java")) ) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package1:NewClass.java"), listOf()) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package1:BUILD"), listOf()) ) .build() val queryStrategy = PartialProjectRefresh( Path.of("/workspace/root"), baseProject, QuerySyncTestUtils.CLEAN_VCS_STATE, Optional.empty(), /* modifiedPackages= */ ImmutableSet.of(Path.of("my/build/package1")), ImmutableSet.of() ) val applied = queryStrategy.applyDelta(delta) Truth.assertThat(applied.rulesMap.keys) .containsExactly( Label.of("//my/build/package1:newrule"), Label.of("//my/build/package2:rule") ) Truth.assertThat(applied.sourceFilesMap.keys) .containsExactly( Label.of("//my/build/package1:NewClass.java"), Label.of("//my/build/package1:BUILD"), Label.of("//my/build/package2:Class2.java"), Label.of("//my/build/package2:BUILD") ) } @Test fun testApplyDelta_deletePackage() { val base = QuerySummaryImpl.newBuilder() .putRules( QueryData.Rule.createForTests(label = Label.of("//my/build/package1:rule")).copy( ruleClass = "java_library", sources = listOf(Label.of("//my/build/package1:Class1.java")) ) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package1:Class1.java"), listOf()) ) .putSourceFiles( QueryData.SourceFile( Label.of("//my/build/package1:subpackage/AnotherClass.java"), listOf() ) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package1:BUILD"), listOf()) ) .putRules( QueryData.Rule.createForTests(label = Label.of("//my/build/package2:rule")).copy( ruleClass = "java_library", sources = listOf(Label.of("//my/build/package2:Class2.java")) ) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package2:Class2.java"), listOf()) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package2:BUILD"), listOf()) ) .build() val baseProject = PostQuerySyncData.EMPTY.toBuilder().setQuerySummary(base).build() val queryStrategy = PartialProjectRefresh( Path.of("/workspace/root"), baseProject, QuerySyncTestUtils.CLEAN_VCS_STATE, Optional.empty(), ImmutableSet.of(), /* deletedPackages= */ ImmutableSet.of(Path.of("my/build/package1")) ) Truth8.assertThat(queryStrategy.getQuerySpec()).isEmpty() val applied = queryStrategy.applyDelta(QuerySummary.EMPTY) Truth.assertThat(applied.rulesMap.keys) .containsExactly(Label.of("//my/build/package2:rule")) Truth.assertThat(applied.sourceFilesMap.keys) .containsExactly( Label.of("//my/build/package2:Class2.java"), Label.of("//my/build/package2:BUILD") ) } @Test fun testDelta_addPackage() { val base = QuerySummaryImpl.newBuilder() .putRules( QueryData.Rule.createForTests(label = Label.of("//my/build/package1:rule")).copy( ruleClass = "java_library", sources = listOf(Label.of("//my/build/package1:Class1.java")) ) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package1:Class1.java"), listOf()) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package1:BUILD"), listOf()) ) .build() val baseProject = PostQuerySyncData.EMPTY.toBuilder().setQuerySummary(base).build() val delta = QuerySummaryImpl.newBuilder() .putRules( QueryData.Rule.createForTests(label = Label.of("//my/build/package2:rule")).copy( ruleClass = "java_library", sources = listOf(Label.of("//my/build/package2:Class2.java")) ) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package2:Class2.java"), listOf()) ) .putSourceFiles( QueryData.SourceFile(Label.of("//my/build/package2:BUILD"), listOf()) ) .build() val queryStrategy = PartialProjectRefresh( Path.of("/workspace/root"), baseProject, QuerySyncTestUtils.CLEAN_VCS_STATE, Optional.empty(), /* modifiedPackages= */ ImmutableSet.of(Path.of("my/build/package2")), ImmutableSet.of() ) val applied = queryStrategy.applyDelta(delta) Truth.assertThat(applied.rulesMap.keys) .containsExactly( Label.of("//my/build/package1:rule"), Label.of("//my/build/package2:rule") ) Truth.assertThat(applied.sourceFilesMap.keys) .containsExactly( Label.of("//my/build/package1:Class1.java"), Label.of("//my/build/package1:BUILD"), Label.of("//my/build/package2:Class2.java"), Label.of("//my/build/package2:BUILD") ) } @Test fun testDelta_packagesWithErrors() { val base = QuerySummaryImpl.create( Query.Summary.newBuilder().addPackagesWithErrors("//my/build/package:BUILD").build() ) val baseProject = PostQuerySyncData.EMPTY.toBuilder().setQuerySummary(base).build() val delta = QuerySummaryImpl.create( Query.Summary.newBuilder().addPackagesWithErrors("//my/build/package:BUILD").build() ) val queryStrategy = PartialProjectRefresh( Path.of("/workspace/root"), baseProject, QuerySyncTestUtils.CLEAN_VCS_STATE, Optional.empty(), /* modifiedPackages= */ ImmutableSet.of(Path.of("my/build/package")), ImmutableSet.of() ) val applied = queryStrategy.applyDelta(delta) Truth.assertThat(applied.packagesWithErrors).containsExactly(Path.of("my/build/package")) } private fun <T> listOf(vararg list: T): ImmutableList<T> = ImmutableList.copyOf(list) }