Skip to content

Commit 363addb

Browse files
authored
NIFI-15505 Added tests for property migration of Controller Services in standard-services (#10808)
Signed-off-by: David Handermann <exceptionfactory@apache.org>
1 parent d4e67fd commit 363addb

File tree

35 files changed

+1387
-109
lines changed

35 files changed

+1387
-109
lines changed

nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-dbcp-service/src/test/java/org/apache/nifi/record/sink/db/DatabaseRecordSinkTest.java

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@
3939
import org.apache.nifi.serialization.record.RecordSet;
4040
import org.apache.nifi.state.MockStateManager;
4141
import org.apache.nifi.util.MockControllerServiceInitializationContext;
42+
import org.apache.nifi.util.MockPropertyConfiguration;
4243
import org.apache.nifi.util.MockPropertyValue;
4344
import org.apache.nifi.util.NoOpProcessor;
45+
import org.apache.nifi.util.PropertyMigrationResult;
4446
import org.apache.nifi.util.TestRunner;
4547
import org.apache.nifi.util.TestRunners;
4648
import org.junit.jupiter.api.BeforeEach;
@@ -95,7 +97,7 @@ public class DatabaseRecordSinkTest {
9597
private DBCPConnectionPool dbcpService;
9698

9799
@BeforeEach
98-
public void setService(@TempDir final Path tempDir) throws InitializationException, SQLException {
100+
public void setService(@TempDir final Path tempDir) throws InitializationException {
99101
dbcpService = new DBCPConnectionPool();
100102
TestRunner runner = TestRunners.newTestRunner(NoOpProcessor.class);
101103
runner.addControllerService(SERVICE_ID, dbcpService);
@@ -114,15 +116,13 @@ void testRecordFormat() throws IOException, InitializationException, SQLExceptio
114116
// Create the table
115117
final Connection con = dbcpService.getConnection();
116118
final Statement stmt = con.createStatement();
117-
try {
118-
stmt.execute("drop table TESTTABLE");
119-
} catch (final SQLException ignored) {
120-
// Ignore, usually due to Derby not having DROP TABLE IF EXISTS
121-
}
122-
try {
119+
try (stmt) {
120+
try {
121+
stmt.execute("drop table TESTTABLE");
122+
} catch (final SQLException ignored) {
123+
// Ignore, usually due to Derby not having DROP TABLE IF EXISTS
124+
}
123125
stmt.executeUpdate("CREATE TABLE testTable (field1 integer, field2 varchar(20))");
124-
} finally {
125-
stmt.close();
126126
}
127127

128128
final List<RecordField> recordFields = Arrays.asList(
@@ -202,18 +202,16 @@ void testMissingField() throws InitializationException, SQLException {
202202
// Create the table
203203
final Connection con = dbcpService.getConnection();
204204
final Statement stmt = con.createStatement();
205-
try {
206-
stmt.execute("drop table TESTTABLE");
207-
} catch (final SQLException ignored) {
208-
// Ignore, usually due to Derby not having DROP TABLE IF EXISTS
209-
}
210-
try {
205+
try (stmt) {
206+
try {
207+
stmt.execute("drop table TESTTABLE");
208+
} catch (final SQLException ignored) {
209+
// Ignore, usually due to Derby not having DROP TABLE IF EXISTS
210+
}
211211
stmt.executeUpdate("CREATE TABLE testTable (field1 integer, field2 varchar(20) not null)");
212-
} finally {
213-
stmt.close();
214212
}
215213

216-
final List<RecordField> recordFields = Arrays.asList(
214+
final List<RecordField> recordFields = List.of(
217215
new RecordField("field1", RecordFieldType.INT.getDataType())
218216
);
219217
final RecordSchema recordSchema = new SimpleRecordSchema(recordFields);
@@ -236,15 +234,13 @@ void testMissingColumn() throws InitializationException, SQLException {
236234
// Create the table
237235
final Connection con = dbcpService.getConnection();
238236
final Statement stmt = con.createStatement();
239-
try {
240-
stmt.execute("drop table TESTTABLE");
241-
} catch (final SQLException ignored) {
242-
// Ignore, usually due to Derby not having DROP TABLE IF EXISTS
243-
}
244-
try {
237+
try (stmt) {
238+
try {
239+
stmt.execute("drop table TESTTABLE");
240+
} catch (final SQLException ignored) {
241+
// Ignore, usually due to Derby not having DROP TABLE IF EXISTS
242+
}
245243
stmt.executeUpdate("CREATE TABLE testTable (field1 integer, field2 varchar(20))");
246-
} finally {
247-
stmt.close();
248244
}
249245

250246
final List<RecordField> recordFields = Arrays.asList(
@@ -262,6 +258,33 @@ void testMissingColumn() throws InitializationException, SQLException {
262258
"Should have generated an exception for field not present");
263259
}
264260

261+
@Test
262+
void testMigrateProperties() {
263+
final Map<String, String> expectedRenamed = Map.ofEntries(
264+
Map.entry("db-record-sink-dcbp-service", DatabaseRecordSink.DBCP_SERVICE.getName()),
265+
Map.entry("db-record-sink-catalog-name", DatabaseRecordSink.CATALOG_NAME.getName()),
266+
Map.entry("db-record-sink-schema-name", DatabaseRecordSink.SCHEMA_NAME.getName()),
267+
Map.entry("db-record-sink-table-name", DatabaseRecordSink.TABLE_NAME.getName()),
268+
Map.entry("db-record-sink-translate-field-names", DatabaseRecordSink.TRANSLATE_FIELD_NAMES.getName()),
269+
Map.entry("db-record-sink-unmatched-field-behavior", DatabaseRecordSink.UNMATCHED_FIELD_BEHAVIOR.getName()),
270+
Map.entry("db-record-sink-unmatched-column-behavior", DatabaseRecordSink.UNMATCHED_COLUMN_BEHAVIOR.getName()),
271+
Map.entry("db-record-sink-quoted-identifiers", DatabaseRecordSink.QUOTED_IDENTIFIERS.getName()),
272+
Map.entry("db-record-sink-quoted-table-identifiers", DatabaseRecordSink.QUOTED_TABLE_IDENTIFIER.getName()),
273+
Map.entry("db-record-sink-query-timeout", DatabaseRecordSink.QUERY_TIMEOUT.getName()),
274+
Map.entry("record-sink-record-writer", RecordSinkService.RECORD_WRITER_FACTORY.getName())
275+
);
276+
277+
final Map<String, String> propertyValues = Map.of();
278+
final MockPropertyConfiguration configuration = new MockPropertyConfiguration(propertyValues);
279+
final DatabaseRecordSink databaseRecordSink = new DatabaseRecordSink();
280+
databaseRecordSink.migrateProperties(configuration);
281+
282+
final PropertyMigrationResult result = configuration.toPropertyMigrationResult();
283+
final Map<String, String> propertiesRenamed = result.getPropertiesRenamed();
284+
285+
assertEquals(expectedRenamed, propertiesRenamed);
286+
}
287+
265288
private DatabaseRecordSink initTask(String tableName) throws InitializationException {
266289
final ComponentLog logger = mock(ComponentLog.class);
267290
final DatabaseRecordSink task = new DatabaseRecordSink();

nifi-extension-bundles/nifi-standard-services/nifi-dbcp-service-bundle/nifi-hikari-dbcp-service/src/test/java/org/apache/nifi/dbcp/HikariCPConnectionPoolTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import org.apache.nifi.util.ControllerServiceConfiguration;
2222
import org.apache.nifi.util.MockConfigurationContext;
2323
import org.apache.nifi.util.MockProcessContext;
24+
import org.apache.nifi.util.MockPropertyConfiguration;
2425
import org.apache.nifi.util.NoOpProcessor;
26+
import org.apache.nifi.util.PropertyMigrationResult;
2527
import org.apache.nifi.util.TestRunner;
2628
import org.apache.nifi.util.TestRunners;
2729
import org.junit.jupiter.api.Assertions;
@@ -34,6 +36,7 @@
3436
import java.util.Collections;
3537
import java.util.Iterator;
3638
import java.util.List;
39+
import java.util.Map;
3740

3841
import static org.junit.jupiter.api.Assertions.assertEquals;
3942
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -208,4 +211,31 @@ private void assertOutcomeSuccessful(final List<ConfigVerificationResult> result
208211

209212
assertFalse(resultsFound.hasNext());
210213
}
214+
215+
@Test
216+
void testMigrateProperties() {
217+
final Map<String, String> expectedRenamed = Map.ofEntries(
218+
Map.entry("hikaricp-connection-url", HikariCPConnectionPool.DATABASE_URL.getName()),
219+
Map.entry("hikaricp-driver-classname", HikariCPConnectionPool.DB_DRIVERNAME.getName()),
220+
Map.entry("hikaricp-driver-locations", HikariCPConnectionPool.DB_DRIVER_LOCATION.getName()),
221+
Map.entry("hikaricp-username", HikariCPConnectionPool.DB_USER.getName()),
222+
Map.entry("hikaricp-password", HikariCPConnectionPool.DB_PASSWORD.getName()),
223+
Map.entry("hikaricp-max-wait-time", HikariCPConnectionPool.MAX_WAIT_TIME.getName()),
224+
Map.entry("hikaricp-max-total-conns", HikariCPConnectionPool.MAX_TOTAL_CONNECTIONS.getName()),
225+
Map.entry("hikaricp-validation-query", HikariCPConnectionPool.VALIDATION_QUERY.getName()),
226+
Map.entry("hikaricp-min-idle-conns", HikariCPConnectionPool.MIN_IDLE.getName()),
227+
Map.entry("hikaricp-max-conn-lifetime", HikariCPConnectionPool.MAX_CONN_LIFETIME.getName()),
228+
Map.entry("hikaricp-kerberos-user-service", HikariCPConnectionPool.KERBEROS_USER_SERVICE.getName())
229+
);
230+
231+
final Map<String, String> propertyValues = Map.of();
232+
final MockPropertyConfiguration configuration = new MockPropertyConfiguration(propertyValues);
233+
final HikariCPConnectionPool hikariCPConnectionPool = new HikariCPConnectionPool();
234+
hikariCPConnectionPool.migrateProperties(configuration);
235+
236+
final PropertyMigrationResult result = configuration.toPropertyMigrationResult();
237+
final Map<String, String> propertiesRenamed = result.getPropertiesRenamed();
238+
239+
assertEquals(expectedRenamed, propertiesRenamed);
240+
}
211241
}

nifi-extension-bundles/nifi-standard-services/nifi-file-resource-service-bundle/nifi-file-resource-service/src/test/java/org/apache/nifi/fileresource/service/StandardFileResourceServiceTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import org.apache.nifi.fileresource.service.api.FileResource;
2121
import org.apache.nifi.processor.exception.ProcessException;
2222
import org.apache.nifi.reporting.InitializationException;
23+
import org.apache.nifi.util.MockPropertyConfiguration;
2324
import org.apache.nifi.util.NoOpProcessor;
25+
import org.apache.nifi.util.PropertyMigrationResult;
2426
import org.apache.nifi.util.TestRunner;
2527
import org.apache.nifi.util.TestRunners;
2628
import org.junit.jupiter.api.AfterAll;
@@ -136,6 +138,22 @@ void testNonReadableFile() throws IOException {
136138
assertThrows(ProcessException.class, () -> service.getFileResource(attributes));
137139
}
138140

141+
@Test
142+
void testMigrateProperties() {
143+
final Map<String, String> expectedRenamed = Map.of(
144+
"file-path", StandardFileResourceService.FILE_PATH.getName()
145+
);
146+
147+
final Map<String, String> propertyValues = Map.of();
148+
final MockPropertyConfiguration configuration = new MockPropertyConfiguration(propertyValues);
149+
service.migrateProperties(configuration);
150+
151+
final PropertyMigrationResult result = configuration.toPropertyMigrationResult();
152+
final Map<String, String> propertiesRenamed = result.getPropertiesRenamed();
153+
154+
assertEquals(expectedRenamed, propertiesRenamed);
155+
}
156+
139157
private Path createTestFile(final String filenamePrefix) throws IOException {
140158
final Path filePath = Files.createTempFile(directoryPath, filenamePrefix, "");
141159
Files.write(filePath, TEST_DATA);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package org.apache.nifi.dbcp;
18+
19+
import org.apache.nifi.dbcp.utils.DBCPProperties;
20+
import org.apache.nifi.reporting.InitializationException;
21+
import org.apache.nifi.util.MockPropertyConfiguration;
22+
import org.apache.nifi.util.NoOpProcessor;
23+
import org.apache.nifi.util.PropertyMigrationResult;
24+
import org.apache.nifi.util.TestRunner;
25+
import org.apache.nifi.util.TestRunners;
26+
import org.junit.jupiter.api.Test;
27+
28+
import java.util.Map;
29+
import java.util.Set;
30+
31+
import static org.apache.nifi.dbcp.utils.DBCPProperties.EVICTION_RUN_PERIOD;
32+
import static org.apache.nifi.dbcp.utils.DBCPProperties.KERBEROS_USER_SERVICE;
33+
import static org.apache.nifi.dbcp.utils.DBCPProperties.MAX_CONN_LIFETIME;
34+
import static org.apache.nifi.dbcp.utils.DBCPProperties.MAX_IDLE;
35+
import static org.apache.nifi.dbcp.utils.DBCPProperties.MIN_EVICTABLE_IDLE_TIME;
36+
import static org.apache.nifi.dbcp.utils.DBCPProperties.MIN_IDLE;
37+
import static org.apache.nifi.dbcp.utils.DBCPProperties.SOFT_MIN_EVICTABLE_IDLE_TIME;
38+
import static org.apache.nifi.dbcp.utils.DBCPProperties.VALIDATION_QUERY;
39+
import static org.junit.jupiter.api.Assertions.assertEquals;
40+
41+
public class TestHadoopDBCPConnectionPool {
42+
43+
@Test
44+
void testMigrateProperties() throws InitializationException {
45+
final TestRunner runner = TestRunners.newTestRunner(NoOpProcessor.class);
46+
final HadoopDBCPConnectionPool service = new HadoopDBCPConnectionPool();
47+
runner.addControllerService("hadoopDBCPConnectionPool", service);
48+
49+
final Map<String, String> expectedRenamed = Map.ofEntries(
50+
Map.entry("hadoop-config-resources", HadoopDBCPConnectionPool.HADOOP_CONFIGURATION_RESOURCES.getName()),
51+
Map.entry("database-driver-locations", HadoopDBCPConnectionPool.DB_DRIVER_LOCATION.getName()),
52+
Map.entry("Database Driver Location(s)", HadoopDBCPConnectionPool.DB_DRIVER_LOCATION.getName()),
53+
Map.entry(DBCPProperties.OLD_VALIDATION_QUERY_PROPERTY_NAME, VALIDATION_QUERY.getName()),
54+
Map.entry(DBCPProperties.OLD_MIN_IDLE_PROPERTY_NAME, MIN_IDLE.getName()),
55+
Map.entry(DBCPProperties.OLD_MAX_IDLE_PROPERTY_NAME, MAX_IDLE.getName()),
56+
Map.entry(DBCPProperties.OLD_MAX_CONN_LIFETIME_PROPERTY_NAME, MAX_CONN_LIFETIME.getName()),
57+
Map.entry(DBCPProperties.OLD_EVICTION_RUN_PERIOD_PROPERTY_NAME, EVICTION_RUN_PERIOD.getName()),
58+
Map.entry(DBCPProperties.OLD_MIN_EVICTABLE_IDLE_TIME_PROPERTY_NAME, MIN_EVICTABLE_IDLE_TIME.getName()),
59+
Map.entry(DBCPProperties.OLD_SOFT_MIN_EVICTABLE_IDLE_TIME_PROPERTY_NAME, SOFT_MIN_EVICTABLE_IDLE_TIME.getName()),
60+
Map.entry(DBCPProperties.OLD_KERBEROS_USER_SERVICE_PROPERTY_NAME, KERBEROS_USER_SERVICE.getName())
61+
);
62+
63+
final Map<String, String> propertyValues = Map.of();
64+
final MockPropertyConfiguration configuration = new MockPropertyConfiguration(propertyValues);
65+
service.migrateProperties(configuration);
66+
67+
final PropertyMigrationResult result = configuration.toPropertyMigrationResult();
68+
final Map<String, String> propertiesRenamed = result.getPropertiesRenamed();
69+
70+
assertEquals(expectedRenamed, propertiesRenamed);
71+
72+
final Set<String> expectedRemoved = Set.of(
73+
"Kerberos Principal",
74+
"Kerberos Password",
75+
"Kerberos Keytab",
76+
"kerberos-credentials-service"
77+
);
78+
79+
assertEquals(expectedRemoved, result.getPropertiesRemoved());
80+
}
81+
}

nifi-extension-bundles/nifi-standard-services/nifi-key-service-bundle/nifi-key-service/src/test/java/org/apache/nifi/key/service/StandardPrivateKeyServiceTest.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package org.apache.nifi.key.service;
1818

1919
import org.apache.nifi.reporting.InitializationException;
20+
import org.apache.nifi.util.MockPropertyConfiguration;
2021
import org.apache.nifi.util.NoOpProcessor;
22+
import org.apache.nifi.util.PropertyMigrationResult;
2123
import org.apache.nifi.util.TestRunner;
2224
import org.apache.nifi.util.TestRunners;
2325
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
@@ -35,13 +37,13 @@
3537

3638
import java.io.IOException;
3739
import java.io.StringWriter;
38-
import java.nio.charset.StandardCharsets;
3940
import java.nio.file.Files;
4041
import java.nio.file.Path;
4142
import java.security.KeyPair;
4243
import java.security.KeyPairGenerator;
4344
import java.security.NoSuchAlgorithmException;
4445
import java.security.PrivateKey;
46+
import java.util.Map;
4547
import java.util.UUID;
4648

4749
import static org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8EncryptorBuilder.AES_256_CBC;
@@ -126,6 +128,24 @@ void testGetPrivateKeyEncryptedKey(final String encryptionAlgorithm) throws Exce
126128
assertEquals(generatedPrivateKey, privateKey);
127129
}
128130

131+
@Test
132+
void testMigrateProperties() {
133+
final Map<String, String> expectedRenamed = Map.ofEntries(
134+
Map.entry("key-file", StandardPrivateKeyService.KEY_FILE.getName()),
135+
Map.entry("key", StandardPrivateKeyService.KEY.getName()),
136+
Map.entry("key-password", StandardPrivateKeyService.KEY_PASSWORD.getName())
137+
);
138+
139+
final Map<String, String> propertyValues = Map.of();
140+
final MockPropertyConfiguration configuration = new MockPropertyConfiguration(propertyValues);
141+
service.migrateProperties(configuration);
142+
143+
final PropertyMigrationResult result = configuration.toPropertyMigrationResult();
144+
final Map<String, String> propertiesRenamed = result.getPropertiesRenamed();
145+
146+
assertEquals(expectedRenamed, propertiesRenamed);
147+
}
148+
129149
private static String[] encryptionAlgorithms() {
130150
return new String[] {
131151
AES_256_CBC,
@@ -138,9 +158,7 @@ private Path writeKey(final String encodedPrivateKey) throws IOException {
138158
final Path keyPath = Files.createTempFile(StandardPrivateKeyServiceTest.class.getSimpleName(), RSA_ALGORITHM);
139159
keyPath.toFile().deleteOnExit();
140160

141-
final byte[] keyBytes = encodedPrivateKey.getBytes(StandardCharsets.UTF_8);
142-
143-
Files.write(keyPath, keyBytes);
161+
Files.writeString(keyPath, encodedPrivateKey);
144162
return keyPath;
145163
}
146164

0 commit comments

Comments
 (0)