Skip to content

Commit 5ba5b3e

Browse files
committed
Add extra logging during error
1 parent f174edc commit 5ba5b3e

2 files changed

Lines changed: 64 additions & 44 deletions

File tree

e2e/src/utils/Actions.ts

Lines changed: 54 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import { ErrorEvent, type Event, PlayerEventType, SourceDescription, THEOplayer } from 'react-native-theoplayer';
44
import { getTestPlayer } from '../components/TestableTHEOplayerView';
5+
import { logPlayerBuffer } from './PlayerUtils';
56

67
export interface TestOptions {
78
timeout: number;
@@ -66,51 +67,52 @@ export const waitForPlayerEvents = async <EType extends Event<PlayerEventType>>(
6667
options = defaultTestOptions,
6768
): Promise<Event<PlayerEventType>[]> => {
6869
const receivedEvents: Event<PlayerEventType>[] = [];
69-
return withEventTimeOut(
70-
new Promise<Event<PlayerEventType>[]>((resolve, reject) => {
71-
const onError = (err: ErrorEvent) => {
72-
console.error('[waitForPlayerEvents]', err);
73-
player.removeEventListener(PlayerEventType.ERROR, onError);
74-
reject(err);
75-
};
76-
let eventMap = expectedEvents.map((_expected: Partial<EType>) => ({
77-
event: _expected as Event<PlayerEventType>,
78-
onEvent(receivedEvent: Event<PlayerEventType>) {
79-
if (!eventMap.length) {
80-
// No more events expected
81-
return;
70+
const eventsPromise = new Promise<Event<PlayerEventType>[]>((resolve, reject) => {
71+
const onError = (err: ErrorEvent) => {
72+
console.error('[waitForPlayerEvents]', err);
73+
player.removeEventListener(PlayerEventType.ERROR, onError);
74+
reject(err);
75+
};
76+
let eventMap = expectedEvents.map((_expected: Partial<EType>) => ({
77+
event: _expected as Event<PlayerEventType>,
78+
onEvent(receivedEvent: Event<PlayerEventType>) {
79+
if (!eventMap.length) {
80+
// No more events expected
81+
return;
82+
}
83+
const expectedEvent = eventMap[0].event;
84+
receivedEvents.push(receivedEvent);
85+
console.debug('[waitForPlayerEvents]', `Received event ${JSON.stringify(receivedEvent.type)} - waiting for ${expectedEvent.type}`);
86+
const index = eventMap.findIndex((e) => propsMatch(e.event, receivedEvent));
87+
const isExpected = index <= 0;
88+
89+
// Check order
90+
if (inOrder && eventMap.length && !isExpected) {
91+
const err = `Expected event '${expectedEvent.type}' but received '${receivedEvent.type}'`;
92+
console.error('[waitForPlayerEvents]', err);
93+
reject(err);
94+
}
95+
eventMap = eventMap.filter((entry) => {
96+
if (entry.event.type === expectedEvent.type) {
97+
player.removeEventListener(expectedEvent.type, entry.onEvent);
8298
}
83-
const expectedEvent = eventMap[0].event;
84-
receivedEvents.push(receivedEvent);
85-
console.debug('[waitForPlayerEvents]', `Received event ${JSON.stringify(receivedEvent.type)} - waiting for ${expectedEvent.type}`);
86-
const index = eventMap.findIndex((e) => propsMatch(e.event, receivedEvent));
87-
const isExpected = index <= 0;
88-
89-
// Check order
90-
if (inOrder && eventMap.length && !isExpected) {
91-
const err = `Expected event '${expectedEvent.type}' but received '${receivedEvent.type}'`;
92-
console.error('[waitForPlayerEvents]', err);
93-
reject(err);
94-
}
95-
eventMap = eventMap.filter((entry) => {
96-
if (entry.event.type === expectedEvent.type) {
97-
player.removeEventListener(expectedEvent.type, entry.onEvent);
98-
}
99-
return entry.event.type !== expectedEvent.type;
100-
});
101-
if (!eventMap.length) {
102-
// Done
103-
resolve(receivedEvents);
104-
}
105-
},
106-
}));
107-
player.addEventListener(PlayerEventType.ERROR, onError);
108-
eventMap.forEach(({ event, onEvent }) => player.addEventListener(event.type, onEvent));
109-
}),
110-
options.timeout,
111-
expectedEvents,
112-
receivedEvents,
113-
);
99+
return entry.event.type !== expectedEvent.type;
100+
});
101+
if (!eventMap.length) {
102+
// Done
103+
resolve(receivedEvents);
104+
}
105+
},
106+
}));
107+
player.addEventListener(PlayerEventType.ERROR, onError);
108+
eventMap.forEach(({ event, onEvent }) => player.addEventListener(event.type, onEvent));
109+
});
110+
111+
// Add rejection on time-out
112+
const timeOutPromise = withEventTimeOut(eventsPromise, options.timeout, expectedEvents, receivedEvents);
113+
114+
// Add extra logging on error
115+
return withPlayerStateLogOnError(player, timeOutPromise);
114116
};
115117

116118
const withEventTimeOut = <EType extends Event<PlayerEventType>>(
@@ -137,6 +139,14 @@ const withEventTimeOut = <EType extends Event<PlayerEventType>>(
137139
});
138140
};
139141

142+
const withPlayerStateLogOnError = async (player: THEOplayer, promise: Promise<any>) => {
143+
try {
144+
return await promise;
145+
} catch (e) {
146+
throw e + ` buffer: ${logPlayerBuffer(player)};` + ` currenTime: ${player.currentTime};` + ` paused: ${player.paused};`;
147+
}
148+
};
149+
140150
export function expect(actual: any, desc?: string) {
141151
const descPrefix = desc ? `${desc}: ` : '';
142152

e2e/src/utils/PlayerUtils.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { THEOplayer } from 'react-native-theoplayer';
2+
3+
export function logPlayerBuffer(player: THEOplayer): string {
4+
let buffer = '[ ';
5+
for (let i = 0; i < player.buffered.length; i++) {
6+
buffer += `${player.buffered[i].start} - ${player.buffered[i].end} ${i === player.buffered.length - 1 ? '' : ', '}`;
7+
}
8+
buffer += ']';
9+
return buffer;
10+
}

0 commit comments

Comments
 (0)