Skip to content

Commit 74824b3

Browse files
authored
Null path prefix handling (#6101)
Signed-off-by: Santhosh Gandhe <[email protected]>
1 parent 79cb4e2 commit 74824b3

File tree

4 files changed

+50
-4
lines changed

4 files changed

+50
-4
lines changed

data-prepper-plugins/s3-sink/src/main/java/org/opensearch/dataprepper/plugins/sink/s3/KeyGenerator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public KeyGenerator(final S3SinkConfig s3SinkConfig,
3535
*/
3636
public String generateKeyForEvent(final Event event) {
3737
final String pathPrefix = s3BucketSelector != null ? s3BucketSelector.getPathPrefix() : ObjectKey.buildingPathPrefix(s3SinkConfig, event, expressionEvaluator);
38+
final String safePathPrefix = pathPrefix != null ? pathPrefix : "";
3839
final String namePattern = ObjectKey.objectFileName(s3SinkConfig, extensionProvider.getExtension(), event, expressionEvaluator);
39-
return (!pathPrefix.isEmpty()) ? pathPrefix + namePattern : namePattern;
40+
return (!safePathPrefix.isEmpty()) ? safePathPrefix + namePattern : namePattern;
4041
}
4142
}

data-prepper-plugins/s3-sink/src/main/java/org/opensearch/dataprepper/plugins/sink/s3/accumulator/ObjectKey.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55

66
package org.opensearch.dataprepper.plugins.sink.s3.accumulator;
77

8-
import java.util.regex.Pattern;
9-
108
import org.opensearch.dataprepper.expression.ExpressionEvaluator;
119
import org.opensearch.dataprepper.model.event.Event;
1210
import org.opensearch.dataprepper.plugins.s3keyindex.S3ObjectIndexUtility;
1311
import org.opensearch.dataprepper.plugins.sink.s3.S3SinkConfig;
1412
import org.slf4j.Logger;
1513
import org.slf4j.LoggerFactory;
1614

15+
import java.util.regex.Pattern;
16+
1717
/**
1818
* Building the path prefix and name pattern.
1919
*
@@ -49,6 +49,9 @@ private static String buildingPathPrefixInternal(final S3SinkConfig s3SinkConfig
4949
final Event event,
5050
final ExpressionEvaluator expressionEvaluator) {
5151
String pathPrefix = s3SinkConfig.getObjectKeyOptions().getPathPrefix();
52+
if (pathPrefix == null) {
53+
return "";
54+
}
5255
String pathPrefixExpressionResult = expressionEvaluator != null ? event.formatString(pathPrefix, expressionEvaluator, REPLACEMENT_FOR_NON_EXISTENT_KEYS) : pathPrefix;
5356
StringBuilder s3ObjectPath = new StringBuilder();
5457
if (pathPrefixExpressionResult != null && !pathPrefixExpressionResult.isEmpty()) {

data-prepper-plugins/s3-sink/src/test/java/org/opensearch/dataprepper/plugins/sink/s3/KeyGeneratorTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import org.junit.jupiter.api.BeforeEach;
1010
import org.junit.jupiter.api.Test;
1111
import org.junit.jupiter.api.extension.ExtendWith;
12+
import org.junit.jupiter.params.ParameterizedTest;
13+
import org.junit.jupiter.params.provider.NullAndEmptySource;
1214
import org.mockito.Mock;
1315
import org.mockito.MockedStatic;
1416
import org.mockito.junit.jupiter.MockitoExtension;
@@ -149,4 +151,26 @@ void generateKey_with_extension_with_bucketSelector() {
149151
}
150152

151153
}
154+
155+
@ParameterizedTest
156+
@NullAndEmptySource
157+
void test_generateKey_with_null_or_empty_pathPrefix_from_bucketSelector(String pathPrefix) {
158+
final String objectName = UUID.randomUUID().toString();
159+
when(extensionProvider.getExtension()).thenReturn(null);
160+
161+
S3BucketSelector s3BucketSelector = mock(S3BucketSelector.class);
162+
when(s3BucketSelector.getPathPrefix()).thenReturn(pathPrefix);
163+
final KeyGenerator objectUnderTest = createObjectUnderTest(s3BucketSelector);
164+
165+
final Event event = mock(Event.class);
166+
167+
try (final MockedStatic<ObjectKey> objectKeyMockedStatic = mockStatic(ObjectKey.class)) {
168+
objectKeyMockedStatic.when(() -> ObjectKey.objectFileName(s3SinkConfig, null, event, expressionEvaluator))
169+
.thenReturn(objectName);
170+
171+
String key = objectUnderTest.generateKeyForEvent(event);
172+
assertThat(key, notNullValue());
173+
assertThat(key, equalTo(objectName));
174+
}
175+
}
152176
}

data-prepper-plugins/s3-sink/src/test/java/org/opensearch/dataprepper/plugins/sink/s3/accumulator/ObjectKeyTest.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
import org.junit.jupiter.api.BeforeEach;
1010
import org.junit.jupiter.api.Test;
1111
import org.junit.jupiter.api.extension.ExtendWith;
12+
import org.junit.jupiter.params.ParameterizedTest;
13+
import org.junit.jupiter.params.provider.NullAndEmptySource;
1214
import org.mockito.Mock;
1315
import org.mockito.junit.jupiter.MockitoExtension;
1416
import org.opensearch.dataprepper.expression.ExpressionEvaluator;
1517
import org.opensearch.dataprepper.model.event.Event;
18+
import org.opensearch.dataprepper.model.event.JacksonEvent;
1619
import org.opensearch.dataprepper.plugins.sink.s3.S3SinkConfig;
1720
import org.opensearch.dataprepper.plugins.sink.s3.configuration.ObjectKeyOptions;
1821

@@ -36,7 +39,7 @@ class ObjectKeyTest {
3639
private Event event;
3740

3841
@BeforeEach
39-
void setUp() throws Exception {
42+
void setUp() {
4043
when(s3SinkConfig.getObjectKeyOptions()).thenReturn(objectKeyOptions);
4144
}
4245

@@ -85,4 +88,19 @@ void test_objectFileName_default_fileExtension() {
8588
Assertions.assertNotNull(objectFileName);
8689
Assertions.assertTrue(objectFileName.contains(".json"));
8790
}
91+
92+
@ParameterizedTest
93+
@NullAndEmptySource
94+
void test_buildingPathPrefix_with_null_formatString_result(final String pathPrefix) {
95+
when(objectKeyOptions.getPathPrefix()).thenReturn(pathPrefix);
96+
Event event = JacksonEvent.builder()
97+
.withData("{}")
98+
.withEventType("event")
99+
.build();
100+
Assertions.assertDoesNotThrow(() -> {
101+
String pathPrefixResult = ObjectKey.buildingPathPrefix(s3SinkConfig, event, expressionEvaluator);
102+
Assertions.assertEquals("", pathPrefixResult);
103+
});
104+
}
105+
88106
}

0 commit comments

Comments
 (0)