1
1
package cromwell .services .metadata .impl
2
2
3
3
import java .sql .{Connection , Timestamp }
4
-
5
4
import akka .actor .ActorRef
6
5
import akka .testkit .{TestFSMRef , TestProbe }
7
6
import cats .data .NonEmptyVector
@@ -19,7 +18,7 @@ import cromwell.services.metadata.MetadataService.{
19
18
}
20
19
import cromwell .services .metadata .impl .MetadataStatisticsRecorder .MetadataStatisticsDisabled
21
20
import cromwell .services .metadata .impl .WriteMetadataActorSpec .BatchSizeCountingWriteMetadataActor
22
- import cromwell .services .metadata .{MetadataEvent , MetadataKey , MetadataValue }
21
+ import cromwell .services .metadata .{MetadataEvent , MetadataInt , MetadataKey , MetadataValue }
23
22
import org .scalatest .concurrent .Eventually
24
23
import org .scalatest .flatspec .AnyFlatSpecLike
25
24
import org .scalatest .matchers .should .Matchers
@@ -178,7 +177,7 @@ class WriteMetadataActorSpec extends TestKitSuite with AnyFlatSpecLike with Matc
178
177
179
178
sanitizedWriteActions.map { writeAction =>
180
179
writeAction.events.map { event =>
181
- if (event.value.getOrElse(fail(" Removed value from metadata event" )).value.matches( " [ \\ x{10000}- \\ x{FFFFF}] " )) {
180
+ if (event.value.getOrElse(fail(" Removed value from metadata event" )).value.contains( " \uD83C\uDF89 " )) {
182
181
fail(" Metadata event contains emoji" )
183
182
}
184
183
@@ -220,7 +219,7 @@ class WriteMetadataActorSpec extends TestKitSuite with AnyFlatSpecLike with Matc
220
219
221
220
sanitizedWriteActions.map { writeAction =>
222
221
writeAction.events.map { event =>
223
- if (event.value.getOrElse(fail(" Removed value from metadata event" )).value.matches( " [ \\ x{10000}- \\ x{FFFFF}] " )) {
222
+ if (event.value.getOrElse(fail(" Removed value from metadata event" )).value.contains( " \uD83C\uDF89 " )) {
224
223
fail(" Metadata event contains emoji" )
225
224
}
226
225
@@ -231,6 +230,90 @@ class WriteMetadataActorSpec extends TestKitSuite with AnyFlatSpecLike with Matc
231
230
}
232
231
}
233
232
233
+ it should s " test sanitize inputs does not modify metadata values whose keys are not included in the keys to clean " in {
234
+ val registry = TestProbe ().ref
235
+ val writeActor =
236
+ TestFSMRef (new BatchSizeCountingWriteMetadataActor (10 , 10 .millis, registry, Int .MaxValue , List (" some_key" )) {
237
+ override val metadataDatabaseInterface = mockDatabaseInterface(100 )
238
+ })
239
+
240
+ def metadataEvent (index : Int , probe : ActorRef ) = PutMetadataActionAndRespond (
241
+ List (
242
+ MetadataEvent (MetadataKey (WorkflowId .randomId(), None , " metadata_key" ), MetadataValue (s " 🎉_ $index" ))
243
+ ),
244
+ probe
245
+ )
246
+
247
+ val probes = (0 until 43 )
248
+ .map { _ =>
249
+ val probe = TestProbe ()
250
+ probe
251
+ }
252
+ .zipWithIndex
253
+ .map { case (probe, index) =>
254
+ probe -> metadataEvent(index, probe.ref)
255
+ }
256
+
257
+ val metadataWriteActions = probes.map(probe => probe._2).toVector
258
+ val metadataWriteActionNE = NonEmptyVector (metadataWriteActions.head, metadataWriteActions.tail)
259
+
260
+ val sanitizedWriteActions = writeActor.underlyingActor.sanitizeInputs(metadataWriteActionNE)
261
+
262
+ sanitizedWriteActions.map { writeAction =>
263
+ writeAction.events.map { event =>
264
+ if (! event.value.getOrElse(fail(" Removed value from metadata event" )).value.contains(" \uD83C\uDF89 " )) {
265
+ fail(" Metadata event was incorrectly sanitized" )
266
+ }
267
+
268
+ if (event.value.getOrElse(fail(" Removed value from metadata event" )).value.contains(" \uFFFD " )) {
269
+ fail(" Incorrectly replaced character in metadata event" )
270
+ }
271
+ }
272
+ }
273
+ }
274
+
275
+ it should s " test sanitize inputs does not modify metadata values that are not strings " in {
276
+ val registry = TestProbe ().ref
277
+ val writeActor =
278
+ TestFSMRef (new BatchSizeCountingWriteMetadataActor (10 , 10 .millis, registry, Int .MaxValue , List (" metadata_key" )) {
279
+ override val metadataDatabaseInterface = mockDatabaseInterface(100 )
280
+ })
281
+
282
+ def metadataEvent (index : Int , probe : ActorRef ) = PutMetadataActionAndRespond (
283
+ List (
284
+ MetadataEvent (MetadataKey (WorkflowId .randomId(), None , " metadata_key" ), MetadataValue (100 ))
285
+ ),
286
+ probe
287
+ )
288
+
289
+ val probes = (0 until 43 )
290
+ .map { _ =>
291
+ val probe = TestProbe ()
292
+ probe
293
+ }
294
+ .zipWithIndex
295
+ .map { case (probe, index) =>
296
+ probe -> metadataEvent(index, probe.ref)
297
+ }
298
+
299
+ val metadataWriteActions = probes.map(probe => probe._2).toVector
300
+ val metadataWriteActionNE = NonEmptyVector (metadataWriteActions.head, metadataWriteActions.tail)
301
+
302
+ val sanitizedWriteActions = writeActor.underlyingActor.sanitizeInputs(metadataWriteActionNE)
303
+
304
+ sanitizedWriteActions.map { writeAction =>
305
+ writeAction.events.map { event =>
306
+ if (! (event.value.getOrElse(fail(" Removed value from metadata event" )).valueType == MetadataInt )) {
307
+ fail(" Changed metadata type" )
308
+ }
309
+
310
+ if (! event.value.getOrElse(fail(" Removed value from metadata event" )).value.equals(" 100" )) {
311
+ fail(" Modified metadata value" )
312
+ }
313
+ }
314
+ }
315
+ }
316
+
234
317
// Mock database interface.
235
318
// A customizable number of failures occur between each success
236
319
def mockDatabaseInterface (failuresBetweenEachSuccess : Int ) = new MetadataSqlDatabase with SqlDatabase {
0 commit comments