Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions .github/workflows/integration_tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: Integration tests
on:
push:
paths:
- '.github/workflows/integration_tests.yml'
branches:
- master
pull_request:
paths:
- '.github/workflows/integration_tests.yml'
branches:
- master
workflow_dispatch:
permissions:
contents: read

jobs:
test:
name: Test

strategy:
fail-fast: false
matrix:
node-version: [lts/*]
os: [windows-latest, ubuntu-latest]

runs-on: ${{ matrix.os }}

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}

- name: Install dependencies
run: npm ci

- name: Update resolution (Windows)
if: ${{ matrix.os == 'windows-latest' }}
run: Set-DisplayResolution -Width 1920 -Height 1080 -Force

- name: Run integration tests (Windows)
if: ${{ matrix.os == 'windows-latest' }}
run: npx gulp integrationtest

- name: Run integration tests (Linux)
if: ${{ matrix.os == 'ubuntu-latest' }}
run: xvfb-run -a --server-args="-screen 0, 1920x1080x24" npx gulp integrationtest
6 changes: 3 additions & 3 deletions test/integration/jasmine-boot.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ async function runTests(results) {
specDone(result) {
// Report on the result of individual tests.
++results.runs;
if (result.failedExpectations.length > 0) {
if (result.failedExpectations.length > 0 && !result.pendingReason) {
++results.failures;
console.log(`TEST-UNEXPECTED-FAIL | ${result.description}`);
} else {
Expand All @@ -63,14 +63,14 @@ async function runTests(results) {
specStarted(result) {},
suiteDone(result) {
// Report on the result of `afterAll` invocations.
if (result.failedExpectations.length > 0) {
if (result.failedExpectations.length > 0 && !result.pendingReason) {
++results.failures;
console.log(`TEST-UNEXPECTED-FAIL | ${result.description}`);
}
},
suiteStarted(result) {
// Report on the result of `beforeAll` invocations.
if (result.failedExpectations.length > 0) {
if (result.failedExpectations.length > 0 && !result.pendingReason) {
++results.failures;
console.log(`TEST-UNEXPECTED-FAIL | ${result.description}`);
}
Expand Down
52 changes: 22 additions & 30 deletions test/integration/thumbnail_view_spec.mjs
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import {
awaitPromise,
closePages,
kbFocusNext,
loadAndWait,
scrollIntoView,
waitForPageRendered,
} from "./test_utils.mjs";

function waitForThumbnailVisible(page, pageNum) {
return page.waitForSelector(
`.thumbnailImage[data-l10n-args='{"page":${pageNum}}']`,
{ visible: true }
);
function waitForThumbnailVisible(page, pageNum, current = false) {
let selector = `.thumbnailImage[data-l10n-args='{"page":${pageNum}}']`;
if (current) {
selector += '[aria-current="page"]';
}
return page.waitForSelector(selector, { visible: true });
}

describe("PDF Thumbnail View", () => {
Expand All @@ -32,7 +34,7 @@ describe("PDF Thumbnail View", () => {
const thumbSelector = "#thumbnailsView .thumbnailImage";
await page.waitForSelector(thumbSelector, { visible: true });

await waitForThumbnailVisible(page, 1);
await waitForThumbnailVisible(page, 1, /* current = */ true);

