Skip to content

Commit 859326c

Browse files
committed
chore: Use a caching TestP2Provisioner in tests
1 parent 39d4fc5 commit 859326c

8 files changed

Lines changed: 161 additions & 20 deletions

lib-extra/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ dependencies {
2525

2626
// testing
2727
testImplementation projects.testlib
28+
testImplementation "com.diffplug.durian:durian-io:${VER_DURIAN}"
29+
testImplementation "com.google.code.findbugs:jsr305:${VER_JSR_305}"
2830
testImplementation "org.junit.jupiter:junit-jupiter:${VER_JUNIT}"
2931
testImplementation "org.assertj:assertj-core:${VER_ASSERTJ}"
3032
testImplementation "com.diffplug.durian:durian-testlib:${VER_DURIAN}"
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/*
2+
* Copyright 2016-2026 DiffPlug
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.diffplug.spotless;
17+
18+
import java.io.File;
19+
import java.io.IOException;
20+
import java.io.ObjectInputStream;
21+
import java.io.ObjectOutputStream;
22+
import java.io.Serializable;
23+
import java.util.HashMap;
24+
import java.util.List;
25+
import java.util.Map;
26+
import java.util.Objects;
27+
import java.util.Set;
28+
import java.util.function.Supplier;
29+
30+
import javax.annotation.Nullable;
31+
32+
import com.diffplug.common.base.Errors;
33+
import com.diffplug.common.base.StandardSystemProperty;
34+
import com.diffplug.common.base.Suppliers;
35+
import com.diffplug.common.collect.ImmutableList;
36+
import com.diffplug.common.io.Files;
37+
import com.diffplug.spotless.extra.P2Provisioner;
38+
39+
public class TestP2Provisioner {
40+
/** Creates a P2Provisioner which will cache the result of previous calls. */
41+
@SuppressWarnings("unchecked")
42+
private static P2Provisioner caching(String name, Supplier<P2Provisioner> input) {
43+
File spotlessDir = new File(StandardSystemProperty.USER_DIR.value()).getParentFile();
44+
File testlib = new File(spotlessDir, "testlib");
45+
File cacheFile = new File(testlib, "build/tmp/testp2provisioner." + name + ".cache");
46+
47+
Map<CacheKey, ImmutableList<File>> cached;
48+
if (cacheFile.exists()) {
49+
try (ObjectInputStream inputStream = new ObjectInputStream(Files.asByteSource(cacheFile).openBufferedStream())) {
50+
cached = (Map<CacheKey, ImmutableList<File>>) inputStream.readObject();
51+
} catch (IOException | ClassNotFoundException e) {
52+
throw Errors.asRuntime(e);
53+
}
54+
} else {
55+
cached = new HashMap<>();
56+
try {
57+
Files.createParentDirs(cacheFile);
58+
} catch (IOException e) {
59+
throw Errors.asRuntime(e);
60+
}
61+
}
62+
return (modelWrapper, mavenProvisioner, cacheDirectory) -> {
63+
CacheKey key = new CacheKey(
64+
List.copyOf(modelWrapper.getP2Repos()),
65+
List.copyOf(modelWrapper.getInstallList()),
66+
Set.copyOf(modelWrapper.getFilterNames()),
67+
List.copyOf(modelWrapper.getPureMaven()),
68+
modelWrapper.isUseMavenCentral(),
69+
cacheDirectory);
70+
71+
synchronized (TestP2Provisioner.class) {
72+
ImmutableList<File> result = cached.get(key);
73+
// double-check that depcache pruning hasn't removed them since our cache cached them
74+
boolean needsToBeSet = result == null || !result.stream().allMatch(file -> file.exists() && file.isFile() && file.length() > 0);
75+
if (needsToBeSet) {
76+
result = ImmutableList.copyOf(input.get().provisionP2Dependencies(modelWrapper, mavenProvisioner, cacheDirectory));
77+
cached.put(key, result);
78+
try (ObjectOutputStream outputStream = new ObjectOutputStream(Files.asByteSink(cacheFile).openBufferedStream())) {
79+
outputStream.writeObject(cached);
80+
} catch (IOException e) {
81+
throw Errors.asRuntime(e);
82+
}
83+
}
84+
return result;
85+
}
86+
};
87+
}
88+
89+
/** Creates a default P2Provisioner with caching for tests. */
90+
public static P2Provisioner defaultProvisioner() {
91+
return DEFAULT_PROVISIONER.get();
92+
}
93+
94+
private static final Supplier<P2Provisioner> DEFAULT_PROVISIONER = Suppliers.memoize(() -> caching("default", P2Provisioner::createDefault));
95+
96+
/**
97+
* Cache key capturing all P2Model state that affects query results.
98+
* Must be Serializable for disk caching.
99+
*/
100+
private static class CacheKey implements Serializable {
101+
private static final long serialVersionUID = 1L;
102+
private final List<String> p2Repos;
103+
private final List<String> installList;
104+
private final Set<String> filterNames;
105+
private final List<String> pureMaven;
106+
private final boolean useMavenCentral;
107+
@Nullable private final File cacheDirectory;
108+
109+
CacheKey(List<String> p2Repos, List<String> installList, Set<String> filterNames,
110+
List<String> pureMaven, boolean useMavenCentral, @Nullable File cacheDirectory) {
111+
this.p2Repos = p2Repos;
112+
this.installList = installList;
113+
this.filterNames = filterNames;
114+
this.pureMaven = pureMaven;
115+
this.useMavenCentral = useMavenCentral;
116+
this.cacheDirectory = cacheDirectory;
117+
}
118+
119+
@Override
120+
public boolean equals(Object o) {
121+
if (this == o)
122+
return true;
123+
if (o == null || getClass() != o.getClass())
124+
return false;
125+
CacheKey cacheKey = (CacheKey) o;
126+
return useMavenCentral == cacheKey.useMavenCentral &&
127+
Objects.equals(p2Repos, cacheKey.p2Repos) &&
128+
Objects.equals(installList, cacheKey.installList) &&
129+
Objects.equals(filterNames, cacheKey.filterNames) &&
130+
Objects.equals(pureMaven, cacheKey.pureMaven) &&
131+
Objects.equals(cacheDirectory, cacheKey.cacheDirectory);
132+
}
133+
134+
@Override
135+
public int hashCode() {
136+
return Objects.hash(p2Repos, installList, filterNames, pureMaven, useMavenCentral, cacheDirectory);
137+
}
138+
}
139+
}

