Skip to content

Commit 957e2d4

Browse files
committed
Implement unit tests for the network utility code
This should provide 100% coverage for the file.
1 parent 404cba8 commit 957e2d4

File tree

4 files changed

+181
-1
lines changed

4 files changed

+181
-1
lines changed

src/display/network_utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919

2020
function validateRangeRequestCapabilities({ getResponseHeader, isHttp,
2121
rangeChunkSize, disableRange, }) {
22-
assert(rangeChunkSize > 0);
22+
assert(rangeChunkSize > 0, 'Range chunk size must be larger than zero');
2323
let returnValues = {
2424
allowRangeRequests: false,
2525
suggestedLength: undefined,

test/unit/clitests.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"function_spec.js",
1717
"metadata_spec.js",
1818
"murmurhash3_spec.js",
19+
"network_utils_spec.js",
1920
"node_stream_spec.js",
2021
"parser_spec.js",
2122
"pdf_history.js",

test/unit/jasmine-boot.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ function initializePDFJS(callback) {
6363
'pdfjs-test/unit/metadata_spec',
6464
'pdfjs-test/unit/murmurhash3_spec',
6565
'pdfjs-test/unit/network_spec',
66+
'pdfjs-test/unit/network_utils_spec',
6667
'pdfjs-test/unit/parser_spec',
6768
'pdfjs-test/unit/pdf_history_spec',
6869
'pdfjs-test/unit/primitives_spec',

test/unit/network_utils_spec.js

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/* Copyright 2017 Mozilla Foundation
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
import {
17+
createResponseStatusError, validateRangeRequestCapabilities,
18+
validateResponseStatus
19+
} from '../../src/display/network_utils';
20+
import {
21+
MissingPDFException, UnexpectedResponseException
22+
} from '../../src/shared/util';
23+
24+
describe('network_utils', function() {
25+
describe('validateRangeRequestCapabilities', function() {
26+
const defaultValues = {
27+
allowRangeRequests: false,
28+
suggestedLength: undefined,
29+
};
30+
31+
it('rejects range chunk sizes that are not larger than zero', function() {
32+
expect(function() {
33+
validateRangeRequestCapabilities({ rangeChunkSize: 0, });
34+
}).toThrow(new Error('Range chunk size must be larger than zero'));
35+
});
36+
37+
it('rejects disabled or non-HTTP range requests', function() {
38+
expect(validateRangeRequestCapabilities({
39+
disableRange: true,
40+
isHttp: true,
41+
rangeChunkSize: 64,
42+
})).toEqual(defaultValues);
43+
44+
expect(validateRangeRequestCapabilities({
45+
disableRange: false,
46+
isHttp: false,
47+
rangeChunkSize: 64,
48+
})).toEqual(defaultValues);
49+
});
50+
51+
it('rejects invalid Accept-Ranges header values', function() {
52+
expect(validateRangeRequestCapabilities({
53+
disableRange: false,
54+
isHttp: true,
55+
getResponseHeader: (headerName) => {
56+
if (headerName === 'Accept-Ranges') {
57+
return 'none';
58+
}
59+
},
60+
rangeChunkSize: 64,
61+
})).toEqual(defaultValues);
62+
});
63+
64+
it('rejects invalid Content-Encoding header values', function() {
65+
expect(validateRangeRequestCapabilities({
66+
disableRange: false,
67+
isHttp: true,
68+
getResponseHeader: (headerName) => {
69+
if (headerName === 'Accept-Ranges') {
70+
return 'bytes';
71+
} else if (headerName === 'Content-Encoding') {
72+
return 'gzip';
73+
}
74+
},
75+
rangeChunkSize: 64,
76+
})).toEqual(defaultValues);
77+
});
78+
79+
it('rejects invalid Content-Length header values', function() {
80+
expect(validateRangeRequestCapabilities({
81+
disableRange: false,
82+
isHttp: true,
83+
getResponseHeader: (headerName) => {
84+
if (headerName === 'Accept-Ranges') {
85+
return 'bytes';
86+
} else if (headerName === 'Content-Encoding') {
87+
return null;
88+
} else if (headerName === 'Content-Length') {
89+
return 'eight';
90+
}
91+
},
92+
rangeChunkSize: 64,
93+
})).toEqual(defaultValues);
94+
});
95+
96+
it('rejects file sizes that are too small for range requests', function() {
97+
expect(validateRangeRequestCapabilities({
98+
disableRange: false,
99+
isHttp: true,
100+
getResponseHeader: (headerName) => {
101+
if (headerName === 'Accept-Ranges') {
102+
return 'bytes';
103+
} else if (headerName === 'Content-Encoding') {
104+
return null;
105+
} else if (headerName === 'Content-Length') {
106+
return 8;
107+
}
108+
},
109+
rangeChunkSize: 64,
110+
})).toEqual({
111+
allowRangeRequests: false,
112+
suggestedLength: 8,
113+
});
114+
});
115+
116+
it('accepts file sizes large enough for range requests', function() {
117+
expect(validateRangeRequestCapabilities({
118+
disableRange: false,
119+
isHttp: true,
120+
getResponseHeader: (headerName) => {
121+
if (headerName === 'Accept-Ranges') {
122+
return 'bytes';
123+
} else if (headerName === 'Content-Encoding') {
124+
return null;
125+
} else if (headerName === 'Content-Length') {
126+
return 8192;
127+
}
128+
},
129+
rangeChunkSize: 64,
130+
})).toEqual({
131+
allowRangeRequests: true,
132+
suggestedLength: 8192,
133+
});
134+
});
135+
});
136+
137+
describe('createResponseStatusError', function() {
138+
it('handles missing PDF file responses', function() {
139+
expect(createResponseStatusError(404, 'https://foo.com/bar.pdf')).toEqual(
140+
new MissingPDFException('Missing PDF "https://foo.com/bar.pdf".')
141+
);
142+
143+
expect(createResponseStatusError(0, 'file://foo.pdf')).toEqual(
144+
new MissingPDFException('Missing PDF "file://foo.pdf".')
145+
);
146+
});
147+
148+
it('handles unexpected responses', function() {
149+
expect(createResponseStatusError(302, 'https://foo.com/bar.pdf')).toEqual(
150+
new UnexpectedResponseException(
151+
'Unexpected server response (302) while retrieving PDF ' +
152+
'"https://foo.com/bar.pdf".'
153+
)
154+
);
155+
156+
expect(createResponseStatusError(0, 'https://foo.com/bar.pdf')).toEqual(
157+
new UnexpectedResponseException(
158+
'Unexpected server response (0) while retrieving PDF ' +
159+
'"https://foo.com/bar.pdf".'
160+
)
161+
);
162+
});
163+
});
164+
165+
describe('validateResponseStatus', function() {
166+
it('accepts valid response statuses', function() {
167+
expect(validateResponseStatus(200)).toEqual(true);
168+
expect(validateResponseStatus(206)).toEqual(true);
169+
});
170+
171+
it('rejects invalid response statuses', function() {
172+
expect(validateResponseStatus(302)).toEqual(false);
173+
expect(validateResponseStatus(404)).toEqual(false);
174+
expect(validateResponseStatus(null)).toEqual(false);
175+
expect(validateResponseStatus(undefined)).toEqual(false);
176+
});
177+
});
178+
});

0 commit comments

Comments
 (0)