Skip to content

Commit 1979c16

Browse files
committed
Frontport Jaybird 5 change for testing old Firebird with new client
1 parent 2852266 commit 1979c16

6 files changed

Lines changed: 111 additions & 42 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
@@ -148,7 +148,7 @@ void testBasicCreateAndDrop() throws Exception {
148148
try {
149149
db.createDatabase();
150150
assertTrue(db.isAttached(), "Database should be attached after create");
151-
assertTrue(dbFile.exists() || !FBTestProperties.DB_SERVER_URL.equalsIgnoreCase("localhost"),
151+
assertTrue(dbFile.exists() || !FBTestProperties.isLocalhost(),
152152
"Expected database file to exist (NOTE: only works on localhost)");
153153

154154
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
@@ -105,6 +105,7 @@ void basicStatusVectorProcessing_wrongLogin() throws Exception {
105105

106106
@Test
107107
void testBasicStatusVectorProcessing_wrongService() throws Exception {
108+
// Test may also fail when using fbclient of Firebird 4.0 or higher for NATIVE tests
108109
assumeTrue(getDefaultSupportInfo().isVersionBelow(4), "Incorrect service name ignored in Firebird 4+");
109110
// set invalid database
110111
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
@@ -26,18 +26,23 @@
2626
import org.firebirdsql.gds.ng.FbConnectionProperties;
2727
import org.firebirdsql.gds.ng.FbDatabaseFactory;
2828
import org.firebirdsql.gds.ng.FbServiceProperties;
29+
import org.firebirdsql.gds.ng.jna.AbstractNativeDatabaseFactory;
30+
import org.firebirdsql.gds.ng.jna.FbClientFeature;
31+
import org.firebirdsql.gds.ng.jna.FbClientFeatureAccess;
2932
import org.firebirdsql.jaybird.fb.constants.TpbItems;
3033
import org.firebirdsql.jaybird.props.AttachmentProperties;
3134
import org.firebirdsql.jaybird.props.DatabaseConnectionProperties;
3235
import org.firebirdsql.jaybird.props.ServiceConnectionProperties;
3336
import org.firebirdsql.jaybird.xca.FBManagedConnectionFactory;
3437
import org.firebirdsql.jdbc.FBDriver;
3538
import org.firebirdsql.jdbc.FirebirdConnection;
39+
import org.firebirdsql.jna.fbclient.FbClientLibrary;
3640
import org.firebirdsql.management.FBManager;
3741
import org.firebirdsql.management.FBServiceManager;
3842
import org.firebirdsql.management.ServiceManager;
3943
import org.firebirdsql.util.FirebirdSupportInfo;
4044

45+
import java.lang.reflect.Method;
4146
import java.nio.file.Path;
4247
import java.sql.DriverManager;
4348
import java.sql.SQLException;
@@ -47,6 +52,8 @@
4752
import java.util.ResourceBundle;
4853

4954
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isEmbeddedType;
55+
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isOtherNativeType;
56+
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isPureJavaType;
5057
import static org.firebirdsql.jaybird.util.StringUtils.trimToNull;
5158
import static org.hamcrest.Matchers.not;
5259

@@ -95,6 +102,10 @@ public static String getProperty(String property, String defaultValue) {
95102
public static final boolean USE_FIREBIRD_AUTOCOMMIT =
96103
Boolean.parseBoolean(getProperty("test.use_firebird_autocommit", "false"));
97104
public static final String ENABLE_PROTOCOL = trimToNull(getProperty("test.enableProtocol", "*"));
105+
// Allows running native tests against Firebird 2.5 or older with a Firebird 3.0 or newer fbclient.
106+
private static final boolean NATIVE_LEGACY_AUTH_COMPAT =
107+
Boolean.parseBoolean(getProperty("test.native_legacy_auth_compat", "false"));
108+
private static final String NATIVE_LEGACY_AUTH_COMPAT_AUTH_PLUGINS = "Legacy_Auth";
98109

99110
public static boolean isLocalhost() {
100111
return "localhost".equals(DB_SERVER_URL) || "127.0.0.1".equals(DB_SERVER_URL);
@@ -140,6 +151,9 @@ public static Properties getDefaultPropertiesForConnection() {
140151
if (ENABLE_PROTOCOL != null) {
141152
props.setProperty("enableProtocol", ENABLE_PROTOCOL);
142153
}
154+
if (isEnableNativeLegacyAuthCompat()) {
155+
props.setProperty("authPlugins", NATIVE_LEGACY_AUTH_COMPAT_AUTH_PLUGINS);
156+
}
143157

144158
return props;
145159
}
@@ -200,6 +214,9 @@ public static <T extends AttachmentProperties> T configureDefaultAttachmentPrope
200214
connectionInfo.setPassword(DB_PASSWORD);
201215
connectionInfo.setEncoding(DB_LC_CTYPE);
202216
connectionInfo.setEnableProtocol(ENABLE_PROTOCOL);
217+
if (isEnableNativeLegacyAuthCompat()) {
218+
connectionInfo.setAuthPlugins(NATIVE_LEGACY_AUTH_COMPAT_AUTH_PLUGINS);
219+
}
203220
return connectionInfo;
204221
}
205222

@@ -314,6 +331,9 @@ public static FBManagedConnectionFactory createDefaultMcf(boolean shared) {
314331
public static FBManager createFBManager() {
315332
FBManager fbManager = new FBManager(getGdsType());
316333
fbManager.setEnableProtocol(ENABLE_PROTOCOL);
334+
if (isEnableNativeLegacyAuthCompat()) {
335+
fbManager.setAuthPlugins(NATIVE_LEGACY_AUTH_COMPAT_AUTH_PLUGINS);
336+
}
317337
return fbManager;
318338
}
319339

@@ -380,6 +400,35 @@ public static void defaultDatabaseTearDown(FBManager fbManager) throws Exception
380400
}
381401
}
382402

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

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,7 @@ class DatabaseUrlFormatsTest {
5555
@ParameterizedTest
5656
@MethodSource
5757
void testConnectionWithDriverManager(String url) throws Exception {
58-
if (ENABLE_PROTOCOL != null) {
59-
url += (url.contains("?") ? '&' : "?") + "enableProtocol=" + ENABLE_PROTOCOL;
60-
}
61-
try (Connection connection = DriverManager.getConnection(url, DB_USER, FBTestProperties.DB_PASSWORD)) {
58+
try (var connection = DriverManager.getConnection(url, getDefaultPropertiesForConnection())) {
6259
assertTrue(connection.isValid(1000));
6360
}
6461
}
@@ -160,20 +157,24 @@ private static List<String> urlsWithoutProtocolPrefix() {
160157
urlFormats.add("doesnotexist/1234:nopath?databaseName=//%1$s:%2$d/%3$s");
161158

162159
if (isOtherNativeType().matches(gdsTypeName)) {
163-
// NOTE: This test assumes a Firebird 3.0 or higher client library is used
164-
urlFormats.add("inet://%1$s:%2$d/%3$s");
165-
// Not testing inet4/inet6
160+
final boolean supportsNativeModernUrls = supportsNativeModernUrls();
161+
if (supportsNativeModernUrls) {
162+
urlFormats.add("inet://%1$s:%2$d/%3$s");
163+
// Not testing inet4/inet6
164+
}
166165
FirebirdSupportInfo supportInfo = getDefaultSupportInfo();
167166
if (supportInfo.isWindows() && isWindowsSystem()) {
168167
if (supportInfo.supportsWnet()) {
169168
// NOTE: This assumes the default WNET service name is used
170-
urlFormats.add("wnet://%1$s/%3$s");
171169
urlFormats.add("\\\\%4$s\\%3$s");
172-
if (localhost) {
173-
urlFormats.add("wnet://%3$s");
170+
if (supportsNativeModernUrls) {
171+
urlFormats.add("wnet://%1$s/%3$s");
172+
if (localhost) {
173+
urlFormats.add("wnet://%3$s");
174+
}
174175
}
175176
}
176-
if (localhost) {
177+
if (supportsNativeModernUrls && localhost) {
177178
urlFormats.add("xnet://%3$s");
178179
}
179180
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import static java.lang.String.format;
3333
import static org.firebirdsql.common.DdlHelper.executeCreateTable;
3434
import static org.firebirdsql.common.DdlHelper.executeDDL;
35+
import static org.firebirdsql.common.FBTestProperties.getDefaultPropertiesForConnection;
3536
import static org.hamcrest.MatcherAssert.assertThat;
3637
import static org.hamcrest.Matchers.lessThan;
3738
import static org.junit.jupiter.api.Assertions.*;
@@ -55,12 +56,11 @@ class UseFirebirdAutocommitTest {
5556
"?encoding=NONE&useFirebirdAutocommit=true, true"
5657
})
5758
void checkFirebirdAutocommitValue(String properties, boolean expectedUseFirebirdAutocommit) throws SQLException {
59+
Properties props = getDefaultPropertiesForConnection();
60+
props.remove("lc_ctype");
61+
props.remove("useFirebirdAutocommit");
5862
String url = FBTestProperties.getUrl() + properties;
59-
if (FBTestProperties.ENABLE_PROTOCOL != null) {
60-
url += "&enableProtocol=" + FBTestProperties.ENABLE_PROTOCOL;
61-
}
62-
try (FBConnection connection = (FBConnection) DriverManager.getConnection(url, FBTestProperties.DB_USER,
63-
FBTestProperties.DB_PASSWORD)) {
63+
try (FBConnection connection = (FBConnection) DriverManager.getConnection(url, props)) {
6464
FBManagedConnectionFactory managedConnectionFactory = connection
6565
.getManagedConnection().getManagedConnectionFactory();
6666
assertEquals(expectedUseFirebirdAutocommit, managedConnectionFactory.isUseFirebirdAutocommit(),

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

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import static org.firebirdsql.common.FBTestProperties.configureServiceManager;
3939
import static org.firebirdsql.common.FBTestProperties.getDefaultSupportInfo;
4040
import static org.firebirdsql.common.FBTestProperties.isLocalhost;
41+
import static org.firebirdsql.common.FBTestProperties.supportsNativeModernUrls;
4142
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isEmbeddedType;
4243
import static org.firebirdsql.common.matchers.GdsTypeMatchers.isOtherNativeType;
4344
import static org.firebirdsql.jaybird.props.PropertyConstants.DEFAULT_SERVICE_NAME;
@@ -79,68 +80,85 @@ void testGetServerVersion(String serverName, Integer portNumber, String serviceN
7980

8081
@SuppressWarnings("unused")
8182
static Stream<Arguments> testGetServerVersion() {
83+
FirebirdSupportInfo supportInfo = getDefaultSupportInfo();
84+
final boolean supportsNamelessServiceManager = supportInfo.supportsNamelessServiceManager();
8285
List<Arguments> arguments = new ArrayList<>();
83-
arguments.add(Arguments.of(DB_SERVER_URL, DB_SERVER_PORT, null));
86+
if (supportsNamelessServiceManager) {
87+
arguments.add(Arguments.of(DB_SERVER_URL, DB_SERVER_PORT, null));
88+
}
8489
arguments.add(Arguments.of(DB_SERVER_URL, DB_SERVER_PORT, DEFAULT_SERVICE_NAME));
8590

8691
final String gdsTypeName = GDS_TYPE;
8792
if (isEmbeddedType().matches(gdsTypeName)) {
88-
arguments.add(Arguments.of(null, null, null));
93+
if (supportsNamelessServiceManager) {
94+
arguments.add(Arguments.of(null, null, null));
95+
}
8996
arguments.add(Arguments.of(null, null, DEFAULT_SERVICE_NAME));
9097
} else {
9198
final String serverName = DB_SERVER_URL;
9299
final boolean localhost = isLocalhost();
93100
final String ipv6SafeServerName = serverName.indexOf(':') != -1 ? '[' + serverName + ']' : serverName;
94101
final List<String> urlFormats = new ArrayList<>();
95-
urlFormats.add("%1$s/%2$d:");
96102
urlFormats.add("%1$s/%2$d:%3$s");
97-
urlFormats.add("//%1$s:%2$d");
98-
urlFormats.add("//%1$s:%2$d/");
103+
if (supportsNamelessServiceManager) {
104+
urlFormats.add("%1$s/%2$d:");
105+
urlFormats.add("//%1$s:%2$d");
106+
urlFormats.add("//%1$s:%2$d/");
107+
}
99108
urlFormats.add("//%1$s:%2$d/%3$s");
100109
if (DB_SERVER_PORT == PropertyConstants.DEFAULT_PORT) {
101-
urlFormats.add("%1$s:");
102110
urlFormats.add("%1$s:%3$s");
103-
urlFormats.add("//%1$s");
104-
urlFormats.add("//%1$s/");
111+
if (supportsNamelessServiceManager) {
112+
urlFormats.add("%1$s:");
113+
urlFormats.add("//%1$s");
114+
urlFormats.add("//%1$s/");
115+
}
105116
urlFormats.add("//%1$s/%3$s");
106117
if (localhost) {
107118
// no hostname + port:
108119
urlFormats.add("%3$s");
109120
}
110-
if (isOtherNativeType().matches(gdsTypeName)) {
121+
if (isOtherNativeType().matches(gdsTypeName) && supportsNamelessServiceManager) {
111122
urlFormats.add("%1$s");
112123
}
113124
}
114125

115126
if (isOtherNativeType().matches(gdsTypeName)) {
116-
urlFormats.add("%1$s/%2$d");
117-
// NOTE: This test assumes a Firebird 3.0 or higher client library is used
118-
urlFormats.add("inet://%1$s:%2$d/%3$s");
119-
urlFormats.add("inet://%1$s:%2$d/");
120-
urlFormats.add("inet://%1$s:%2$d");
127+
if (supportsNamelessServiceManager) {
128+
urlFormats.add("%1$s/%2$d");
129+
}
130+
final boolean supportsNativeModernUrls = supportsNativeModernUrls();
131+
if (supportsNativeModernUrls) {
132+
urlFormats.add("inet://%1$s:%2$d/%3$s");
133+
urlFormats.add("inet://%1$s:%2$d/");
134+
urlFormats.add("inet://%1$s:%2$d");
135+
}
121136
// Not testing inet4/inet6
122-
FirebirdSupportInfo supportInfo = getDefaultSupportInfo();
123137
if (supportInfo.isWindows() && isWindowsSystem()) {
124138
if (supportInfo.supportsWnet()) {
125139
// NOTE: This assumes the default WNET service name is used
126-
urlFormats.add("wnet://%1$s/%3$s");
127-
urlFormats.add("wnet://%1$s/");
128-
urlFormats.add("wnet://%1$s");
140+
if (supportsNativeModernUrls) {
141+
urlFormats.add("wnet://%1$s/%3$s");
142+
urlFormats.add("wnet://%1$s/");
143+
urlFormats.add("wnet://%1$s");
144+
if (localhost) {
145+
urlFormats.add("wnet://%3$s");
146+
urlFormats.add("wnet://");
147+
}
148+
}
129149
urlFormats.add("\\\\%4$s\\%3$s");
130-
urlFormats.add("\\\\%4$s\\");
131-
urlFormats.add("\\\\%4$s");
132-
if (localhost) {
133-
urlFormats.add("wnet://%3$s");
134-
urlFormats.add("wnet://");
150+
if (supportsNamelessServiceManager) {
151+
urlFormats.add("\\\\%4$s\\");
152+
urlFormats.add("\\\\%4$s");
135153
}
136154
}
137-
if (localhost) {
155+
if (supportsNativeModernUrls && localhost) {
138156
urlFormats.add("xnet://%3$s");
139157
urlFormats.add("xnet://");
140158
}
141159
}
142160
}
143-
161+
144162
urlFormats.stream()
145163
.map(urlFormat ->
146164
String.format(urlFormat, ipv6SafeServerName, DB_SERVER_PORT, DEFAULT_SERVICE_NAME, serverName))

0 commit comments

Comments
 (0)