@aws-solutions-constructs/aws-sqs-pipes-stepfunctions 2.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/.eslintignore +7 -0
  2. package/.jsii +4457 -0
  3. package/README.md +100 -0
  4. package/architecture.png +0 -0
  5. package/integ.config.json +0 -0
  6. package/lib/index.d.ts +140 -0
  7. package/lib/index.js +77 -0
  8. package/package.json +96 -0
  9. package/test/integ.sqspstp-custom-log-level.d.ts +13 -0
  10. package/test/integ.sqspstp-custom-log-level.js +33 -0
  11. package/test/integ.sqspstp-custom-log-level.js.snapshot/cdk.out +1 -0
  12. package/test/integ.sqspstp-custom-log-level.js.snapshot/integ.json +12 -0
  13. package/test/integ.sqspstp-custom-log-level.js.snapshot/manifest.json +205 -0
  14. package/test/integ.sqspstp-custom-log-level.js.snapshot/sqspstp-custom-log-level.assets.json +19 -0
  15. package/test/integ.sqspstp-custom-log-level.js.snapshot/sqspstp-custom-log-level.template.json +654 -0
  16. package/test/integ.sqspstp-custom-log-level.js.snapshot/sqspstpcustomloglevelIntegDefaultTestDeployAssertD542618D.assets.json +19 -0
  17. package/test/integ.sqspstp-custom-log-level.js.snapshot/sqspstpcustomloglevelIntegDefaultTestDeployAssertD542618D.template.json +36 -0
  18. package/test/integ.sqspstp-custom-log-level.js.snapshot/tree.json +957 -0
  19. package/test/integ.sqspstp-existing-queue.d.ts +13 -0
  20. package/test/integ.sqspstp-existing-queue.js +35 -0
  21. package/test/integ.sqspstp-existing-queue.js.snapshot/cdk.out +1 -0
  22. package/test/integ.sqspstp-existing-queue.js.snapshot/integ.json +12 -0
  23. package/test/integ.sqspstp-existing-queue.js.snapshot/manifest.json +205 -0
  24. package/test/integ.sqspstp-existing-queue.js.snapshot/sqspstp-existing-queue.assets.json +19 -0
  25. package/test/integ.sqspstp-existing-queue.js.snapshot/sqspstp-existing-queue.template.json +654 -0
  26. package/test/integ.sqspstp-existing-queue.js.snapshot/sqspstpexistingqueueIntegDefaultTestDeployAssert6DA9FDD7.assets.json +19 -0
  27. package/test/integ.sqspstp-existing-queue.js.snapshot/sqspstpexistingqueueIntegDefaultTestDeployAssert6DA9FDD7.template.json +36 -0
  28. package/test/integ.sqspstp-existing-queue.js.snapshot/tree.json +957 -0
  29. package/test/integ.sqspstp-filter.d.ts +13 -0
  30. package/test/integ.sqspstp-filter.js +44 -0
  31. package/test/integ.sqspstp-filter.js.snapshot/cdk.out +1 -0
  32. package/test/integ.sqspstp-filter.js.snapshot/integ.json +12 -0
  33. package/test/integ.sqspstp-filter.js.snapshot/manifest.json +205 -0
  34. package/test/integ.sqspstp-filter.js.snapshot/sqspstp-filter.assets.json +19 -0
  35. package/test/integ.sqspstp-filter.js.snapshot/sqspstp-filter.template.json +662 -0
  36. package/test/integ.sqspstp-filter.js.snapshot/sqspstpfilterIntegDefaultTestDeployAssert0C52837E.assets.json +19 -0
  37. package/test/integ.sqspstp-filter.js.snapshot/sqspstpfilterIntegDefaultTestDeployAssert0C52837E.template.json +36 -0
  38. package/test/integ.sqspstp-filter.js.snapshot/tree.json +965 -0
  39. package/test/integ.sqspstp-lambda-function-enrichment.d.ts +13 -0
  40. package/test/integ.sqspstp-lambda-function-enrichment.js +40 -0
  41. package/test/integ.sqspstp-lambda-function-enrichment.js.snapshot/asset.33adcab38bd8c4e154734b436a40ee81920a89cd6c787ce62302c33df5e1dfcb/index.js +9 -0
  42. package/test/integ.sqspstp-lambda-function-enrichment.js.snapshot/cdk.out +1 -0
  43. package/test/integ.sqspstp-lambda-function-enrichment.js.snapshot/integ.json +12 -0
  44. package/test/integ.sqspstp-lambda-function-enrichment.js.snapshot/manifest.json +223 -0
  45. package/test/integ.sqspstp-lambda-function-enrichment.js.snapshot/sqspstp-lambda-function-enrichment.assets.json +32 -0
  46. package/test/integ.sqspstp-lambda-function-enrichment.js.snapshot/sqspstp-lambda-function-enrichment.template.json +757 -0
  47. package/test/integ.sqspstp-lambda-function-enrichment.js.snapshot/sqspstplambdafunctionenrichmentIntegDefaultTestDeployAssert1F2A8125.assets.json +19 -0
  48. package/test/integ.sqspstp-lambda-function-enrichment.js.snapshot/sqspstplambdafunctionenrichmentIntegDefaultTestDeployAssert1F2A8125.template.json +36 -0
  49. package/test/integ.sqspstp-lambda-function-enrichment.js.snapshot/tree.json +1127 -0
  50. package/test/integ.sqspstp-logs-off.d.ts +13 -0
  51. package/test/integ.sqspstp-logs-off.js +33 -0
  52. package/test/integ.sqspstp-logs-off.js.snapshot/cdk.out +1 -0
  53. package/test/integ.sqspstp-logs-off.js.snapshot/integ.json +12 -0
  54. package/test/integ.sqspstp-logs-off.js.snapshot/manifest.json +199 -0
  55. package/test/integ.sqspstp-logs-off.js.snapshot/sqspstp-logs-off.assets.json +19 -0
  56. package/test/integ.sqspstp-logs-off.js.snapshot/sqspstp-logs-off.template.json +601 -0
  57. package/test/integ.sqspstp-logs-off.js.snapshot/sqspstplogsoffIntegDefaultTestDeployAssert25C29ACD.assets.json +19 -0
  58. package/test/integ.sqspstp-logs-off.js.snapshot/sqspstplogsoffIntegDefaultTestDeployAssert25C29ACD.template.json +36 -0
  59. package/test/integ.sqspstp-logs-off.js.snapshot/tree.json +902 -0
  60. package/test/integ.sqspstp-no-arguments.d.ts +13 -0
  61. package/test/integ.sqspstp-no-arguments.js +32 -0
  62. package/test/integ.sqspstp-no-arguments.js.snapshot/cdk.out +1 -0
  63. package/test/integ.sqspstp-no-arguments.js.snapshot/integ.json +12 -0
  64. package/test/integ.sqspstp-no-arguments.js.snapshot/manifest.json +205 -0
  65. package/test/integ.sqspstp-no-arguments.js.snapshot/sqspstp-no-arguments.assets.json +19 -0
  66. package/test/integ.sqspstp-no-arguments.js.snapshot/sqspstp-no-arguments.template.json +654 -0
  67. package/test/integ.sqspstp-no-arguments.js.snapshot/sqspstpnoargumentsIntegDefaultTestDeployAssert83953622.assets.json +19 -0
  68. package/test/integ.sqspstp-no-arguments.js.snapshot/sqspstpnoargumentsIntegDefaultTestDeployAssert83953622.template.json +36 -0
  69. package/test/integ.sqspstp-no-arguments.js.snapshot/tree.json +957 -0
  70. package/test/integ.sqspstp-set-queue-batch-size.d.ts +13 -0
  71. package/test/integ.sqspstp-set-queue-batch-size.js +39 -0
  72. package/test/integ.sqspstp-set-queue-batch-size.js.snapshot/cdk.out +1 -0
  73. package/test/integ.sqspstp-set-queue-batch-size.js.snapshot/integ.json +12 -0
  74. package/test/integ.sqspstp-set-queue-batch-size.js.snapshot/manifest.json +205 -0
  75. package/test/integ.sqspstp-set-queue-batch-size.js.snapshot/sqspstp-set-queue-batch-size.assets.json +19 -0
  76. package/test/integ.sqspstp-set-queue-batch-size.js.snapshot/sqspstp-set-queue-batch-size.template.json +658 -0
  77. package/test/integ.sqspstp-set-queue-batch-size.js.snapshot/sqspstpsetqueuebatchsizeIntegDefaultTestDeployAssertA1752E9D.assets.json +19 -0
  78. package/test/integ.sqspstp-set-queue-batch-size.js.snapshot/sqspstpsetqueuebatchsizeIntegDefaultTestDeployAssertA1752E9D.template.json +36 -0
  79. package/test/integ.sqspstp-set-queue-batch-size.js.snapshot/tree.json +961 -0
  80. package/test/integ.sqspstp-state-machine-enrichment.d.ts +13 -0
  81. package/test/integ.sqspstp-state-machine-enrichment.js +39 -0
  82. package/test/integ.sqspstp-state-machine-enrichment.js.snapshot/cdk.out +1 -0
  83. package/test/integ.sqspstp-state-machine-enrichment.js.snapshot/integ.json +12 -0
  84. package/test/integ.sqspstp-state-machine-enrichment.js.snapshot/manifest.json +241 -0
  85. package/test/integ.sqspstp-state-machine-enrichment.js.snapshot/sqspstp-state-machine-enrichment.assets.json +19 -0
  86. package/test/integ.sqspstp-state-machine-enrichment.js.snapshot/sqspstp-state-machine-enrichment.template.json +868 -0
  87. package/test/integ.sqspstp-state-machine-enrichment.js.snapshot/sqspstpstatemachineenrichmentIntegDefaultTestDeployAssert47A5DE6D.assets.json +19 -0
  88. package/test/integ.sqspstp-state-machine-enrichment.js.snapshot/sqspstpstatemachineenrichmentIntegDefaultTestDeployAssert47A5DE6D.template.json +36 -0
  89. package/test/integ.sqspstp-state-machine-enrichment.js.snapshot/tree.json +1252 -0
  90. package/test/lambda/index.js +9 -0
  91. package/test/sqs-pipes-stepfunctions.test.d.ts +13 -0
  92. package/test/sqs-pipes-stepfunctions.test.js +394 -0
