// Licensed to the Software Freedom Conservancy (SFC) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The SFC licenses this file // to you 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. 'use strict' const assert = require('node:assert') const fs = require('node:fs') const path = require('node:path') const io = require('selenium-webdriver/io') const zip = require('selenium-webdriver/io/zip') const { InvalidArgumentError } = require('selenium-webdriver/lib/error') const { locate } = require('../../lib/test/resources') const XPI_PATH = locate('common/extensions/webextensions-selenium-example.xpi') describe('io/zip', function () { describe('unzip', function () { it('creates destination dir if necessary', function () { return io .tmpDir() .then((dir) => zip.unzip(XPI_PATH, dir)) .then((dir) => { assertExists(path.join(dir, 'inject.js')) assertExists(path.join(dir, 'manifest.json')) assertExists(path.join(dir, 'META-INF/manifest.mf')) }) }) }) describe('Zip', function () { let dir beforeEach(function () { return io.tmpDir().then((d) => (dir = d)) }) it('can convert an archive to a buffer', function () { let z = new zip.Zip() return io .mkdirp(path.join(dir, 'a/b/c/d/e')) .then(() => { return Promise.all([ io.write(path.join(dir, 'foo'), 'a file'), io.write(path.join(dir, 'a/b/c/carrot'), 'an orange carrot'), io.write(path.join(dir, 'a/b/c/d/e/elephant'), 'e is for elephant'), ]) }) .then(() => z.addDir(dir)) .then(() => Promise.all([io.tmpDir(), z.toBuffer()])) .then(([outDir, buf]) => { let output = path.join(outDir, 'out.zip') return io .write(output, buf) .then(() => io.tmpDir()) .then((d) => zip.unzip(output, d)) .then((d) => { assertContents(path.join(d, 'foo'), 'a file') assertContents(path.join(d, 'a/b/c/carrot'), 'an orange carrot') assertContents(path.join(d, 'a/b/c/d/e/elephant'), 'e is for elephant') }) }) }) describe('getFile', function () { it('returns archive file contents as a buffer', function () { let foo = path.join(dir, 'foo') fs.writeFileSync(foo, 'hello, world!') let z = new zip.Zip() return z .addFile(foo) .then(() => { assert.ok(z.has('foo')) return z.getFile('foo') }) .then((buffer) => assert.strictEqual(buffer.toString('utf8'), 'hello, world!')) }) it('returns an error if file is not in archive', function () { let z = new zip.Zip() assert.ok(!z.has('some-file')) return z.getFile('some-file').then( () => assert.fail('should have failed'), (e) => assert.strictEqual(e.constructor, InvalidArgumentError), ) }) it('returns a rejected promise if the requested path is a directory', function () { let file = path.join(dir, 'aFile') fs.writeFileSync(file, 'hello, world!') let z = new zip.Zip() return z .addDir(dir, 'foo') .then(() => z.getFile('foo')) .then( () => assert.fail('should have failed'), (e) => assert.strictEqual(e.constructor, InvalidArgumentError), ) .then(() => z.getFile('foo/aFile')) .then((b) => assert.strictEqual(b.toString('utf8'), 'hello, world!')) }) }) }) function assertExists(p) { assert.ok(fs.existsSync(p), `expected ${p} to exist`) } function assertContents(p, c) { assert.strictEqual(fs.readFileSync(p, 'utf8'), c, `unexpected file contents for ${p}`) } })