Skip to content

Commit 41e7e0e

Browse files
committed
Frontport Jaybird 5 change for testing old Firebird with new client
1 parent 8ac8d66 commit 41e7e0e

6 files changed

Lines changed: 110 additions & 40 deletions

File tree

src/jna-test/org/firebirdsql/gds/ng/jna/JnaDatabaseTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void testBasicCreateAndDrop() throws Exception {
133133
try {
134134
db.createDatabase();
135135
assertTrue(db.isAttached(), "Database should be attached after create");
136-
assertTrue(dbFile.exists() || !FBTestProperties.DB_SERVER_URL.equalsIgnoreCase("localhost"),
136+
assertTrue(dbFile.exists() || !FBTestProperties.isLocalhost(),
137137
"Expected database file to exist (NOTE: only works on localhost)");
138138

139139
db.dropDatabase();

src/jna-test/org/firebirdsql/gds/ng/jna/JnaServiceTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ void basicStatusVectorProcessing_wrongLogin() throws Exception {
8989

9090
@Test
9191
void testBasicStatusVectorProcessing_wrongService() throws Exception {
92+
// Test may also fail when using fbclient of Firebird 4.0 or higher for NATIVE tests
9293
assumeTrue(getDefaultSupportInfo().isVersionBelow(4), "Incorrect service name ignored in Firebird 4+");
9394
// set invalid database
9495
final String invalidServiceName = "doesnotexist";

src/test/org/firebirdsql/common/FBTestProperties.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import org.firebirdsql.gds.ng.FbConnectionProperties;
1313
import org.firebirdsql.gds.ng.FbDatabaseFactory;
1414
import org.firebirdsql.gds.ng.FbServiceProperties;
15+
import org.firebirdsql.gds.ng.jna.AbstractNativeDatabaseFactory;
16+
import org.firebirdsql.gds.ng.jna.FbClientFeature;
17+
import org.firebirdsql.gds.ng.jna.FbClientFeatureAccess;
1518
import org.firebirdsql.jaybird.fb.constants.TpbItems;
1619
import org.firebirdsql.jaybird.props.AttachmentProperties;
1720
import org.firebirdsql.jaybird.props.DatabaseConnectionProperties;
@@ -20,12 +23,14 @@
2023
import org.firebirdsql.jaybird.xca.FBManagedConnectionFactory;
2124
import org.firebirdsql.jdbc.FBDriver;
2225
import org.firebirdsql.jdbc.FirebirdConnection;
26+
import org.firebirdsql.jna.fbclient.FbClientLibrary;
2327
import org.firebirdsql.management.FBManager;
2428
import org.firebirdsql.management.FBServiceManager;
2529
import org.firebirdsql.management.ServiceManager;
2630
import org.firebirdsql.util.FirebirdSupportInfo;
2731
import org.jspecify.annotations.Nullable;
2832

33+
import java.lang.reflect.Method;
2934
import java.nio.file.Path;
3035
import java.sql.DriverManager;
3136
import java.sql.SQLException;
@@ -35,6 +40,8 @@
3540
import java.util.ResourceBundle;
3641

3742
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isEmbeddedType;
43+
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isOtherNativeType;
44+
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isPureJavaType;
3845
import static org.firebirdsql.jaybird.util.StringUtils.trimToNull;
3946
import static org.hamcrest.Matchers.not;
4047

@@ -83,6 +90,10 @@ public static String getProperty(String property, String defaultValue) {
8390
public static final boolean USE_FIREBIRD_AUTOCOMMIT =
8491
Boolean.parseBoolean(getProperty("test.use_firebird_autocommit", "false"));
8592
public static final String ENABLE_PROTOCOL = trimToNull(getProperty("test.enableProtocol", "*"));
93+
// Allows running native tests against Firebird 2.5 or older with a Firebird 3.0 or newer fbclient.
94+
private static final boolean NATIVE_LEGACY_AUTH_COMPAT =
95+
Boolean.parseBoolean(getProperty("test.native_legacy_auth_compat", "false"));
96+
private static final String NATIVE_LEGACY_AUTH_COMPAT_AUTH_PLUGINS = "Legacy_Auth";
8697

8798
public static boolean isLocalhost() {
8899
return "localhost".equals(DB_SERVER_URL) || "127.0.0.1".equals(DB_SERVER_URL);
@@ -128,6 +139,9 @@ public static Properties getDefaultPropertiesForConnection() {
128139
if (ENABLE_PROTOCOL != null) {
129140
props.setProperty("enableProtocol", ENABLE_PROTOCOL);
130141
}
142+
if (isEnableNativeLegacyAuthCompat()) {
143+
props.setProperty("authPlugins", NATIVE_LEGACY_AUTH_COMPAT_AUTH_PLUGINS);
144+
}
131145

132146
return props;
133147
}
@@ -190,6 +204,9 @@ public static <T extends AttachmentProperties> T configureDefaultAttachmentPrope
190204
connectionInfo.setPassword(DB_PASSWORD);
191205
connectionInfo.setEncoding(DB_LC_CTYPE);
192206
connectionInfo.setEnableProtocol(ENABLE_PROTOCOL);
207+
if (isEnableNativeLegacyAuthCompat()) {
208+
connectionInfo.setAuthPlugins(NATIVE_LEGACY_AUTH_COMPAT_AUTH_PLUGINS);
209+
}
193210
return connectionInfo;
194211
}
195212

@@ -304,6 +321,9 @@ public static FBManagedConnectionFactory createDefaultMcf(boolean shared) {
304321
public static FBManager createFBManager() {
305322
FBManager fbManager = new FBManager(getGdsType());
306323
fbManager.setEnableProtocol(ENABLE_PROTOCOL);
324+
if (isEnableNativeLegacyAuthCompat()) {
325+
fbManager.setAuthPlugins(NATIVE_LEGACY_AUTH_COMPAT_AUTH_PLUGINS);
326+
}
307327
return fbManager;
308328
}
309329

@@ -370,6 +390,35 @@ public static void defaultDatabaseTearDown(FBManager fbManager) throws Exception
370390
}
371391
}
372392

393+
/**
394+
* @return {@code true} if modern URLs (e.g. inet:// ...) are supported, {@code false} otherwise (i.e. a native test
395+
* where a client library of Firebird 2.5 or older is used, or for pure Java)
396+
*/
397+
public static boolean supportsNativeModernUrls() {
398+
if (isPureJavaType().matches(GDS_TYPE)) {
399+
return false;
400+
} else {
401+
try {
402+
Method getClientLibrary = AbstractNativeDatabaseFactory.class.getDeclaredMethod("getClientLibrary");
403+
getClientLibrary.setAccessible(true);
404+
FbClientLibrary clientLibrary = (FbClientLibrary) getClientLibrary.invoke(
405+
FBTestProperties.getFbDatabaseFactory());
406+
if (clientLibrary instanceof FbClientFeatureAccess) {
407+
return ((FbClientFeatureAccess) clientLibrary).hasFeature(FbClientFeature.FB_PING);
408+
}
409+
return false;
410+
} catch (RuntimeException | Error e) {
411+
throw e;
412+
} catch (Throwable e) {
413+
throw new RuntimeException(e);
414+
}
415+
}
416+
}
417+
418+
private static boolean isEnableNativeLegacyAuthCompat() {
419+
return NATIVE_LEGACY_AUTH_COMPAT && isOtherNativeType().matches(GDS_TYPE);
420+
}
421+
373422
/**
374423
* @return the Java major/feature version (as defined in {@code java.lang.Runtime.Version} in Java 10 and higher)
375424
*/

src/test/org/firebirdsql/jdbc/DatabaseUrlFormatsTest.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,7 @@ class DatabaseUrlFormatsTest {
3939
@ParameterizedTest
4040
@MethodSource
4141
void testConnectionWithDriverManager(String url) throws Exception {
42-
if (ENABLE_PROTOCOL != null) {
43-
url += (url.contains("?") ? '&' : "?") + "enableProtocol=" + ENABLE_PROTOCOL;
44-
}
45-
try (Connection connection = DriverManager.getConnection(url, DB_USER, FBTestProperties.DB_PASSWORD)) {
42+
try (var connection = DriverManager.getConnection(url, getDefaultPropertiesForConnection())) {
4643
assertTrue(connection.isValid(1000));
4744
}
4845
}
@@ -144,20 +141,25 @@ private static List<String> urlsWithoutProtocolPrefix() {
144141
urlFormats.add("doesnotexist/1234:nopath?databaseName=//%1$s:%2$d/%3$s");
145142

146143
if (isOtherNativeType().matches(gdsTypeName)) {
144+
final boolean supportsNativeModernUrls = supportsNativeModernUrls();
147145
// NOTE: This test assumes a Firebird 3.0 or higher client library is used
148-
urlFormats.add("inet://%1$s:%2$d/%3$s");
149-
// Not testing inet4/inet6
146+
if (supportsNativeModernUrls) {
147+
urlFormats.add("inet://%1$s:%2$d/%3$s");
148+
// Not testing inet4/inet6
149+
}
150150
FirebirdSupportInfo supportInfo = getDefaultSupportInfo();
151151
if (supportInfo.isWindows() && isWindowsSystem()) {
152152
if (supportInfo.supportsWnet()) {
153153
// NOTE: This assumes the default WNET service name is used
154-
urlFormats.add("wnet://%1$s/%3$s");
155154
urlFormats.add("\\\\%4$s\\%3$s");
156-
if (localhost) {
157-
urlFormats.add("wnet://%3$s");
155+
if (supportsNativeModernUrls) {
156+
urlFormats.add("wnet://%1$s/%3$s");
157+
if (localhost) {
158+
urlFormats.add("wnet://%3$s");
159+
}
158160
}
159161
}
160-
if (localhost) {
162+
if (supportsNativeModernUrls && localhost) {
161163
urlFormats.add("xnet://%3$s");
162164
}
163165
}

src/test/org/firebirdsql/jdbc/UseFirebirdAutocommitTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static java.lang.String.format;
1717
import static org.firebirdsql.common.DdlHelper.executeCreateTable;
1818
import static org.firebirdsql.common.DdlHelper.executeDDL;
19+
import static org.firebirdsql.common.FBTestProperties.getDefaultPropertiesForConnection;
1920
import static org.hamcrest.MatcherAssert.assertThat;
2021
import static org.hamcrest.Matchers.lessThan;
2122
import static org.junit.jupiter.api.Assertions.*;
@@ -39,12 +40,11 @@ class UseFirebirdAutocommitTest {
3940
"?encoding=NONE&useFirebirdAutocommit=true, true"
4041
})
4142
void checkFirebirdAutocommitValue(String properties, boolean expectedUseFirebirdAutocommit) throws SQLException {
43+
Properties props = getDefaultPropertiesForConnection();
44+
props.remove("lc_ctype");
45+
props.remove("useFirebirdAutocommit");
4246
String url = FBTestProperties.getUrl() + properties;
43-
if (FBTestProperties.ENABLE_PROTOCOL != null) {
44-
url += "&enableProtocol=" + FBTestProperties.ENABLE_PROTOCOL;
45-
}
46-
try (FBConnection connection = (FBConnection) DriverManager.getConnection(url, FBTestProperties.DB_USER,
47-
FBTestProperties.DB_PASSWORD)) {
47+
try (FBConnection connection = (FBConnection) DriverManager.getConnection(url, props)) {
4848
FBManagedConnectionFactory managedConnectionFactory = connection
4949
.getManagedConnection().getManagedConnectionFactory();
5050
assertEquals(expectedUseFirebirdAutocommit, managedConnectionFactory.isUseFirebirdAutocommit(),

src/test/org/firebirdsql/management/FBServiceManagerTest.java

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import static org.firebirdsql.common.FBTestProperties.configureServiceManager;
3030
import static org.firebirdsql.common.FBTestProperties.getDefaultSupportInfo;
3131
import static org.firebirdsql.common.FBTestProperties.isLocalhost;
32+
import static org.firebirdsql.common.FBTestProperties.supportsNativeModernUrls;
3233
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isEmbeddedType;
3334
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isOtherNativeType;
3435
import static org.firebirdsql.jaybird.props.PropertyConstants.DEFAULT_SERVICE_NAME;
@@ -71,62 +72,79 @@ void testGetServerVersion(String serverName, Integer portNumber, String serviceN
7172

7273
@SuppressWarnings("unused")
7374
static Stream<Arguments> testGetServerVersion() {
75+
FirebirdSupportInfo supportInfo = getDefaultSupportInfo();
76+
final boolean supportsNamelessServiceManager = supportInfo.supportsNamelessServiceManager();
7477
List<Arguments> arguments = new ArrayList<>();
75-
arguments.add(Arguments.of(DB_SERVER_URL, DB_SERVER_PORT, null));
78+
if (supportsNamelessServiceManager) {
79+
arguments.add(Arguments.of(DB_SERVER_URL, DB_SERVER_PORT, null));
80+
}
7681
arguments.add(Arguments.of(DB_SERVER_URL, DB_SERVER_PORT, DEFAULT_SERVICE_NAME));
7782

7883
final String gdsTypeName = GDS_TYPE;
7984
if (isEmbeddedType().matches(gdsTypeName)) {
80-
arguments.add(Arguments.of(null, null, null));
85+
if (supportsNamelessServiceManager) {
86+
arguments.add(Arguments.of(null, null, null));
87+
}
8188
arguments.add(Arguments.of(null, null, DEFAULT_SERVICE_NAME));
8289
} else {
8390
final String serverName = DB_SERVER_URL;
8491
final boolean localhost = isLocalhost();
8592
final String ipv6SafeServerName = serverName.indexOf(':') != -1 ? '[' + serverName + ']' : serverName;
8693
final List<String> urlFormats = new ArrayList<>();
87-
urlFormats.add("%1$s/%2$d:");
8894
urlFormats.add("%1$s/%2$d:%3$s");
89-
urlFormats.add("//%1$s:%2$d");
90-
urlFormats.add("//%1$s:%2$d/");
95+
if (supportsNamelessServiceManager) {
96+
urlFormats.add("%1$s/%2$d:");
97+
urlFormats.add("//%1$s:%2$d");
98+
urlFormats.add("//%1$s:%2$d/");
99+
}
91100
urlFormats.add("//%1$s:%2$d/%3$s");
92101
if (DB_SERVER_PORT == PropertyConstants.DEFAULT_PORT) {
93-
urlFormats.add("%1$s:");
94102
urlFormats.add("%1$s:%3$s");
95-
urlFormats.add("//%1$s");
96-
urlFormats.add("//%1$s/");
103+
if (supportsNamelessServiceManager) {
104+
urlFormats.add("%1$s:");
105+
urlFormats.add("//%1$s");
106+
urlFormats.add("//%1$s/");
107+
}
97108
urlFormats.add("//%1$s/%3$s");
98109
if (localhost) {
99110
// no hostname + port:
100111
urlFormats.add("%3$s");
101112
}
102-
if (isOtherNativeType().matches(gdsTypeName)) {
113+
if (isOtherNativeType().matches(gdsTypeName) && supportsNamelessServiceManager) {
103114
urlFormats.add("%1$s");
104115
}
105116
}
106117

107118
if (isOtherNativeType().matches(gdsTypeName)) {
108-
urlFormats.add("%1$s/%2$d");
109-
// NOTE: This test assumes a Firebird 3.0 or higher client library is used
110-
urlFormats.add("inet://%1$s:%2$d/%3$s");
111-
urlFormats.add("inet://%1$s:%2$d/");
112-
urlFormats.add("inet://%1$s:%2$d");
119+
if (supportsNamelessServiceManager) {
120+
urlFormats.add("%1$s/%2$d");
121+
}
122+
final boolean supportsNativeModernUrls = supportsNativeModernUrls();
123+
if (supportsNativeModernUrls) {
124+
urlFormats.add("inet://%1$s:%2$d/%3$s");
125+
urlFormats.add("inet://%1$s:%2$d/");
126+
urlFormats.add("inet://%1$s:%2$d");
127+
}
113128
// Not testing inet4/inet6
114-
FirebirdSupportInfo supportInfo = getDefaultSupportInfo();
115129
if (supportInfo.isWindows() && isWindowsSystem()) {
116130
if (supportInfo.supportsWnet()) {
117131
// NOTE: This assumes the default WNET service name is used
118-
urlFormats.add("wnet://%1$s/%3$s");
119-
urlFormats.add("wnet://%1$s/");
120-
urlFormats.add("wnet://%1$s");
132+
if (supportsNativeModernUrls) {
133+
urlFormats.add("wnet://%1$s/%3$s");
134+
urlFormats.add("wnet://%1$s/");
135+
urlFormats.add("wnet://%1$s");
136+
if (localhost) {
137+
urlFormats.add("wnet://%3$s");
138+
urlFormats.add("wnet://");
139+
}
140+
}
121141
urlFormats.add("\\\\%4$s\\%3$s");
122-
urlFormats.add("\\\\%4$s\\");
123-
urlFormats.add("\\\\%4$s");
124-
if (localhost) {
125-
urlFormats.add("wnet://%3$s");
126-
urlFormats.add("wnet://");
142+
if (supportsNamelessServiceManager) {
143+
urlFormats.add("\\\\%4$s\\");
144+
urlFormats.add("\\\\%4$s");
127145
}
128146
}
129-
if (localhost) {
147+
if (supportsNativeModernUrls && localhost) {
130148
urlFormats.add("xnet://%3$s");
131149
urlFormats.add("xnet://");
132150
}

0 commit comments

Comments
 (0)