lib-extra/src/test/java/com/diffplug/spotless/extra/cpp/EclipseCdtFormatterStepTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
import org.junit.jupiter.params.ParameterizedTest;
2121
import org.junit.jupiter.params.provider.MethodSource;
2222

23+
import com.diffplug.spotless.TestP2Provisioner;
2324
import com.diffplug.spotless.TestProvisioner;
24-
import com.diffplug.spotless.extra.P2Provisioner;
2525
import com.diffplug.spotless.extra.eclipse.EquoResourceHarness;
2626

2727
class EclipseCdtFormatterStepTest extends EquoResourceHarness {
2828
public EclipseCdtFormatterStepTest() {
29-
super(EclipseCdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault()));
29+
super(EclipseCdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner()));
3030
}
3131

3232
@ParameterizedTest

lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepSpecialCaseTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
import org.junit.jupiter.api.Test;
2020

2121
import com.diffplug.spotless.StepHarness;
22+
import com.diffplug.spotless.TestP2Provisioner;
2223
import com.diffplug.spotless.TestProvisioner;
23-
import com.diffplug.spotless.extra.P2Provisioner;
2424

2525
public class GrEclipseFormatterStepSpecialCaseTest {
2626
/**
@@ -31,13 +31,13 @@ public class GrEclipseFormatterStepSpecialCaseTest {
3131
*/
3232
@Test
3333
public void issue_1657() {
34-
Assertions.assertThrows(RuntimeException.class, () -> StepHarness.forStep(GrEclipseFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault()).build())
34+
Assertions.assertThrows(RuntimeException.class, () -> StepHarness.forStep(GrEclipseFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner()).build())
3535
.testResourceUnaffected("groovy/greclipse/format/SomeClass.test"));
3636
}
3737

3838
@Test
3939
public void issue_1657_fixed() {
40-
StepHarness.forStep(GrEclipseFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault()).build())
40+
StepHarness.forStep(GrEclipseFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner()).build())
4141
.testResourceUnaffected("groovy/greclipse/format/SomeClass.fixed");
4242
}
4343
}

lib-extra/src/test/java/com/diffplug/spotless/extra/groovy/GrEclipseFormatterStepTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@
2020
import org.junit.jupiter.params.ParameterizedTest;
2121
import org.junit.jupiter.params.provider.MethodSource;
2222

23+
import com.diffplug.spotless.TestP2Provisioner;
2324
import com.diffplug.spotless.TestProvisioner;
24-
import com.diffplug.spotless.extra.P2Provisioner;
2525
import com.diffplug.spotless.extra.eclipse.EquoResourceHarness;
2626

2727
public class GrEclipseFormatterStepTest extends EquoResourceHarness {
2828
private static final String INPUT = "class F{ def m(){} }";
2929
private static final String EXPECTED = "class F{\n\tdef m(){}\n}";
3030

3131
public GrEclipseFormatterStepTest() {
32-
super(GrEclipseFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault()));
32+
super(GrEclipseFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner()));
3333
}
3434

3535
@ParameterizedTest

lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtEqualityTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828

2929
import com.diffplug.spotless.FormatterStep;
3030
import com.diffplug.spotless.ResourceHarness;
31+
import com.diffplug.spotless.TestP2Provisioner;
3132
import com.diffplug.spotless.TestProvisioner;
3233
import com.diffplug.spotless.ThrowingEx;
33-
import com.diffplug.spotless.extra.P2Provisioner;
3434

