Skip to content

Commit 1b8baf3

Browse files
committed
Merge branch 'DBTOOLS-2079_speed_up_tests' into 'master'
DBTOOLS-2079 speed up tests See merge request codekeeper/pgcodekeeper-core!282
2 parents 3022539 + 5a3e7b2 commit 1b8baf3

10 files changed

Lines changed: 165 additions & 50 deletions

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@
3939
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
4040
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
4141

42-
<sonar.language>java</sonar.language>
4342
<sonar.java.binaries>${project.build.directory}/classes</sonar.java.binaries>
4443
<sonar.java.source>${java.version}</sonar.java.source>
4544
<sonar.java.target>${java.version}</sonar.java.target>
4645
<sonar.core.coveragePlugin>jacoco</sonar.core.coveragePlugin>
46+
<sonar.inclusions>**/*.java</sonar.inclusions>
4747
<sonar.exclusions>**/*.sql, **/*.xml, **/generated/**, **/Messages.java</sonar.exclusions>
4848

4949
<antlr.version>4.13.2</antlr.version>

src/test/java/org/pgcodekeeper/core/it/jdbc/base/JdbcLoaderTest.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,35 @@
3030
import java.io.IOException;
3131
import java.nio.charset.StandardCharsets;
3232
import java.sql.SQLException;
33+
import java.util.Map;
34+
import java.util.concurrent.ConcurrentHashMap;
3335