@@ -0,0 +1,9 @@
1
+ exports.handler = async (event) => {
2
+ console.log(event);
3
+ const response = event.map((x) =>{
4
+ const body = JSON.parse(x.body);
5
+ body.newAttrib = "content";
6
+ return body;
7
+ });
8
+ return response;
9
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
5
+ * with the License. A copy of the License is located at
6
+ *
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
10
+ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
11
+ * and limitations under the License.
12
+ */
13
+ export {};
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
6
+ * with the License. A copy of the License is located at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
11
+ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
12
+ * and limitations under the License.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
16
+ const lib_1 = require("../lib");
17
+ const assertions_1 = require("aws-cdk-lib/assertions");
18
+ const sqs = require("aws-cdk-lib/aws-sqs");
19
+ const defaults = require("@aws-solutions-constructs/core");
20
+ const lambda = require("aws-cdk-lib/aws-lambda");
21
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
22
+ test('Test default behaviors', () => {
23
+ // Initial Setup
24
+ const stack = new aws_cdk_lib_1.Stack();
25
+ const props = {
26
+ stateMachineProps: {
27
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'pipes-test')
28
+ }
29
+ };
30
+ const construct = new lib_1.SqsToPipesToStepfunctions(stack, 'test-sqs-pipes-states', props);
31
+ const template = assertions_1.Template.fromStack(stack);
32
+ expect(construct.pipe).toBeDefined();
33
+ expect(construct.pipeRole).toBeDefined();
34
+ template.hasResourceProperties('AWS::IAM::Role', {
35
+ AssumeRolePolicyDocument: {
36
+ Statement: [
37
+ {
38
+ Action: "sts:AssumeRole",
39
+ Effect: "Allow",
40
+ Principal: {
41
+ Service: "pipes.amazonaws.com"
42
+ }
43
+ }
44
+ ],
45
+ Version: "2012-10-17"
46
+ },
47
+ Policies: [
48
+ {
49
+ PolicyDocument: {
50
+ Statement: [
51
+ {
52
+ Action: [
53
+ "sqs:ReceiveMessage",
54
+ "sqs:DeleteMessage",
55
+ "sqs:GetQueueAttributes"
56
+ ],
57
+ Effect: "Allow",
58
+ Resource: {
59
+ "Fn::GetAtt": [
60
+ assertions_1.Match.stringLikeRegexp(`testsqspipesstatesqueue.*`),
61
+ "Arn"
62
+ ]
63
+ }
64
+ }
65
+ ],
66
+ Version: "2012-10-17"
67
+ },
68
+ PolicyName: "sourcePolicy"
69
+ },
70
+ {
71
+ PolicyDocument: {
72
+ Statement: [
73
+ {
74
+ Action: "states:StartExecution",
75
+ Effect: "Allow",
76
+ Resource: {
77
+ Ref: assertions_1.Match.stringLikeRegexp(`testsqspipesstatesStateMachine.*`)
78
+ }
79
+ }
80
+ ],
81
+ Version: "2012-10-17"
82
+ },
83
+ PolicyName: "targetPolicy"
84
+ }
85
+ ]
86
+ });
87
+ template.hasResourceProperties('AWS::Pipes::Pipe', {
88
+ Source: {
89
+ "Fn::GetAtt": [
90
+ assertions_1.Match.stringLikeRegexp(`testsqspipesstatesqueue.*`),
91
+ "Arn"
92
+ ]
93
+ },
94
+ Target: {
95
+ Ref: assertions_1.Match.stringLikeRegexp(`testsqspipesstatesStateMachine.*`),
96
+ },
97
+ });
98
+ template.hasResourceProperties('AWS::Pipes::Pipe', {
99
+ LogConfiguration: {
100
+ CloudwatchLogsLogDestination: {
101
+ LogGroupArn: {
102
+ "Fn::GetAtt": [
103
+ assertions_1.Match.stringLikeRegexp(`testsqspipesstatesLogGrouptestsqspipesstates.*`),
104
+ "Arn"
105
+ ]
106
+ }
107
+ },
108
+ Level: "INFO"
109
+ }
110
+ });
111
+ template.hasResourceProperties('AWS::Logs::LogGroup', {
112
+ LogGroupName: {
113
+ "Fn::Join": [
114
+ "",
115
+ [
116
+ assertions_1.Match.stringLikeRegexp('\/aws\/vendedlogs\/pipes\/constructs'),
117
+ {
118
+ "Fn::Select": [
119
+ 2,
120
+ assertions_1.Match.anyValue()
121
+ ]
122
+ }
123
+ ]
124
+ ]
125
+ },
126
+ });
127
+ });
128
+ test('Test queue and state machine aspects of construct', () => {
129
+ // Initial Setup
130
+ const stack = new aws_cdk_lib_1.Stack();
131
+ const props = {
132
+ stateMachineProps: {
133
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'lamstp-test')
134
+ }
135
+ };
136
+ const construct = new lib_1.SqsToPipesToStepfunctions(stack, 'test-sqs-pipes-states', props);
137
+ const template = assertions_1.Template.fromStack(stack);
138
+ expect(construct.sqsQueue).toBeDefined();
139
+ expect(construct.deadLetterQueue).toBeDefined();
140
+ template.resourceCountIs("AWS::SQS::Queue", 2);
141
+ template.hasResourceProperties('AWS::SQS::Queue', {
142
+ KmsMasterKeyId: "alias/aws/sqs"
143
+ });
144
+ const stateMachine = construct.stateMachine;
145
+ expect(stateMachine).toBeDefined();
146
+ const cwAlarm = construct.cloudwatchAlarms;
147
+ expect(cwAlarm).toBeDefined();
148
+ expect(construct.stateMachineLogGroup).toBeDefined();
149
+ });
150
+ test('Test existing queue', () => {
151
+ const stack = new aws_cdk_lib_1.Stack();
152
+ const existingQueue = new sqs.Queue(stack, 'existing-queue', {});
153
+ const props = {
154
+ stateMachineProps: {
155
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'lamstp-test')
156
+ },
157
+ existingQueueObj: existingQueue,
158
+ };
159
+ const construct = new lib_1.SqsToPipesToStepfunctions(stack, 'test-sqs-pipes-states', props);
160
+ expect(construct.sqsQueue.queueArn).toEqual(existingQueue.queueArn);
161
+ });
162
+ test('Test filter', () => {
163
+ // Stack
164
+ const stack = new aws_cdk_lib_1.Stack();
165
+ const testFilterPattern = `{
166
+ "body": {
167
+ "state": ["open"]
168
+ }
169
+ }`;
170
+ const props = {
171
+ stateMachineProps: {
172
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'lamstp-test')
173
+ },
174
+ pipeProps: {
175
+ sourceParameters: {
176
+ filterCriteria: {
177
+ filters: [{ pattern: testFilterPattern }],
178
+ },
179
+ }
180
+ }
181
+ };
182
+ new lib_1.SqsToPipesToStepfunctions(stack, 'test-sqs-pipes-states', props);
183
+ const template = assertions_1.Template.fromStack(stack);
184
+ template.hasResourceProperties('AWS::Pipes::Pipe', {
185
+ SourceParameters: {
186
+ FilterCriteria: {
187
+ Filters: [
188
+ {
189
+ Pattern: testFilterPattern
190
+ }
191
+ ]
192
+ }
193
+ }
194
+ });
195
+ });
196
+ test('Test target parameters?', () => {
197
+ const testMessageGroupId = "test-id";
198
+ // Stack
199
+ const stack = new aws_cdk_lib_1.Stack();
200
+ const props = {
201
+ stateMachineProps: {
202
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'lamstp-test')
203
+ },
204
+ pipeProps: {
205
+ // We realize that this would not launch because the target is not
206
+ // a queue, but it tests the functionality
207
+ targetParameters: {
208
+ sqsQueueParameters: {
209
+ messageGroupId: testMessageGroupId,
210
+ }
211
+ }
212
+ }
213
+ };
214
+ new lib_1.SqsToPipesToStepfunctions(stack, 'test-sqs-pipes-states', props);
215
+ const template = assertions_1.Template.fromStack(stack);
216
+ template.hasResourceProperties('AWS::Pipes::Pipe', {
217
+ TargetParameters: {
218
+ SqsQueueParameters: {
219
+ MessageGroupId: testMessageGroupId,
220
+ }
221
+ }
222
+ });
223
+ });
224
+ test('test state machine enrichment', () => {
225
+ const stack = new aws_cdk_lib_1.Stack();
226
+ const enrichmentStateMachine = defaults.CreateTestStateMachine(stack, 'enrichment-state-machine');
227
+ const props = {
228
+ enrichmentStateMachine,
229
+ stateMachineProps: {
230
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'pipes-test')
231
+ }
232
+ };
233
+ const construct = new lib_1.SqsToPipesToStepfunctions(stack, 'test', props);
234
+ expect(construct.pipe).toBeDefined();
235
+ expect(construct.pipeRole).toBeDefined();
236
+ const template = assertions_1.Template.fromStack(stack);
237
+ // Look for additional enrichment permision
238
+ template.hasResourceProperties('AWS::IAM::Policy', {
239
+ PolicyDocument: {
240
+ Statement: [
241
+ {
242
+ Action: "states:StartSyncExecution",
243
+ Effect: "Allow",
244
+ Resource: {
245
+ Ref: assertions_1.Match.stringLikeRegexp('enrichmentstatemachine.*'),
246
+ }
247
+ }
248
+ ],
249
+ Version: "2012-10-17"
250
+ },
251
+ PolicyName: assertions_1.Match.stringLikeRegexp(`testenrichmentpolicytest.*`),
252
+ Roles: [
253
+ {
254
+ Ref: assertions_1.Match.stringLikeRegexp(`testPipeRoletest.*`)
255
+ }
256
+ ]
257
+ });
258
+ template.hasResourceProperties('AWS::Pipes::Pipe', {
259
+ Enrichment: {
260
+ Ref: assertions_1.Match.stringLikeRegexp("enrichmentstatemachine.*")
261
+ },
262
+ });
263
+ });
264
+ test('Test lambda function enrichment', () => {
265
+ const stack = new aws_cdk_lib_1.Stack();
266
+ const enrichmentFunction = new lambda.Function(stack, 'enrichment-function', {
267
+ runtime: lambda.Runtime.NODEJS_20_X,
268
+ handler: 'index.handler',
269
+ code: lambda.Code.fromInline(`exports.handler = async (event) => {return;}`)
270
+ });
271
+ const props = {
272
+ stateMachineProps: {
273
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'pipes-test')
274
+ },
275
+ enrichmentFunction
276
+ };
277
+ const construct = new lib_1.SqsToPipesToStepfunctions(stack, 'enrichment-function-test', props);
278
+ const template = assertions_1.Template.fromStack(stack);
279
+ expect(construct.pipe).toBeDefined();
280
+ expect(construct.pipeRole).toBeDefined();
281
+ template.hasResourceProperties('AWS::IAM::Policy', {
282
+ PolicyDocument: {
283
+ Statement: [
284
+ {
285
+ Action: "lambda:InvokeFunction",
286
+ Effect: "Allow",
287
+ Resource: {
288
+ "Fn::GetAtt": [
289
+ assertions_1.Match.stringLikeRegexp('enrichmentfunction.*'),
290
+ "Arn"
291
+ ]
292
+ }
293
+ }
294
+ ],
295
+ Version: "2012-10-17"
296
+ },
297
+ PolicyName: assertions_1.Match.stringLikeRegexp(`enrichmentfunctiontestenrichmentpolicyenrichmentfunctiontest.*`),
298
+ Roles: [
299
+ {
300
+ Ref: assertions_1.Match.stringLikeRegexp(`enrichmentfunctiontestPipeRoleenrichmentfunctiontest.*`)
301
+ }
302
+ ]
303
+ });
304
+ template.hasResourceProperties('AWS::Pipes::Pipe', {
305
+ Enrichment: {
306
+ "Fn::GetAtt": [
307
+ assertions_1.Match.stringLikeRegexp("enrichmentfunction.*"),
308
+ "Arn"
309
+ ]
310
+ },
311
+ });
312
+ });
313
+ test('Test custom log level', () => {
314
+ const stack = new aws_cdk_lib_1.Stack();
315
+ const props = {
316
+ stateMachineProps: {
317
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'pipes-test')
318
+ },
319
+ logLevel: defaults.PipesLogLevel.TRACE
320
+ };
321
+ const construct = new lib_1.SqsToPipesToStepfunctions(stack, 'test-sqs-pipes-states', props);
322
+ const template = assertions_1.Template.fromStack(stack);
323
+ expect(construct.pipe).toBeDefined();
324
+ expect(construct.pipeRole).toBeDefined();
325
+ template.hasResourceProperties('AWS::Pipes::Pipe', {
326
+ LogConfiguration: {
327
+ Level: "TRACE",
328
+ }
329
+ });
330
+ });
331
+ test('Test log level OFF', () => {
332
+ const stack = new aws_cdk_lib_1.Stack();
333
+ const props = {
334
+ stateMachineProps: {
335
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'pipes-test')
336
+ },
337
+ logLevel: defaults.PipesLogLevel.OFF
338
+ };
339
+ const construct = new lib_1.SqsToPipesToStepfunctions(stack, 'test-sqs-pipes-states', props);
340
+ const template = assertions_1.Template.fromStack(stack);
341
+ expect(construct.pipe).toBeDefined();
342
+ expect(construct.pipeRole).toBeDefined();
343
+ // Should be no LogConfiguration
344
+ template.resourcePropertiesCountIs('AWS::Pipes::Pipe', { LogConfiguration: {} }, 0);
345
+ // One log group for the state machine, none for the pipe
346
+ template.resourceCountIs('AWS::Logs::LogGroup', 1);
347
+ });
348
+ test('Test custom pipe log props', () => {
349
+ const testRetention = aws_logs_1.RetentionDays.FOUR_MONTHS;
350
+ const stack = new aws_cdk_lib_1.Stack();
351
+ const props = {
352
+ stateMachineProps: {
353
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'pipes-test')
354
+ },
355
+ pipeLogProps: {
356
+ retention: testRetention
357
+ }
358
+ };
359
+ const construct = new lib_1.SqsToPipesToStepfunctions(stack, 'test-sqs-pipes-states', props);
360
+ const template = assertions_1.Template.fromStack(stack);
361
+ expect(construct.pipe).toBeDefined();
362
+ expect(construct.pipeRole).toBeDefined();
363
+ template.hasResourceProperties('AWS::Logs::LogGroup', {
364
+ RetentionInDays: 120,
365
+ });
366
+ });
367
+ test('Test setting source parameters like batchSize', () => {
368
+ const testBatchSize = 123;
369
+ const stack = new aws_cdk_lib_1.Stack();
370
+ const props = {
371
+ stateMachineProps: {
372
+ definitionBody: defaults.CreateTestStateMachineDefinitionBody(stack, 'pipes-test')
373
+ },
374
+ pipeProps: {
375
+ sourceParameters: {
376
+ sqsQueueParameters: {
377
+ batchSize: testBatchSize,
378
+ },
379
+ }
380
+ }
381
+ };
382
+ const construct = new lib_1.SqsToPipesToStepfunctions(stack, 'test-sqs-pipes-states', props);
383
+ const template = assertions_1.Template.fromStack(stack);
384
+ expect(construct.pipe).toBeDefined();
385
+ expect(construct.pipeRole).toBeDefined();
386
+ template.hasResourceProperties('AWS::Pipes::Pipe', {
387
+ SourceParameters: {
388
+ SqsQueueParameters: {
389
+ BatchSize: testBatchSize,
390
+ }
391
+ }
392
+ });
393
+ });
394
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FzLXBpcGVzLXN0ZXBmdW5jdGlvbnMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNxcy1waXBlcy1zdGVwZnVuY3Rpb25zLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7OztHQVdHOztBQUVILDZDQUFvQztBQUNwQyxnQ0FBbUY7QUFDbkYsdURBQXlEO0FBQ3pELDJDQUEyQztBQUMzQywyREFBMkQ7QUFDM0QsaURBQWlEO0FBQ2pELG1EQUFxRDtBQUVyRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLGdCQUFnQjtJQUNoQixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLEVBQUUsQ0FBQztJQUMxQixNQUFNLEtBQUssR0FBbUM7UUFDNUMsaUJBQWlCLEVBQUU7WUFDakIsY0FBYyxFQUFFLFFBQVEsQ0FBQyxvQ0FBb0MsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1NBQ25GO0tBQ0YsQ0FBQztJQUNGLE1BQU0sU0FBUyxHQUFHLElBQUksK0JBQXlCLENBQUMsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZGLE1BQU0sUUFBUSxHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTNDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUV6QyxRQUFRLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLEVBQUU7UUFDL0Msd0JBQXdCLEVBQUU7WUFDeEIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE1BQU0sRUFBRSxnQkFBZ0I7b0JBQ3hCLE1BQU0sRUFBRSxPQUFPO29CQUNmLFNBQVMsRUFBRTt3QkFDVCxPQUFPLEVBQUUscUJBQXFCO3FCQUMvQjtpQkFDRjthQUNGO1lBQ0QsT0FBTyxFQUFFLFlB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QUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFtQztRQUM1QyxpQkFBaUIsRUFBRTtZQUNqQixjQUFjLEVBQUUsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUM7U0FDbkY7UUFDRCxTQUFTLEVBQUU7WUFDVCxnQkFBZ0IsRUFBRTtnQkFDaEIsa0JBQWtCLEVBQUU7b0JBQ2xCLFNBQVMsRUFBRSxhQUFhO2lCQUN6QjthQUNGO1NBQ0Y7S0FDRixDQUFDO0lBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkYsTUFBTSxRQUFRLEdBQUcscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3pDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRTtRQUNqRCxnQkFBZ0IsRUFBRTtZQUNoQixrQkFBa0IsRUFBRTtnQkFDbEIsU0FBUyxFQUFFLGFBQWE7YUFDekI7U0FDRjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIikuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqICB3aXRoIHRoZSBMaWNlbnNlLiBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgbG9jYXRlZCBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIG9yIGluIHRoZSAnbGljZW5zZScgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcyBmaWxlLiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTXG4gKiAgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbiAqICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IFNxc1RvUGlwZXNUb1N0ZXBmdW5jdGlvbnMsIFNxc1RvUGlwZXNUb1N0ZXBmdW5jdGlvbnNQcm9wcyB9IGZyb20gXCIuLi9saWJcIjtcbmltcG9ydCB7IE1hdGNoLCBUZW1wbGF0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuaW1wb3J0ICogYXMgc3FzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zcXMnO1xuaW1wb3J0ICogYXMgZGVmYXVsdHMgZnJvbSAnQGF3cy1zb2x1dGlvbnMtY29uc3RydWN0cy9jb3JlJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcblxudGVzdCgnVGVzdCBkZWZhdWx0IGJlaGF2aW9ycycsICgpID0+IHtcbiAgLy8gSW5pdGlhbCBTZXR1cFxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICBjb25zdCBwcm9wczogU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9uc1Byb3BzID0ge1xuICAgIHN0YXRlTWFjaGluZVByb3BzOiB7XG4gICAgICBkZWZpbml0aW9uQm9keTogZGVmYXVsdHMuQ3JlYXRlVGVzdFN0YXRlTWFjaGluZURlZmluaXRpb25Cb2R5KHN0YWNrLCAncGlwZXMtdGVzdCcpXG4gICAgfVxuICB9O1xuICBjb25zdCBjb25zdHJ1Y3QgPSBuZXcgU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9ucyhzdGFjaywgJ3Rlc3Qtc3FzLXBpcGVzLXN0YXRlcycsIHByb3BzKTtcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIGV4cGVjdChjb25zdHJ1Y3QucGlwZSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbnN0cnVjdC5waXBlUm9sZSkudG9CZURlZmluZWQoKTtcblxuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xuICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBBY3Rpb246IFwic3RzOkFzc3VtZVJvbGVcIixcbiAgICAgICAgICBFZmZlY3Q6IFwiQWxsb3dcIixcbiAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgIFNlcnZpY2U6IFwicGlwZXMuYW1hem9uYXdzLmNvbVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgVmVyc2lvbjogXCIyMDEyLTEwLTE3XCJcbiAgICB9LFxuICAgIFBvbGljaWVzOiBbXG4gICAgICB7XG4gICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAgIFwic3FzOlJlY2VpdmVNZXNzYWdlXCIsXG4gICAgICAgICAgICAgICAgXCJzcXM6RGVsZXRlTWVzc2FnZVwiLFxuICAgICAgICAgICAgICAgIFwic3FzOkdldFF1ZXVlQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgICAgICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKGB0ZXN0c3FzcGlwZXNzdGF0ZXNxdWV1ZS4qYCksXG4gICAgICAgICAgICAgICAgICBcIkFyblwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBWZXJzaW9uOiBcIjIwMTItMTAtMTdcIlxuICAgICAgICB9LFxuICAgICAgICBQb2xpY3lOYW1lOiBcInNvdXJjZVBvbGljeVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBBY3Rpb246IFwic3RhdGVzOlN0YXJ0RXhlY3V0aW9uXCIsXG4gICAgICAgICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgICAgICAgICAgICBSZXNvdXJjZToge1xuICAgICAgICAgICAgICAgIFJlZjogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChgdGVzdHNxc3BpcGVzc3RhdGVzU3RhdGVNYWNoaW5lLipgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBWZXJzaW9uOiBcIjIwMTItMTAtMTdcIlxuICAgICAgICB9LFxuICAgICAgICBQb2xpY3lOYW1lOiBcInRhcmdldFBvbGljeVwiXG4gICAgICB9XG4gICAgXVxuICB9KTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlBpcGVzOjpQaXBlJywge1xuICAgIFNvdXJjZToge1xuICAgICAgXCJGbjo6R2V0QXR0XCI6IFtcbiAgICAgICAgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChgdGVzdHNxc3BpcGVzc3RhdGVzcXVldWUuKmApLFxuICAgICAgICBcIkFyblwiXG4gICAgICBdXG4gICAgfSxcbiAgICBUYXJnZXQ6IHtcbiAgICAgIFJlZjogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChgdGVzdHNxc3BpcGVzc3RhdGVzU3RhdGVNYWNoaW5lLipgKSxcbiAgICB9LFxuICB9KTtcblxuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UGlwZXM6OlBpcGUnLCB7XG4gICAgTG9nQ29uZmlndXJhdGlvbjoge1xuICAgICAgQ2xvdWR3YXRjaExvZ3NMb2dEZXN0aW5hdGlvbjoge1xuICAgICAgICBMb2dHcm91cEFybjoge1xuICAgICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKGB0ZXN0c3FzcGlwZXNzdGF0ZXNMb2dHcm91cHRlc3RzcXNwaXBlc3N0YXRlcy4qYCksXG4gICAgICAgICAgICBcIkFyblwiXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgTGV2ZWw6IFwiSU5GT1wiXG4gICAgfVxuICB9KTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxvZ3M6OkxvZ0dyb3VwJywge1xuICAgIExvZ0dyb3VwTmFtZToge1xuICAgICAgXCJGbjo6Sm9pblwiOiBbXG4gICAgICAgIFwiXCIsXG4gICAgICAgIFtcbiAgICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdcXC9hd3NcXC92ZW5kZWRsb2dzXFwvcGlwZXNcXC9jb25zdHJ1Y3RzJyksXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJGbjo6U2VsZWN0XCI6IFtcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgTWF0Y2guYW55VmFsdWUoKVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgXVxuICAgIH0sXG4gIH0pO1xuXG59KTtcblxudGVzdCgnVGVzdCBxdWV1ZSBhbmQgc3RhdGUgbWFjaGluZSBhc3BlY3RzIG9mIGNvbnN0cnVjdCcsICgpID0+IHtcbiAgLy8gSW5pdGlhbCBTZXR1cFxuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICBjb25zdCBwcm9wczogU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9uc1Byb3BzID0ge1xuICAgIHN0YXRlTWFjaGluZVByb3BzOiB7XG4gICAgICBkZWZpbml0aW9uQm9keTogZGVmYXVsdHMuQ3JlYXRlVGVzdFN0YXRlTWFjaGluZURlZmluaXRpb25Cb2R5KHN0YWNrLCAnbGFtc3RwLXRlc3QnKVxuICAgIH1cbiAgfTtcbiAgY29uc3QgY29uc3RydWN0ID0gbmV3IFNxc1RvUGlwZXNUb1N0ZXBmdW5jdGlvbnMoc3RhY2ssICd0ZXN0LXNxcy1waXBlcy1zdGF0ZXMnLCBwcm9wcyk7XG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuICBleHBlY3QoY29uc3RydWN0LnNxc1F1ZXVlKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uc3RydWN0LmRlYWRMZXR0ZXJRdWV1ZSkudG9CZURlZmluZWQoKTtcbiAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKFwiQVdTOjpTUVM6OlF1ZXVlXCIsIDIpO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U1FTOjpRdWV1ZScsIHtcbiAgICBLbXNNYXN0ZXJLZXlJZDogXCJhbGlhcy9hd3Mvc3FzXCJcbiAgfSk7XG5cbiAgY29uc3Qgc3RhdGVNYWNoaW5lID0gY29uc3RydWN0LnN0YXRlTWFjaGluZTtcbiAgZXhwZWN0KHN0YXRlTWFjaGluZSkudG9CZURlZmluZWQoKTtcbiAgY29uc3QgY3dBbGFybSA9IGNvbnN0cnVjdC5jbG91ZHdhdGNoQWxhcm1zO1xuICBleHBlY3QoY3dBbGFybSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbnN0cnVjdC5zdGF0ZU1hY2hpbmVMb2dHcm91cCkudG9CZURlZmluZWQoKTtcbn0pO1xuXG50ZXN0KCdUZXN0IGV4aXN0aW5nIHF1ZXVlJywgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICBjb25zdCBleGlzdGluZ1F1ZXVlID0gbmV3IHNxcy5RdWV1ZShzdGFjaywgJ2V4aXN0aW5nLXF1ZXVlJywge30pO1xuXG4gIGNvbnN0IHByb3BzOiBTcXNUb1BpcGVzVG9TdGVwZnVuY3Rpb25zUHJvcHMgPSB7XG4gICAgc3RhdGVNYWNoaW5lUHJvcHM6IHtcbiAgICAgIGRlZmluaXRpb25Cb2R5OiBkZWZhdWx0cy5DcmVhdGVUZXN0U3RhdGVNYWNoaW5lRGVmaW5pdGlvbkJvZHkoc3RhY2ssICdsYW1zdHAtdGVzdCcpXG4gICAgfSxcbiAgICBleGlzdGluZ1F1ZXVlT2JqOiBleGlzdGluZ1F1ZXVlLFxuICB9O1xuICBjb25zdCBjb25zdHJ1Y3QgPSBuZXcgU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9ucyhzdGFjaywgJ3Rlc3Qtc3FzLXBpcGVzLXN0YXRlcycsIHByb3BzKTtcbiAgZXhwZWN0KGNvbnN0cnVjdC5zcXNRdWV1ZS5xdWV1ZUFybikudG9FcXVhbChleGlzdGluZ1F1ZXVlLnF1ZXVlQXJuKTtcbn0pO1xuXG50ZXN0KCdUZXN0IGZpbHRlcicsICgpID0+IHtcbiAgLy8gU3RhY2tcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgY29uc3QgdGVzdEZpbHRlclBhdHRlcm4gPSBge1xuICAgIFwiYm9keVwiOiB7XG4gICAgICBcInN0YXRlXCI6IFtcIm9wZW5cIl1cbiAgICB9XG4gIH1gO1xuICBjb25zdCBwcm9wczogU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9uc1Byb3BzID0ge1xuICAgIHN0YXRlTWFjaGluZVByb3BzOiB7XG4gICAgICBkZWZpbml0aW9uQm9keTogZGVmYXVsdHMuQ3JlYXRlVGVzdFN0YXRlTWFjaGluZURlZmluaXRpb25Cb2R5KHN0YWNrLCAnbGFtc3RwLXRlc3QnKVxuICAgIH0sXG4gICAgcGlwZVByb3BzOiB7XG4gICAgICBzb3VyY2VQYXJhbWV0ZXJzOiB7XG4gICAgICAgIGZpbHRlckNyaXRlcmlhOiB7XG4gICAgICAgICAgZmlsdGVyczogW3sgcGF0dGVybjogdGVzdEZpbHRlclBhdHRlcm4gfV0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICB9O1xuICBuZXcgU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9ucyhzdGFjaywgJ3Rlc3Qtc3FzLXBpcGVzLXN0YXRlcycsIHByb3BzKTtcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UGlwZXM6OlBpcGUnLCB7XG4gICAgU291cmNlUGFyYW1ldGVyczoge1xuICAgICAgRmlsdGVyQ3JpdGVyaWE6IHtcbiAgICAgICAgRmlsdGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFBhdHRlcm46IHRlc3RGaWx0ZXJQYXR0ZXJuXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfVxuICB9KTtcblxufSk7XG5cbnRlc3QoJ1Rlc3QgdGFyZ2V0IHBhcmFtZXRlcnM/JywgKCkgPT4ge1xuICBjb25zdCB0ZXN0TWVzc2FnZUdyb3VwSWQgPSBcInRlc3QtaWRcIjtcbiAgLy8gU3RhY2tcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgY29uc3QgcHJvcHM6IFNxc1RvUGlwZXNUb1N0ZXBmdW5jdGlvbnNQcm9wcyA9IHtcbiAgICBzdGF0ZU1hY2hpbmVQcm9wczoge1xuICAgICAgZGVmaW5pdGlvbkJvZHk6IGRlZmF1bHRzLkNyZWF0ZVRlc3RTdGF0ZU1hY2hpbmVEZWZpbml0aW9uQm9keShzdGFjaywgJ2xhbXN0cC10ZXN0JylcbiAgICB9LFxuICAgIHBpcGVQcm9wczoge1xuICAgICAgLy8gV2UgcmVhbGl6ZSB0aGF0IHRoaXMgd291bGQgbm90IGxhdW5jaCBiZWNhdXNlIHRoZSB0YXJnZXQgaXMgbm90XG4gICAgICAvLyBhIHF1ZXVlLCBidXQgaXQgdGVzdHMgdGhlIGZ1bmN0aW9uYWxpdHlcbiAgICAgIHRhcmdldFBhcmFtZXRlcnM6IHtcbiAgICAgICAgc3FzUXVldWVQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgbWVzc2FnZUdyb3VwSWQ6IHRlc3RNZXNzYWdlR3JvdXBJZCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgbmV3IFNxc1RvUGlwZXNUb1N0ZXBmdW5jdGlvbnMoc3RhY2ssICd0ZXN0LXNxcy1waXBlcy1zdGF0ZXMnLCBwcm9wcyk7XG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UGlwZXM6OlBpcGUnLCB7XG4gICAgVGFyZ2V0UGFyYW1ldGVyczoge1xuICAgICAgU3FzUXVldWVQYXJhbWV0ZXJzOiB7XG4gICAgICAgIE1lc3NhZ2VHcm91cElkOiB0ZXN0TWVzc2FnZUdyb3VwSWQsXG4gICAgICB9XG4gICAgfVxuICB9KTtcbn0pO1xuXG50ZXN0KCd0ZXN0IHN0YXRlIG1hY2hpbmUgZW5yaWNobWVudCcsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgY29uc3QgZW5yaWNobWVudFN0YXRlTWFjaGluZSA9IGRlZmF1bHRzLkNyZWF0ZVRlc3RTdGF0ZU1hY2hpbmUoc3RhY2ssICdlbnJpY2htZW50LXN0YXRlLW1hY2hpbmUnKTtcbiAgY29uc3QgcHJvcHM6IFNxc1RvUGlwZXNUb1N0ZXBmdW5jdGlvbnNQcm9wcyA9IHtcbiAgICBlbnJpY2htZW50U3RhdGVNYWNoaW5lLFxuICAgIHN0YXRlTWFjaGluZVByb3BzOiB7XG4gICAgICBkZWZpbml0aW9uQm9keTogZGVmYXVsdHMuQ3JlYXRlVGVzdFN0YXRlTWFjaGluZURlZmluaXRpb25Cb2R5KHN0YWNrLCAncGlwZXMtdGVzdCcpXG4gICAgfVxuICB9O1xuICBjb25zdCBjb25zdHJ1Y3QgPSBuZXcgU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9ucyhzdGFjaywgJ3Rlc3QnLCBwcm9wcyk7XG5cbiAgZXhwZWN0KGNvbnN0cnVjdC5waXBlKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uc3RydWN0LnBpcGVSb2xlKS50b0JlRGVmaW5lZCgpO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuICAvLyBMb29rIGZvciBhZGRpdGlvbmFsIGVucmljaG1lbnQgcGVybWlzaW9uXG4gIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlBvbGljeScsIHtcbiAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBBY3Rpb246IFwic3RhdGVzOlN0YXJ0U3luY0V4ZWN1dGlvblwiLFxuICAgICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgICAgICAgIFJlc291cmNlOiB7XG4gICAgICAgICAgICBSZWY6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ2VucmljaG1lbnRzdGF0ZW1hY2hpbmUuKicpLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFZlcnNpb246IFwiMjAxMi0xMC0xN1wiXG4gICAgfSxcbiAgICBQb2xpY3lOYW1lOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKGB0ZXN0ZW5yaWNobWVudHBvbGljeXRlc3QuKmApLFxuICAgIFJvbGVzOiBbXG4gICAgICB7XG4gICAgICAgIFJlZjogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChgdGVzdFBpcGVSb2xldGVzdC4qYClcbiAgICAgIH1cbiAgICBdXG4gIH0pO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UGlwZXM6OlBpcGUnLCB7XG4gICAgRW5yaWNobWVudDoge1xuICAgICAgUmVmOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiZW5yaWNobWVudHN0YXRlbWFjaGluZS4qXCIpXG4gICAgfSxcbiAgfSk7XG59KTtcblxudGVzdCgnVGVzdCBsYW1iZGEgZnVuY3Rpb24gZW5yaWNobWVudCcsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgY29uc3QgZW5yaWNobWVudEZ1bmN0aW9uID0gbmV3IGxhbWJkYS5GdW5jdGlvbihzdGFjaywgJ2VucmljaG1lbnQtZnVuY3Rpb24nLCB7XG4gICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21JbmxpbmUoYGV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIChldmVudCkgPT4ge3JldHVybjt9YClcbiAgfSk7XG5cbiAgY29uc3QgcHJvcHM6IFNxc1RvUGlwZXNUb1N0ZXBmdW5jdGlvbnNQcm9wcyA9IHtcbiAgICBzdGF0ZU1hY2hpbmVQcm9wczoge1xuICAgICAgZGVmaW5pdGlvbkJvZHk6IGRlZmF1bHRzLkNyZWF0ZVRlc3RTdGF0ZU1hY2hpbmVEZWZpbml0aW9uQm9keShzdGFjaywgJ3BpcGVzLXRlc3QnKVxuICAgIH0sXG4gICAgZW5yaWNobWVudEZ1bmN0aW9uXG4gIH07XG4gIGNvbnN0IGNvbnN0cnVjdCA9IG5ldyBTcXNUb1BpcGVzVG9TdGVwZnVuY3Rpb25zKHN0YWNrLCAnZW5yaWNobWVudC1mdW5jdGlvbi10ZXN0JywgcHJvcHMpO1xuICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG5cbiAgZXhwZWN0KGNvbnN0cnVjdC5waXBlKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uc3RydWN0LnBpcGVSb2xlKS50b0JlRGVmaW5lZCgpO1xuXG4gIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlBvbGljeScsIHtcbiAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBBY3Rpb246IFwibGFtYmRhOkludm9rZUZ1bmN0aW9uXCIsXG4gICAgICAgICAgRWZmZWN0OiBcIkFsbG93XCIsXG4gICAgICAgICAgUmVzb3VyY2U6IHtcbiAgICAgICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgICAgIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ2VucmljaG1lbnRmdW5jdGlvbi4qJyksXG4gICAgICAgICAgICAgIFwiQXJuXCJcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBWZXJzaW9uOiBcIjIwMTItMTAtMTdcIlxuICAgIH0sXG4gICAgUG9saWN5TmFtZTogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChgZW5yaWNobWVudGZ1bmN0aW9udGVzdGVucmljaG1lbnRwb2xpY3llbnJpY2htZW50ZnVuY3Rpb250ZXN0LipgKSxcbiAgICBSb2xlczogW1xuICAgICAge1xuICAgICAgICBSZWY6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoYGVucmljaG1lbnRmdW5jdGlvbnRlc3RQaXBlUm9sZWVucmljaG1lbnRmdW5jdGlvbnRlc3QuKmApXG4gICAgICB9XG4gICAgXVxuICB9KTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlBpcGVzOjpQaXBlJywge1xuICAgIEVucmljaG1lbnQ6IHtcbiAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJlbnJpY2htZW50ZnVuY3Rpb24uKlwiKSxcbiAgICAgICAgXCJBcm5cIlxuICAgICAgXVxuICAgIH0sXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Rlc3QgY3VzdG9tIGxvZyBsZXZlbCcsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgY29uc3QgcHJvcHM6IFNxc1RvUGlwZXNUb1N0ZXBmdW5jdGlvbnNQcm9wcyA9IHtcbiAgICBzdGF0ZU1hY2hpbmVQcm9wczoge1xuICAgICAgZGVmaW5pdGlvbkJvZHk6IGRlZmF1bHRzLkNyZWF0ZVRlc3RTdGF0ZU1hY2hpbmVEZWZpbml0aW9uQm9keShzdGFjaywgJ3BpcGVzLXRlc3QnKVxuICAgIH0sXG4gICAgbG9nTGV2ZWw6IGRlZmF1bHRzLlBpcGVzTG9nTGV2ZWwuVFJBQ0VcbiAgfTtcbiAgY29uc3QgY29uc3RydWN0ID0gbmV3IFNxc1RvUGlwZXNUb1N0ZXBmdW5jdGlvbnMoc3RhY2ssICd0ZXN0LXNxcy1waXBlcy1zdGF0ZXMnLCBwcm9wcyk7XG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuICBleHBlY3QoY29uc3RydWN0LnBpcGUpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25zdHJ1Y3QucGlwZVJvbGUpLnRvQmVEZWZpbmVkKCk7XG5cbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlBpcGVzOjpQaXBlJywge1xuICAgIExvZ0NvbmZpZ3VyYXRpb246IHtcbiAgICAgIExldmVsOiBcIlRSQUNFXCIsXG4gICAgfVxuICB9KTtcbn0pO1xuXG50ZXN0KCdUZXN0IGxvZyBsZXZlbCBPRkYnLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IHByb3BzOiBTcXNUb1BpcGVzVG9TdGVwZnVuY3Rpb25zUHJvcHMgPSB7XG4gICAgc3RhdGVNYWNoaW5lUHJvcHM6IHtcbiAgICAgIGRlZmluaXRpb25Cb2R5OiBkZWZhdWx0cy5DcmVhdGVUZXN0U3RhdGVNYWNoaW5lRGVmaW5pdGlvbkJvZHkoc3RhY2ssICdwaXBlcy10ZXN0JylcbiAgICB9LFxuICAgIGxvZ0xldmVsOiBkZWZhdWx0cy5QaXBlc0xvZ0xldmVsLk9GRlxuICB9O1xuICBjb25zdCBjb25zdHJ1Y3QgPSBuZXcgU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9ucyhzdGFjaywgJ3Rlc3Qtc3FzLXBpcGVzLXN0YXRlcycsIHByb3BzKTtcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIGV4cGVjdChjb25zdHJ1Y3QucGlwZSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbnN0cnVjdC5waXBlUm9sZSkudG9CZURlZmluZWQoKTtcblxuICAvLyBTaG91bGQgYmUgbm8gTG9nQ29uZmlndXJhdGlvblxuICB0ZW1wbGF0ZS5yZXNvdXJjZVByb3BlcnRpZXNDb3VudElzKCdBV1M6OlBpcGVzOjpQaXBlJywgeyBMb2dDb25maWd1cmF0aW9uOiB7fX0sIDApO1xuXG4gIC8vIE9uZSBsb2cgZ3JvdXAgZm9yIHRoZSBzdGF0ZSBtYWNoaW5lLCBub25lIGZvciB0aGUgcGlwZVxuICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6TG9nczo6TG9nR3JvdXAnLCAxKTtcbn0pO1xuXG50ZXN0KCdUZXN0IGN1c3RvbSBwaXBlIGxvZyBwcm9wcycsICgpID0+IHtcbiAgY29uc3QgdGVzdFJldGVudGlvbiA9IFJldGVudGlvbkRheXMuRk9VUl9NT05USFM7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IHByb3BzOiBTcXNUb1BpcGVzVG9TdGVwZnVuY3Rpb25zUHJvcHMgPSB7XG4gICAgc3RhdGVNYWNoaW5lUHJvcHM6IHtcbiAgICAgIGRlZmluaXRpb25Cb2R5OiBkZWZhdWx0cy5DcmVhdGVUZXN0U3RhdGVNYWNoaW5lRGVmaW5pdGlvbkJvZHkoc3RhY2ssICdwaXBlcy10ZXN0JylcbiAgICB9LFxuICAgIHBpcGVMb2dQcm9wczoge1xuICAgICAgcmV0ZW50aW9uOiB0ZXN0UmV0ZW50aW9uXG4gICAgfVxuICB9O1xuICBjb25zdCBjb25zdHJ1Y3QgPSBuZXcgU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9ucyhzdGFjaywgJ3Rlc3Qtc3FzLXBpcGVzLXN0YXRlcycsIHByb3BzKTtcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIGV4cGVjdChjb25zdHJ1Y3QucGlwZSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbnN0cnVjdC5waXBlUm9sZSkudG9CZURlZmluZWQoKTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxvZ3M6OkxvZ0dyb3VwJywge1xuICAgIFJldGVudGlvbkluRGF5czogMTIwLFxuICB9KTtcbn0pO1xuXG50ZXN0KCdUZXN0IHNldHRpbmcgc291cmNlIHBhcmFtZXRlcnMgbGlrZSBiYXRjaFNpemUnLCAoKSA9PiB7XG4gIGNvbnN0IHRlc3RCYXRjaFNpemUgPSAxMjM7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IHByb3BzOiBTcXNUb1BpcGVzVG9TdGVwZnVuY3Rpb25zUHJvcHMgPSB7XG4gICAgc3RhdGVNYWNoaW5lUHJvcHM6IHtcbiAgICAgIGRlZmluaXRpb25Cb2R5OiBkZWZhdWx0cy5DcmVhdGVUZXN0U3RhdGVNYWNoaW5lRGVmaW5pdGlvbkJvZHkoc3RhY2ssICdwaXBlcy10ZXN0JylcbiAgICB9LFxuICAgIHBpcGVQcm9wczoge1xuICAgICAgc291cmNlUGFyYW1ldGVyczoge1xuICAgICAgICBzcXNRdWV1ZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBiYXRjaFNpemU6IHRlc3RCYXRjaFNpemUsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBjb25zdHJ1Y3QgPSBuZXcgU3FzVG9QaXBlc1RvU3RlcGZ1bmN0aW9ucyhzdGFjaywgJ3Rlc3Qtc3FzLXBpcGVzLXN0YXRlcycsIHByb3BzKTtcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIGV4cGVjdChjb25zdHJ1Y3QucGlwZSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbnN0cnVjdC5waXBlUm9sZSkudG9CZURlZmluZWQoKTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlBpcGVzOjpQaXBlJywge1xuICAgIFNvdXJjZVBhcmFtZXRlcnM6IHtcbiAgICAgIFNxc1F1ZXVlUGFyYW1ldGVyczoge1xuICAgICAgICBCYXRjaFNpemU6IHRlc3RCYXRjaFNpemUsXG4gICAgICB9XG4gICAgfVxuICB9KTtcbn0pO1xuIl19