Skip to content

Commit

Permalink
makes asset saving use computed artifacts
Browse files Browse the repository at this point in the history
fixes screenshots not being saved
  • Loading branch information
brendankenny committed Sep 28, 2016
1 parent 962948f commit 26b9b97
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 25 deletions.
57 changes: 41 additions & 16 deletions lighthouse-core/lib/asset-saver.js
Expand Up @@ -85,28 +85,53 @@ function saveArtifacts(artifacts, filename) {
log.log('artifacts file saved to disk', artifactsFilename);
}

/**
* Filter traces and extract screenshots to prepare for saving.
* @param {!Object} options
* @param {!Artifacts} artifacts
* @return {!Promise<!Array<{traceData: !Object, html: string}>>}
*/
function prepareAssets(options, artifacts) {
const traceData = Object.keys(artifacts.traces).map(passName => {
const filteredTrace = Object.assign({}, artifacts.traces[passName]);
filteredTrace.traceEvents = filterForSize(filteredTrace.traceEvents);
return filteredTrace;
});
const html = screenshotDump(options, artifacts.ScreenshotFilmstrip);
return {traceData, html};
const passNames = Object.keys(artifacts.traces);
const assets = [];

return passNames.reduce((chain, passName) => {
const trace = artifacts.traces[passName];

return chain.then(_ => artifacts.requestScreenshots(trace))
.then(screenshots => {
const traceData = Object.assign({}, trace);
traceData.traceEvents = filterForSize(traceData.traceEvents);
const html = screenshotDump(options, screenshots);

assets.push({
traceData,
html
});
});
}, Promise.resolve())
.then(_ => assets);
}

/**
* Writes trace(s) and associated screenshot(s) to disk.
* @param {!Object} options
* @param {!Artifacts} artifacts
* @return {!Promise}
*/
function saveAssets(options, artifacts) {
const assets = prepareAssets(options, artifacts);
return prepareAssets(options, artifacts).then(assets => {
assets.forEach((data, index) => {
const filenamePrefix = getFilenamePrefix(options);

assets.traceData.forEach((data, index) => {
const traceFilename = getFilenamePrefix(options);
fs.writeFileSync(`${traceFilename}${index}.trace.json`, stringify(data, null, 2));
log.log('trace file saved to disk', traceFilename);
});
const traceData = data.traceData;
fs.writeFileSync(`${filenamePrefix}-${index}.trace.json`, stringify(traceData, null, 2));
log.log('trace file saved to disk', filenamePrefix);

const screenshotsFilename = getFilenamePrefix(options);
fs.writeFileSync(screenshotsFilename + '.screenshots.html', assets.html);
log.log('screenshots saved to disk', screenshotsFilename);
fs.writeFileSync(`${filenamePrefix}-${index}.screenshots.html`, data.html);
log.log('screenshots saved to disk', filenamePrefix);
});
});
}

module.exports = {
Expand Down
9 changes: 7 additions & 2 deletions lighthouse-core/runner.js
Expand Up @@ -80,13 +80,18 @@ class Runner {

// Ignoring these two flags for coverage as this functionality is not exposed by the module.
/* istanbul ignore next */
if (opts.flags.saveArtifacts || opts.flags.saveAssets) {
if (opts.flags.saveArtifacts) {
run = run.then(artifacts => {
opts.flags.saveArtifacts && assetSaver.saveArtifacts(artifacts);
opts.flags.saveAssets && assetSaver.saveAssets(opts, artifacts);
return artifacts;
});
}
if (opts.flags.saveAssets) {
run = run.then(artifacts => {
return assetSaver.saveAssets(opts, artifacts)
.then(_ => artifacts);
});
}

// Now run the audits.
let auditResults = [];
Expand Down
22 changes: 15 additions & 7 deletions lighthouse-core/test/lib/asset-saver-test.js
Expand Up @@ -21,17 +21,25 @@ const assetSaver = require('../../lib/asset-saver');
const assert = require('assert');
const fs = require('fs');

const ScreenshotFilmstrip = require('../fixtures/traces/screenshots.json');
const screenshotFilmstrip = require('../fixtures/traces/screenshots.json');
const traceEvents = require('../fixtures/traces/progressive-app.json');
const Audit = require('../../audits/audit.js');

/* eslint-env mocha */
describe('asset-saver helper', () => {
it('generates HTML', () => {
const options = {url: 'https://testexample.com'};
const artifacts = {screenshots: [], traces: []};
const output = assetSaver.prepareAssets(options, artifacts);
assert.ok(/<!doctype/gim.test(output.html));
const artifacts = {
traces: {
[Audit.DEFAULT_PASS]: {
traceEvents: []
}
},
requestScreenshots: () => Promise.resolve([]),
};
return assetSaver.prepareAssets(options, artifacts).then(assets => {
assert.ok(/<!doctype/gim.test(assets[0].html));
});
});

describe('saves files to disk with real filenames', function() {
Expand All @@ -48,20 +56,20 @@ describe('asset-saver helper', () => {
traceEvents
}
},
ScreenshotFilmstrip
requestScreenshots: () => Promise.resolve(screenshotFilmstrip)
};

assetSaver.saveAssets(options, artifacts);

it('trace file saved to disk with data', () => {
const traceFilename = assetSaver.getFilenamePrefix(options) + '0.trace.json';
const traceFilename = assetSaver.getFilenamePrefix(options) + '-0.trace.json';
const traceFileContents = fs.readFileSync(traceFilename, 'utf8');
assert.ok(traceFileContents.length > 3000000);
fs.unlinkSync(traceFilename);
});

it('screenshots file saved to disk with data', () => {
const ssFilename = assetSaver.getFilenamePrefix(options) + '.screenshots.html';
const ssFilename = assetSaver.getFilenamePrefix(options) + '-0.screenshots.html';
const ssFileContents = fs.readFileSync(ssFilename, 'utf8');
assert.ok(/<!doctype/gim.test(ssFileContents));
assert.ok(ssFileContents.includes('{"timestamp":674089419.919'));
Expand Down

0 comments on commit 26b9b97

Please sign in to comment.