Skip to content

Commit ed0e9f9

Browse files
committed
Add more comments. Change temp folder to untrustedInbox
1 parent ef092ed commit ed0e9f9

File tree

2 files changed

+29
-16
lines changed

2 files changed

+29
-16
lines changed

functions/index.js

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const fs = require('fs');
1616
* /screenshot/reports/$prNumber.
1717
* These are data for screenshot results (success or failure), GitHub PR/commit and TravisCI job information
1818
*
19-
* For valid image datas written to database /$temp/screenshot/images/$prNumber/$secureToken/, save the image
19+
* For valid image results written to database /$temp/screenshot/images/$prNumber/$secureToken/, save the image
2020
* data to image files and upload to google cloud storage under location /screenshots/$prNumber
2121
* These are screenshot test result images, and difference images generated from screenshot comparison.
2222
*
@@ -48,26 +48,35 @@ const bucket = gcs.bucket(firebaseFunctions.config().firebase.storageBucket);
4848
/** The Json Web Token format. The token is stored in data path. */
4949
const jwtFormat = '{jwtHeader}/{jwtPayload}/{jwtSignature}';
5050

51-
/** The temporary folder name */
52-
const tempFolder = '/screenshotQueue';
51+
/** The temporary folder name for screenshot data that needs to be validated via JWT. */
52+
const tempFolder = '/untrustedInbox';
5353

54-
/** Copy valid data from /$temp/screenshot/reports/$prNumber/$secureToken/ to /screenshot/reports/$prNumber */
54+
/**
55+
* Copy valid data from /$temp/screenshot/reports/$prNumber/$secureToken/ to /screenshot/reports/$prNumber
56+
* Data copied: filenames(image results names), commit(github PR info),
57+
* sha (github PR info), result (true or false for all the tests), travis job number
58+
*/
5559
const copyDataPath = `${tempFolder}/screenshot/reports/{prNumber}/${jwtFormat}/{dataType}`;
5660
exports.copyData = firebaseFunctions.database.ref(copyDataPath).onWrite(event => {
5761
const dataType = event.params.dataType;
5862
if (dataTypes.includes(dataType)) {
59-
return handleDataChange(event, dataType);
63+
return verifyAndCopyScreenshotResult(event, dataType);
6064
}
61-
return;
6265
});
6366

64-
/** Copy valid data from /$temp/screenshot/reports/$prNumber/$secureToken/ to /screenshot/reports/$prNumber */
67+
/**
68+
* Copy valid data from /$temp/screenshot/reports/$prNumber/$secureToken/ to /screenshot/reports/$prNumber
69+
* Data copied: test result for each file/test with ${filename}. The value should be true or false.
70+
*/
6571
const copyDataResultPath = `${tempFolder}/screenshot/reports/{prNumber}/${jwtFormat}/results/{filename}`;
6672
exports.copyDataResult = firebaseFunctions.database.ref(copyDataResultPath).onWrite(event => {
67-
return handleDataChange(event, `results/${event.params.filename}`);
73+
return verifyAndCopyScreenshotResult(event, `results/${event.params.filename}`);
6874
});
6975

