mirror of
https://github.com/microsoft/playwright.git
synced 2024-12-15 22:22:53 +03:00
d104591aa1
This refactors azure function and adds a new dashboard format implementation that is 15x smaller while tracking specs with non-empty annotations. Old dashboard is still updated.
80 lines
2.8 KiB
JavaScript
80 lines
2.8 KiB
JavaScript
/**
|
|
* Copyright (c) Microsoft Corporation.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the 'License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
const { BlobServiceClient } = require("@azure/storage-blob");
|
|
const zlib = require('zlib');
|
|
const util = require('util');
|
|
|
|
const gzipAsync = util.promisify(zlib.gzip);
|
|
const gunzipAsync = util.promisify(zlib.gunzip);
|
|
|
|
const blobServiceClient = BlobServiceClient.fromConnectionString(process.env.AzureWebJobsStorage);
|
|
|
|
function flattenSpecs(suite, result = []) {
|
|
if (suite.suites) {
|
|
for (const child of suite.suites)
|
|
flattenSpecs(child, result);
|
|
}
|
|
for (const spec of suite.specs || [])
|
|
result.push(spec);
|
|
return result;
|
|
}
|
|
|
|
class SimpleBlob {
|
|
static async create(container, blobName) {
|
|
const dashboardContainerClient = await blobServiceClient.getContainerClient(container);
|
|
return new SimpleBlob(dashboardContainerClient, blobName);
|
|
}
|
|
|
|
constructor(containerClient, blobName) {
|
|
this._blobClient = containerClient.getBlobClient(blobName);
|
|
this._blockBlobClient = this._blobClient.getBlockBlobClient();
|
|
}
|
|
|
|
async download() {
|
|
if (!await this._blobClient.exists())
|
|
return undefined;
|
|
const response = await this._blobClient.download();
|
|
const responseStream = response.readableStreamBody;
|
|
const buffer = await new Promise((resolve, reject) => {
|
|
const chunks = [];
|
|
responseStream.on('data', data => chunks.push(data instanceof Buffer ? data : Buffer.from(data)));
|
|
responseStream.on('end', () => resolve(Buffer.concat(chunks)));
|
|
responseStream.on('error', reject);
|
|
});
|
|
const properties = await this._blobClient.getProperties();
|
|
const content = properties.contentEncoding.toLowerCase().trim() === 'gzip' ? await gunzipAsync(buffer) : buffer.toString('utf8');
|
|
return JSON.parse(content);
|
|
}
|
|
|
|
async uploadGzipped(data) {
|
|
const content = JSON.stringify(data);
|
|
const zipped = await gzipAsync(content);
|
|
await this._blockBlobClient.upload(zipped, Buffer.byteLength(zipped), {
|
|
blobHTTPHeaders: {
|
|
blobContentEncoding: 'gzip',
|
|
blobContentType: 'application/json; charset=UTF-8',
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
async function deleteBlob(container, blobName) {
|
|
const containerClient = await blobServiceClient.getContainerClient(container);
|
|
await containerClient.deleteBlob(blobName, {});
|
|
}
|
|
|
|
module.exports = {gzipAsync, gunzipAsync, flattenSpecs, SimpleBlob, blobServiceClient, deleteBlob};
|