3535
public class EclipseJdtEqualityTest extends ResourceHarness {
3636
@Test
@@ -49,7 +49,7 @@ public void test() throws Exception {
4949
}
5050

5151
private static FormatterStep withSettingsFile(File settingsFile) {
52-
var builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
52+
var builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
5353
builder.setPreferences(List.of(settingsFile));
5454
return builder.build();
5555
}

lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepSpecialCaseTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,25 @@
2121
import org.junit.jupiter.api.Test;
2222

2323
import com.diffplug.spotless.StepHarness;
24+
import com.diffplug.spotless.TestP2Provisioner;
2425
import com.diffplug.spotless.TestProvisioner;
2526
import com.diffplug.spotless.extra.EquoBasedStepBuilder;
26-
import com.diffplug.spotless.extra.P2Provisioner;
2727

2828
class EclipseJdtFormatterStepSpecialCaseTest {
2929
/** https://github.com/diffplug/spotless/issues/1638 */
3030
@Test
3131
void issue_1638() {
3232
ClassLoader classLoader = getClass().getClassLoader();
3333
File file = new File(classLoader.getResource("eclipse_formatter_issue_1638.xml").getFile());
34-
EquoBasedStepBuilder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
34+
EquoBasedStepBuilder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
3535
builder.setPreferences(List.of(file));
3636
StepHarness.forStep(builder.build())
3737
.testResource("java/eclipse/AbstractType.test", "java/eclipse/AbstractType.clean");
3838
}
3939

4040
@Test
4141
void sort_members_global_by_visibility() {
42-
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
42+
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
4343
builder.sortMembersEnabled(true);
4444
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
4545
builder.sortMembersDoNotSortFields(false);
@@ -51,7 +51,7 @@ void sort_members_global_by_visibility() {
5151

5252
@Test
5353
void sort_members_global_enabled() {
54-
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
54+
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
5555
builder.sortMembersEnabled(true);
5656
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
5757
builder.sortMembersDoNotSortFields(false);
@@ -61,7 +61,7 @@ void sort_members_global_enabled() {
6161

6262
@Test
6363
void sort_members_global_no_fields() {
64-
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
64+
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
6565
builder.sortMembersEnabled(true);
6666
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
6767
builder.sortMembersDoNotSortFields(true);
@@ -71,7 +71,7 @@ void sort_members_global_no_fields() {
7171

7272
@Test
7373
void sort_members_local_by_visibility() {
74-
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
74+
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
7575
builder.sortMembersEnabled(true);
7676
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
7777
builder.sortMembersDoNotSortFields(false);
@@ -83,7 +83,7 @@ void sort_members_local_by_visibility() {
8383

8484
@Test
8585
void sort_members_local_enabled_false() {
86-
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
86+
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
8787
builder.sortMembersEnabled(true);
8888
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
8989
builder.sortMembersDoNotSortFields(false);
@@ -93,7 +93,7 @@ void sort_members_local_enabled_false() {
9393

9494
@Test
9595
void sort_members_local_no_fields() {
96-
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
96+
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
9797
builder.sortMembersEnabled(true);
9898
builder.sortMembersOrder("SF,SI,SM,F,I,C,M,T");
9999
builder.sortMembersDoNotSortFields(false);
@@ -103,7 +103,7 @@ void sort_members_local_no_fields() {
103103

104104
@Test
105105
void sort_members_local_enabled_true() {
106-
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
106+
EclipseJdtFormatterStep.Builder builder = EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
107107
StepHarness.forStep(builder.build())
108108
.testResource("java/eclipse/SortExample.localEnabledTrue.test", "java/eclipse/SortExample.localEnabledTrue.clean");
109109
}

lib-extra/src/test/java/com/diffplug/spotless/extra/java/EclipseJdtFormatterStepTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222
import org.junit.jupiter.params.ParameterizedTest;
2323
import org.junit.jupiter.params.provider.MethodSource;
2424

25+
import com.diffplug.spotless.TestP2Provisioner;
2526
import com.diffplug.spotless.TestProvisioner;
2627
import com.diffplug.spotless.extra.EquoBasedStepBuilder;
27-
import com.diffplug.spotless.extra.P2Provisioner;
2828
import com.diffplug.spotless.extra.eclipse.EquoResourceHarness;
2929

3030
class EclipseJdtFormatterStepTest extends EquoResourceHarness {
3131
private static EquoBasedStepBuilder createBuilder() {
32-
return EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), P2Provisioner.createDefault());
32+
return EclipseJdtFormatterStep.createBuilder(TestProvisioner.mavenCentral(), TestP2Provisioner.defaultProvisioner());
3333
}
3434

3535
public EclipseJdtFormatterStepTest() {

0 commit comments

Comments
 (0)