70-
/** Copy valid data from database /$temp/screenshot/images/$prNumber/$secureToken/ to storage /screenshots/$prNumber */
76+
/**
77+
* Copy valid data from database /$temp/screenshot/images/$prNumber/$secureToken/ to storage /screenshots/$prNumber
78+
* Data copied: test result images. Convert from data to image files in storage.
79+
*/
7180
const copyImagePath = `${tempFolder}/screenshot/images/{prNumber}/${jwtFormat}/{dataType}/{filename}`;
7281
exports.copyImage = firebaseFunctions.database.ref(copyImagePath).onWrite(event => {
7382
// Only edit data when it is first created. Exit when the data is deleted.
@@ -84,7 +93,7 @@ exports.copyImage = firebaseFunctions.database.ref(copyImagePath).onWrite(event
8493
return;
8594
}
8695

87-
return validateSecureToken(secureToken, prNumber).then((payload) => {
96+
return verifySecureToken(secureToken, prNumber).then((payload) => {
8897
const tempPath = `/tmp/${dataType}-${saveFilename}`
8998
const filePath = `screenshots/${prNumber}/${dataType}/${saveFilename}`;
9099
const binaryData = new Buffer(event.data.val(), 'base64').toString('binary');
@@ -105,6 +114,7 @@ exports.copyImage = firebaseFunctions.database.ref(copyImagePath).onWrite(event
105114
*/
106115
exports.copyGoldens = firebaseFunctions.storage.bucket(firebaseFunctions.config().firebase.storageBucket)
107116
.object().onChange(event => {
117+
// The filePath should always l ook like "goldens/xxx.png"
108118
const filePath = event.data.name;
109119

110120
// Get the file name.
@@ -114,7 +124,7 @@ exports.copyGoldens = firebaseFunctions.storage.bucket(firebaseFunctions.config(
114124
}
115125
const filenameKey = fileNames[1].replace('.screenshot.png', '');
116126

117-
// When delete a file, remove the file in database
127+
// When a gold image is deleted, also delete the corresponding record in the firebase database.
118128
if (event.data.resourceState === 'not_exists') {
119129
return firebaseAdmin.database().ref(`screenshot/goldens/${filenameKey}`).set(null);
120130
}
@@ -132,7 +142,7 @@ exports.copyGoldens = firebaseFunctions.storage.bucket(firebaseFunctions.config(
132142
* Handle data written to temporary folder. Validate the JWT and move the data out of
133143
* temporary folder if the token is valid.
134144
*/
135-
function handleDataChange(event, path) {
145+
function verifyAndCopyScreenshotResult(event, path) {
136146
// Only edit data when it is first created. Exit when the data is deleted.
137147
if (event.data.previous.exists() || !event.data.exists()) {
138148
return;
@@ -142,7 +152,7 @@ function handleDataChange(event, path) {
142152
const secureToken = getSecureToken(event);
143153
const original = event.data.val();
144154

145-
return validateSecureToken(secureToken, prNumber).then((payload) => {
155+
return verifySecureToken(secureToken, prNumber).then((payload) => {
146156
return firebaseAdmin.database().ref().child('screenshot/reports')
147157
.child(prNumber).child(path).set(original).then(() => {
148158
// Clear the data in temporary folder after processed.
@@ -163,7 +173,7 @@ function getSecureToken(event) {
163173
return `${event.params.jwtHeader}.${event.params.jwtPayload}.${event.params.jwtSignature}`;
164174
}
165175

166-
function validateSecureToken(token, prNumber) {
176+
function verifySecureToken(token, prNumber) {
167177
return new Promise((resolve, reject) => {
168178
jwt.verify(token, secret, {issuer: 'Travis CI, GmbH'}, (err, payload) => {
169179
if (err) {

tools/gulp/tasks/screenshots.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import {setGithubStatus} from '../util/github';
1111

1212
const imageDiff = require('image-diff');
1313

14-
const TEMP_FOLDER = 'screenshotQueue';
14+
// Directory to which untrusted screenshot results are temporarily written
15+
// (without authentication required) before they are verified and copied to the final storage location.
16+
const TEMP_FOLDER = 'untrustedInbox';
1517
const SCREENSHOT_DIR = './screenshots';
1618
const FIREBASE_REPORT = `${TEMP_FOLDER}/screenshot/reports`;
1719
const FIREBASE_IMAGE = `${TEMP_FOLDER}/screenshot/images`;
@@ -78,7 +80,8 @@ function getScreenshotFiles(database: firebase.database.Database) {
7880
let key = childSnapshot.key;
7981
let binaryData = new Buffer(childSnapshot.val(), 'base64').toString('binary');
8082
writeFileSync(`${SCREENSHOT_DIR}/golds/${key}.screenshot.png`, binaryData, 'binary');
81-
if (++counter == snapshot.numChildren()) {
83+
counter++;
84+
if (counter == snapshot.numChildren()) {
8285
return true;
8386
}
8487
});

0 commit comments

Comments
 (0)