Skip to content

Commit bd4a58c

Browse files
rickhanloniimeta-codesync[bot]
authored andcommitted
Remove legacy component stack tests (#55230)
Summary: Pull Request resolved: #55230 Remove tests that only test legacy component stack behavior. The 'stack' tests provide equivalent coverage for all scenarios. Legacy component stacks used a custom React string format (`\n in ComponentName (at filename.js:123)`) that was not symbolicated. The modern 'stack' format uses native JS Error stack frames that get properly symbolicated. This is the first step in removing `componentStackType` from LogBox entirely. The legacy parsing logic will be removed in a follow-up diff. Changelog: [Internal] Reviewed By: vzaidman Differential Revision: D90888272 fbshipit-source-id: 80e878636b58068cea760926b3b807ab421913af
1 parent 66c5b55 commit bd4a58c

2 files changed

Lines changed: 17 additions & 834 deletions

File tree

packages/react-native/Libraries/LogBox/Data/__tests__/LogBoxLog-test.js

Lines changed: 0 additions & 260 deletions
Original file line numberDiff line numberDiff line change
@@ -40,29 +40,6 @@ const COMPONENT_CODE_FRAME: CodeCodeFrame = {
4040
content: 'Component',
4141
};
4242

43-
// We can delete this when we delete legacy component stack types.
44-
function getLogBoxLogLegacy() {
45-
return new (require('../LogBoxLog').default)({
46-
level: 'warn',
47-
isComponentError: false,
48-
message: {content: '...', substitutions: []},
49-
stack: createStack(['A', 'B', 'C']),
50-
category: 'Message category...',
51-
componentStack: [
52-
{
53-
content: 'LogBoxLog',
54-
fileName: 'LogBoxLog.js',
55-
location: {column: -1, row: 1},
56-
},
57-
],
58-
codeFrame: {
59-
fileName: '/path/to/RKJSModules/Apps/CrashReact/CrashReactApp.js',
60-
location: {row: 199, column: 0},
61-
content: '<code frame>',
62-
},
63-
});
64-
}
65-
6643
function getLogBoxLog() {
6744
return new (require('../LogBoxLog').default)({
6845
level: 'warn',
@@ -148,243 +125,6 @@ describe('LogBoxLog', () => {
148125
);
149126
});
150127

151-
describe('symbolicate legacy component stacks (no symbolication)', () => {
152-
it('creates a LogBoxLog object', () => {
153-
const log = getLogBoxLogLegacy();
154-
155-
expect(log.level).toEqual('warn');
156-
expect(log.message).toEqual({content: '...', substitutions: []});
157-
expect(log.stack).toEqual(createStack(['A', 'B', 'C']));
158-
expect(log.category).toEqual('Message category...');
159-
expect(log.componentStack).toEqual([
160-
{
161-
content: 'LogBoxLog',
162-
fileName: 'LogBoxLog.js',
163-
location: {column: -1, row: 1},
164-
},
165-
]);
166-
expect(log.codeFrame).toEqual({
167-
fileName: '/path/to/RKJSModules/Apps/CrashReact/CrashReactApp.js',
168-
location: {row: 199, column: 0},
169-
content: '<code frame>',
170-
});
171-
});
172-
173-
it('increments LogBoxLog count', () => {
174-
const log = getLogBoxLogLegacy();
175-
176-
expect(log.count).toEqual(1);
177-
178-
log.incrementCount();
179-
180-
expect(log.count).toEqual(2);
181-
});
182-
183-
it('starts without a symbolicated stack', () => {
184-
const log = getLogBoxLogLegacy();
185-
186-
expect(log.symbolicated).toEqual({
187-
error: null,
188-
stack: null,
189-
status: 'NONE',
190-
});
191-
});
192-
193-
it('updates when symbolication is in progress', () => {
194-
const log = getLogBoxLogLegacy();
195-
196-
const callback = jest.fn();
197-
log.symbolicate(callback);
198-
199-
expect(callback).toBeCalledTimes(1);
200-
expect(callback).toBeCalledWith('PENDING');
201-
expect(getLogBoxSymbolication().symbolicate).toBeCalledTimes(1);
202-
expect(log.symbolicated).toEqual({
203-
error: null,
204-
stack: null,
205-
status: 'PENDING',
206-
});
207-
208-
// Symbolicating while pending should not make more requests.
209-
callback.mockClear();
210-
getLogBoxSymbolication().symbolicate.mockClear();
211-
212-
log.symbolicate(callback);
213-
expect(callback).not.toBeCalled();
214-
expect(getLogBoxSymbolication().symbolicate).not.toBeCalled();
215-
});
216-
217-
it('updates when symbolication finishes', async () => {
218-
const log = getLogBoxLogLegacy();
219-
220-
const callback = jest.fn();
221-
log.symbolicate(callback);
222-
expect(callback).toBeCalledTimes(1);
223-
expect(callback).toBeCalledWith('PENDING');
224-
expect(getLogBoxSymbolication().symbolicate).toBeCalled();
225-
226-
await runMicrotasks();
227-
228-
expect(callback).toBeCalledTimes(2);
229-
expect(callback).toBeCalledWith('COMPLETE');
230-
expect(log.symbolicated).toEqual({
231-
error: null,
232-
stack: createStack(['S(A)', 'S(B)', 'S(C)']),
233-
status: 'COMPLETE',
234-
});
235-
236-
// Do not symbolicate again.
237-
callback.mockClear();
238-
getLogBoxSymbolication().symbolicate.mockClear();
239-
240-
log.symbolicate(callback);
241-
242-
await runMicrotasks();
243-
244-
expect(callback).toBeCalledTimes(0);
245-
expect(getLogBoxSymbolication().symbolicate).not.toBeCalled();
246-
});
247-
248-
it('updates when symbolication fails', async () => {
249-
const error = new Error('...');
250-
getLogBoxSymbolication().symbolicate.mockImplementation(async stack => {
251-
throw error;
252-
});
253-
254-
const log = getLogBoxLogLegacy();
255-
256-
const callback = jest.fn();
257-
log.symbolicate(callback);
258-
expect(callback).toBeCalledTimes(1);
259-
expect(callback).toBeCalledWith('PENDING');
260-
expect(getLogBoxSymbolication().symbolicate).toBeCalled();
261-
262-
await runMicrotasks();
263-
264-
expect(callback).toBeCalledTimes(2);
265-
expect(callback).toBeCalledWith('FAILED');
266-
expect(log.symbolicated).toEqual({
267-
error,
268-
stack: null,
269-
status: 'FAILED',
270-
});
271-
272-
// Do not symbolicate again, retry if needed.
273-
callback.mockClear();
274-
getLogBoxSymbolication().symbolicate.mockClear();
275-
276-
log.symbolicate(callback);
277-
278-
await runMicrotasks();
279-
280-
expect(callback).toBeCalledTimes(0);
281-
expect(getLogBoxSymbolication().symbolicate).not.toBeCalled();
282-
});
283-
284-
it('retry updates when symbolication is in progress', () => {
285-
const log = getLogBoxLogLegacy();
286-
287-
const callback = jest.fn();
288-
log.retrySymbolicate(callback);
289-
290-
expect(callback).toBeCalledTimes(1);
291-
expect(callback).toBeCalledWith('PENDING');
292-
expect(getLogBoxSymbolication().symbolicate).toBeCalledTimes(1);
293-
expect(log.symbolicated).toEqual({
294-
error: null,
295-
stack: null,
296-
status: 'PENDING',
297-
});
298-
299-
// Symbolicating while pending should not make more requests.
300-
callback.mockClear();
301-
getLogBoxSymbolication().symbolicate.mockClear();
302-
303-
log.symbolicate(callback);
304-
expect(callback).not.toBeCalled();
305-
expect(getLogBoxSymbolication().symbolicate).not.toBeCalled();
306-
});
307-
308-
it('retry updates when symbolication finishes', async () => {
309-
const log = getLogBoxLogLegacy();
310-
311-
const callback = jest.fn();
312-
log.retrySymbolicate(callback);
313-
expect(callback).toBeCalledTimes(1);
314-
expect(callback).toBeCalledWith('PENDING');
315-
expect(getLogBoxSymbolication().symbolicate).toBeCalled();
316-
317-
await runMicrotasks();
318-
319-
expect(callback).toBeCalledTimes(2);
320-
expect(callback).toBeCalledWith('COMPLETE');
321-
expect(log.symbolicated).toEqual({
322-
error: null,
323-
stack: createStack(['S(A)', 'S(B)', 'S(C)']),
324-
status: 'COMPLETE',
325-
});
326-
327-
// Do not symbolicate again
328-
callback.mockClear();
329-
getLogBoxSymbolication().symbolicate.mockClear();
330-
331-
log.retrySymbolicate(callback);
332-
jest.runAllTicks();
333-
334-
expect(callback).toBeCalledTimes(0);
335-
expect(getLogBoxSymbolication().symbolicate).not.toBeCalled();
336-
});
337-
338-
it('retry updates when symbolication fails', async () => {
339-
const error = new Error('...');
340-
getLogBoxSymbolication().symbolicate.mockImplementation(async stack => {
341-
throw error;
342-
});
343-
344-
const log = getLogBoxLogLegacy();
345-
346-
const callback = jest.fn();
347-
log.retrySymbolicate(callback);
348-
expect(callback).toBeCalledTimes(1);
349-
expect(callback).toBeCalledWith('PENDING');
350-
expect(getLogBoxSymbolication().symbolicate).toBeCalled();
351-
352-
await runMicrotasks();
353-
354-
expect(callback).toBeCalledTimes(2);
355-
expect(callback).toBeCalledWith('FAILED');
356-
expect(log.symbolicated).toEqual({
357-
error,
358-
stack: null,
359-
status: 'FAILED',
360-
});
361-
362-
// Retry to symbolicate again.
363-
callback.mockClear();
364-
getLogBoxSymbolication().symbolicate.mockClear();
365-
getLogBoxSymbolication().symbolicate.mockImplementation(async stack => ({
366-
stack: createStack(stack.map(frame => `S(${frame.methodName})`)),
367-
codeFrame: null,
368-
}));
369-
370-
log.retrySymbolicate(callback);
371-
372-
expect(callback).toBeCalledTimes(1);
373-
expect(callback).toBeCalledWith('PENDING');
374-
expect(getLogBoxSymbolication().symbolicate).toBeCalled();
375-
376-
await runMicrotasks();
377-
378-
expect(callback).toBeCalledTimes(2);
379-
expect(callback).toBeCalledWith('COMPLETE');
380-
expect(log.symbolicated).toEqual({
381-
error: null,
382-
stack: createStack(['S(A)', 'S(B)', 'S(C)']),
383-
status: 'COMPLETE',
384-
});
385-
});
386-
});
387-
388128
describe('symbolicate component stacks', () => {
389129
it('creates a LogBoxLog object', () => {
390130
const log = getLogBoxLog();

0 commit comments

Comments
 (0)