From 507e0a49074842ec610bfb8d8d72aab6c4d44c12 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sun, 17 Feb 2019 12:34:37 +0100 Subject: [PATCH] Add a new `DOMFileReaderFactory` helper to the unit-tests, and re-factor `NodeFileReaderFactory` to be asynchronous This allows simplification of the 'creates pdf doc from URL and aborts loading after worker initialized' API unit-test. Note that the `DOMFileReaderFactory` uses the Fetch API, for simplicity, since it should be available in all browsers where we're running tests. --- test/unit/api_spec.js | 64 ++++++++++++++++------------------------- test/unit/test_utils.js | 27 ++++++++++++++--- 2 files changed, 48 insertions(+), 43 deletions(-) diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index 073634517..8d481973c 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -14,13 +14,12 @@ */ import { - buildGetDocumentParams, NodeCanvasFactory, NodeFileReaderFactory, - TEST_PDFS_PATH + buildGetDocumentParams, DOMFileReaderFactory, NodeCanvasFactory, + NodeFileReaderFactory, TEST_PDFS_PATH } from './test_utils'; import { createPromiseCapability, FontType, InvalidPDFException, MissingPDFException, - OPS, PasswordException, PasswordResponses, PermissionFlag, StreamType, - stringToBytes + OPS, PasswordException, PasswordResponses, PermissionFlag, StreamType } from '../../src/shared/util'; import { DOMCanvasFactory, RenderingCancelledException, StatTimer @@ -110,50 +109,37 @@ describe('api', function() { }).catch(done.fail); }); it('creates pdf doc from typed array', function(done) { - var typedArrayPdf; + let typedArrayPdfPromise; if (isNodeJS()) { - typedArrayPdf = NodeFileReaderFactory.fetch({ + typedArrayPdfPromise = NodeFileReaderFactory.fetch({ path: TEST_PDFS_PATH.node + basicApiFileName, }); } else { - let nonBinaryRequest = false; - let request = new XMLHttpRequest(); - request.open('GET', TEST_PDFS_PATH.dom + basicApiFileName, false); - try { - request.responseType = 'arraybuffer'; - nonBinaryRequest = request.responseType !== 'arraybuffer'; - } catch (e) { - nonBinaryRequest = true; - } - if (nonBinaryRequest && request.overrideMimeType) { - request.overrideMimeType('text/plain; charset=x-user-defined'); - } - request.send(null); - - if (nonBinaryRequest) { - typedArrayPdf = stringToBytes(request.responseText); - } else { - typedArrayPdf = new Uint8Array(request.response); - } + typedArrayPdfPromise = DOMFileReaderFactory.fetch({ + path: TEST_PDFS_PATH.dom + basicApiFileName, + }); } - // Sanity check to make sure that we fetched the entire PDF file. - expect(typedArrayPdf.length).toEqual(basicApiFileLength); - const loadingTask = getDocument(typedArrayPdf); + typedArrayPdfPromise.then((typedArrayPdf) => { + // Sanity check to make sure that we fetched the entire PDF file. + expect(typedArrayPdf.length).toEqual(basicApiFileLength); - const progressReportedCapability = createPromiseCapability(); - loadingTask.onProgress = function(data) { - progressReportedCapability.resolve(data); - }; + const loadingTask = getDocument(typedArrayPdf); - Promise.all([ - loadingTask.promise, - progressReportedCapability.promise, - ]).then(function(data) { - expect(data[0] instanceof PDFDocumentProxy).toEqual(true); - expect(data[1].loaded / data[1].total).toEqual(1); + const progressReportedCapability = createPromiseCapability(); + loadingTask.onProgress = function(data) { + progressReportedCapability.resolve(data); + }; - loadingTask.destroy().then(done); + return Promise.all([ + loadingTask.promise, + progressReportedCapability.promise, + ]).then(function(data) { + expect(data[0] instanceof PDFDocumentProxy).toEqual(true); + expect(data[1].loaded / data[1].total).toEqual(1); + + loadingTask.destroy().then(done); + }); }).catch(done.fail); }); it('creates pdf doc from invalid PDF file', function(done) { diff --git a/test/unit/test_utils.js b/test/unit/test_utils.js index 175a8437d..0b590b1cc 100644 --- a/test/unit/test_utils.js +++ b/test/unit/test_utils.js @@ -17,11 +17,29 @@ import { assert, CMapCompressionType } from '../../src/shared/util'; import isNodeJS from '../../src/shared/is_node'; import { isRef } from '../../src/core/primitives'; +class DOMFileReaderFactory { + static async fetch(params) { + const response = await fetch(params.path); + if (!response.ok) { + throw new Error(response.statusText); + } + return new Uint8Array(await response.arrayBuffer()); + } +} + class NodeFileReaderFactory { - static fetch(params) { - var fs = require('fs'); - var file = fs.readFileSync(params.path); - return new Uint8Array(file); + static async fetch(params) { + const fs = require('fs'); + + return new Promise((resolve, reject) => { + fs.readFile(params.path, (error, data) => { + if (error || !data) { + reject(error || new Error(`Empty file for: ${params.path}`)); + return; + } + resolve(new Uint8Array(data)); + }); + }); } } @@ -142,6 +160,7 @@ class XRefMock { } export { + DOMFileReaderFactory, NodeFileReaderFactory, NodeCanvasFactory, NodeCMapReaderFactory,