| #!/usr/bin/perl | |
| # (C) Sergey Kandaurov | |
| # (C) Nginx, Inc. | |
| # Tests for image filter module, WebP support. | |
| ############################################################################### | |
| use warnings; | |
| use strict; | |
| use Test::More; | |
| BEGIN { use FindBin; chdir($FindBin::Bin); } | |
| use lib 'lib'; | |
| use Test::Nginx; | |
| ############################################################################### | |
| select STDERR; $| = 1; | |
| select STDOUT; $| = 1; | |
| my $t = Test::Nginx->new()->has(qw/http image_filter/) | |
| ->write_file_expand('nginx.conf', <<'EOF'); | |
| %%TEST_GLOBALS%% | |
| daemon off; | |
| events { | |
| } | |
| http { | |
| %%TEST_GLOBALS_HTTP%% | |
| server { | |
| listen 127.0.0.1:8080; | |
| server_name localhost; | |
| location /size { | |
| image_filter size; | |
| alias %%TESTDIR%%/; | |
| } | |
| location /test { | |
| image_filter test; | |
| alias %%TESTDIR%%/; | |
| } | |
| location /resize { | |
| image_filter resize 1 1; | |
| alias %%TESTDIR%%/; | |
| } | |
| location /quality { | |
| image_filter rotate 90; | |
| image_filter_webp_quality 50; | |
| alias %%TESTDIR%%/; | |
| } | |
| location /quality_var { | |
| image_filter rotate 90; | |
| image_filter_webp_quality $arg_q; | |
| alias %%TESTDIR%%/; | |
| } | |
| } | |
| } | |
| EOF | |
| $t->run()->plan(18); | |
| $t->write_file('webp', pack("A4LA8", "RIFF", 0x22, "WEBPVP8 ") . | |
| pack("N4", 0x16000000, 0x3001009d, 0x012a0100, 0x01000ec0) . | |
| pack("N2n", 0xfe25a400, 0x03700000, 0x0000)); | |
| $t->write_file('webpl', pack("A4LA8", "RIFF", 0x1a, "WEBPVP8L") . | |
| pack("N4n", 0x0d000000, 0x2f000000, 0x10071011, 0x118888fe, 0x0700)); | |
| $t->write_file('webpx', pack("A4LA8", "RIFF", 0x4a, "WEBPVP8X") . | |
| pack("N4", 0x0a000000, 0x10000000, 0x00000000, 0x0000414c) . | |
| pack("N4", 0x50480c00, 0x00001107, 0x1011fd0f, 0x4444ff03) . | |
| pack("N4", 0x00005650, 0x38201800, 0x00001401, 0x009d012a) . | |
| pack("N4n", 0x01000100, 0x0000fe00, 0x000dc000, 0xfee6b500, 0x0000)); | |
| $t->write_file('webperr', pack("A4LA8", "RIFF", 0x22, "WEBPERR ") . | |
| pack("N4", 0x16000000, 0x3001009d, 0x012a0100, 0x01000ec0) . | |
| pack("N2n", 0xfe25a400, 0x03700000, 0x0000)); | |
| $t->write_file('webptrunc', substr $t->read_file('webp'), 0, 29); | |
| ############################################################################### | |
| my $r = http_get('/test/webp'); | |
| like($r, qr!Content-Type: image/webp!, 'content-type'); | |
| like($r, qr/RIFF/, 'content'); | |
| $r = http_get('/size/webp'); | |
| like($r, qr/"type": "webp"/, 'size type'); | |
| like($r, qr/"width": 1/, 'size width'); | |
| like($r, qr/"height": 1/, 'size height'); | |
| # lossless | |
| $r = http_get('/size/webpl'); | |
| like($r, qr/"type": "webp"/, 'lossless type'); | |
| like($r, qr/"width": 1/, 'lossless width'); | |
| like($r, qr/"height": 1/, 'lossless height'); | |
| # extended | |
| $r = http_get('/size/webpx'); | |
| like($r, qr/"type": "webp"/, 'extended type'); | |
| like($r, qr/"width": 1/, 'extended width'); | |
| like($r, qr/"height": 1/, 'extended height'); | |
| # transforms, libgd may have no WebP support | |
| like(http_get('/quality/webp'), qr/RIFF|415/, 'quality'); | |
| like(http_get('/quality_var/webp?q=40'), qr/RIFF|415/, 'quality var'); | |
| like(http_get('/resize/webp'), qr/RIFF/, 'resize as is'); | |
| # generic error handling | |
| like(http_get('/quality/webperr'), qr/415 Unsupported/, 'bad header'); | |
| like(http_get('/quality/webptrunc'), qr/415 Unsupported/, 'truncated'); | |
| like(http_get('/size/webperr'), qr/{}/, 'size - bad header'); | |
| like(http_get('/size/webptrunc'), qr/{}/, 'size - truncated'); | |
| ############################################################################### |