@@ -63,8 +63,7 @@ public void setUp() {
63
63
s3WriterConfig .setMaxRetries (3 );
64
64
65
65
// Initialize the S3Writer with mock dependencies
66
- s3Writer =
67
- new S3Writer (logStream , s3WriterConfig , mockS3Uploader , tempPath );
66
+ s3Writer = new S3Writer (logStream , s3WriterConfig , mockS3Uploader , tempPath );
68
67
}
69
68
70
69
@ After
@@ -75,62 +74,7 @@ public void tearDown() throws IOException {
75
74
}
76
75
// reset hostname
77
76
SingerUtils .setHostname (SingerUtils .getHostname (), "-" );
78
- }
79
-
80
- @ Test
81
- public void testSanitizeFileName () {
82
- String fullPathPrefix = "/var/logs/app" ;
83
- String expected = "var_logs_app" ;
84
- String result = s3Writer .sanitizeFileName (fullPathPrefix );
85
- assertEquals (expected , result );
86
-
87
- fullPathPrefix = "var/logs/app" ;
88
- expected = "var_logs_app" ;
89
- result = s3Writer .sanitizeFileName (fullPathPrefix );
90
- assertEquals (expected , result );
91
-
92
- fullPathPrefix = "/var/logs/app/" ;
93
- expected = "var_logs_app_" ;
94
- result = s3Writer .sanitizeFileName (fullPathPrefix );
95
- assertEquals (expected , result );
96
-
97
- fullPathPrefix = "/" ;
98
- expected = "" ;
99
- result = s3Writer .sanitizeFileName (fullPathPrefix );
100
- assertEquals (expected , result );
101
-
102
- fullPathPrefix = "" ;
103
- expected = "" ;
104
- result = s3Writer .sanitizeFileName (fullPathPrefix );
105
- assertEquals (expected , result );
106
- }
107
-
108
- @ Test
109
- public void testExtractHostSuffix () {
110
- String hostname = "app-server-12345" ;
111
- String expected = "12345" ;
112
- String result = S3Writer .extractHostSuffix (hostname );
113
- assertEquals (expected , result );
114
-
115
- hostname = "app-12345" ;
116
- expected = "12345" ;
117
- result = S3Writer .extractHostSuffix (hostname );
118
- assertEquals (expected , result );
119
-
120
- hostname = "12345" ;
121
- expected = "12345" ;
122
- result = S3Writer .extractHostSuffix (hostname );
123
- assertEquals (expected , result );
124
-
125
- hostname = "app-server" ;
126
- expected = "server" ;
127
- result = S3Writer .extractHostSuffix (hostname );
128
- assertEquals (expected , result );
129
-
130
- hostname = "" ;
131
- expected = "" ;
132
- result = S3Writer .extractHostSuffix (hostname );
133
- assertEquals (expected , result );
77
+ s3Writer .close ();
134
78
}
135
79
136
80
@ Test
@@ -146,21 +90,8 @@ public void testWriteLogMessageToCommit() throws Exception {
146
90
s3Writer .endCommit (1 , false );
147
91
148
92
// Verify that the messages are written to the buffer file
149
- String
150
- bufferFileNamePrefix =
151
- s3Writer .sanitizeFileName (logStream .getFullPathPrefix ()) + ".buffer." ;
152
- File tmpDir = new File (tempPath );
153
- File bufferFile = null ;
154
- File [] tmpFiles = tmpDir .listFiles ();
155
- boolean bufferFileExists = false ;
156
- for (File file : tmpFiles ) {
157
- if (file .getName ().startsWith (bufferFileNamePrefix )) {
158
- bufferFileExists = true ;
159
- bufferFile = file ;
160
- break ;
161
- }
162
- }
163
- assertTrue (bufferFileExists );
93
+ File bufferFile = new File (tempPath + "/" + s3Writer .getBufferFileName ());
94
+ assertTrue (bufferFile .exists ());
164
95
String content = new String (Files .readAllBytes (bufferFile .toPath ()));
165
96
assertTrue (content .contains ("test message" ));
166
97
}
@@ -210,6 +141,37 @@ public void testUploadIsScheduled() throws Exception {
210
141
verify (mockS3Uploader , atLeastOnce ()).upload (any (S3ObjectUpload .class ));
211
142
}
212
143
144
+ @ Test
145
+ public void testResumeFromExistingBufferFile () throws Exception {
146
+ // Prepare log message
147
+ ByteBuffer messageBuffer = ByteBuffer .wrap ("This is message 1 :" .getBytes ());
148
+ LogMessage logMessage = new LogMessage (messageBuffer );
149
+ LogMessageAndPosition logMessageAndPosition = new LogMessageAndPosition (logMessage , null );
150
+
151
+ // Write log message to commit
152
+ s3Writer .startCommit (false );
153
+ s3Writer .writeLogMessageToCommit (logMessageAndPosition , false );
154
+
155
+ // Create a new S3Writer with the same buffer file and write another message to simulate resuming
156
+ S3Writer
157
+ newS3Writer =
158
+ new S3Writer (logStream , s3WriterConfig , mockS3Uploader , tempPath );
159
+ messageBuffer = ByteBuffer .wrap (" This is message 2" .getBytes ());
160
+ logMessage = new LogMessage (messageBuffer );
161
+ logMessageAndPosition = new LogMessageAndPosition (logMessage , null );
162
+
163
+ // Write log message to commit
164
+ newS3Writer .startCommit (false );
165
+ newS3Writer .writeLogMessageToCommit (logMessageAndPosition , false );
166
+
167
+ // Verify that the messages are written to the buffer file
168
+ File bufferFile = new File (tempPath + "/" + newS3Writer .getBufferFileName ());
169
+ assertTrue (bufferFile .exists ());
170
+ String content = new String (Files .readAllBytes (bufferFile .toPath ()));
171
+ assertTrue (content .contains ("This is message 1 : This is message 2" ));
172
+ newS3Writer .close ();
173
+ }
174
+
213
175
@ Test
214
176
public void testObjectKeyGeneration () {
215
177
// Custom and default tokens used
@@ -223,24 +185,25 @@ public void testObjectKeyGeneration() {
223
185
s3WriterConfig .setBucket ("bucket-name" );
224
186
s3WriterConfig .setFilenamePattern ("(?<namespace>[^-]+)-(?<filename>[^.]+)\\ .(?<index>\\ d+)" );
225
187
s3WriterConfig .setFilenameTokens (Arrays .asList ("namespace" , "filename" , "index" ));
226
- s3Writer =
227
- new S3Writer ( logStream , s3WriterConfig , mockS3Uploader , tempPath );
188
+ s3Writer = new S3Writer ( logStream , s3WriterConfig , mockS3Uploader , tempPath );
189
+
228
190
// Check key prefix
229
191
String [] objectKeyParts = s3Writer .generateS3ObjectKey ().split ("/" );
230
192
assertEquals (4 , objectKeyParts .length );
231
193
assertEquals ("my-path" , objectKeyParts [0 ]);
232
194
assertEquals ("my_namespace" , objectKeyParts [1 ]);
233
195
assertEquals (logStream .getSingerLog ().getSingerLogConfig ().getName (), objectKeyParts [2 ]);
196
+
234
197
// Check last part of object key
235
198
String [] keySuffixParts = objectKeyParts [3 ].split ("\\ ." );
236
199
assertEquals (3 , keySuffixParts .length );
237
200
assertEquals ("test_log-0" , keySuffixParts [0 ]);
238
201
assertNotEquals ("{{S}}" , keySuffixParts [1 ]);
239
202
assertEquals (2 , keySuffixParts [1 ].length ());
203
+
240
204
// Custom tokens provided but filename pattern does not match
241
205
s3WriterConfig .setFilenamePattern ("(?<filename>[^.]+)\\ .(?<index>\\ d+).0" );
242
- s3Writer =
243
- new S3Writer (logStream , s3WriterConfig , mockS3Uploader , tempPath );
206
+ s3Writer = new S3Writer (logStream , s3WriterConfig , mockS3Uploader , tempPath );
244
207
objectKeyParts = s3Writer .generateS3ObjectKey ().split ("/" );
245
208
assertEquals ("%{namespace}" , objectKeyParts [1 ]);
246
209
keySuffixParts = objectKeyParts [3 ].split ("\\ ." );
@@ -280,10 +243,9 @@ public void testClose() throws Exception {
280
243
281
244
// Verify that the buffer file was correctly handled
282
245
String
283
- bufferFileName =
284
- s3Writer .sanitizeFileName (logStream .getFullPathPrefix ()) + ".buffer.log" ;
246
+ bufferFileName = s3Writer .getBufferFileName ();
285
247
File bufferFile = new File (FilenameUtils .concat (tempPath , bufferFileName ));
286
- assertTrue (! bufferFile .exists ());
248
+ assertFalse ( bufferFile .exists ());
287
249
assertEquals (0 , bufferFile .length ());
288
250
verify (mockS3Uploader , atLeastOnce ()).upload (any (S3ObjectUpload .class ));
289
251
}
0 commit comments