From 127e6a6464a800540e86edf6a83306fe27bac2d6 Mon Sep 17 00:00:00 2001 From: ecarton Date: Tue, 2 Apr 2024 11:24:36 -0400 Subject: [PATCH 01/12] workign on tests --- CHANGELOG.md | 3 ++- packages/aws-client/src/SQS.ts | 12 ++++++++---- packages/aws-client/tests/test-SQS.js | 13 +++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf2ea4d4b16..45688b78014 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,7 +72,8 @@ the CloudWatch logs for your async operations (e.g. `PREFIX-AsyncOperationEcsLog to granules table ### Add - +- **UnticketedForNow** + - sqs messages truncated to max sqs length if necessary - **CUMULUS-3614** - `tf-modules/monitoring` module now deploys Glue table for querying dead-letter-archive messages. diff --git a/packages/aws-client/src/SQS.ts b/packages/aws-client/src/SQS.ts index b279ffeb170..ee1ba1394cd 100644 --- a/packages/aws-client/src/SQS.ts +++ b/packages/aws-client/src/SQS.ts @@ -9,7 +9,7 @@ import isObject from 'lodash/isObject'; import isString from 'lodash/isString'; import isNil from 'lodash/isNil'; import { SQSRecord } from 'aws-lambda'; -import { Message, QueueAttributeName } from '@aws-sdk/client-sqs'; +import { Message, QueueAttributeName, SendMessageCommandOutput } from '@aws-sdk/client-sqs'; import { StepFunctionEventBridgeEvent } from './Lambda'; import { sqs } from './services'; @@ -78,13 +78,17 @@ export const sendSQSMessage = ( queueUrl: string, message: string | object, logOverride: Logger | undefined = undefined -) => { +): Promise => { const logger = logOverride || log; let messageBody; if (isString(message)) messageBody = message; else if (isObject(message)) messageBody = JSON.stringify(message); else throw new Error('body type is not accepted'); - + const maxLength = 262144; + if (messageBody.length > maxLength) { + const warningString = '...TruncatedForLength'; + messageBody = `${messageBody.substring(0, maxLength - warningString.length)}${warningString}`; + } return sqs().sendMessage({ MessageBody: messageBody, QueueUrl: queueUrl, @@ -106,7 +110,7 @@ type ReceiveSQSMessagesOptions = { */ export const receiveSQSMessages = async ( queueUrl: string, - options: ReceiveSQSMessagesOptions + options: ReceiveSQSMessagesOptions = {} ): Promise => { const params = { QueueUrl: queueUrl, diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index 8748b0a5f2f..80ac0bbea09 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -12,6 +12,7 @@ const { sqsQueueExists, sendSQSMessage, isSQSRecordLike, + receiveSQSMessages, } = require('../SQS'); const randomString = () => cryptoRandomString({ length: 10 }); @@ -100,3 +101,15 @@ test('isSQSRecordLike filters correctly for sqs record shape', (t) => { body *should* be a string form json object, but strictly checking is not compatible with the current use-case*/ }); + +test.only('sendSQSMessage truncates oversized messages safely', async (t) => { + const queueName = randomString(); + const queueUrl = await createQueue(queueName); + const maxLength = 262144; + const overflowMessage = '0'.repeat(maxLength + 2); + const a = await sendSQSMessage(queueUrl, overflowMessage); + console.log(a); + const b = await receiveSQSMessages(queueUrl, {}); + console.log(b); + t.true(true); +}); From 2f08facbe2c7cd384b7329ebc570f2bf4aaca2f2 Mon Sep 17 00:00:00 2001 From: ecarton Date: Tue, 2 Apr 2024 11:31:36 -0400 Subject: [PATCH 02/12] tests updated --- packages/aws-client/tests/test-SQS.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index 80ac0bbea09..4868ed4c9ad 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -107,9 +107,17 @@ test.only('sendSQSMessage truncates oversized messages safely', async (t) => { const queueUrl = await createQueue(queueName); const maxLength = 262144; const overflowMessage = '0'.repeat(maxLength + 2); - const a = await sendSQSMessage(queueUrl, overflowMessage); - console.log(a); - const b = await receiveSQSMessages(queueUrl, {}); - console.log(b); - t.true(true); + await sendSQSMessage(queueUrl, overflowMessage); + + let recievedMessage = await receiveSQSMessages(queueUrl, {}); + let messageBody = recievedMessage[0].Body; + t.true(messageBody.endsWith('...TruncatedForLength')); + t.is(messageBody.length, maxLength); + + const underflowMessage = '0'.repeat(maxLength); + await sendSQSMessage(queueUrl, underflowMessage); + recievedMessage = await receiveSQSMessages(queueUrl, {}); + messageBody = recievedMessage[0].Body; + + t.deepEqual(messageBody, underflowMessage); }); From b5fb5f11b23df887138c60d1421e9fc676555003 Mon Sep 17 00:00:00 2001 From: ecarton Date: Tue, 2 Apr 2024 11:34:41 -0400 Subject: [PATCH 03/12] cleanup with added default param args --- packages/aws-client/tests/test-SQS.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index 4868ed4c9ad..1210d9e0426 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -102,21 +102,21 @@ test('isSQSRecordLike filters correctly for sqs record shape', (t) => { but strictly checking is not compatible with the current use-case*/ }); -test.only('sendSQSMessage truncates oversized messages safely', async (t) => { +test('sendSQSMessage truncates oversized messages safely', async (t) => { const queueName = randomString(); const queueUrl = await createQueue(queueName); const maxLength = 262144; const overflowMessage = '0'.repeat(maxLength + 2); await sendSQSMessage(queueUrl, overflowMessage); - let recievedMessage = await receiveSQSMessages(queueUrl, {}); + let recievedMessage = await receiveSQSMessages(queueUrl); let messageBody = recievedMessage[0].Body; t.true(messageBody.endsWith('...TruncatedForLength')); t.is(messageBody.length, maxLength); const underflowMessage = '0'.repeat(maxLength); await sendSQSMessage(queueUrl, underflowMessage); - recievedMessage = await receiveSQSMessages(queueUrl, {}); + recievedMessage = await receiveSQSMessages(queueUrl); messageBody = recievedMessage[0].Body; t.deepEqual(messageBody, underflowMessage); From d97fcee6f088c127d8d9f5816c0ce3fbb3b0f81a Mon Sep 17 00:00:00 2001 From: ecarton Date: Tue, 2 Apr 2024 11:38:39 -0400 Subject: [PATCH 04/12] ticket number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 45688b78014..1c8ada9a60d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,7 +72,7 @@ the CloudWatch logs for your async operations (e.g. `PREFIX-AsyncOperationEcsLog to granules table ### Add -- **UnticketedForNow** +- **CUMULUS-3678** - sqs messages truncated to max sqs length if necessary - **CUMULUS-3614** - `tf-modules/monitoring` module now deploys Glue table for querying dead-letter-archive messages. From 5b4c3d2c27b053c9816c8ec04550e803d47c75df Mon Sep 17 00:00:00 2001 From: etcart Date: Mon, 28 Oct 2024 11:10:55 -0400 Subject: [PATCH 05/12] fix merge mangling --- CHANGELOG.md | 5 +++-- packages/aws-client/src/SQS.ts | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f99a425d5c..a6c1ad6ca4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). ### Changed +- **CUMULUS-3678** + - sqs messages truncated to max sqs length if necessary - **CUMULUS-3928** - updated publish scripting to use cumulus.bot@gmail.com for user email - updated publish scripting to use esm over common import of latest-version @@ -417,8 +419,7 @@ to update to at least [cumulus-ecs-task:2.1.0](https://hub.docker.com/layers/cum support `aws-sdk` v3 changes. ### Add -- **CUMULUS-3678** - - sqs messages truncated to max sqs length if necessary + - **CUMULUS-3614** - `tf-modules/monitoring` module now deploys Glue table for querying dead-letter-archive messages. - **CUMULUS-3616** diff --git a/packages/aws-client/src/SQS.ts b/packages/aws-client/src/SQS.ts index e59effb64ef..b2bafc56a51 100644 --- a/packages/aws-client/src/SQS.ts +++ b/packages/aws-client/src/SQS.ts @@ -18,7 +18,9 @@ import { Message, QueueAttributeName, ReceiveMessageCommand, - SendMessageCommand } from '@aws-sdk/client-sqs'; + SendMessageCommand, + SendMessageCommandOutput +} from '@aws-sdk/client-sqs'; import { StepFunctionEventBridgeEvent } from './Lambda'; import { sqs } from './services'; @@ -105,7 +107,8 @@ export const sendSQSMessage = ( const warningString = '...TruncatedForLength'; messageBody = `${messageBody.substring(0, maxLength - warningString.length)}${warningString}`; } - return sqs().sendMessage({ + + const command = new SendMessageCommand({ MessageBody: messageBody, QueueUrl: queueUrl, }); From 1b060d12a881ace4d7aa646b903fd43ef39d7313 Mon Sep 17 00:00:00 2001 From: etcart Date: Mon, 28 Oct 2024 15:31:51 -0400 Subject: [PATCH 06/12] pr feedback and changelog --- CHANGELOG.md | 2 +- packages/aws-client/src/SQS.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6c1ad6ca4e..df5de3c9a49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -418,7 +418,7 @@ to update to at least [cumulus-ecs-task:2.1.0](https://hub.docker.com/layers/cum - Updates async_operations Docker image to Node v20 and bumps its cumulus dependencies to v18.3.0 to support `aws-sdk` v3 changes. -### Add +### Added - **CUMULUS-3614** - `tf-modules/monitoring` module now deploys Glue table for querying dead-letter-archive messages. diff --git a/packages/aws-client/src/SQS.ts b/packages/aws-client/src/SQS.ts index b2bafc56a51..3db85e8715b 100644 --- a/packages/aws-client/src/SQS.ts +++ b/packages/aws-client/src/SQS.ts @@ -132,7 +132,7 @@ type ReceiveSQSMessagesOptions = { */ export const receiveSQSMessages = async ( queueUrl: string, - options: ReceiveSQSMessagesOptions = {} + options: ReceiveSQSMessagesOptions ): Promise => { const params = { QueueUrl: queueUrl, From e390f1b93e82dbf1104b89a714568532764e4c21 Mon Sep 17 00:00:00 2001 From: etcart Date: Mon, 28 Oct 2024 15:40:42 -0400 Subject: [PATCH 07/12] git pr clarify negative test --- packages/aws-client/tests/test-SQS.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index 1210d9e0426..37998d5f9ef 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -121,3 +121,14 @@ test('sendSQSMessage truncates oversized messages safely', async (t) => { t.deepEqual(messageBody, underflowMessage); }); + +test('sendSQSMessage does not alter objects of normal size', async (t) => { + const queueName = randomString(); + const queueUrl = await createQueue(queueName); + const underflowMessage = '0'.repeat(maxLength); + await sendSQSMessage(queueUrl, underflowMessage); + recievedMessage = await receiveSQSMessages(queueUrl); + messageBody = recievedMessage[0].Body; + + t.deepEqual(messageBody, underflowMessage); +}); \ No newline at end of file From b7c78a270168c5feb6503f91385d05a87f8dfb39 Mon Sep 17 00:00:00 2001 From: etcart Date: Mon, 28 Oct 2024 15:51:26 -0400 Subject: [PATCH 08/12] adding verbosity in negative test --- packages/aws-client/tests/test-SQS.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index 37998d5f9ef..a61d596fbd7 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -131,4 +131,5 @@ test('sendSQSMessage does not alter objects of normal size', async (t) => { messageBody = recievedMessage[0].Body; t.deepEqual(messageBody, underflowMessage); + t.false(messageBody.endsWith('...TruncatedForLength')); }); \ No newline at end of file From 3966ac5ea3ce5de5080c57cafa860b8cc98655e0 Mon Sep 17 00:00:00 2001 From: etcart Date: Mon, 28 Oct 2024 16:17:03 -0400 Subject: [PATCH 09/12] pass needed arg to receiveSQSMessages --- packages/aws-client/tests/test-SQS.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index a61d596fbd7..f9b79d67cb6 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -109,25 +109,19 @@ test('sendSQSMessage truncates oversized messages safely', async (t) => { const overflowMessage = '0'.repeat(maxLength + 2); await sendSQSMessage(queueUrl, overflowMessage); - let recievedMessage = await receiveSQSMessages(queueUrl); + let recievedMessage = await receiveSQSMessages(queueUrl, {}); let messageBody = recievedMessage[0].Body; t.true(messageBody.endsWith('...TruncatedForLength')); t.is(messageBody.length, maxLength); - - const underflowMessage = '0'.repeat(maxLength); - await sendSQSMessage(queueUrl, underflowMessage); - recievedMessage = await receiveSQSMessages(queueUrl); - messageBody = recievedMessage[0].Body; - - t.deepEqual(messageBody, underflowMessage); }); test('sendSQSMessage does not alter objects of normal size', async (t) => { const queueName = randomString(); const queueUrl = await createQueue(queueName); + const maxLength = 262144; const underflowMessage = '0'.repeat(maxLength); await sendSQSMessage(queueUrl, underflowMessage); - recievedMessage = await receiveSQSMessages(queueUrl); + recievedMessage = await receiveSQSMessages(queueUrl, {}); messageBody = recievedMessage[0].Body; t.deepEqual(messageBody, underflowMessage); From 7ff89f212decc011e205d37ed7354a58c9583cfa Mon Sep 17 00:00:00 2001 From: etcart Date: Mon, 28 Oct 2024 16:28:58 -0400 Subject: [PATCH 10/12] linting fixes --- packages/aws-client/src/SQS.ts | 2 +- packages/aws-client/tests/test-SQS.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/aws-client/src/SQS.ts b/packages/aws-client/src/SQS.ts index 3db85e8715b..65f696b685d 100644 --- a/packages/aws-client/src/SQS.ts +++ b/packages/aws-client/src/SQS.ts @@ -19,7 +19,7 @@ import { QueueAttributeName, ReceiveMessageCommand, SendMessageCommand, - SendMessageCommandOutput + SendMessageCommandOutput, } from '@aws-sdk/client-sqs'; import { StepFunctionEventBridgeEvent } from './Lambda'; diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index f9b79d67cb6..8c4097f296f 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -109,8 +109,8 @@ test('sendSQSMessage truncates oversized messages safely', async (t) => { const overflowMessage = '0'.repeat(maxLength + 2); await sendSQSMessage(queueUrl, overflowMessage); - let recievedMessage = await receiveSQSMessages(queueUrl, {}); - let messageBody = recievedMessage[0].Body; + const recievedMessage = await receiveSQSMessages(queueUrl, {}); + const messageBody = recievedMessage[0].Body; t.true(messageBody.endsWith('...TruncatedForLength')); t.is(messageBody.length, maxLength); }); @@ -121,9 +121,9 @@ test('sendSQSMessage does not alter objects of normal size', async (t) => { const maxLength = 262144; const underflowMessage = '0'.repeat(maxLength); await sendSQSMessage(queueUrl, underflowMessage); - recievedMessage = await receiveSQSMessages(queueUrl, {}); - messageBody = recievedMessage[0].Body; + const recievedMessage = await receiveSQSMessages(queueUrl, {}); + const messageBody = recievedMessage[0].Body; t.deepEqual(messageBody, underflowMessage); t.false(messageBody.endsWith('...TruncatedForLength')); -}); \ No newline at end of file +}); From 4a3881f7d0199c157e1dd3589bf923eeb4721218 Mon Sep 17 00:00:00 2001 From: etcart Date: Tue, 29 Oct 2024 22:34:44 -0400 Subject: [PATCH 11/12] moved limiter out to more complex function to handle unicode edge cases --- packages/aws-client/src/SQS.ts | 30 ++++++++++++++++---- packages/aws-client/tests/test-SQS.js | 40 ++++++++++++++++++++------- 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/packages/aws-client/src/SQS.ts b/packages/aws-client/src/SQS.ts index 65f696b685d..8cafb793f3c 100644 --- a/packages/aws-client/src/SQS.ts +++ b/packages/aws-client/src/SQS.ts @@ -89,6 +89,28 @@ export const getQueueAttributes = async (queueName: string) => { }; }; +/** + * Ensure that a string does not overrun SQS max body size of 262144 bytes + */ +export const limitSQSMessageLength = (str: string) => { + const maxSize = 262144; + // because this string can be a mix of + // if there is a chance this is overflowing, do a more expensive check and fix + if (str.length <= maxSize / 2) { + return str; + } + + const encoded = (new TextEncoder()).encode(str); + if (encoded.length <= maxSize) { + return str; + } + const warningString = '...TruncatedForLength'; + // In the specific edge case that a unicode (2 byte) character is split + // TextDecoder decoding pads it with 2 hidden bytes + const finalStr = new TextDecoder().decode(encoded.slice(0, maxSize - warningString.length - 2)); + return `${finalStr}${warningString}`; +}; + /** * Send a message to AWS SQS **/ @@ -99,14 +121,12 @@ export const sendSQSMessage = ( ): Promise => { const logger = logOverride || log; let messageBody; + console.log(messageBody); if (isString(message)) messageBody = message; else if (isObject(message)) messageBody = JSON.stringify(message); else throw new Error('body type is not accepted'); - const maxLength = 262144; - if (messageBody.length > maxLength) { - const warningString = '...TruncatedForLength'; - messageBody = `${messageBody.substring(0, maxLength - warningString.length)}${warningString}`; - } + + messageBody = limitSQSMessageLength(messageBody); const command = new SendMessageCommand({ MessageBody: messageBody, diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index 8c4097f296f..c09a1d1ad0a 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -13,6 +13,7 @@ const { sendSQSMessage, isSQSRecordLike, receiveSQSMessages, + limitSQSMessageLength, } = require('../SQS'); const randomString = () => cryptoRandomString({ length: 10 }); @@ -112,18 +113,37 @@ test('sendSQSMessage truncates oversized messages safely', async (t) => { const recievedMessage = await receiveSQSMessages(queueUrl, {}); const messageBody = recievedMessage[0].Body; t.true(messageBody.endsWith('...TruncatedForLength')); - t.is(messageBody.length, maxLength); + t.true(messageBody.length <= maxLength); }); -test('sendSQSMessage does not alter objects of normal size', async (t) => { - const queueName = randomString(); - const queueUrl = await createQueue(queueName); +test('limitSQSMessageLength truncates unicode messages of greater than maximum byte size', async (t) => { + const maxLength = 262144; - const underflowMessage = '0'.repeat(maxLength); - await sendSQSMessage(queueUrl, underflowMessage); - const recievedMessage = await receiveSQSMessages(queueUrl, {}); - const messageBody = recievedMessage[0].Body; + const overflowMessageUnicodeMessage = 'è'.repeat(maxLength / 2 + 20); + const massagedMessage = limitSQSMessageLength(overflowMessageUnicodeMessage); + + t.true(massagedMessage.endsWith('...TruncatedForLength')); + t.true(massagedMessage.length <= maxLength); + + const overflowMessageMixedMessage = 'èa'.repeat(maxLength / 2 + 20); + const massagedMixedMessage = limitSQSMessageLength(overflowMessageMixedMessage); - t.deepEqual(messageBody, underflowMessage); - t.false(messageBody.endsWith('...TruncatedForLength')); + t.true(massagedMixedMessage.endsWith('...TruncatedForLength')); + t.true(massagedMixedMessage.length <= maxLength); }); + +test('limitSQSMessageLength does not truncate messages appropriate for sqs to handle', async (t) => { + const maxLength = 262144; + let underflowMessage = '0'.repeat(maxLength); + t.is(limitSQSMessageLength(underflowMessage), underflowMessage) + + + underflowMessage = 'ř'.repeat(maxLength/2); + t.is(limitSQSMessageLength(underflowMessage), underflowMessage) + + underflowMessage = 'a'.repeat(maxLength/2); + t.is(limitSQSMessageLength(underflowMessage), underflowMessage) + + underflowMessage = 'abcd'; + t.is(limitSQSMessageLength(underflowMessage), underflowMessage) +}); \ No newline at end of file From a18310df286d5827bce7aeec3f249700ebb87621 Mon Sep 17 00:00:00 2001 From: etcart Date: Wed, 30 Oct 2024 11:09:23 -0400 Subject: [PATCH 12/12] linter errors --- packages/aws-client/tests/test-SQS.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/aws-client/tests/test-SQS.js b/packages/aws-client/tests/test-SQS.js index c09a1d1ad0a..853956136ce 100644 --- a/packages/aws-client/tests/test-SQS.js +++ b/packages/aws-client/tests/test-SQS.js @@ -116,8 +116,7 @@ test('sendSQSMessage truncates oversized messages safely', async (t) => { t.true(messageBody.length <= maxLength); }); -test('limitSQSMessageLength truncates unicode messages of greater than maximum byte size', async (t) => { - +test('limitSQSMessageLength truncates unicode messages of greater than maximum byte size', (t) => { const maxLength = 262144; const overflowMessageUnicodeMessage = 'è'.repeat(maxLength / 2 + 20); const massagedMessage = limitSQSMessageLength(overflowMessageUnicodeMessage); @@ -132,18 +131,17 @@ test('limitSQSMessageLength truncates unicode messages of greater than maximum b t.true(massagedMixedMessage.length <= maxLength); }); -test('limitSQSMessageLength does not truncate messages appropriate for sqs to handle', async (t) => { +test('limitSQSMessageLength does not truncate messages appropriate for sqs to handle', (t) => { const maxLength = 262144; let underflowMessage = '0'.repeat(maxLength); - t.is(limitSQSMessageLength(underflowMessage), underflowMessage) - + t.is(limitSQSMessageLength(underflowMessage), underflowMessage); - underflowMessage = 'ř'.repeat(maxLength/2); - t.is(limitSQSMessageLength(underflowMessage), underflowMessage) + underflowMessage = 'ř'.repeat(maxLength / 2); + t.is(limitSQSMessageLength(underflowMessage), underflowMessage); - underflowMessage = 'a'.repeat(maxLength/2); - t.is(limitSQSMessageLength(underflowMessage), underflowMessage) + underflowMessage = 'a'.repeat(maxLength / 2); + t.is(limitSQSMessageLength(underflowMessage), underflowMessage); underflowMessage = 'abcd'; - t.is(limitSQSMessageLength(underflowMessage), underflowMessage) -}); \ No newline at end of file + t.is(limitSQSMessageLength(underflowMessage), underflowMessage); +});