Skip to content

Commit 1690365

Browse files
authored
SQL-2271: Fix appending of clientInfo to appName if it exists (#279)
1 parent 51bebc1 commit 1690365

File tree

2 files changed

+71
-23
lines changed

2 files changed

+71
-23
lines changed

src/main/java/com/mongodb/jdbc/MongoConnection.java

+18-23
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public class MongoConnection implements Connection {
8888
private String logDirPath;
8989
private boolean extJsonMode;
9090
private UuidRepresentation uuidRepresentation;
91+
private String appName;
9192

9293
public MongoConnection(
9394
MongoClient mongoClient, MongoConnectionProperties connectionProperties) {
@@ -104,7 +105,13 @@ public MongoConnection(
104105
this.mongoClientSettings = createMongoClientSettings(connectionProperties);
105106

106107
if (mongoClient == null) {
107-
this.mongoClient = createMongoClient(connectionProperties);
108+
this.mongoClient =
109+
MongoClients.create(
110+
this.mongoClientSettings,
111+
MongoDriverInformation.builder()
112+
.driverName(MongoDriver.NAME)
113+
.driverVersion(MongoDriver.getVersion())
114+
.build());
108115
} else {
109116
this.mongoClient = mongoClient;
110117
}
@@ -121,44 +128,32 @@ private void initializeConnection(MongoConnectionProperties connectionProperties
121128
this.extJsonMode = connectionProperties.getExtJsonMode();
122129
this.uuidRepresentation =
123130
connectionProperties.getConnectionString().getUuidRepresentation();
131+
this.appName = buildAppName(connectionProperties);
124132

125133
this.isClosed = false;
126134
}
127135

128-
private MongoClient createMongoClient(MongoConnectionProperties connectionProperties) {
129-
StringBuilder appName =
136+
private String buildAppName(MongoConnectionProperties connectionProperties) {
137+
StringBuilder appNameBuilder =
130138
new StringBuilder(MongoDriver.NAME).append("+").append(MongoDriver.getVersion());
131139

132-
MongoDriverInformation.Builder mdiBuilder;
133140
String clientInfo = connectionProperties.getClientInfo();
134-
String[] clientInfoSplit = (clientInfo == null) ? null : clientInfo.split("\\+");
135-
if (clientInfoSplit != null && clientInfoSplit.length == 2) {
136-
appName.append('|').append(clientInfo);
137-
MongoDriverInformation driverInfoWithClientInfo =
138-
MongoDriverInformation.builder()
139-
.driverName(clientInfoSplit[0])
140-
.driverVersion(clientInfoSplit[1])
141-
.build();
142-
mdiBuilder = MongoDriverInformation.builder(driverInfoWithClientInfo);
143-
} else {
144-
mdiBuilder = MongoDriverInformation.builder();
141+
if (clientInfo != null) {
142+
String[] clientInfoSplit = clientInfo.split("\\+");
143+
if (clientInfoSplit.length == 2) {
144+
appNameBuilder.append('|').append(clientInfo);
145+
}
145146
}
146-
MongoDriverInformation mongoDriverInformation =
147-
mdiBuilder
148-
.driverName(MongoDriver.NAME)
149-
.driverVersion(MongoDriver.getVersion())
150-
.build();
151147

152-
return MongoClients.create(this.mongoClientSettings, mongoDriverInformation);
148+
return appNameBuilder.toString();
153149
}
154150

155151
private MongoClientSettings createMongoClientSettings(
156152
MongoConnectionProperties connectionProperties) {
157-
String appName = MongoDriver.NAME + "+" + MongoDriver.getVersion();
158153

159154
MongoClientSettings.Builder settingsBuilder =
160155
MongoClientSettings.builder()
161-
.applicationName(appName)
156+
.applicationName(this.appName)
162157
.applyConnectionString(connectionProperties.getConnectionString());
163158

164159
MongoCredential credential = connectionProperties.getConnectionString().getCredential();

src/test/java/com/mongodb/jdbc/MongoConnectionTest.java

+53
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
import static org.junit.jupiter.api.Assertions.*;
2020
import static org.mockito.Mockito.*;
2121

22+
import com.mongodb.ConnectionString;
23+
import com.mongodb.MongoClientSettings;
24+
import com.mongodb.client.internal.MongoClientImpl;
2225
import java.sql.Connection;
2326
import java.sql.SQLException;
2427
import java.sql.Savepoint;
@@ -28,6 +31,7 @@
2831
import org.junit.jupiter.api.Test;
2932
import org.junit.jupiter.api.TestInstance;
3033
import org.junit.jupiter.api.extension.ExtendWith;
34+
import org.mockito.Mock;
3135
import org.mockito.MockitoAnnotations;
3236
import org.mockito.junit.jupiter.MockitoExtension;
3337
import org.mockito.junit.jupiter.MockitoSettings;
@@ -37,6 +41,9 @@
3741
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
3842
@MockitoSettings(strictness = Strictness.WARN)
3943
class MongoConnectionTest extends MongoMock {
44+
static final String localhost = "mongodb://localhost";
45+
@Mock private MongoConnectionProperties mockConnectionProperties;
46+
4047
@BeforeAll
4148
protected void initMocks() {
4249
MockitoAnnotations.initMocks(this);
@@ -49,6 +56,52 @@ void setupTest() throws NoSuchFieldException {
4956
resetMockObjs();
5057
}
5158

59+
@BeforeEach
60+
void setUp() {
61+
when(mockConnectionProperties.getConnectionString())
62+
.thenReturn(new ConnectionString(localhost));
63+
when(mockConnectionProperties.getDatabase()).thenReturn("test");
64+
}
65+
66+
private String getApplicationName(MongoConnection connection) {
67+
MongoClientImpl mongoClientImpl = (MongoClientImpl) connection.getMongoClient();
68+
MongoClientSettings mcs = mongoClientImpl.getSettings();
69+
return mcs.getApplicationName();
70+
}
71+
72+
@Test
73+
void testBuildAppNameWithoutClientInfo() {
74+
when(mockConnectionProperties.getClientInfo()).thenReturn(null);
75+
76+
mongoConnection = new MongoConnection(null, mockConnectionProperties);
77+
78+
String expectedAppName = MongoDriver.NAME + "+" + MongoDriver.getVersion();
79+
assertEquals(expectedAppName, getApplicationName(mongoConnection));
80+
}
81+
82+
@Test
83+
void testAppNameWithValidClientInfo() {
84+
String clientInfo = "test-client+1.0.0";
85+
when(mockConnectionProperties.getClientInfo()).thenReturn(clientInfo);
86+
87+
mongoConnection = new MongoConnection(null, mockConnectionProperties);
88+
89+
String expectedAppName =
90+
MongoDriver.NAME + "+" + MongoDriver.getVersion() + "|" + clientInfo;
91+
assertEquals(expectedAppName, getApplicationName(mongoConnection));
92+
}
93+
94+
@Test
95+
void testAppNameWithInvalidClientInfo() {
96+
// Client information has to be in the format 'name+version'
97+
when(mockConnectionProperties.getClientInfo()).thenReturn("invalid-client-info");
98+
99+
mongoConnection = new MongoConnection(null, mockConnectionProperties);
100+
101+
String expectedAppName = MongoDriver.NAME + "+" + MongoDriver.getVersion();
102+
assertEquals(expectedAppName, getApplicationName(mongoConnection));
103+
}
104+
52105
// to replace lambda as input in the testExceptionAfterConnectionClosed
53106
interface TestInterface {
54107
void test() throws SQLException;

0 commit comments

Comments
 (0)