Skip to content

Commit c7b512d

Browse files
authored
Create DisabledIfServerGreater annotation for disabling tests for newer server versions (#3937)
1 parent 47f7e3b commit c7b512d

3 files changed

Lines changed: 90 additions & 1 deletion

File tree

pgjdbc/src/test/java/org/postgresql/test/jdbc2/PreparedStatementTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.postgresql.jdbc.PgStatement;
2424
import org.postgresql.jdbc.PreferQueryMode;
2525
import org.postgresql.test.TestUtil;
26+
import org.postgresql.test.annotations.DisabledIfServerVersionGreater;
2627
import org.postgresql.test.util.BrokenInputStream;
2728
import org.postgresql.util.GT;
2829
import org.postgresql.util.PSQLState;
@@ -466,11 +467,11 @@ public void testSetNull() throws SQLException {
466467

467468
}
468469

470+
@DisabledIfServerVersionGreater("19")
469471
@Test
470472
public void testSingleQuotes() throws SQLException {
471473
// This test is only relevant for PostgreSQL 18 and below
472474
// as of 4576208 in postgres non-standard strings now throw an error.
473-
assumeMinimumServerVersion(ServerVersion.v18);
474475

475476
String[] testStrings = new String[]{
476477
"bare ? question mark",
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright (c) 2026, PostgreSQL Global Development Group
3+
* See the LICENSE file in the project root for more information.
4+
*/
5+
6+
package org.postgresql.test.annotations;
7+
8+
import org.postgresql.test.impl.ServerVersionGreaterCondition;
9+
10+
import org.junit.jupiter.api.extension.ExtendWith;
11+
12+
import java.lang.annotation.ElementType;
13+
import java.lang.annotation.Retention;
14+
import java.lang.annotation.RetentionPolicy;
15+
import java.lang.annotation.Target;
16+
17+
/**
18+
* Disables test if the current server version is greater than specified version.
19+
* @see org.junit.jupiter.api.Disabled
20+
*/
21+
@Target({ElementType.TYPE, ElementType.METHOD})
22+
@Retention(RetentionPolicy.RUNTIME)
23+
@ExtendWith(ServerVersionGreaterCondition.class)
24+
public @interface DisabledIfServerVersionGreater {
25+
/**
26+
* @return not null sever version in form x.y.z like 9.4, 9.5.3, etc.
27+
* @see org.postgresql.core.ServerVersion
28+
*/
29+
String value();
30+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright (c) 2026, PostgreSQL Global Development Group
3+
* See the LICENSE file in the project root for more information.
4+
*/
5+
6+
package org.postgresql.test.impl;
7+
8+
import org.postgresql.core.ServerVersion;
9+
import org.postgresql.core.Version;
10+
import org.postgresql.test.TestUtil;
11+
import org.postgresql.test.annotations.DisabledIfServerVersionGreater;
12+
13+
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
14+
import org.junit.jupiter.api.extension.ExecutionCondition;
15+
import org.junit.jupiter.api.extension.ExtensionContext;
16+
import org.junit.platform.commons.support.AnnotationSupport;
17+
18+
import java.lang.reflect.AnnotatedElement;
19+
import java.sql.Connection;
20+
21+
public class ServerVersionGreaterCondition implements ExecutionCondition {
22+
private static final ConditionEvaluationResult ENABLED = ConditionEvaluationResult.enabled(
23+
"@DisabledIfServerVersionGreater is not present");
24+
25+
@Override
26+
public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {
27+
return context.getElement()
28+
.flatMap(element ->
29+
AnnotationSupport.findAnnotation(element, DisabledIfServerVersionGreater.class)
30+
.map(annotation -> ServerVersionGreaterCondition.toResult(element, annotation))
31+
).orElse(ENABLED);
32+
}
33+
34+
private static ConditionEvaluationResult toResult(AnnotatedElement element,
35+
DisabledIfServerVersionGreater annotation) {
36+
Version maxVersion = ServerVersion.from(annotation.value());
37+
if (maxVersion.getVersionNum() <= 0) {
38+
throw new IllegalArgumentException(
39+
"Server version " + annotation.value() + " not valid for "
40+
+ element);
41+
}
42+
43+
try (Connection con = TestUtil.openDB()) {
44+
String dbVersionNumber = con.getMetaData().getDatabaseProductVersion();
45+
Version actualVersion = ServerVersion.from(dbVersionNumber);
46+
if (actualVersion.getVersionNum() >= maxVersion.getVersionNum()) {
47+
return ConditionEvaluationResult.disabled(
48+
"Test requires version <= " + maxVersion
49+
+ ", but the server version is " + actualVersion);
50+
}
51+
return ConditionEvaluationResult.enabled(
52+
"Test requires version <= " + maxVersion
53+
+ ", and the server version is " + actualVersion);
54+
} catch (Exception e) {
55+
throw new IllegalStateException("Not available open connection", e);
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)