const src = await page.$eval(thumbSelector, el => el.src);
expect(src)
Expand All @@ -47,42 +49,32 @@ describe("PDF Thumbnail View", () => {
let pages;

beforeEach(async () => {
pages = await loadAndWait("tracemonkey.pdf", "#viewsManagerToggleButton");
pages = await loadAndWait(
"tracemonkey.pdf",
`.page[data-page-number = "1"] .endOfContent`
);
});

afterEach(async () => {
await closePages(pages);
});

async function goToPage(page, number) {
const handle = await page.evaluateHandle(
num => [
new Promise(resolve => {
const container = document.getElementById("viewsManagerContent");
container.addEventListener("scrollend", resolve, { once: true });
// eslint-disable-next-line no-undef
PDFViewerApplication.pdfLinkService.goToPage(num);
}),
],
number
);
return awaitPromise(handle);
}

it("should scroll the view", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");

await waitForThumbnailVisible(page, 1);
await waitForThumbnailVisible(page, 1, /* current = */ true);

for (const pageNum of [14, 1, 13, 2]) {
await goToPage(page, pageNum);
const pageSelector = `.page[data-page-number = "${pageNum}"]`;
await page.waitForSelector(pageSelector);
await scrollIntoView(page, pageSelector);
await waitForPageRendered(page, pageNum);

await waitForThumbnailVisible(page, pageNum, /* current = */ true);

const thumbSelector = `.thumbnailImage[data-l10n-args='{"page":${pageNum}}']`;
await page.waitForSelector(
`.thumbnail ${thumbSelector}[aria-current="page"]`,
{ visible: true }
);
const src = await page.$eval(thumbSelector, el => el.src);
expect(src)
.withContext(`In ${browserName}`)
Expand Down Expand Up @@ -115,7 +107,7 @@ describe("PDF Thumbnail View", () => {
pages.map(async ([browserName, page]) => {
await page.click("#viewsManagerToggleButton");

await waitForThumbnailVisible(page, 1);
await waitForThumbnailVisible(page, 1, /* current = */ true);
await waitForThumbnailVisible(page, 2);
await waitForThumbnailVisible(page, 3);

Expand Down
14 changes: 9 additions & 5 deletions test/test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -410,18 +410,21 @@ function handleSessionTimeout(session) {
closeSession(browser);
}

function getTestManifest() {
function getTestManifest(label = null) {
var manifest = JSON.parse(fs.readFileSync(options.manifestFile));

const testFilter = options.testfilter.slice(0),
xfaOnly = options.xfaOnly;
if (testFilter.length || xfaOnly) {
if (label || testFilter.length || xfaOnly) {
manifest = manifest.filter(function (item) {
var i = testFilter.indexOf(item.id);
if (i !== -1) {
testFilter.splice(i, 1);
return true;
}
if (label && item.labels?.includes(label)) {
return true;
}
if (xfaOnly && item.enableXfa) {
return true;
}
Expand Down Expand Up @@ -809,6 +812,7 @@ function onAllSessionsClosedAfterTests(name) {
}
var runtime = (Date.now() - startTime) / 1000;
console.log(name + " tests runtime was " + runtime.toFixed(1) + " seconds");
process.exit(numErrors > 0 ? 1 : 0);
};
}

Expand Down Expand Up @@ -1088,8 +1092,8 @@ async function closeSession(browser) {
}
}

async function ensurePDFsDownloaded() {
const manifest = getTestManifest();
async function ensurePDFsDownloaded(label = null) {
const manifest = getTestManifest(label);
await downloadManifestFiles(manifest);
try {
await verifyManifestFiles(manifest);
Expand Down Expand Up @@ -1124,7 +1128,7 @@ async function main() {
await startUnitTest("/test/font/font_test.html", "font");
} else if (options.integration) {
// Allows linked PDF files in integration-tests as well.
await ensurePDFsDownloaded();
await ensurePDFsDownloaded("integration");
await startIntegrationTest();
} else {
await startRefTest(options.masterMode, options.reftest);
Expand Down
27 changes: 18 additions & 9 deletions test/test_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -1028,7 +1028,8 @@
"type": "eq",
"link": true,
"lastPage": 1,
"about": "The same file as issue2337."
"about": "The same file as issue2337.",
"labels": ["integration"]
},
{
"id": "freeculture",
Expand Down Expand Up @@ -2081,7 +2082,8 @@
"rounds": 1,
"link": true,
"enableXfa": true,
"type": "eq"
"type": "eq",
"labels": ["integration"]
},
{
"id": "xfa_bug1716380",
Expand Down Expand Up @@ -5165,7 +5167,8 @@
"file": "pdfs/issue13132.pdf",
"md5": "1b28964b9188047bc6c786302c95029f",
"link": true,
"type": "other"
"type": "other",
"labels": ["integration"]
},
{
"id": "issue11518",
Expand Down Expand Up @@ -8494,7 +8497,8 @@
"link": true,
"rounds": 1,
"type": "eq",
"forms": true
"forms": true,
"labels": ["integration"]
},
{
"id": "issue12233-print",
Expand Down Expand Up @@ -9109,7 +9113,8 @@
"md5": "3ce134ead03d6158c3e8207453dcd21d",
"rounds": 1,
"link": true,
"type": "other"
"type": "other",
"labels": ["integration"]
},
{
"id": "issue14301",
Expand Down Expand Up @@ -9997,7 +10002,8 @@
"file": "pdfs/bug1823296.pdf",
"md5": "f71e89ebe3d6e75e0c83ce41cd72df1f",
"link": true,
"type": "other"
"type": "other",
"labels": ["integration"]
},
{
"id": "bug1942064",
Expand Down Expand Up @@ -10441,7 +10447,8 @@
"md5": "d2e167216493a50f732b4b3685a91792",
"rounds": 1,
"link": true,
"type": "other"
"type": "other",
"labels": ["integration"]
},
{
"id": "protected-stamp-editor-save-print",
Expand Down Expand Up @@ -10477,7 +10484,8 @@
"file": "pdfs/issue16863.pdf",
"md5": "af8abe281721f92a0d46646969f061de",
"link": true,
"type": "other"
"type": "other",
"labels": ["integration"]
},
{
"id": "bug1851498",
Expand Down Expand Up @@ -10511,7 +10519,8 @@
"firstPage": 2,
"lastPage": 2,
"type": "eq",
"forms": true
"forms": true,
"labels": ["integration"]
},
{
"id": "issue17169",
Expand Down