3436
public abstract class JdbcLoaderTest {
3537

3638
public static final String CLEAN_DB_SCRIPT = "clean db script";
3739

38-
protected void clearDb(IDatabase startConfDb, IJdbcConnector connector, String url,
40+
private static final Map<String, IDatabase> START_CONF_DB_CACHE = new ConcurrentHashMap<>();
41+
42+
/**
43+
* Loads the start-configuration database from {@code url} using {@code databaseProvider}, caching it on first use
44+
* and returning the cached instance on subsequent calls. The cache is keyed by {@code url}.
45+
*/
46+
protected IDatabase loadStartConfDb(IDatabaseProvider databaseProvider, String url, DiffSettings diffSettings)
47+
throws IOException, InterruptedException {
48+
var cached = START_CONF_DB_CACHE.get(url);
49+
if (cached != null) {
50+
return cached;
51+
}
52+
var startConfDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
53+
START_CONF_DB_CACHE.put(url, startConfDb);
54+
return startConfDb;
55+
}
56+
57+
protected void clearDb(IDatabase startConfDb, IDatabase currentDb, IJdbcConnector connector, String url,
3958
IDatabaseProvider databaseProvider, DiffSettings diffSettings)
4059
throws IOException, InterruptedException, SQLException {
41-
var oldDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
60+
var oldDb = currentDb != null ? currentDb
61+
: databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
4262
var dropScript = PgCodeKeeperApi.diff(databaseProvider, oldDb, startConfDb, diffSettings);
4363

4464
var loader = createDumpLoader(() -> new ByteArrayInputStream(dropScript.getBytes(StandardCharsets.UTF_8)),

src/test/java/org/pgcodekeeper/core/it/jdbc/ch/ChJdbcLoaderTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.pgcodekeeper.core.TestUtils;
2323
import org.pgcodekeeper.core.api.PgCodeKeeperApi;
2424
import org.pgcodekeeper.core.database.api.jdbc.IJdbcConnector;
25+
import org.pgcodekeeper.core.database.api.schema.IDatabase;
2526
import org.pgcodekeeper.core.database.base.jdbc.JdbcRunner;
2627
import org.pgcodekeeper.core.database.base.loader.AbstractDumpLoader;
2728
import org.pgcodekeeper.core.database.base.parser.ScriptParser;
@@ -71,20 +72,21 @@ void chJdbcLoaderTest(String fileName) throws Exception {
7172
ScriptParser parser = new ScriptParser(loader, dumpFileName, script);
7273

7374
var url = TestContainerType.CH_24.getUrl();
74-
var startConfDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
75+
var startConfDb = loadStartConfDb(databaseProvider, url, diffSettings);
7576
IJdbcConnector connector = new ChJdbcConnector(url);
77+
IDatabase remoteDb = null;
7678
try {
7779
new JdbcRunner(new NullMonitor()).runBatches(connector, parser.batch(), null);
7880

79-
var remoteDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
81+
remoteDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
8082
List<Path> ignoreLists = List.of(TestUtils.getFilePath("ch.pgcodekeeperignore", getClass()));
8183
for (var ignorePath : ignoreLists) {
8284
diffSettings.addIgnoreList(ignorePath);
8385
}
8486
var actual = PgCodeKeeperApi.diff(databaseProvider, dumpDb, remoteDb, diffSettings);
8587
Assertions.assertEquals("", actual, "Incorrect run dump %s on Database".formatted(dumpFileName));
8688
} finally {
87-
clearDb(startConfDb, connector, url, databaseProvider, diffSettings);
89+
clearDb(startConfDb, remoteDb, connector, url, databaseProvider, diffSettings);
8890
}
8991
}
9092

src/test/java/org/pgcodekeeper/core/it/jdbc/ms/MsJdbcLoaderTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.pgcodekeeper.core.TestUtils;
2323
import org.pgcodekeeper.core.api.PgCodeKeeperApi;
2424
import org.pgcodekeeper.core.database.api.jdbc.IJdbcConnector;
25+
import org.pgcodekeeper.core.database.api.schema.IDatabase;
2526
import org.pgcodekeeper.core.database.base.jdbc.JdbcRunner;
2627
import org.pgcodekeeper.core.database.base.loader.AbstractDumpLoader;
2728
import org.pgcodekeeper.core.database.base.parser.ScriptParser;
@@ -89,8 +90,9 @@ private void jdbcLoaderTest(String dumpFileName, String url, CoreSettings settin
8990
dumpFileName, diffSettings);
9091
ScriptParser parser = new ScriptParser(loader, dumpFileName, script);
9192

92-
var startConfDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
93+
var startConfDb = loadStartConfDb(databaseProvider, url, diffSettings);
9394
IJdbcConnector connector = new MsJdbcConnector(url);
95+
IDatabase remoteDb = null;
9496
try {
9597
var runner = new JdbcRunner(new NullMonitor());
9698
if (isMemoryOptimized) {
@@ -99,15 +101,15 @@ private void jdbcLoaderTest(String dumpFileName, String url, CoreSettings settin
99101
runner.runBatches(connector, parser.batch(), null);
100102
}
101103

102-
var remoteDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
104+
remoteDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
103105
List<Path> ignoreLists = List.of(TestUtils.getFilePath("ms.pgcodekeeperignore", getClass()));
104106
for (Path ignorePath : ignoreLists) {
105107
diffSettings.addIgnoreList(ignorePath);
106108
}
107109
var actual = PgCodeKeeperApi.diff(databaseProvider, dumpDb, remoteDb, diffSettings);
108110
Assertions.assertEquals("", actual, "Incorrect run dump %s on Database".formatted(dumpFileName));
109111
} finally {
110-
clearDb(startConfDb, connector, url, databaseProvider, diffSettings);
112+
clearDb(startConfDb, remoteDb, connector, url, databaseProvider, diffSettings);
111113
}
112114
}
113115

src/test/java/org/pgcodekeeper/core/it/jdbc/pg/PgGpJdbcLoaderTest.java renamed to src/test/java/org/pgcodekeeper/core/it/jdbc/pg/AbstractPgGpJdbcLoaderTest.java

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,11 @@
1616
package org.pgcodekeeper.core.it.jdbc.pg;
1717

1818
import org.junit.jupiter.api.Assertions;
19-
import org.junit.jupiter.params.ParameterizedTest;
20-
import org.junit.jupiter.params.provider.CsvSource;
2119
import org.pgcodekeeper.core.FILES_POSTFIX;
2220
import org.pgcodekeeper.core.TestUtils;
2321
import org.pgcodekeeper.core.api.PgCodeKeeperApi;
2422
import org.pgcodekeeper.core.database.api.jdbc.IJdbcConnector;
23+
import org.pgcodekeeper.core.database.api.schema.IDatabase;
2524
import org.pgcodekeeper.core.database.base.jdbc.JdbcRunner;
2625
import org.pgcodekeeper.core.database.base.loader.AbstractDumpLoader;
2726
import org.pgcodekeeper.core.database.base.parser.ScriptParser;
@@ -30,7 +29,6 @@
3029
import org.pgcodekeeper.core.database.pg.loader.PgDumpLoader;
3130
import org.pgcodekeeper.core.it.jdbc.base.JdbcLoaderTest;
3231
import org.pgcodekeeper.core.monitor.NullMonitor;
33-
import org.pgcodekeeper.core.settings.CoreSettings;
3432
import org.pgcodekeeper.core.settings.DiffSettings;
3533
import org.pgcodekeeper.core.settings.ISettings;
3634
import org.pgcodekeeper.core.utils.InputStreamProvider;
@@ -43,43 +41,10 @@
4341
import java.util.List;
4442
import java.util.Locale;
4543

46-
class PgGpJdbcLoaderTest extends JdbcLoaderTest {
44+
abstract class AbstractPgGpJdbcLoaderTest extends JdbcLoaderTest {
4745

4846
private final PgDatabaseProvider databaseProvider = new PgDatabaseProvider();
4947

50-
@ParameterizedTest
51-
@CsvSource({
52-
"dump_test, PG_16",
53-
"operator, PG_16",
54-
"statistics, PG_16",
55-
"view, PG_16",
56-
"not_null, PG_18",
57-
"dump_test, GP_6",
58-
"operator, GP_6",
59-
"view, GP_6",
60-
"dump_test, GP_7",
61-
"operator, GP_7",
62-
"statistics, GP_7",
63-
"view, GP_7",
64-
})
65-
void jdbcLoaderTest(String fileName, String contTypeName) throws Exception {
66-
var settings = new CoreSettings();
67-
settings.setEnableFunctionBodiesDependencies(true);
68-
jdbcLoaderTest(false, fileName, contTypeName, settings);
69-
}
70-
71-
@ParameterizedTest
72-
@CsvSource({
73-
"view, PG_16",
74-
"not_null, PG_18"
75-
})
76-
void jdbcLoaderSpecialTest(String fileName, String contTypeName) throws Exception {
77-
var settings = new CoreSettings();
78-
settings.setSimplifyNotNull(true);
79-
settings.setSimplifyView(true);
80-
jdbcLoaderTest(true, fileName, contTypeName, settings);
81-
}
82-
8348
protected void jdbcLoaderTest(boolean hasDiff, String fileName, String contTypeName, ISettings settings)
8449
throws Exception {
8550
var url = TestContainerType.valueOf(contTypeName).getUrl();
@@ -95,12 +60,13 @@ protected void jdbcLoaderTest(boolean hasDiff, String fileName, String contTypeN
9560
dumpFileName, diffSettings);
9661
ScriptParser parser = new ScriptParser(loader, dumpFileName, script);
9762

98-
var startConfDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
63+
var startConfDb = loadStartConfDb(databaseProvider, url, diffSettings);
9964
IJdbcConnector connector = new PgJdbcConnector(url);
65+
IDatabase remoteDb = null;
10066
try {
10167
new JdbcRunner(new NullMonitor()).runBatches(connector, parser.batch(), null);
10268

103-
var remoteDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
69+
remoteDb = databaseProvider.getJdbcLoader(url, diffSettings).loadAndAnalyze();
10470
List<Path> ignoreLists = List.of(TestUtils.getFilePath(ignoreListName, getClass()));
10571
for (var ignoreList : ignoreLists) {
10672
diffSettings.addIgnoreList(ignoreList);
@@ -117,7 +83,7 @@ protected void jdbcLoaderTest(boolean hasDiff, String fileName, String contTypeN
11783

11884
Assertions.assertEquals(expected, actual, "Incorrect run dump %s on Database".formatted(dumpFileName));
11985
} finally {
120-
clearDb(startConfDb, connector, url, databaseProvider, diffSettings);
86+
clearDb(startConfDb, remoteDb, connector, url, databaseProvider, diffSettings);
12187
}
12288
}
12389

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*******************************************************************************
2+
* Copyright 2017-2026 TAXTELECOM, LLC
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 org.pgcodekeeper.core.it.jdbc.pg;
17+
18+
import org.junit.jupiter.params.ParameterizedTest;
19+
import org.junit.jupiter.params.provider.CsvSource;
20+
import org.pgcodekeeper.core.settings.CoreSettings;
21+
22+
class Gp6JdbcLoaderTest extends AbstractPgGpJdbcLoaderTest {
23+
24+
@ParameterizedTest
25+
@CsvSource({
26+
"dump_test, GP_6",
27+
"operator, GP_6",
28+
"view, GP_6",
29+
})
30+
void jdbcLoaderTest(String fileName, String contTypeName) throws Exception {
31+
var settings = new CoreSettings();
32+
settings.setEnableFunctionBodiesDependencies(true);
33+
jdbcLoaderTest(false, fileName, contTypeName, settings);
34+
}
35+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*******************************************************************************
2+
* Copyright 2017-2026 TAXTELECOM, LLC
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 org.pgcodekeeper.core.it.jdbc.pg;
17+
18+
import org.junit.jupiter.params.ParameterizedTest;
19+
import org.junit.jupiter.params.provider.CsvSource;
20+
import org.pgcodekeeper.core.settings.CoreSettings;
21+
22+
class Gp7JdbcLoaderTest extends AbstractPgGpJdbcLoaderTest {
23+
24+
@ParameterizedTest
25+
@CsvSource({
26+
"dump_test, GP_7",
27+
"operator, GP_7",
28+
"statistics, GP_7",
29+
"view, GP_7",
30+
})
31+
void jdbcLoaderTest(String fileName, String contTypeName) throws Exception {
32+
var settings = new CoreSettings();
33+
settings.setEnableFunctionBodiesDependencies(true);
34+
jdbcLoaderTest(false, fileName, contTypeName, settings);
35+
}
36+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*******************************************************************************
2+
* Copyright 2017-2026 TAXTELECOM, LLC
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 org.pgcodekeeper.core.it.jdbc.pg;
17+
18+
import org.junit.jupiter.params.ParameterizedTest;
19+
import org.junit.jupiter.params.provider.CsvSource;
20+
import org.pgcodekeeper.core.settings.CoreSettings;
21+
22+
class PgJdbcLoaderTest extends AbstractPgGpJdbcLoaderTest {
23+
24+
@ParameterizedTest
25+
@CsvSource({
26+
"dump_test, PG_16",
27+
"operator, PG_16",
28+
"statistics, PG_16",
29+
"view, PG_16",
30+
"not_null, PG_18",
31+
})
32+
void jdbcLoaderTest(String fileName, String contTypeName) throws Exception {
33+
var settings = new CoreSettings();
34+
settings.setEnableFunctionBodiesDependencies(true);
35+
jdbcLoaderTest(false, fileName, contTypeName, settings);
36+
}
37+
38+
@ParameterizedTest
39+
@CsvSource({
40+
"view, PG_16",
41+
"not_null, PG_18"
42+
})
43+
void jdbcLoaderSpecialTest(String fileName, String contTypeName) throws Exception {
44+
var settings = new CoreSettings();
45+
settings.setSimplifyNotNull(true);
46+
settings.setSimplifyView(true);
47+
jdbcLoaderTest(true, fileName, contTypeName, settings);
48+
}
49+
}

src/test/java/org/pgcodekeeper/core/utils/testcontainer/TestContainerType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public String getUrl() {
5656
return finalUrl;
5757
}
5858

59-
private void initContainer() {
59+
private synchronized void initContainer() {
6060
if (container.isCreated()) {
6161
return;
6262
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
junit.jupiter.execution.parallel.enabled=true
2+
junit.jupiter.execution.parallel.mode.default=same_thread
3+
junit.jupiter.execution.parallel.mode.classes.default=concurrent
4+
junit.jupiter.execution.parallel.config.strategy=dynamic
5+
junit.jupiter.execution.parallel.config.dynamic.factor=1.0

0 commit comments

Comments
 (0)