Skip to content

Commit

Permalink
feat(Tracing): return a buffer from tracing.stop (#2360)
Browse files Browse the repository at this point in the history
Fixes #2148
  • Loading branch information
yanivefraim authored and aslushnikov committed Apr 12, 2018
1 parent 04991ad commit 98bb261
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 7 deletions.
4 changes: 2 additions & 2 deletions docs/api.md
Expand Up @@ -1602,15 +1602,15 @@ await page.tracing.stop();

#### tracing.start(options)
- `options` <[Object]>
- `path` <[string]> A path to write the trace file to. **required**
- `path` <[string]> A path to write the trace file to.
- `screenshots` <[boolean]> captures screenshots in the trace.
- `categories` <[Array]<[string]>> specify custom categories to use instead of default.
- returns: <[Promise]>

Only one trace can be active at a time per browser.

#### tracing.stop()
- returns: <[Promise]>
- returns: <[Promise]<[Buffer]>> Promise which resolves to buffer with trace data.

### class: Dialog

Expand Down
16 changes: 13 additions & 3 deletions lib/Tracing.js
Expand Up @@ -35,7 +35,6 @@ class Tracing {
*/
async start(options) {
console.assert(!this._recording, 'Cannot start recording trace while already recording trace.');
console.assert(options.path, 'Must specify a path to write trace file to.');

const defaultCategories = [
'-*', 'devtools.timeline', 'v8.execute', 'disabled-by-default-devtools.timeline',
Expand Down Expand Up @@ -73,15 +72,26 @@ class Tracing {
*/
async _readStream(handle, path) {
let eof = false;
const file = await openAsync(path, 'w');
let file;
if (path)
file = await openAsync(path, 'w');
const bufs = [];
while (!eof) {
const response = await this._client.send('IO.read', {handle});
eof = response.eof;
bufs.push(new Buffer(response.data));
if (path)
await writeAsync(file, response.data);
}
await closeAsync(file);
if (path)
await closeAsync(file);
await this._client.send('IO.close', {handle});
let resultBuffer = null;
try {
resultBuffer = Buffer.concat(bufs);
} finally {
return resultBuffer;
}
}
}
helper.tracePublicAPI(Tracing);
Expand Down
30 changes: 28 additions & 2 deletions test/tracing.spec.js
Expand Up @@ -27,8 +27,10 @@ module.exports.addTests = function({testRunner, expect}) {
state.outputFile = path.join(__dirname, 'assets', `trace-${state.parallelIndex}.json`);
});
afterEach(function(state) {
fs.unlinkSync(state.outputFile);
state.outputFile = null;
if (fs.existsSync(state.outputFile)) {
fs.unlinkSync(state.outputFile);
state.outputFile = null;
}
});
it('should output a trace', async({page, server, outputFile}) => {
await page.tracing.start({screenshots: true, path: outputFile});
Expand All @@ -52,5 +54,29 @@ module.exports.addTests = function({testRunner, expect}) {
expect(error).toBeTruthy();
await page.tracing.stop();
});
it('should return a buffer', async({page, server, outputFile}) => {
await page.tracing.start({screenshots: true, path: outputFile});
await page.goto(server.PREFIX + '/grid.html');
const trace = await page.tracing.stop();
const buf = fs.readFileSync(outputFile);
expect(trace.toString()).toEqual(buf.toString());
});
it('should return null in case of Buffer error', async({page, server}) => {
await page.tracing.start({screenshots: true});
await page.goto(server.PREFIX + '/grid.html');
const oldBufferConcat = Buffer.concat;
Buffer.concat = bufs => {
throw 'error';
};
const trace = await page.tracing.stop();
expect(trace).toEqual(null);
Buffer.concat = oldBufferConcat;
});
it('should support a buffer without a path', async({page, server}) => {
await page.tracing.start({screenshots: true});
await page.goto(server.PREFIX + '/grid.html');
const trace = await page.tracing.stop();
expect(trace.toString()).toContain('screenshot');
});
});
};

1 comment on commit 98bb261

@ebidel
Copy link
Contributor

@ebidel ebidel commented on 98bb261 Apr 12, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

woot!

Please sign in to comment.