Skip to content

Commit 89bf33d

Browse files
batiskafffCompuIves
authored andcommitted
client test performance improvement, reduce screen freezing (codesandbox#2074)
* Add debounce for tests in watch mode * add-comment
1 parent bf0bd76 commit 89bf33d

File tree

3 files changed

+49
-26
lines changed

3 files changed

+49
-26
lines changed

packages/app/src/app/components/Preview/DevTools/Tests/index.tsx

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { actions, dispatch, listen } from 'codesandbox-api';
44
import SplitPane from 'react-split-pane';
55

66
import immer from 'immer';
7+
import { debounce } from 'lodash-es';
78

89
import { Container, TestDetails, TestContainer } from './elements';
910

@@ -68,6 +69,7 @@ type State = {
6869

6970
type SandboxMessage = { type: 'test' | 'done' } & (
7071
| InitializedTestsMessage
72+
| CompilationDoneMessage
7173
| TestCountMessage
7274
| TotalTestStartMessage
7375
| TotalTestEndMessage
@@ -84,46 +86,50 @@ interface InitializedTestsMessage {
8486
event: messages.INITIALIZE;
8587
}
8688

89+
interface CompilationDoneMessage {
90+
compilatonError: boolean;
91+
}
92+
8793
interface TestCountMessage {
8894
event: 'test_count';
8995
count: number;
9096
}
9197

9298
interface TotalTestStartMessage {
93-
event: 'total_test_start';
99+
event: messages.TOTAL_TEST_START;
94100
}
95101

96102
interface TotalTestEndMessage {
97-
event: 'total_test_end';
103+
event: messages.TOTAL_TEST_END;
98104
}
99105

100106
interface AddFileMessage {
101-
event: 'add_file';
107+
event: messages.ADD_FILE;
102108
path: string;
103109
}
104110

105111
interface RemoveFileMessage {
106-
event: 'remove_file';
112+
event: messages.REMOVE_FILE;
107113
path: string;
108114
}
109115

110116
interface FileErrorMessage {
111-
event: 'file_error';
117+
event: messages.FILE_ERROR;
112118
path: string;
113119
error: TestError;
114120
}
115121

116122
interface DescribeStartMessage {
117-
event: 'describe_start';
123+
event: messages.DESCRIBE_START;
118124
blockName: string;
119125
}
120126

121127
interface DescribeEndMessage {
122-
event: 'describe_end';
128+
event: messages.DESCRIBE_END;
123129
}
124130

125131
interface AddTestMessage {
126-
event: 'add_test';
132+
event: messages.ADD_TEST;
127133
testName: string;
128134
path: string;
129135
}
@@ -135,12 +141,12 @@ type TestMessage = Test & {
135141
};
136142

137143
interface TestStartMessage {
138-
event: 'test_start';
144+
event: messages.TEST_START;
139145
test: TestMessage;
140146
}
141147

142148
interface TestEndMessage {
143-
event: 'test_end';
149+
event: messages.TEST_END;
144150
test: TestMessage;
145151
}
146152

@@ -201,7 +207,21 @@ class Tests extends React.Component<DevToolProps, State> {
201207

202208
handleMessage = (data: SandboxMessage) => {
203209
if (data.type === 'done' && this.state.watching && !this.props.hidden) {
204-
this.runAllTests();
210+
let delay = 1000;
211+
212+
if (data.compilatonError) {
213+
delay = 2 * delay;
214+
}
215+
216+
// avoid to often test run in file watching mode,
217+
// very frequent test runs cause screen freezing
218+
debounce(
219+
() => {
220+
this.runAllTests();
221+
},
222+
delay,
223+
{ maxWait: 4 * delay }
224+
)();
205225
} else if (data.type === 'test') {
206226
switch (data.event) {
207227
case messages.INITIALIZE: {
@@ -220,7 +240,7 @@ class Tests extends React.Component<DevToolProps, State> {
220240
}
221241
break;
222242
}
223-
case 'total_test_start': {
243+
case messages.TOTAL_TEST_START: {
224244
this.currentDescribeBlocks = [];
225245
if (this.props.updateStatus) {
226246
this.props.updateStatus('clear');
@@ -231,7 +251,7 @@ class Tests extends React.Component<DevToolProps, State> {
231251
});
232252
break;
233253
}
234-
case 'total_test_end': {
254+
case messages.TOTAL_TEST_END: {
235255
this.setState({
236256
...this.state,
237257
running: false,
@@ -259,7 +279,7 @@ class Tests extends React.Component<DevToolProps, State> {
259279
break;
260280
}
261281

262-
case 'add_file': {
282+
case messages.ADD_FILE: {
263283
this.setState(
264284
immer(this.state, state => {
265285
state.files[data.path] = {
@@ -272,7 +292,7 @@ class Tests extends React.Component<DevToolProps, State> {
272292
);
273293
break;
274294
}
275-
case 'remove_file': {
295+
case messages.REMOVE_FILE: {
276296
this.setState(
277297
immer(this.state, state => {
278298
if (state.files[data.path]) {
@@ -284,7 +304,7 @@ class Tests extends React.Component<DevToolProps, State> {
284304
);
285305
break;
286306
}
287-
case 'file_error': {
307+
case messages.FILE_ERROR: {
288308
this.setState(
289309
immer(this.state, state => {
290310
if (state.files[data.path]) {
@@ -294,15 +314,15 @@ class Tests extends React.Component<DevToolProps, State> {
294314
);
295315
break;
296316
}
297-
case 'describe_start': {
317+
case messages.DESCRIBE_START: {
298318
this.currentDescribeBlocks.push(data.blockName);
299319
break;
300320
}
301-
case 'describe_end': {
321+
case messages.DESCRIBE_END: {
302322
this.currentDescribeBlocks.pop();
303323
break;
304324
}
305-
case 'add_test': {
325+
case messages.ADD_TEST: {
306326
const testName = [...this.currentDescribeBlocks, data.testName];
307327

308328
this.setState(
@@ -326,7 +346,7 @@ class Tests extends React.Component<DevToolProps, State> {
326346
);
327347
break;
328348
}
329-
case 'test_start': {
349+
case messages.TEST_START: {
330350
const test = data.test;
331351
const testName = [...test.blocks, test.name];
332352

@@ -356,7 +376,7 @@ class Tests extends React.Component<DevToolProps, State> {
356376
);
357377
break;
358378
}
359-
case 'test_end': {
379+
case messages.TEST_END: {
360380
const test = data.test;
361381
const testName = [...test.blocks, test.name];
362382

packages/app/src/sandbox/compile.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ async function compile({
724724
firstLoad = false;
725725

726726
dispatch({ type: 'status', status: 'idle' });
727-
dispatch({ type: 'done' });
727+
dispatch({ type: 'done', compilatonError: hadError });
728728

729729
if (typeof (window as any).__puppeteer__ === 'function') {
730730
(window as any).__puppeteer__('done');

packages/app/src/sandbox/eval/tests/jest-lite.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -465,21 +465,24 @@ export default class TestRunner {
465465
};
466466

467467
handleCodeSandboxMessage = (message: any) => {
468-
if (message) {
469-
if (message.type === 'set-test-watching') {
468+
switch (message.type) {
469+
case 'set-test-watching':
470470
this.watching = message.watching;
471471
if (message.watching === true) {
472472
this.ranTests.clear();
473473
this.runTests(true);
474474
}
475-
} else if (message.type === 'run-all-tests') {
475+
break;
476+
case 'run-all-tests':
476477
this.ranTests.clear();
477478
this.runTests(true);
478-
} else if (message.type === 'run-tests') {
479+
break;
480+
case 'run-tests': {
479481
const path = message.path;
480482

481483
this.ranTests.delete(path);
482484
this.runTests();
485+
break;
483486
}
484487
}
485488
};

0 commit comments

Comments
 (0)