Skip to content

Commit 1c42957

Browse files
authored
Merge pull request #5646 from Tyriar/slow_tests
Speed up slow payload limit parser tests
2 parents 77036d3 + ccbf612 commit 1c42957

8 files changed

Lines changed: 76 additions & 25 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"lint-fix": "eslint --fix src/ addons/ demo/",
5454
"lint-api": "eslint --config eslint.config.typings.mjs --max-warnings 0 typings/",
5555
"test-unit": "node ./bin/test_unit.js",
56+
"test-unit-slow-tests": "npm run test-unit | grep \"ms)\"",
5657
"test-unit-coverage": "node ./bin/test_unit.js --coverage",
5758
"test-unit-dev": "cross-env NODE_PATH='./out' mocha",
5859
"test-integration": "node ./bin/test_integration.js --workers=75%",

src/common/parser/ApcParser.test.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { assert } from 'chai';
66
import { ApcParser, ApcHandler } from 'common/parser/ApcParser';
77
import { StringToUtf32, utf32ToString } from 'common/input/TextDecoder';
88
import { IApcHandler } from 'common/parser/Types';
9-
import { PAYLOAD_LIMIT } from 'common/parser/Constants';
109

1110
function toUtf32(s: string): Uint32Array {
1211
const utf32 = new Uint32Array(s.length);
@@ -216,6 +215,21 @@ describe('ApcParser', () => {
216215
});
217216

218217
describe('ApcHandler convenience class', () => {
218+
const TEST_PAYLOAD_LIMIT = 100;
219+
const CHUNK_SIZE = 10;
220+
let originalPayloadLimit: number;
221+
222+
beforeEach(() => {
223+
const handlerConstructor = ApcHandler as unknown as { _payloadLimit: number };
224+
originalPayloadLimit = handlerConstructor._payloadLimit;
225+
handlerConstructor._payloadLimit = TEST_PAYLOAD_LIMIT;
226+
});
227+
228+
afterEach(() => {
229+
const handlerConstructor = ApcHandler as unknown as { _payloadLimit: number };
230+
handlerConstructor._payloadLimit = originalPayloadLimit;
231+
});
232+
219233
it('should be called once on end(true)', () => {
220234
const G_CODE = 0x47;
221235
const results: [number, string][] = [];
@@ -257,12 +271,12 @@ describe('ApcParser', () => {
257271
parser.start();
258272
let data = toUtf32('G');
259273
parser.put(data, 0, data.length);
260-
data = toUtf32('A'.repeat(1000));
261-
for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) {
274+
data = toUtf32('A'.repeat(CHUNK_SIZE));
275+
for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) {
262276
parser.put(data, 0, data.length);
263277
}
264278
parser.end(true);
265-
assert.deepEqual(results, [[G_CODE, 'A'.repeat(PAYLOAD_LIMIT)]]);
279+
assert.deepEqual(results, [[G_CODE, 'A'.repeat(TEST_PAYLOAD_LIMIT)]]);
266280
});
267281

268282
it('should abort for payload over limit', function(): void {
@@ -276,8 +290,8 @@ describe('ApcParser', () => {
276290
parser.start();
277291
let data = toUtf32('G');
278292
parser.put(data, 0, data.length);
279-
data = toUtf32('A'.repeat(1000));
280-
for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) {
293+
data = toUtf32('A'.repeat(CHUNK_SIZE));
294+
for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) {
281295
parser.put(data, 0, data.length);
282296
}
283297
data = toUtf32('A');

src/common/parser/ApcParser.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55

66
import { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from 'common/parser/Types';
7-
import { ApcState, PAYLOAD_LIMIT } from 'common/parser/Constants';
7+
import { ApcState, ParserConstants } from 'common/parser/Constants';
88
import { utf32ToString } from 'common/input/TextDecoder';
99
import { IDisposable } from 'common/Types';
1010

@@ -199,6 +199,8 @@ export class ApcParser implements IApcParser {
199199
* as APC handlers.
200200
*/
201201
export class ApcHandler implements IApcHandler {
202+
private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;
203+
202204
private _data = '';
203205
private _hitLimit: boolean = false;
204206

@@ -214,7 +216,7 @@ export class ApcHandler implements IApcHandler {
214216
return;
215217
}
216218
this._data += utf32ToString(data, start, end);
217-
if (this._data.length > PAYLOAD_LIMIT) {
219+
if (this._data.length > ApcHandler._payloadLimit) {
218220
this._data = '';
219221
this._hitLimit = true;
220222
}

src/common/parser/Constants.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,6 @@ export const enum ApcState {
7171
}
7272

7373
// payload limit for OSC and DCS
74-
export const PAYLOAD_LIMIT = 10000000;
74+
export const enum ParserConstants {
75+
PAYLOAD_LIMIT = 10000000
76+
}

src/common/parser/DcsParser.test.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { DcsParser, DcsHandler } from 'common/parser/DcsParser';
77
import { IDcsHandler, IParams, IFunctionIdentifier } from 'common/parser/Types';
88
import { utf32ToString, StringToUtf32 } from 'common/input/TextDecoder';
99
import { Params } from 'common/parser/Params';
10-
import { PAYLOAD_LIMIT } from 'common/parser/Constants';
1110

1211
function toUtf32(s: string): Uint32Array {
1312
const utf32 = new Uint32Array(s.length);
@@ -176,6 +175,21 @@ describe('DcsParser', () => {
176175
});
177176
});
178177
describe('DcsHandlerFactory', () => {
178+
const TEST_PAYLOAD_LIMIT = 100;
179+
const CHUNK_SIZE = 10;
180+
let originalPayloadLimit: number;
181+
182+
beforeEach(() => {
183+
const handlerConstructor = DcsHandler as unknown as { _payloadLimit: number };
184+
originalPayloadLimit = handlerConstructor._payloadLimit;
185+
handlerConstructor._payloadLimit = TEST_PAYLOAD_LIMIT;
186+
});
187+
188+
afterEach(() => {
189+
const handlerConstructor = DcsHandler as unknown as { _payloadLimit: number };
190+
handlerConstructor._payloadLimit = originalPayloadLimit;
191+
});
192+
179193
it('should be called once on end(true)', () => {
180194
parser.registerHandler(identifier({intermediates: '+', final: 'p'}), new DcsHandler((data, params) => { reports.push([params.toArray(), data]); return true; }));
181195
parser.hook(identifier({intermediates: '+', final: 'p'}), Params.fromArray([1, 2, 3]));
@@ -230,19 +244,19 @@ describe('DcsParser', () => {
230244
this.timeout(30000);
231245
parser.registerHandler(identifier({intermediates: '+', final: 'p'}), new DcsHandler((data, params) => { reports.push([params.toArray(), data]); return true; }));
232246
parser.hook(identifier({intermediates: '+', final: 'p'}), Params.fromArray([1, 2, 3]));
233-
const data = toUtf32('A'.repeat(1000));
234-
for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) {
247+
const data = toUtf32('A'.repeat(CHUNK_SIZE));
248+
for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) {
235249
parser.put(data, 0, data.length);
236250
}
237251
parser.unhook(true);
238-
assert.deepEqual(reports, [[[1, 2, 3], 'A'.repeat(PAYLOAD_LIMIT)]]);
252+
assert.deepEqual(reports, [[[1, 2, 3], 'A'.repeat(TEST_PAYLOAD_LIMIT)]]);
239253
});
240254
it('should abort for payload limit +1', function(): void {
241255
this.timeout(30000);
242256
parser.registerHandler(identifier({intermediates: '+', final: 'p'}), new DcsHandler((data, params) => { reports.push([params.toArray(), data]); return true; }));
243257
parser.hook(identifier({intermediates: '+', final: 'p'}), Params.fromArray([1, 2, 3]));
244-
let data = toUtf32('A'.repeat(1000));
245-
for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) {
258+
let data = toUtf32('A'.repeat(CHUNK_SIZE));
259+
for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) {
246260
parser.put(data, 0, data.length);
247261
}
248262
data = toUtf32('A');

src/common/parser/DcsParser.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { IDisposable } from 'common/Types';
77
import { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from 'common/parser/Types';
88
import { utf32ToString } from 'common/input/TextDecoder';
99
import { Params } from 'common/parser/Params';
10-
import { PAYLOAD_LIMIT } from 'common/parser/Constants';
10+
import { ParserConstants } from 'common/parser/Constants';
1111

1212
const EMPTY_HANDLERS: IDcsHandler[] = [];
1313

@@ -138,6 +138,8 @@ EMPTY_PARAMS.addParam(0);
138138
* Note: The payload is currently limited to 50 MB (hardcoded).
139139
*/
140140
export class DcsHandler implements IDcsHandler {
141+
private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;
142+
141143
private _data = '';
142144
private _params: IParams = EMPTY_PARAMS;
143145
private _hitLimit: boolean = false;
@@ -159,7 +161,7 @@ export class DcsHandler implements IDcsHandler {
159161
return;
160162
}
161163
this._data += utf32ToString(data, start, end);
162-
if (this._data.length > PAYLOAD_LIMIT) {
164+
if (this._data.length > DcsHandler._payloadLimit) {
163165
this._data = '';
164166
this._hitLimit = true;
165167
}

src/common/parser/OscParser.test.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { assert } from 'chai';
66
import { OscParser, OscHandler } from 'common/parser/OscParser';
77
import { StringToUtf32, utf32ToString } from 'common/input/TextDecoder';
88
import { IOscHandler } from 'common/parser/Types';
9-
import { PAYLOAD_LIMIT } from 'common/parser/Constants';
109

1110
function toUtf32(s: string): Uint32Array {
1211
const utf32 = new Uint32Array(s.length);
@@ -170,6 +169,21 @@ describe('OscParser', () => {
170169
});
171170
});
172171
describe('OscHandlerFactory', () => {
172+
const TEST_PAYLOAD_LIMIT = 100;
173+
const CHUNK_SIZE = 10;
174+
let originalPayloadLimit: number;
175+
176+
beforeEach(() => {
177+
const handlerConstructor = OscHandler as unknown as { _payloadLimit: number };
178+
originalPayloadLimit = handlerConstructor._payloadLimit;
179+
handlerConstructor._payloadLimit = TEST_PAYLOAD_LIMIT;
180+
});
181+
182+
afterEach(() => {
183+
const handlerConstructor = OscHandler as unknown as { _payloadLimit: number };
184+
handlerConstructor._payloadLimit = originalPayloadLimit;
185+
});
186+
173187
it('should be called once on end(true)', () => {
174188
parser.registerHandler(1234, new OscHandler(data => { reports.push([1234, data]); return true; }));
175189
parser.start();
@@ -226,21 +240,21 @@ describe('OscParser', () => {
226240
parser.start();
227241
let data = toUtf32('1234;');
228242
parser.put(data, 0, data.length);
229-
data = toUtf32('A'.repeat(1000));
230-
for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) {
243+
data = toUtf32('A'.repeat(CHUNK_SIZE));
244+
for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) {
231245
parser.put(data, 0, data.length);
232246
}
233247
parser.end(true);
234-
assert.deepEqual(reports, [[1234, 'A'.repeat(PAYLOAD_LIMIT)]]);
248+
assert.deepEqual(reports, [[1234, 'A'.repeat(TEST_PAYLOAD_LIMIT)]]);
235249
});
236250
it('should abort for payload limit +1', function(): void {
237251
this.timeout(30000);
238252
parser.registerHandler(1234, new OscHandler(data => { reports.push([1234, data]); return true; }));
239253
parser.start();
240254
let data = toUtf32('1234;');
241255
parser.put(data, 0, data.length);
242-
data = toUtf32('A'.repeat(1000));
243-
for (let i = 0; i < PAYLOAD_LIMIT; i += 1000) {
256+
data = toUtf32('A'.repeat(CHUNK_SIZE));
257+
for (let i = 0; i < TEST_PAYLOAD_LIMIT; i += CHUNK_SIZE) {
244258
parser.put(data, 0, data.length);
245259
}
246260
data = toUtf32('A');

src/common/parser/OscParser.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55

66
import { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from 'common/parser/Types';
7-
import { OscState, PAYLOAD_LIMIT } from 'common/parser/Constants';
7+
import { OscState, ParserConstants } from 'common/parser/Constants';
88
import { utf32ToString } from 'common/input/TextDecoder';
99
import { IDisposable } from 'common/Types';
1010

@@ -192,6 +192,8 @@ export class OscParser implements IOscParser {
192192
* as OSC handlers.
193193
*/
194194
export class OscHandler implements IOscHandler {
195+
private static _payloadLimit = ParserConstants.PAYLOAD_LIMIT;
196+
195197
private _data = '';
196198
private _hitLimit: boolean = false;
197199

@@ -207,7 +209,7 @@ export class OscHandler implements IOscHandler {
207209
return;
208210
}
209211
this._data += utf32ToString(data, start, end);
210-
if (this._data.length > PAYLOAD_LIMIT) {
212+
if (this._data.length > OscHandler._payloadLimit) {
211213
this._data = '';
212214
this._hitLimit = true;
213215
}

0 commit comments

Comments
 (0)