Fix max preview, some resizing and caching issues and force preview providers to resize their previews properly
* introduces a method in OC_Image which doesn't stretch images when trying to make them fit in a box * adds the method to all key providers so that they can do their job, as expected by the Preview class * improves the caching mechanism of Preview in order to reduce I/O and to avoid filling the available disk space * fixes some long standing issues * **contains mostly tests**
This commit is contained in:
parent
16708ae187
commit
71d65cb713
25 changed files with 2096 additions and 464 deletions
|
@ -952,6 +952,8 @@ class OC_Image implements \OCP\IImage {
|
|||
/**
|
||||
* Resizes the image to fit within a boundary while preserving ratio.
|
||||
*
|
||||
* Warning: Images smaller than $maxWidth x $maxHeight will end up being scaled up
|
||||
*
|
||||
* @param integer $maxWidth
|
||||
* @param integer $maxHeight
|
||||
* @return bool
|
||||
|
@ -972,6 +974,24 @@ class OC_Image implements \OCP\IImage {
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shrinks larger images to fit within specified boundaries while preserving ratio.
|
||||
*
|
||||
* @param integer $maxWidth
|
||||
* @param integer $maxHeight
|
||||
* @return bool
|
||||
*/
|
||||
public function scaleDownToFit($maxWidth, $maxHeight) {
|
||||
$widthOrig = imageSX($this->resource);
|
||||
$heightOrig = imageSY($this->resource);
|
||||
|
||||
if ($widthOrig > $maxWidth || $heightOrig >$maxHeight) {
|
||||
return $this->fitIn($maxWidth, $maxHeight);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroys the current image and resets the object
|
||||
*/
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -33,7 +33,7 @@ abstract class Image extends Provider {
|
|||
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
|
||||
//get fileinfo
|
||||
$fileInfo = $fileview->getFileInfo($path);
|
||||
if(!$fileInfo) {
|
||||
if (!$fileInfo) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -46,15 +46,19 @@ abstract class Image extends Provider {
|
|||
|
||||
$image = new \OC_Image();
|
||||
|
||||
if($fileInfo['encrypted'] === true) {
|
||||
if ($fileInfo['encrypted'] === true) {
|
||||
$fileName = $fileview->toTmpFile($path);
|
||||
} else {
|
||||
$fileName = $fileview->getLocalFile($path);
|
||||
}
|
||||
$image->loadFromFile($fileName);
|
||||
$image->fixOrientation();
|
||||
if ($image->valid()) {
|
||||
$image->scaleDownToFit($maxX, $maxY);
|
||||
|
||||
return $image->valid() ? $image : false;
|
||||
return $image;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -91,7 +91,6 @@ class Movie extends Provider {
|
|||
$cmd = self::$ffmpegBinary . ' -y -ss ' . escapeshellarg($second) .
|
||||
' -i ' . escapeshellarg($absPath) .
|
||||
' -f mjpeg -vframes 1' .
|
||||
' -s ' . escapeshellarg($maxX) . 'x' . escapeshellarg($maxY) .
|
||||
' ' . escapeshellarg($tmpPath) .
|
||||
' > /dev/null 2>&1';
|
||||
}
|
||||
|
@ -102,7 +101,11 @@ class Movie extends Provider {
|
|||
$image = new \OC_Image();
|
||||
$image->loadFromFile($tmpPath);
|
||||
unlink($tmpPath);
|
||||
return $image->valid() ? $image : false;
|
||||
if ($image->valid()) {
|
||||
$image->scaleDownToFit($maxX, $maxY);
|
||||
|
||||
return $image;
|
||||
}
|
||||
}
|
||||
unlink($tmpPath);
|
||||
return false;
|
||||
|
|
|
@ -47,7 +47,12 @@ class MP3 extends Provider {
|
|||
unlink($tmpPath);
|
||||
$image = new \OC_Image();
|
||||
$image->loadFromData($picture);
|
||||
return $image->valid() ? $image : $this->getNoCoverThumbnail();
|
||||
|
||||
if ($image->valid()) {
|
||||
$image->scaleDownToFit($maxX, $maxY);
|
||||
|
||||
return $image;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->getNoCoverThumbnail();
|
||||
|
|
|
@ -29,7 +29,7 @@ abstract class Office extends Provider {
|
|||
*/
|
||||
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
|
||||
$this->initCmd();
|
||||
if(is_null($this->cmd)) {
|
||||
if (is_null($this->cmd)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ abstract class Office extends Provider {
|
|||
|
||||
$tmpDir = get_temp_dir();
|
||||
|
||||
$defaultParameters = ' -env:UserInstallation=file://' . escapeshellarg($tmpDir . '/owncloud-' . \OC_Util::getInstanceId().'/') . ' --headless --nologo --nofirststartwizard --invisible --norestore --convert-to pdf --outdir ';
|
||||
$defaultParameters = ' -env:UserInstallation=file://' . escapeshellarg($tmpDir . '/owncloud-' . \OC_Util::getInstanceId() . '/') . ' --headless --nologo --nofirststartwizard --invisible --norestore --convert-to pdf --outdir ';
|
||||
$clParameters = \OCP\Config::getSystemValue('preview_office_cl_parameters', $defaultParameters);
|
||||
|
||||
$exec = $this->cmd . $clParameters . escapeshellarg($tmpDir) . ' ' . escapeshellarg($absPath);
|
||||
|
@ -46,8 +46,8 @@ abstract class Office extends Provider {
|
|||
|
||||
//create imagick object from pdf
|
||||
$pdfPreview = null;
|
||||
try{
|
||||
list( $dirname, , , $filename ) = array_values( pathinfo($absPath) );
|
||||
try {
|
||||
list($dirname, , , $filename) = array_values(pathinfo($absPath));
|
||||
$pdfPreview = $dirname . '/' . $filename . '.pdf';
|
||||
|
||||
$pdf = new \imagick($pdfPreview . '[0]');
|
||||
|
@ -65,27 +65,33 @@ abstract class Office extends Provider {
|
|||
unlink($absPath);
|
||||
unlink($pdfPreview);
|
||||
|
||||
return $image->valid() ? $image : false;
|
||||
if ($image->valid()) {
|
||||
$image->scaleDownToFit($maxX, $maxY);
|
||||
|
||||
return $image;
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
private function initCmd() {
|
||||
$cmd = '';
|
||||
|
||||
if(is_string(\OC_Config::getValue('preview_libreoffice_path', null))) {
|
||||
if (is_string(\OC_Config::getValue('preview_libreoffice_path', null))) {
|
||||
$cmd = \OC_Config::getValue('preview_libreoffice_path', null);
|
||||
}
|
||||
|
||||
$whichLibreOffice = shell_exec('command -v libreoffice');
|
||||
if($cmd === '' && !empty($whichLibreOffice)) {
|
||||
if ($cmd === '' && !empty($whichLibreOffice)) {
|
||||
$cmd = 'libreoffice';
|
||||
}
|
||||
|
||||
$whichOpenOffice = shell_exec('command -v openoffice');
|
||||
if($cmd === '' && !empty($whichOpenOffice)) {
|
||||
if ($cmd === '' && !empty($whichOpenOffice)) {
|
||||
$cmd = 'openoffice';
|
||||
}
|
||||
|
||||
if($cmd === '') {
|
||||
if ($cmd === '') {
|
||||
$cmd = null;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Georg Ehrke <georg@owncloud.com>
|
||||
* @author Georg Ehrke <georg@ownCloud.com>
|
||||
* @author Joas Schilling <nickvergessen@owncloud.com>
|
||||
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
|
||||
* @author Robin Appelman <icewind@owncloud.com>
|
||||
|
@ -54,7 +53,8 @@ abstract class Provider implements IProvider {
|
|||
}
|
||||
|
||||
/**
|
||||
* get thumbnail for file at path $path
|
||||
* Generates thumbnail which fits in $maxX and $maxY and keeps the aspect ratio, for file at path $path
|
||||
*
|
||||
* @param string $path Path of file
|
||||
* @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
|
||||
* @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
|
||||
|
|
|
@ -35,17 +35,17 @@ class SVG extends Provider {
|
|||
* {@inheritDoc}
|
||||
*/
|
||||
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
|
||||
try{
|
||||
try {
|
||||
$svg = new \Imagick();
|
||||
$svg->setBackgroundColor(new \ImagickPixel('transparent'));
|
||||
|
||||
$content = stream_get_contents($fileview->fopen($path, 'r'));
|
||||
if(substr($content, 0, 5) !== '<?xml') {
|
||||
if (substr($content, 0, 5) !== '<?xml') {
|
||||
$content = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . $content;
|
||||
}
|
||||
|
||||
// Do not parse SVG files with references
|
||||
if(stripos($content, 'xlink:href') !== false) {
|
||||
if (stripos($content, 'xlink:href') !== false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -60,6 +60,11 @@ class SVG extends Provider {
|
|||
$image = new \OC_Image();
|
||||
$image->loadFromData($svg);
|
||||
//check if image object is valid
|
||||
return $image->valid() ? $image : false;
|
||||
if ($image->valid()) {
|
||||
$image->scaleDownToFit($maxX, $maxY);
|
||||
|
||||
return $image;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -170,4 +170,14 @@ interface IImage {
|
|||
* @since 8.1.0
|
||||
*/
|
||||
public function fitIn($maxWidth, $maxHeight);
|
||||
|
||||
/**
|
||||
* Shrinks the image to fit within a boundary while preserving ratio.
|
||||
*
|
||||
* @param integer $maxWidth
|
||||
* @param integer $maxHeight
|
||||
* @return bool
|
||||
* @since 8.1.0
|
||||
*/
|
||||
public function scaleDownToFit($maxWidth, $maxHeight);
|
||||
}
|
||||
|
|
BIN
tests/data/testimage-wide.png
Normal file
BIN
tests/data/testimage-wide.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 169 KiB |
175
tests/data/testimage.eps
Normal file
175
tests/data/testimage.eps
Normal file
|
@ -0,0 +1,175 @@
|
|||
%!PS-Adobe-3.0 EPSF-3.0
|
||||
%%Creator: cairo 1.14.1 (http://cairographics.org)
|
||||
%%CreationDate: Fri May 15 16:27:38 2015
|
||||
%%Pages: 1
|
||||
%%DocumentData: Clean7Bit
|
||||
%%LanguageLevel: 2
|
||||
%%BoundingBox: 0 -1 2400 1706
|
||||
%%EndComments
|
||||
%%BeginProlog
|
||||
save
|
||||
50 dict begin
|
||||
/q { gsave } bind def
|
||||
/Q { grestore } bind def
|
||||
/cm { 6 array astore concat } bind def
|
||||
/w { setlinewidth } bind def
|
||||
/J { setlinecap } bind def
|
||||
/j { setlinejoin } bind def
|
||||
/M { setmiterlimit } bind def
|
||||
/d { setdash } bind def
|
||||
/m { moveto } bind def
|
||||
/l { lineto } bind def
|
||||
/c { curveto } bind def
|
||||
/h { closepath } bind def
|
||||
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
|
||||
0 exch rlineto 0 rlineto closepath } bind def
|
||||
/S { stroke } bind def
|
||||
/f { fill } bind def
|
||||
/f* { eofill } bind def
|
||||
/n { newpath } bind def
|
||||
/W { clip } bind def
|
||||
/W* { eoclip } bind def
|
||||
/BT { } bind def
|
||||
/ET { } bind def
|
||||
/pdfmark where { pop globaldict /?pdfmark /exec load put }
|
||||
{ globaldict begin /?pdfmark /pop load def /pdfmark
|
||||
/cleartomark load def end } ifelse
|
||||
/BDC { mark 3 1 roll /BDC pdfmark } bind def
|
||||
/EMC { mark /EMC pdfmark } bind def
|
||||
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
|
||||
/Tj { show currentpoint cairo_store_point } bind def
|
||||
/TJ {
|
||||
{
|
||||
dup
|
||||
type /stringtype eq
|
||||
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
|
||||
} forall
|
||||
currentpoint cairo_store_point
|
||||
} bind def
|
||||
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
|
||||
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
|
||||
/Tf { pop /cairo_font exch def /cairo_font_matrix where
|
||||
{ pop cairo_selectfont } if } bind def
|
||||
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
|
||||
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
|
||||
/cairo_font where { pop cairo_selectfont } if } bind def
|
||||
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
|
||||
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
|
||||
/g { setgray } bind def
|
||||
/rg { setrgbcolor } bind def
|
||||
/d1 { setcachedevice } bind def
|
||||
%%EndProlog
|
||||
%%BeginSetup
|
||||
%%EndSetup
|
||||
%%Page: 1 1
|
||||
%%BeginPageSetup
|
||||
%%PageBoundingBox: 0 -1 2400 1706
|
||||
%%EndPageSetup
|
||||
q 0 -1 2400 1707 rectclip q
|
||||
0.113725 0.176471 0.266667 rg
|
||||
0 1705.263 2400 -1705.262 re f
|
||||
1 g
|
||||
1348.539 1275.525 m 1269.973 1275.525 1206.5 1212.052 1206.5 1133.486 c
|
||||
1206.5 1101.099 1217.285 1071.294 1235.465 1047.427 c 1274.906 1093.076
|
||||
1333.117 1122.064 1398.113 1122.064 c 1429.914 1122.064 1460.066 1114.986
|
||||
1487.238 1102.572 c 1489.438 1112.517 1490.578 1122.865 1490.578 1133.486
|
||||
c 1490.578 1212.052 1427.105 1275.525 1348.539 1275.525 c h
|
||||
1163.055 1209.794 m 1122.137 1209.794 1089.246 1176.626 1089.246 1135.712
|
||||
c 1089.246 1122.466 1092.664 1109.951 1098.719 1099.228 c 1123.406 1113.158
|
||||
1151.949 1121.232 1182.27 1121.232 c 1185.195 1121.232 1188.016 1121.111
|
||||
1190.902 1120.951 c 1190.578 1125.099 1190.348 1129.255 1190.348 1133.486
|
||||
c 1190.348 1156.275 1195.297 1177.955 1203.992 1197.541 c 1192.285 1205.396
|
||||
1178.254 1209.794 1163.055 1209.794 c h
|
||||
1513.418 1158.83 m 1510.395 1158.83 1507.48 1158.458 1504.504 1158.271
|
||||
c 1505.793 1150.154 1506.734 1141.958 1506.734 1133.486 c 1506.734 1120.294
|
||||
1505.055 1107.568 1501.996 1095.33 c 1537.844 1075.494 1567.609 1045.81
|
||||
1587.223 1009.826 c 1607.563 1020.416 1630.258 1027.15 1654.344 1028.767
|
||||
c 1648.137 1101.56 1587.828 1158.83 1513.418 1158.83 c h
|
||||
1398.113 1105.912 m 1288.176 1105.912 1199.258 1017.001 1199.258 907.056
|
||||
c 1199.258 797.123 1288.172 708.201 1398.113 708.201 c 1508.055 708.201
|
||||
1596.969 797.126 1596.969 907.056 c 1596.969 1017.001 1508.051 1105.912
|
||||
1398.113 1105.912 c h
|
||||
1182.27 1105.076 m 1096.98 1105.076 1027.977 1036.072 1027.977 950.783
|
||||
c 1027.977 900.576 1051.898 856.126 1088.969 827.962 c 1104.598 858.103
|
||||
1135.988 878.65 1172.242 878.65 c 1176.625 878.65 1180.832 878.119 1185.055
|
||||
877.537 c 1183.73 887.181 1183.105 897.048 1183.105 907.056 c 1183.105
|
||||
954.908 1198.68 999.154 1225.16 1034.892 c 1209.309 1054.728 1197.965 1078.556
|
||||
1193.133 1104.521 c 1189.547 1104.767 1185.918 1105.076 1182.27 1105.076
|
||||
c h
|
||||
1665.762 1013.169 m 1639.863 1013.169 1615.602 1006.556 1594.184 995.345
|
||||
c 1606.348 968.404 1613.121 938.513 1613.121 907.056 c 1613.121 848.158
|
||||
1589.441 794.677 1551.016 755.826 c 1579.246 724.486 1620.203 704.861 1665.762
|
||||
704.861 c 1751.051 704.861 1820.055 773.865 1820.055 859.154 c 1820.055
|
||||
944.443 1751.051 1013.169 1665.762 1013.169 c h
|
||||
1012.938 992.837 m 934.367 992.837 870.617 929.646 870.617 851.076 c 870.617
|
||||
772.509 934.367 708.759 1012.938 708.759 c 1042.84 708.759 1070.543 718.076
|
||||
1093.426 733.826 c 1083.969 748.517 1078.387 766.083 1078.387 784.791 c
|
||||
1078.387 794.501 1079.82 803.83 1082.563 812.642 c 1039.723 843.603 1011.824
|
||||
893.986 1011.824 950.783 c 1011.824 965.212 1013.723 979.169 1017.113 992.56
|
||||
c 1015.707 992.599 1014.355 992.837 1012.938 992.837 c h
|
||||
1848.184 870.849 m 1843.992 870.849 1839.938 870.373 1835.93 869.736 c
|
||||
1836.152 866.193 1836.207 862.751 1836.207 859.154 c 1836.207 813.853 1818.332
|
||||
772.736 1789.418 742.181 c 1803.645 725.638 1824.539 715.166 1848.184 715.166
|
||||
c 1891.254 715.166 1926.168 749.798 1926.168 792.869 c 1926.168 835.939
|
||||
1891.254 870.849 1848.184 870.849 c h
|
||||
1172.242 862.498 m 1129.176 862.498 1094.539 827.861 1094.539 784.791 c
|
||||
1094.539 741.724 1129.176 706.81 1172.242 706.81 c 1205.258 706.81 1233.277
|
||||
727.408 1244.656 756.384 c 1216.891 784.662 1196.938 820.74 1188.117 860.826
|
||||
c 1182.961 861.892 1177.723 862.498 1172.242 862.498 c h
|
||||
2026.43 797.044 m 2026.43 643.029 l 1944.828 643.029 l 1891.484 643.029
|
||||
1848.184 599.455 1848.184 546.111 c 1848.184 492.775 1891.484 449.466 1944.828
|
||||
449.466 c 1976.578 449.466 l 1992.227 449.466 2007.852 457.068 2020.305
|
||||
468.685 c 2032.754 480.302 2042.254 496.392 2042.582 514.361 c 2043.145
|
||||
545.197 2042.582 634.955 2042.582 634.955 c 2042.582 797.044 l h
|
||||
1280.305 727.419 m 1280.305 514.361 l 1280.305 478.552 1309.668 449.466
|
||||
1345.477 449.466 c 1345.477 465.623 l 1318.383 465.623 1296.457 487.263
|
||||
1296.457 514.361 c 1296.457 717.392 l 1290.836 720.416 1285.617 723.923
|
||||
1280.305 727.419 c h
|
||||
1118.77 707.646 m 1090.16 680.345 1072.258 641.908 1072.258 599.306 c 1072.258
|
||||
516.642 1139.438 449.466 1222.098 449.466 c 1222.098 465.623 l 1148.152
|
||||
465.623 1088.414 525.357 1088.414 599.306 c 1088.414 639.076 1105.773 674.822
|
||||
1133.254 699.291 c 1128.117 701.654 1123.359 704.427 1118.77 707.646 c
|
||||
h
|
||||
928.547 643.587 m 875.203 643.587 831.906 600.291 831.906 546.947 c 831.906
|
||||
457.544 l 848.059 457.544 l 848.059 546.947 l 848.059 591.572 883.922 627.712
|
||||
928.547 627.712 c 973.184 627.712 1009.316 591.572 1009.316 546.947 c 1009.316
|
||||
457.544 l 1025.469 457.544 l 1025.469 546.947 l 1025.469 600.291 981.898
|
||||
643.587 928.547 643.587 c h
|
||||
1470.805 643.029 m 1417.457 643.029 1374.164 599.455 1374.164 546.111 c
|
||||
1374.164 492.763 1417.457 449.189 1470.805 449.189 c 1524.152 449.189 1567.727
|
||||
492.763 1567.727 546.111 c 1567.727 599.455 1524.152 643.029 1470.805 643.029
|
||||
c h
|
||||
392.418 642.751 m 339.078 642.751 295.496 599.451 295.496 546.111 c 295.496
|
||||
492.767 339.078 449.466 392.418 449.466 c 445.762 449.466 489.063 492.767
|
||||
489.063 546.111 c 489.063 599.451 445.762 642.751 392.418 642.751 c h
|
||||
537.523 635.513 m 537.523 514.361 l 537.523 478.552 566.613 449.466 602.414
|
||||
449.466 c 626.816 449.466 648.344 462.958 659.508 482.888 c 670.59 462.958
|
||||
691.93 449.466 716.324 449.466 c 752.133 449.466 781.496 478.552 781.496
|
||||
514.361 c 781.496 635.513 l 765.344 635.513 l 765.344 514.361 l 765.344
|
||||
487.267 743.418 465.623 716.324 465.623 c 689.23 465.623 667.586 487.267
|
||||
667.586 514.361 c 667.586 635.513 l 651.434 635.513 l 651.434 514.361 l
|
||||
651.434 487.267 629.52 465.623 602.414 465.623 c 575.328 465.623 553.676
|
||||
487.267 553.676 514.361 c 553.676 635.513 l h
|
||||
1610.059 635.513 m 1610.059 546.111 l 1610.059 492.775 1653.359 449.466
|
||||
1706.703 449.466 c 1760.047 449.466 1803.621 492.775 1803.621 546.111 c
|
||||
1803.621 635.513 l 1787.469 635.513 l 1787.469 546.111 l 1787.469 501.494
|
||||
1751.328 465.623 1706.703 465.623 c 1662.074 465.623 1626.215 501.49 1626.215
|
||||
546.111 c 1626.215 635.513 l h
|
||||
1470.805 626.876 m 1515.438 626.876 1551.574 590.74 1551.574 546.111 c
|
||||
1551.574 501.478 1515.438 465.341 1470.805 465.341 c 1426.176 465.341 1390.316
|
||||
501.478 1390.316 546.111 c 1390.316 590.74 1426.176 626.876 1470.805 626.876
|
||||
c h
|
||||
1944.828 626.876 m 2026.43 626.876 l 2026.492 616.205 2026.938 542.685
|
||||
2026.43 514.638 c 2026.203 502.158 2019.355 489.634 2009.441 480.38 c 1999.527
|
||||
471.13 1986.695 465.623 1976.578 465.623 c 1944.828 465.623 l 1900.199
|
||||
465.623 1864.34 501.49 1864.34 546.111 c 1864.34 590.74 1900.199 626.876
|
||||
1944.828 626.876 c h
|
||||
392.418 626.599 m 437.047 626.599 472.906 590.736 472.906 546.111 c 472.906
|
||||
501.482 437.047 465.623 392.418 465.623 c 347.793 465.623 311.652 501.482
|
||||
311.652 546.111 c 311.652 590.736 347.793 626.599 392.418 626.599 c h
|
||||
392.418 626.599 m f
|
||||
Q Q
|
||||
showpage
|
||||
%%Trailer
|
||||
end restore
|
||||
%%EOF
|
BIN
tests/data/testimage.mp3
Normal file
BIN
tests/data/testimage.mp3
Normal file
Binary file not shown.
BIN
tests/data/testimage.mp4
Normal file
BIN
tests/data/testimage.mp4
Normal file
Binary file not shown.
BIN
tests/data/testimage.odt
Normal file
BIN
tests/data/testimage.odt
Normal file
Binary file not shown.
2
tests/data/testimagelarge.svg
Normal file
2
tests/data/testimagelarge.svg
Normal file
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 600 600" xml:space="preserve" height="2e3" width="3e3" version="1.0" y="0px" x="0px" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 3000 2000"><g transform="matrix(5,0,0,5,0,-500)"><circle cy="300" cx="300" r="300" fill="#c31927"/><path fill="#fff" d="m300 550c-66.8 0-129.6-26-176.8-73.2s-73.2-110-73.2-176.8 26-129.6 73.2-176.8 110-73.2 176.8-73.2 129.6 26 176.8 73.2 73.2 110 73.2 176.8-26 129.6-73.2 176.8-110 73.2-176.8 73.2z"/><path d="m345.7 64.3-45.7 45.7-45.7-45.7c14.9-2.9 30.2-4.3 45.7-4.3s30.8 1.5 45.7 4.3z"/><path d="m345.7 535.7c-14.9 2.9-30.2 4.3-45.7 4.3s-30.8-1.5-45.7-4.3l45.7-45.7 45.7 45.7z"/><path d="m276.8 389.1c0-3.4 1.1-5.9 3.2-7.5s4.8-2.3 7.9-2.3c3.2 0 5.9 0.8 8 2.4s3.1 4.1 3.1 7.5c0 2.3-0.6 4.3-1.8 5.9s-2.9 2.9-5 3.7c-0.1 0-0.3 0-0.5 0.1s-0.4 0.1-0.5 0.1h-6.2c-0.3 0-1-0.2-2-0.7-1.1-0.5-1.8-0.8-2-1-2.8-2-4.2-4.8-4.2-8.2z"/><path d="m320.4 396.8c-2.3-1.3-4.5-2.3-6.6-3.2s-4.2-2.1-6.4-3.7c-0.6-0.2-0.9-0.6-0.9-1.2v-0.3c0.3-0.5 0.9-1.4 1.6-2.7s1.4-2.7 2.2-4.1c0.7-1.4 1.5-2.8 2.2-4.1s1.1-2.2 1.4-2.8c0.2-0.3 0.5-0.7 0.7-1.1s0.6-0.6 1-0.6c0.3 0 0.8 0.3 1.5 0.9 0.6 0.6 1.1 1 1.3 1.1 3 2 6 3.5 9.1 4.7 3 1.2 6.4 1.8 9.9 1.8 3.6 0 6.6-0.6 9.2-1.9s4.7-3 6.2-5.1c1.6-2.1 2.7-4.7 3.4-7.6s1.1-6.1 1.1-9.4c0-2.9-0.3-5.7-0.9-8.5s-1.6-5.3-2.9-7.4c-1.4-2.1-3.2-3.9-5.5-5.2s-5.2-2-8.6-2c-4 0-7.5 1-10.4 3s-5.5 4.5-7.8 7.5h-0.3l-4.8-3.6c-1.5-1.1-2.9-2.3-4.2-3.4s-2.7-2.3-4.2-3.4v-0.9l8.1-52.4h56.2v18.6h-39.3l-4.1 23.5v0.7c3-2.2 5.8-3.6 8.4-4.4 2.6-0.7 5.7-1.1 9.2-1.1 6 0 11 1 15.2 3 4.1 2 7.5 4.7 10.1 8.2s4.5 7.5 5.6 12.2 1.7 9.8 1.7 15.2c0 6.3-0.8 12.1-2.5 17.2-1.7 5.2-4.2 9.6-7.6 13.3s-7.6 6.5-12.6 8.5-10.8 3-17.5 3c-3.1 0-6.1-0.2-9-0.6-3.1-0.3-6.1-0.9-9.2-1.7z"/><path d="m408.9 301 1.2 9.6c1.1-0.9 2.1-2 3-3.1s1.9-2.2 2.9-3.1c2.4-2.3 5-3.7 7.9-4.3s6-0.9 9.2-0.9c4.2 0 8 0.5 11.4 1.4 3.4 1 6.6 3 9.4 6.2 0.5 0.6 1 1.5 1.5 2.7s1.1 2 1.7 2.3c1.9-2.5 3.8-4.6 5.7-6.2 1.9-1.7 3.9-3 6-3.9s4.3-1.6 6.8-2c2.4-0.4 5.2-0.5 8.3-0.5 5.2 0 9.7 0.6 13.3 1.7s7.2 3.8 10.8 7.9c0.7 1 1.3 2.1 1.9 3.6 0.5 1.4 1.2 2.3 1.9 2.7 0.6 2 1.2 4.2 1.9 6.6s1 4.6 1 6.8v70.8h-21.4v-60.8c0-2.5-0.2-5-0.6-7.4s-1.1-4.7-2.1-6.7-2.4-3.7-4.3-4.9c-1.8-1.2-4.2-1.9-7-1.9-3 0-5.8 0.7-8.5 2.2s-4.5 3.7-5.4 6.5c-0.4 0.8-0.8 2-1.2 3.5-0.5 1.5-0.7 2.3-0.7 2.4v67h-22.1v-63.6c0-2.3-0.3-4.5-0.8-6.6s-1.3-4.1-2.4-5.8-2.5-3.1-4.3-4.1-3.9-1.5-6.4-1.5c-3.2 0-6.3 0.9-9.4 2.7s-4.9 4.4-5.6 7.8c-0.1 0.6-0.2 1.3-0.4 2.1-0.1 0.8-0.3 1.7-0.4 2.5-0.2 0.8-0.4 1.9-0.6 3.2v63.3h-21.9v-98.2h19.7z"/><path d="m168.5 397.1c-3-1.6-6.2-2.9-9.5-3.8s-6.4-2.3-9.5-4.2l-12.3-7.3v-2.4c1.9-4.2 3.5-7.7 4.9-10.5s2.9-5.6 4.4-8.5 2.9-5.3 4-7.1c0.2-0.5 0.6-1.2 1.2-2.1s1-1.5 1.2-1.7h0.7c1.2 0 2.6 0.4 4.4 1.2s3.6 1.8 5.6 3 3.8 2.3 5.6 3.5 3.3 2.1 4.7 2.8c4.7 2.1 9.5 3.6 14.4 4.5s9.7 1.4 14.4 1.4c12.6 0 22.4-3.1 29.4-9.2s10.5-15.5 10.5-28c0-9.1-2.3-16.9-7-23.5s-11.9-10.2-21.7-10.6c-1.2 0-3.3-0.1-6.5-0.2s-6.4-0.2-9.8-0.3-6.7-0.2-9.8-0.2h-6.5v-35.2l26.6-1.7c0.5 0 2.2-0.4 5.1-1.2s5.1-1.4 6.5-1.9c6.1-1.9 10.4-5.3 13.1-10.4s4-10.7 4-16.7c0-10.5-3-18-8.9-22.6-6-4.6-13.8-7-23.6-7-8.6 0-16.6 1.7-24 5.1s-14.5 7.5-21.5 12.4h-0.6c-1.2 0-2-0.7-2.6-2.1s-1.1-2.3-1.6-2.8c-2.3-4.2-4.7-8.3-7-12.4s-4.3-8.4-6-13.1l-0.4-0.7c0-0.7 0.3-1.2 0.9-1.4s1.2-0.6 1.9-1c0.2-0.2 1-0.8 2.4-1.6s2.9-1.6 4.4-2.4 2.9-1.6 4.2-2.4 2.2-1.3 2.6-1.6c0.2 0 1-0.3 2.3-0.9s2.8-1.2 4.6-1.9 3.5-1.4 5.3-2.1 3.2-1.3 4.4-1.7c0.2 0 0.6-0.1 1.2-0.3s1-0.3 1.2-0.3c0.2-0.2 0.5-0.4 0.9-0.5s0.6-0.3 0.9-0.5c5.4-1.2 10.7-2 16.1-2.4 5.4-0.5 11-0.7 16.8-0.7 5.1 0 10.1 0.2 14.9 0.5s9.6 1.2 14.5 2.6c3.3 0.9 6.8 2.4 10.5 4.5s7.2 4.5 10.5 7.3 6.2 5.9 8.8 9.2c2.6 3.4 4.4 6.7 5.6 9.9 0.2 1.2 0.6 2.5 1 4 0.5 1.5 0.9 3.1 1.4 4.7s1 3.6 1.8 5.9v27.2c0 2.8-0.6 5.6-1.8 8.4s-2.6 5.5-4.4 8c-1.8 2.6-3.7 4.9-6 7.1-2.2 2.2-4.3 4.1-6.1 5.7-0.2 0.2-0.8 0.6-1.6 1.2s-1.8 1.2-2.8 1.7c-1 0.6-2 1.2-3 1.7l-1.8 1.2-0.7 0.7c0.7 0.5 2.3 1.2 4.9 2.1s4.2 1.6 4.9 2.1c4.9 2.1 8.9 5.1 12.1 9.1s5.7 8.4 7.5 13.2c1.9 4.9 3.2 9.9 3.8 15.2 0.7 5.2 1 10.2 1 14.8 0 12.3-2.5 24.2-7.5 35.5-5 11.4-13.1 20.2-24.3 26.5-1.9 1.2-3.9 2.1-6.1 2.8s-4.3 1.6-6.1 2.8c-1.2 0.5-3.6 1-7.4 1.7-3.7 0.7-6.2 1.3-7.4 1.7-0.5 0-1.5 0.1-3 0.3s-2.4 0.3-2.6 0.3h-30.8c-0.2 0-1.1-0.1-2.6-0.3s-2.5-0.3-3-0.3c-0.7-0.2-1.8-0.5-3.3-0.7s-3.2-0.5-4.9-0.9c-1.8-0.3-3.4-0.7-4.9-1-1.3-0.7-2.4-1-3.1-1.2z"/></g></svg>
|
After Width: | Height: | Size: 4.4 KiB |
|
@ -238,21 +238,81 @@ class Test_Image extends \Test\TestCase {
|
|||
$this->assertEquals(15, $img->height());
|
||||
}
|
||||
|
||||
public function testFitIn() {
|
||||
$img = new \OC_Image(OC::$SERVERROOT.'/tests/data/testimage.png');
|
||||
$this->assertTrue($img->fitIn(200, 100));
|
||||
$this->assertEquals(100, $img->width());
|
||||
$this->assertEquals(100, $img->height());
|
||||
public static function sampleProvider() {
|
||||
return [
|
||||
['testimage.png', [200, 100], [100, 100]],
|
||||
['testimage.jpg', [840, 840], [840, 525]],
|
||||
['testimage.gif', [200, 250], [200, 200]]
|
||||
];
|
||||
}
|
||||
|
||||
$img = new \OC_Image(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.jpg'));
|
||||
$this->assertTrue($img->fitIn(840, 840));
|
||||
$this->assertEquals(840, $img->width());
|
||||
$this->assertEquals(525, $img->height());
|
||||
/**
|
||||
* @dataProvider sampleProvider
|
||||
*
|
||||
* @param string $filename
|
||||
* @param int[] $asked
|
||||
* @param int[] $expected
|
||||
*/
|
||||
public function testFitIn($filename, $asked, $expected) {
|
||||
$img = new \OC_Image(OC::$SERVERROOT . '/tests/data/' . $filename);
|
||||
$this->assertTrue($img->fitIn($asked[0], $asked[1]));
|
||||
$this->assertEquals($expected[0], $img->width());
|
||||
$this->assertEquals($expected[1], $img->height());
|
||||
}
|
||||
|
||||
$img = new \OC_Image(base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif')));
|
||||
$this->assertTrue($img->fitIn(200, 250));
|
||||
$this->assertEquals(200, $img->width());
|
||||
$this->assertEquals(200, $img->height());
|
||||
public static function sampleFilenamesProvider() {
|
||||
return [
|
||||
['testimage.png'],
|
||||
['testimage.jpg'],
|
||||
['testimage.gif']
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Image should not be resized if it's already smaller than what is required
|
||||
*
|
||||
* @dataProvider sampleFilenamesProvider
|
||||
*
|
||||
* @param string $filename
|
||||
*/
|
||||
public function testScaleDownToFitWhenSmallerAlready($filename) {
|
||||
$img = new \OC_Image(OC::$SERVERROOT . '/tests/data/' . $filename);
|
||||
$currentWidth = $img->width();
|
||||
$currentHeight = $img->height();
|
||||
// We pick something larger than the image we want to scale down
|
||||
$this->assertFalse($img->scaleDownToFit(4000, 4000));
|
||||
// The dimensions of the image should not have changed since it's smaller already
|
||||
$resizedWidth = $img->width();
|
||||
$resizedHeight = $img->height();
|
||||
$this->assertEquals(
|
||||
$currentWidth, $img->width(), "currentWidth $currentWidth resizedWidth $resizedWidth \n"
|
||||
);
|
||||
$this->assertEquals(
|
||||
$currentHeight, $img->height(),
|
||||
"currentHeight $currentHeight resizedHeight $resizedHeight \n"
|
||||
);
|
||||
}
|
||||
|
||||
public static function largeSampleProvider() {
|
||||
return [
|
||||
['testimage.png', [200, 100], [100, 100]],
|
||||
['testimage.jpg', [840, 840], [840, 525]],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider largeSampleProvider
|
||||
*
|
||||
* @param string $filename
|
||||
* @param int[] $asked
|
||||
* @param int[] $expected
|
||||
*/
|
||||
public function testScaleDownWhenBigger($filename, $asked, $expected) {
|
||||
$img = new \OC_Image(OC::$SERVERROOT . '/tests/data/' . $filename);
|
||||
//$this->assertTrue($img->scaleDownToFit($asked[0], $asked[1]));
|
||||
$img->scaleDownToFit($asked[0], $asked[1]);
|
||||
$this->assertEquals($expected[0], $img->width());
|
||||
$this->assertEquals($expected[1], $img->height());
|
||||
}
|
||||
|
||||
function convertDataProvider() {
|
||||
|
|
|
@ -1,9 +1,23 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Georg Ehrke <georg@ownCloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
* @author Georg Ehrke <georg@owncloud.com>
|
||||
* @author Olivier Paroz <owncloud@interfasys.ch>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test;
|
||||
|
@ -12,118 +26,96 @@ class Preview extends TestCase {
|
|||
|
||||
const TEST_PREVIEW_USER1 = "test-preview-user1";
|
||||
|
||||
/**
|
||||
* @var \OC\Files\View
|
||||
*/
|
||||
/** @var \OC\Files\View */
|
||||
private $rootView;
|
||||
/**
|
||||
* Note that using 756 with an image with a ratio of 1.6 brings interesting rounding issues
|
||||
*
|
||||
* @var int maximum width allowed for a preview
|
||||
* */
|
||||
private $configMaxWidth = 756;
|
||||
/** @var int maximum height allowed for a preview */
|
||||
private $configMaxHeight = 756;
|
||||
private $keepAspect;
|
||||
private $scalingUp;
|
||||
|
||||
/** @var \OC\Files\Storage\Storage */
|
||||
private $originalStorage;
|
||||
private $samples = [];
|
||||
private $sampleFileId;
|
||||
private $sampleFilename;
|
||||
private $sampleWidth;
|
||||
private $sampleHeight;
|
||||
private $maxScaleFactor;
|
||||
/** @var int width of the max preview */
|
||||
private $maxPreviewWidth;
|
||||
/** @var int height of the max preview */
|
||||
private $maxPreviewHeight;
|
||||
/** @var int height of the max preview, which is the same as the one of the original image */
|
||||
private $maxPreviewRatio;
|
||||
private $cachedBigger = [];
|
||||
|
||||
/**
|
||||
* Make sure your configuration file doesn't contain any additional providers
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// FIXME: use proper tearDown with $this->loginAsUser() and $this->logout()
|
||||
// (would currently break the tests for some reason)
|
||||
$this->originalStorage = \OC\Files\Filesystem::getStorage('/');
|
||||
|
||||
// create a new user with his own filesystem view
|
||||
// this gets called by each test in this test class
|
||||
$userManager = \OC::$server->getUserManager();
|
||||
$userManager->clearBackends();
|
||||
$backend = new \OC_User_Dummy();
|
||||
\OC_User::useBackend($backend);
|
||||
$userManager->registerBackend($backend);
|
||||
$backend->createUser(self::TEST_PREVIEW_USER1, self::TEST_PREVIEW_USER1);
|
||||
$user = \OC::$server->getUserManager()->get(self::TEST_PREVIEW_USER1);
|
||||
\OC::$server->getUserSession()->setUser($user);
|
||||
\OC\Files\Filesystem::init(self::TEST_PREVIEW_USER1, '/' . self::TEST_PREVIEW_USER1 . '/files');
|
||||
$this->loginAsUser(self::TEST_PREVIEW_USER1);
|
||||
|
||||
\OC\Files\Filesystem::mount('OC\Files\Storage\Temporary', array(), '/');
|
||||
$storage = new \OC\Files\Storage\Temporary([]);
|
||||
\OC\Files\Filesystem::mount($storage, [], '/' . self::TEST_PREVIEW_USER1 . '/');
|
||||
|
||||
$this->rootView = new \OC\Files\View('');
|
||||
$this->rootView->mkdir('/'.self::TEST_PREVIEW_USER1);
|
||||
$this->rootView->mkdir('/'.self::TEST_PREVIEW_USER1.'/files');
|
||||
$this->rootView->mkdir('/' . self::TEST_PREVIEW_USER1);
|
||||
$this->rootView->mkdir('/' . self::TEST_PREVIEW_USER1 . '/files');
|
||||
|
||||
// We simulate the max dimension set in the config
|
||||
\OC::$server->getConfig()
|
||||
->setSystemValue('preview_max_x', $this->configMaxWidth);
|
||||
\OC::$server->getConfig()
|
||||
->setSystemValue('preview_max_y', $this->configMaxHeight);
|
||||
// Used to test upscaling
|
||||
$this->maxScaleFactor = 2;
|
||||
\OC::$server->getConfig()
|
||||
->setSystemValue('preview_max_scale_factor', $this->maxScaleFactor);
|
||||
|
||||
// We need to enable the providers we're going to use in the tests
|
||||
$providers = [
|
||||
'OC\\Preview\\JPEG',
|
||||
'OC\\Preview\\PNG',
|
||||
'OC\\Preview\\GIF',
|
||||
'OC\\Preview\\TXT',
|
||||
'OC\\Preview\\Postscript'
|
||||
];
|
||||
\OC::$server->getConfig()
|
||||
->setSystemValue('enabledPreviewProviders', $providers);
|
||||
|
||||
// Sample is 1680x1050 JPEG
|
||||
$this->prepareSample('testimage.jpg', 1680, 1050);
|
||||
// Sample is 2400x1707 EPS
|
||||
$this->prepareSample('testimage.eps', 2400, 1707);
|
||||
// Sample is 1200x450 PNG
|
||||
$this->prepareSample('testimage-wide.png', 1200, 450);
|
||||
// Sample is 64x64 GIF
|
||||
$this->prepareSample('testimage.gif', 64, 64);
|
||||
}
|
||||
|
||||
protected function tearDown() {
|
||||
\OC\Files\Filesystem::clearMounts();
|
||||
\OC\Files\Filesystem::mount($this->originalStorage, array(), '/');
|
||||
$this->logout();
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
public function testIsMaxSizeWorking() {
|
||||
// Max size from config
|
||||
$maxX = 1024;
|
||||
$maxY = 1024;
|
||||
|
||||
\OC::$server->getConfig()->setSystemValue('preview_max_x', $maxX);
|
||||
\OC::$server->getConfig()->setSystemValue('preview_max_y', $maxY);
|
||||
|
||||
// Sample is 1680x1050 JPEG
|
||||
$sampleFile = '/' . self::TEST_PREVIEW_USER1 . '/files/testimage.jpg';
|
||||
$this->rootView->file_put_contents($sampleFile, file_get_contents(\OC::$SERVERROOT.'/tests/data/testimage.jpg'));
|
||||
$fileInfo = $this->rootView->getFileInfo($sampleFile);
|
||||
$fileId = $fileInfo['fileid'];
|
||||
|
||||
$largeX = 1920;
|
||||
$largeY = 1080;
|
||||
$preview = new \OC\Preview(self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg', $largeX, $largeY);
|
||||
|
||||
$this->assertEquals($preview->isFileValid(), true);
|
||||
|
||||
// There should be no cached copy
|
||||
$isCached = $preview->isCached($fileId);
|
||||
|
||||
$this->assertNotEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '-max.png', $isCached);
|
||||
$this->assertNotEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '.png', $isCached);
|
||||
$this->assertNotEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $largeX . '-' . $largeY . '.png', $isCached);
|
||||
|
||||
// The returned preview should be of max size
|
||||
$image = $preview->getPreview();
|
||||
|
||||
$this->assertEquals($image->width(), $maxX);
|
||||
$this->assertEquals($image->height(), $maxY);
|
||||
|
||||
// The max thumbnail should be created
|
||||
$maxThumbCacheFile = '/' . self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '-max.png';
|
||||
|
||||
$this->assertEquals($this->rootView->file_exists($maxThumbCacheFile), true);
|
||||
|
||||
// A preview of the asked size should not have been created
|
||||
$thumbCacheFile = \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $largeX . '-' . $largeY . '.png';
|
||||
|
||||
$this->assertEquals($this->rootView->file_exists($thumbCacheFile), false);
|
||||
|
||||
// 2nd request should indicate that we have a cached copy of max dimension
|
||||
$isCached = $preview->isCached($fileId);
|
||||
$this->assertEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '.png', $isCached);
|
||||
|
||||
// Smaller previews should be based on the cached max preview
|
||||
$smallX = 50;
|
||||
$smallY = 50;
|
||||
$preview = new \OC\Preview(self::TEST_PREVIEW_USER1, 'files/', 'testimage.jpg', $smallX, $smallY);
|
||||
$isCached = $preview->isCached($fileId);
|
||||
|
||||
$this->assertEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $maxX . '-' . $maxY . '.png', $isCached);
|
||||
|
||||
// A small preview should be created
|
||||
$image = $preview->getPreview();
|
||||
$this->assertEquals($image->width(), $smallX);
|
||||
$this->assertEquals($image->height(), $smallY);
|
||||
|
||||
// The cache should contain the small preview
|
||||
$thumbCacheFile = '/' . self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $smallX . '-' . $smallY . '.png';
|
||||
|
||||
$this->assertEquals($this->rootView->file_exists($thumbCacheFile), true);
|
||||
|
||||
// 2nd request should indicate that we have a cached copy of the exact dimension
|
||||
$isCached = $preview->isCached($fileId);
|
||||
|
||||
$this->assertEquals(\OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $smallX . '-' . $smallY . '.png', $isCached);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a preview can be deleted
|
||||
*/
|
||||
public function testIsPreviewDeleted() {
|
||||
|
||||
$sampleFile = '/'.self::TEST_PREVIEW_USER1.'/files/test.txt';
|
||||
$sampleFile = '/' . self::TEST_PREVIEW_USER1 . '/files/test.txt';
|
||||
|
||||
$this->rootView->file_put_contents($sampleFile, 'dummy file data');
|
||||
|
||||
|
@ -134,20 +126,27 @@ class Preview extends TestCase {
|
|||
$preview->getPreview();
|
||||
|
||||
$fileInfo = $this->rootView->getFileInfo($sampleFile);
|
||||
/** @var int $fileId */
|
||||
$fileId = $fileInfo['fileid'];
|
||||
$thumbCacheFile = $this->buildCachePath($fileId, $x, $y, true);
|
||||
|
||||
$thumbCacheFile = '/' . self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $x . '-' . $y . '.png';
|
||||
|
||||
$this->assertEquals($this->rootView->file_exists($thumbCacheFile), true);
|
||||
$this->assertSame(
|
||||
true, $this->rootView->file_exists($thumbCacheFile), "$thumbCacheFile \n"
|
||||
);
|
||||
|
||||
$preview->deletePreview();
|
||||
|
||||
$this->assertEquals($this->rootView->file_exists($thumbCacheFile), false);
|
||||
$this->assertSame(false, $this->rootView->file_exists($thumbCacheFile));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if all previews can be deleted
|
||||
*
|
||||
* We test this first to make sure we'll be able to cleanup after each preview generating test
|
||||
*/
|
||||
public function testAreAllPreviewsDeleted() {
|
||||
|
||||
$sampleFile = '/'.self::TEST_PREVIEW_USER1.'/files/test.txt';
|
||||
$sampleFile = '/' . self::TEST_PREVIEW_USER1 . '/files/test.txt';
|
||||
|
||||
$this->rootView->file_put_contents($sampleFile, 'dummy file data');
|
||||
|
||||
|
@ -158,104 +157,697 @@ class Preview extends TestCase {
|
|||
$preview->getPreview();
|
||||
|
||||
$fileInfo = $this->rootView->getFileInfo($sampleFile);
|
||||
/** @var int $fileId */
|
||||
$fileId = $fileInfo['fileid'];
|
||||
|
||||
$thumbCacheFolder = '/' . self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/';
|
||||
$thumbCacheFolder = '/' . self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER .
|
||||
'/' . $fileId . '/';
|
||||
|
||||
$this->assertEquals($this->rootView->is_dir($thumbCacheFolder), true);
|
||||
$this->assertSame(true, $this->rootView->is_dir($thumbCacheFolder), "$thumbCacheFolder \n");
|
||||
|
||||
$preview->deleteAllPreviews();
|
||||
|
||||
$this->assertEquals($this->rootView->is_dir($thumbCacheFolder), false);
|
||||
$this->assertSame(false, $this->rootView->is_dir($thumbCacheFolder));
|
||||
}
|
||||
|
||||
public function txtBlacklist() {
|
||||
$txt = 'random text file';
|
||||
|
||||
return array(
|
||||
array('txt', $txt, false),
|
||||
);
|
||||
return [
|
||||
['txt', $txt, false],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider txtBlacklist
|
||||
*
|
||||
* @param $extension
|
||||
* @param $data
|
||||
* @param $expectedResult
|
||||
*/
|
||||
public function testIsTransparent($extension, $data, $expectedResult) {
|
||||
|
||||
$x = 32;
|
||||
$y = 32;
|
||||
|
||||
$sample = '/'.self::TEST_PREVIEW_USER1.'/files/test.'.$extension;
|
||||
$sample = '/' . self::TEST_PREVIEW_USER1 . '/files/test.' . $extension;
|
||||
$this->rootView->file_put_contents($sample, $data);
|
||||
$preview = new \OC\Preview(self::TEST_PREVIEW_USER1, 'files/', 'test.'.$extension, $x, $y);
|
||||
$preview = new \OC\Preview(
|
||||
self::TEST_PREVIEW_USER1, 'files/', 'test.' . $extension, $x,
|
||||
$y
|
||||
);
|
||||
$image = $preview->getPreview();
|
||||
$resource = $image->resource();
|
||||
|
||||
//http://stackoverflow.com/questions/5702953/imagecolorat-and-transparency
|
||||
$colorIndex = imagecolorat($resource, 1, 1);
|
||||
$colorInfo = imagecolorsforindex($resource, $colorIndex);
|
||||
$this->assertEquals(
|
||||
$this->assertSame(
|
||||
$expectedResult,
|
||||
$colorInfo['alpha'] === 127,
|
||||
'Failed asserting that only previews for text files are transparent.'
|
||||
);
|
||||
}
|
||||
|
||||
public function testCreationFromCached() {
|
||||
/**
|
||||
* We generate the data to use as it makes it easier to adjust in case we need to test
|
||||
* something different
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function dimensionsDataProvider() {
|
||||
$data = [];
|
||||
$samples = [
|
||||
[200, 800],
|
||||
[200, 800],
|
||||
[50, 400],
|
||||
[4, 60],
|
||||
];
|
||||
$keepAspect = false;
|
||||
$scalingUp = false;
|
||||
|
||||
$sampleFile = '/'.self::TEST_PREVIEW_USER1.'/files/test.txt';
|
||||
for ($a = 0; $a < sizeof($samples); $a++) {
|
||||
for ($b = 0; $b < 2; $b++) {
|
||||
for ($c = 0; $c < 2; $c++) {
|
||||
for ($d = 0; $d < 4; $d++) {
|
||||
$coordinates = [
|
||||
[
|
||||
-rand($samples[$a][0], $samples[$a][1]),
|
||||
-rand($samples[$a][0], $samples[$a][1])
|
||||
],
|
||||
[
|
||||
rand($samples[$a][0], $samples[$a][1]),
|
||||
rand($samples[$a][0], $samples[$a][1])
|
||||
],
|
||||
[
|
||||
-rand($samples[$a][0], $samples[$a][1]),
|
||||
rand($samples[$a][0], $samples[$a][1])
|
||||
],
|
||||
[
|
||||
rand($samples[$a][0], $samples[$a][1]),
|
||||
-rand($samples[$a][0], $samples[$a][1])
|
||||
]
|
||||
];
|
||||
$row = [$a];
|
||||
$row[] = $coordinates[$d][0];
|
||||
$row[] = $coordinates[$d][1];
|
||||
$row[] = $keepAspect;
|
||||
$row[] = $scalingUp;
|
||||
$data[] = $row;
|
||||
}
|
||||
$scalingUp = !$scalingUp;
|
||||
}
|
||||
$keepAspect = !$keepAspect;
|
||||
}
|
||||
}
|
||||
|
||||
$this->rootView->file_put_contents($sampleFile, 'dummy file data');
|
||||
|
||||
// create base preview
|
||||
$x = 150;
|
||||
$y = 150;
|
||||
|
||||
$preview = new \OC\Preview(self::TEST_PREVIEW_USER1, 'files/', 'test.txt', $x, $y);
|
||||
$preview->getPreview();
|
||||
|
||||
$fileInfo = $this->rootView->getFileInfo($sampleFile);
|
||||
$fileId = $fileInfo['fileid'];
|
||||
|
||||
$thumbCacheFile = '/' . self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $x . '-' . $y . '.png';
|
||||
|
||||
$this->assertEquals($this->rootView->file_exists($thumbCacheFile), true);
|
||||
|
||||
|
||||
// create smaller previews
|
||||
$preview = new \OC\Preview(self::TEST_PREVIEW_USER1, 'files/', 'test.txt', 50, 50);
|
||||
$isCached = $preview->isCached($fileId);
|
||||
|
||||
$this->assertEquals(self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/150-150.png', $isCached);
|
||||
return $data;
|
||||
}
|
||||
|
||||
/*
|
||||
public function testScalingUp() {
|
||||
/**
|
||||
* Tests if a preview of max dimensions gets created
|
||||
*
|
||||
* @dataProvider dimensionsDataProvider
|
||||
*
|
||||
* @param int $sampleId
|
||||
* @param int $widthAdjustment
|
||||
* @param int $heightAdjustment
|
||||
* @param bool $keepAspect
|
||||
* @param bool $scalingUp
|
||||
*/
|
||||
public function testCreateMaxAndNormalPreviewsAtFirstRequest(
|
||||
$sampleId, $widthAdjustment, $heightAdjustment, $keepAspect = false, $scalingUp = false
|
||||
) {
|
||||
//$this->markTestSkipped('Not testing this at this time');
|
||||
|
||||
$sampleFile = '/'.$this->user.'/files/test.txt';
|
||||
// Get the right sample for the experiment
|
||||
$this->getSample($sampleId);
|
||||
$sampleWidth = $this->sampleWidth;
|
||||
$sampleHeight = $this->sampleHeight;
|
||||
$sampleFileId = $this->sampleFileId;
|
||||
|
||||
$this->rootView->file_put_contents($sampleFile, 'dummy file data');
|
||||
// Adjust the requested size so that we trigger various test cases
|
||||
$previewWidth = $sampleWidth + $widthAdjustment;
|
||||
$previewHeight = $sampleHeight + $heightAdjustment;
|
||||
$this->keepAspect = $keepAspect;
|
||||
$this->scalingUp = $scalingUp;
|
||||
|
||||
// create base preview
|
||||
$x = 150;
|
||||
$y = 150;
|
||||
// Generates the max preview
|
||||
$preview = $this->createPreview($previewWidth, $previewHeight);
|
||||
|
||||
$preview = new \OC\Preview($this->user, 'files/', 'test.txt', $x, $y);
|
||||
// There should be no cached thumbnails
|
||||
$thumbnailFolder = '/' . self::TEST_PREVIEW_USER1 . '/' . \OC\Preview::THUMBNAILS_FOLDER .
|
||||
'/' . $sampleFileId;
|
||||
$this->assertSame(false, $this->rootView->is_dir($thumbnailFolder));
|
||||
|
||||
$image = $preview->getPreview();
|
||||
$this->assertNotSame(false, $image);
|
||||
|
||||
$maxThumbCacheFile = $this->buildCachePath(
|
||||
$sampleFileId, $this->maxPreviewWidth, $this->maxPreviewHeight, true, '-max'
|
||||
);
|
||||
|
||||
$this->assertSame(
|
||||
true, $this->rootView->file_exists($maxThumbCacheFile), "$maxThumbCacheFile \n"
|
||||
);
|
||||
|
||||
// We check the dimensions of the file we've just stored
|
||||
$maxPreview = imagecreatefromstring($this->rootView->file_get_contents($maxThumbCacheFile));
|
||||
|
||||
$this->assertEquals($this->maxPreviewWidth, imagesx($maxPreview));
|
||||
$this->assertEquals($this->maxPreviewHeight, imagesy($maxPreview));
|
||||
|
||||
// A thumbnail of the asked dimensions should also have been created (within the constraints of the max preview)
|
||||
list($limitedPreviewWidth, $limitedPreviewHeight) =
|
||||
$this->simulatePreviewDimensions($previewWidth, $previewHeight);
|
||||
|
||||
$actualWidth = $image->width();
|
||||
$actualHeight = $image->height();
|
||||
|
||||
$this->assertEquals(
|
||||
(int)$limitedPreviewWidth, $image->width(), "$actualWidth x $actualHeight \n"
|
||||
);
|
||||
$this->assertEquals((int)$limitedPreviewHeight, $image->height());
|
||||
|
||||
// And it should be cached
|
||||
$this->checkCache($sampleFileId, $limitedPreviewWidth, $limitedPreviewHeight);
|
||||
|
||||
$preview->deleteAllPreviews();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if the second preview will be based off the cached max preview
|
||||
*
|
||||
* @dataProvider dimensionsDataProvider
|
||||
*
|
||||
* @param int $sampleId
|
||||
* @param int $widthAdjustment
|
||||
* @param int $heightAdjustment
|
||||
* @param bool $keepAspect
|
||||
* @param bool $scalingUp
|
||||
*/
|
||||
public function testSecondPreviewsGetCachedMax(
|
||||
$sampleId, $widthAdjustment, $heightAdjustment, $keepAspect = false, $scalingUp = false
|
||||
) {
|
||||
//$this->markTestSkipped('Not testing this at this time');
|
||||
|
||||
$this->getSample($sampleId);
|
||||
$sampleWidth = $this->sampleWidth;
|
||||
$sampleHeight = $this->sampleHeight;
|
||||
$sampleFileId = $this->sampleFileId;
|
||||
|
||||
//Creates the Max preview which will be used in the rest of the test
|
||||
$this->createMaxPreview();
|
||||
|
||||
// Adjust the requested size so that we trigger various test cases
|
||||
$previewWidth = $sampleWidth + $widthAdjustment;
|
||||
$previewHeight = $sampleHeight + $heightAdjustment;
|
||||
$this->keepAspect = $keepAspect;
|
||||
$this->scalingUp = $scalingUp;
|
||||
|
||||
$preview = $this->createPreview($previewWidth, $previewHeight);
|
||||
|
||||
// A cache query should return the thumbnail of max dimension
|
||||
$isCached = $preview->isCached($sampleFileId);
|
||||
$cachedMaxPreview = $this->buildCachePath(
|
||||
$sampleFileId, $this->maxPreviewWidth, $this->maxPreviewHeight, false, '-max'
|
||||
);
|
||||
$this->assertSame($cachedMaxPreview, $isCached);
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure that the max preview can never be deleted
|
||||
*
|
||||
* For this test to work, the preview we generate first has to be the size of max preview
|
||||
*/
|
||||
public function testMaxPreviewCannotBeDeleted() {
|
||||
//$this->markTestSkipped('Not testing this at this time');
|
||||
|
||||
$this->keepAspect = true;
|
||||
$this->getSample(0);
|
||||
$fileId = $this->sampleFileId;
|
||||
|
||||
//Creates the Max preview which we will try to delete
|
||||
$preview = $this->createMaxPreview();
|
||||
|
||||
// We try to deleted the preview
|
||||
$preview->deletePreview();
|
||||
$this->assertNotSame(false, $preview->isCached($fileId));
|
||||
|
||||
$preview->deleteAllPreviews();
|
||||
}
|
||||
|
||||
public static function aspectDataProvider() {
|
||||
$data = [];
|
||||
$samples = 4;
|
||||
$keepAspect = false;
|
||||
$scalingUp = false;
|
||||
for ($a = 0; $a < $samples; $a++) {
|
||||
for ($b = 0; $b < 2; $b++) {
|
||||
for ($c = 0; $c < 2; $c++) {
|
||||
$row = [$a];
|
||||
$row[] = $keepAspect;
|
||||
$row[] = $scalingUp;
|
||||
$data[] = $row;
|
||||
$scalingUp = !$scalingUp;
|
||||
}
|
||||
$keepAspect = !$keepAspect;
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* We ask for a preview larger than what is set in the configuration,
|
||||
* so we should be getting either the max preview or a preview the size
|
||||
* of the dimensions set in the config
|
||||
*
|
||||
* @dataProvider aspectDataProvider
|
||||
*
|
||||
* @param int $sampleId
|
||||
* @param bool $keepAspect
|
||||
* @param bool $scalingUp
|
||||
*/
|
||||
public function testDoNotCreatePreviewsLargerThanConfigMax(
|
||||
$sampleId, $keepAspect = false, $scalingUp = false
|
||||
) {
|
||||
//$this->markTestSkipped('Not testing this at this time');
|
||||
|
||||
$this->getSample($sampleId);
|
||||
|
||||
//Creates the Max preview which will be used in the rest of the test
|
||||
$this->createMaxPreview();
|
||||
|
||||
// Now we will create the real preview
|
||||
$previewWidth = 4000;
|
||||
$previewHeight = 4000;
|
||||
$this->keepAspect = $keepAspect;
|
||||
$this->scalingUp = $scalingUp;
|
||||
|
||||
// Tries to create the very large preview
|
||||
$preview = $this->createPreview($previewWidth, $previewHeight);
|
||||
|
||||
$image = $preview->getPreview();
|
||||
$this->assertNotSame(false, $image);
|
||||
|
||||
list($expectedWidth, $expectedHeight) =
|
||||
$this->simulatePreviewDimensions($previewWidth, $previewHeight);
|
||||
$this->assertEquals($expectedWidth, $image->width());
|
||||
$this->assertEquals($expectedHeight, $image->height());
|
||||
|
||||
// A preview of the asked size should not have been created since it's larger that our max dimensions
|
||||
$postfix = $this->getThumbnailPostfix($previewWidth, $previewHeight);
|
||||
$thumbCacheFile = $this->buildCachePath(
|
||||
$this->sampleFileId, $previewWidth, $previewHeight, false, $postfix
|
||||
);
|
||||
$this->assertSame(
|
||||
false, $this->rootView->file_exists($thumbCacheFile), "$thumbCacheFile \n"
|
||||
);
|
||||
|
||||
$preview->deleteAllPreviews();
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes sure we're getting the proper cached thumbnail
|
||||
*
|
||||
* When we start by generating a preview which keeps the aspect ratio
|
||||
* 200-125-with-aspect
|
||||
* 300-300 ✓
|
||||
*
|
||||
* When we start by generating a preview of exact dimensions
|
||||
* 200-200 ✓
|
||||
* 300-188-with-aspect
|
||||
*
|
||||
* @dataProvider aspectDataProvider
|
||||
*
|
||||
* @param int $sampleId
|
||||
* @param bool $keepAspect
|
||||
* @param bool $scalingUp
|
||||
*/
|
||||
public function testIsBiggerWithAspectRatioCached(
|
||||
$sampleId, $keepAspect = false, $scalingUp = false
|
||||
) {
|
||||
//$this->markTestSkipped('Not testing this at this time');
|
||||
|
||||
$previewWidth = 400;
|
||||
$previewHeight = 400;
|
||||
$this->getSample($sampleId);
|
||||
$fileId = $this->sampleFileId;
|
||||
$this->keepAspect = $keepAspect;
|
||||
$this->scalingUp = $scalingUp;
|
||||
|
||||
// Caching the max preview in our preview array for the test
|
||||
$this->cachedBigger[] = $this->buildCachePath(
|
||||
$fileId, $this->maxPreviewWidth, $this->maxPreviewHeight, false, '-max'
|
||||
);
|
||||
|
||||
$this->getSmallerThanMaxPreview($fileId, $previewWidth, $previewHeight);
|
||||
// We switch the aspect ratio, to generate a thumbnail we should not be picked up
|
||||
$this->keepAspect = !$keepAspect;
|
||||
$this->getSmallerThanMaxPreview($fileId, $previewWidth + 100, $previewHeight + 100);
|
||||
|
||||
// Small thumbnails are always cropped
|
||||
$this->keepAspect = false;
|
||||
// Smaller previews should be based on the previous, larger preview, with the correct aspect ratio
|
||||
$this->createThumbnailFromBiggerCachedPreview($fileId, 36, 36);
|
||||
|
||||
// 2nd cache query should indicate that we have a cached copy of the exact dimension
|
||||
$this->getCachedSmallThumbnail($fileId, 36, 36);
|
||||
|
||||
// We create a preview in order to be able to delete the cache
|
||||
$preview = $this->createPreview(rand(), rand());
|
||||
$preview->deleteAllPreviews();
|
||||
$this->cachedBigger = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialises the preview
|
||||
*
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
*
|
||||
* @return \OC\Preview
|
||||
*/
|
||||
private function createPreview($width, $height) {
|
||||
$preview = new \OC\Preview(
|
||||
self::TEST_PREVIEW_USER1, 'files/', $this->sampleFilename, $width,
|
||||
$height
|
||||
);
|
||||
|
||||
$this->assertSame(true, $preview->isFileValid());
|
||||
|
||||
$preview->setKeepAspect($this->keepAspect);
|
||||
$preview->setScalingup($this->scalingUp);
|
||||
|
||||
return $preview;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the Max preview which will be used in the rest of the test
|
||||
*
|
||||
* @return \OC\Preview
|
||||
*/
|
||||
private function createMaxPreview() {
|
||||
$this->keepAspect = true;
|
||||
$preview = $this->createPreview($this->maxPreviewWidth, $this->maxPreviewHeight);
|
||||
$preview->getPreview();
|
||||
|
||||
$fileInfo = $this->rootView->getFileInfo($sampleFile);
|
||||
$fileId = $fileInfo['fileid'];
|
||||
|
||||
$thumbCacheFile = '/' . $this->user . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/' . $x . '-' . $y . '.png';
|
||||
|
||||
$this->assertEquals($this->rootView->file_exists($thumbCacheFile), true);
|
||||
|
||||
|
||||
// create bigger previews - with scale up
|
||||
$preview = new \OC\Preview($this->user, 'files/', 'test.txt', 250, 250);
|
||||
$isCached = $preview->isCached($fileId);
|
||||
|
||||
$this->assertEquals($this->user . '/' . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId . '/150-150.png', $isCached);
|
||||
return $preview;
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes sure the preview which was just created has been saved to disk
|
||||
*
|
||||
* @param int $fileId
|
||||
* @param int $previewWidth
|
||||
* @param int $previewHeight
|
||||
*/
|
||||
private function checkCache($fileId, $previewWidth, $previewHeight) {
|
||||
$postfix = $this->getThumbnailPostfix($previewWidth, $previewHeight);
|
||||
|
||||
$thumbCacheFile = $this->buildCachePath(
|
||||
$fileId, $previewWidth, $previewHeight, true, $postfix
|
||||
);
|
||||
|
||||
$this->assertSame(
|
||||
true, $this->rootView->file_exists($thumbCacheFile), "$thumbCacheFile \n"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes special filename postfixes
|
||||
*
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getThumbnailPostfix($width, $height) {
|
||||
// Need to take care of special postfix added to the dimensions
|
||||
$postfix = '';
|
||||
$isMaxPreview = ($width === $this->maxPreviewWidth
|
||||
&& $height === $this->maxPreviewHeight) ? true : false;
|
||||
if ($isMaxPreview) {
|
||||
$postfix = '-max';
|
||||
}
|
||||
if ($this->keepAspect && !$isMaxPreview) {
|
||||
$postfix = '-with-aspect';
|
||||
}
|
||||
|
||||
return $postfix;
|
||||
}
|
||||
|
||||
private function getSmallerThanMaxPreview($fileId, $previewWidth, $previewHeight) {
|
||||
$preview = $this->createPreview($previewWidth, $previewHeight);
|
||||
|
||||
$image = $preview->getPreview();
|
||||
$this->assertNotSame(false, $image);
|
||||
|
||||
// A thumbnail of the asked dimensions should also have been created (within the constraints of the max preview)
|
||||
list($limitedPreviewWidth, $limitedPreviewHeight) =
|
||||
$this->simulatePreviewDimensions($previewWidth, $previewHeight);
|
||||
|
||||
$this->assertEquals($limitedPreviewWidth, $image->width());
|
||||
$this->assertEquals($limitedPreviewHeight, $image->height());
|
||||
|
||||
// And it should be cached
|
||||
$this->checkCache($fileId, $limitedPreviewWidth, $limitedPreviewHeight);
|
||||
|
||||
$this->cachedBigger[] = $preview->isCached($fileId);
|
||||
}
|
||||
|
||||
private function createThumbnailFromBiggerCachedPreview($fileId, $width, $height) {
|
||||
$preview = $this->createPreview($width, $height);
|
||||
|
||||
// A cache query should return a thumbnail of slightly larger dimensions
|
||||
// and with the proper aspect ratio
|
||||
$isCached = $preview->isCached($fileId);
|
||||
$expectedCachedBigger = $this->getExpectedCachedBigger();
|
||||
|
||||
$this->assertSame($expectedCachedBigger, $isCached);
|
||||
|
||||
$image = $preview->getPreview();
|
||||
$this->assertNotSame(false, $image);
|
||||
}
|
||||
|
||||
/**
|
||||
* Picks the bigger cached preview with the correct aspect ratio or the max preview if it's
|
||||
* smaller than that
|
||||
*
|
||||
* For non-upscaled images, we pick the only picture without aspect ratio
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getExpectedCachedBigger() {
|
||||
$foundPreview = null;
|
||||
$foundWidth = null;
|
||||
$foundHeight = null;
|
||||
$maxPreview = null;
|
||||
$maxWidth = null;
|
||||
$maxHeight = null;
|
||||
|
||||
foreach ($this->cachedBigger as $cached) {
|
||||
$size = explode('-', basename($cached));
|
||||
$width = (int)$size[0];
|
||||
$height = (int)$size[1];
|
||||
|
||||
if (strpos($cached, 'max')) {
|
||||
$maxWidth = $width;
|
||||
$maxHeight = $height;
|
||||
$maxPreview = $cached;
|
||||
continue;
|
||||
}
|
||||
|
||||
// We pick the larger preview with no aspect ratio
|
||||
if (!strpos($cached, 'aspect') && !strpos($cached, 'max')) {
|
||||
$foundPreview = $cached;
|
||||
$foundWidth = $width;
|
||||
$foundHeight = $height;
|
||||
}
|
||||
}
|
||||
if ($foundWidth > $maxWidth && $foundHeight > $maxHeight) {
|
||||
$foundPreview = $maxPreview;
|
||||
}
|
||||
|
||||
return $foundPreview;
|
||||
}
|
||||
|
||||
/**
|
||||
* A small thumbnail of exact dimensions should be in the cache
|
||||
*
|
||||
* @param int $fileId
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
*/
|
||||
private function getCachedSmallThumbnail($fileId, $width, $height) {
|
||||
$preview = $this->createPreview($width, $height);
|
||||
|
||||
$isCached = $preview->isCached($fileId);
|
||||
$thumbCacheFile = $this->buildCachePath($fileId, $width, $height);
|
||||
|
||||
$this->assertSame($thumbCacheFile, $isCached, "$thumbCacheFile \n");
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the complete path to a cached thumbnail starting from the user folder
|
||||
*
|
||||
* @param int $fileId
|
||||
* @param int $width
|
||||
* @param int $height
|
||||
* @param bool $user
|
||||
* @param string $postfix
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function buildCachePath($fileId, $width, $height, $user = false, $postfix = '') {
|
||||
$userPath = '';
|
||||
if ($user) {
|
||||
$userPath = '/' . self::TEST_PREVIEW_USER1 . '/';
|
||||
}
|
||||
|
||||
return $userPath . \OC\Preview::THUMBNAILS_FOLDER . '/' . $fileId
|
||||
. '/' . $width . '-' . $height . $postfix . '.png';
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores the sample in the filesystem and stores it in the $samples array
|
||||
*
|
||||
* @param string $fileName
|
||||
* @param int $sampleWidth
|
||||
* @param int $sampleHeight
|
||||
*/
|
||||
private function prepareSample($fileName, $sampleWidth, $sampleHeight) {
|
||||
$imgData = file_get_contents(\OC::$SERVERROOT . '/tests/data/' . $fileName);
|
||||
$imgPath = '/' . self::TEST_PREVIEW_USER1 . '/files/' . $fileName;
|
||||
$this->rootView->file_put_contents($imgPath, $imgData);
|
||||
$fileInfo = $this->rootView->getFileInfo($imgPath);
|
||||
|
||||
list($maxPreviewWidth, $maxPreviewHeight) =
|
||||
$this->setMaxPreview($sampleWidth, $sampleHeight);
|
||||
|
||||
$this->samples[] =
|
||||
[
|
||||
'sampleFileId' => $fileInfo['fileid'],
|
||||
'sampleFileName' => $fileName,
|
||||
'sampleWidth' => $sampleWidth,
|
||||
'sampleHeight' => $sampleHeight,
|
||||
'maxPreviewWidth' => $maxPreviewWidth,
|
||||
'maxPreviewHeight' => $maxPreviewHeight
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the variables used to define the boundaries which need to be respected when using a
|
||||
* specific sample
|
||||
*
|
||||
* @param $sampleId
|
||||
*/
|
||||
private function getSample($sampleId) {
|
||||
// Corrects a rounding difference when using the EPS (Imagick converted) sample
|
||||
$filename = $this->samples[$sampleId]['sampleFileName'];
|
||||
$splitFileName = pathinfo($filename);
|
||||
$extension = $splitFileName['extension'];
|
||||
$correction = ($extension === 'eps') ? 1 : 0;
|
||||
$maxPreviewHeight = $this->samples[$sampleId]['maxPreviewHeight'];
|
||||
$maxPreviewHeight = $maxPreviewHeight - $correction;
|
||||
|
||||
$this->sampleFileId = $this->samples[$sampleId]['sampleFileId'];
|
||||
$this->sampleFilename = $this->samples[$sampleId]['sampleFileName'];
|
||||
$this->sampleWidth = $this->samples[$sampleId]['sampleWidth'];
|
||||
$this->sampleHeight = $this->samples[$sampleId]['sampleHeight'];
|
||||
$this->maxPreviewWidth = $this->samples[$sampleId]['maxPreviewWidth'];
|
||||
$this->maxPreviewHeight = $maxPreviewHeight;
|
||||
$ratio = $this->maxPreviewWidth / $this->maxPreviewHeight;
|
||||
$this->maxPreviewRatio = $ratio;
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines the size of the max preview
|
||||
*
|
||||
* @fixme the Imagick previews don't have the exact same size on disk as they're calculated here
|
||||
*
|
||||
* @param int $sampleWidth
|
||||
* @param int $sampleHeight
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function setMaxPreview($sampleWidth, $sampleHeight) {
|
||||
// Max previews are never scaled up
|
||||
$this->scalingUp = false;
|
||||
// Max previews always keep the aspect ratio
|
||||
$this->keepAspect = true;
|
||||
// We set this variable in order to be able to calculate the max preview with the proper aspect ratio
|
||||
$this->maxPreviewRatio = $sampleWidth / $sampleHeight;
|
||||
$maxPreviewWidth = min($sampleWidth, $this->configMaxWidth);
|
||||
$maxPreviewHeight = min($sampleHeight, $this->configMaxHeight);
|
||||
list($maxPreviewWidth, $maxPreviewHeight) =
|
||||
$this->applyAspectRatio($maxPreviewWidth, $maxPreviewHeight);
|
||||
|
||||
return [$maxPreviewWidth, $maxPreviewHeight];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the expected dimensions of the preview to be able to assess if we've got the
|
||||
* right result
|
||||
*
|
||||
* @param int $askedWidth
|
||||
* @param int $askedHeight
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function simulatePreviewDimensions($askedWidth, $askedHeight) {
|
||||
$askedWidth = min($askedWidth, $this->configMaxWidth);
|
||||
$askedHeight = min($askedHeight, $this->configMaxHeight);
|
||||
|
||||
if ($this->keepAspect) {
|
||||
// Defines the box in which the preview has to fit
|
||||
$scaleFactor = $this->scalingUp ? $this->maxScaleFactor : 1;
|
||||
$newPreviewWidth = min($askedWidth, $this->maxPreviewWidth * $scaleFactor);
|
||||
$newPreviewHeight = min($askedHeight, $this->maxPreviewHeight * $scaleFactor);
|
||||
list($newPreviewWidth, $newPreviewHeight) =
|
||||
$this->applyAspectRatio($newPreviewWidth, $newPreviewHeight);
|
||||
} else {
|
||||
list($newPreviewWidth, $newPreviewHeight) =
|
||||
$this->fixSize($askedWidth, $askedHeight);
|
||||
}
|
||||
|
||||
return [(int)$newPreviewWidth, (int)$newPreviewHeight];
|
||||
}
|
||||
|
||||
/**
|
||||
* Resizes the boundaries to match the aspect ratio
|
||||
*
|
||||
* @param int $askedWidth
|
||||
* @param int $askedHeight
|
||||
*
|
||||
* @return \int[]
|
||||
*/
|
||||
private function applyAspectRatio($askedWidth, $askedHeight) {
|
||||
$originalRatio = $this->maxPreviewRatio;
|
||||
if ($askedWidth / $originalRatio < $askedHeight) {
|
||||
$askedHeight = round($askedWidth / $originalRatio);
|
||||
} else {
|
||||
$askedWidth = round($askedHeight * $originalRatio);
|
||||
}
|
||||
|
||||
return [(int)$askedWidth, (int)$askedHeight];
|
||||
}
|
||||
|
||||
/**
|
||||
* Clips or stretches the dimensions so that they fit in the boundaries
|
||||
*
|
||||
* @param int $askedWidth
|
||||
* @param int $askedHeight
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function fixSize($askedWidth, $askedHeight) {
|
||||
if ($this->scalingUp) {
|
||||
$askedWidth = min($this->configMaxWidth, $askedWidth);
|
||||
$askedHeight = min($this->configMaxHeight, $askedHeight);
|
||||
}
|
||||
|
||||
return [(int)$askedWidth, (int)$askedHeight];
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
36
tests/lib/preview/bitmap.php
Normal file
36
tests/lib/preview/bitmap.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Olivier Paroz <owncloud@interfasys.ch>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test\Preview;
|
||||
|
||||
class Bitmap extends Provider {
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$fileName = 'testimage.eps';
|
||||
$this->imgPath = $this->prepareTestFile($fileName, \OC::$SERVERROOT . '/tests/data/' . $fileName);
|
||||
$this->width = 2400;
|
||||
$this->height = 1707;
|
||||
$this->provider = new \OC\Preview\Postscript;
|
||||
}
|
||||
|
||||
}
|
36
tests/lib/preview/image.php
Normal file
36
tests/lib/preview/image.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Olivier Paroz <owncloud@interfasys.ch>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test\Preview;
|
||||
|
||||
class Image extends Provider {
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$fileName = 'testimage.jpg';
|
||||
$this->imgPath = $this->prepareTestFile($fileName, \OC::$SERVERROOT . '/tests/data/' . $fileName);
|
||||
$this->width = 1680;
|
||||
$this->height = 1050;
|
||||
$this->provider = new \OC\Preview\JPEG();
|
||||
}
|
||||
|
||||
}
|
46
tests/lib/preview/movie.php
Normal file
46
tests/lib/preview/movie.php
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Olivier Paroz <owncloud@interfasys.ch>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test\Preview;
|
||||
|
||||
class Movie extends Provider {
|
||||
|
||||
public function setUp() {
|
||||
$avconvBinary = \OC_Helper::findBinaryPath('avconv');
|
||||
$ffmpegBinary = ($avconvBinary) ? null : \OC_Helper::findBinaryPath('ffmpeg');
|
||||
|
||||
if ($avconvBinary || $ffmpegBinary) {
|
||||
parent::setUp();
|
||||
|
||||
\OC\Preview\Movie::$avconvBinary = $avconvBinary;
|
||||
\OC\Preview\Movie::$ffmpegBinary = $ffmpegBinary;
|
||||
|
||||
$fileName = 'testimage.mp4';
|
||||
$this->imgPath = $this->prepareTestFile($fileName, \OC::$SERVERROOT . '/tests/data/' . $fileName);
|
||||
$this->width = 560;
|
||||
$this->height = 320;
|
||||
$this->provider = new \OC\Preview\Movie;
|
||||
} else {
|
||||
$this->markTestSkipped('No Movie provider present');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
36
tests/lib/preview/mp3.php
Normal file
36
tests/lib/preview/mp3.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Olivier Paroz <owncloud@interfasys.ch>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test\Preview;
|
||||
|
||||
class MP3 extends Provider {
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$fileName = 'testimage.mp3';
|
||||
$this->imgPath = $this->prepareTestFile($fileName, \OC::$SERVERROOT . '/tests/data/' . $fileName);
|
||||
$this->width = 200;
|
||||
$this->height = 200;
|
||||
$this->provider = new \OC\Preview\MP3;
|
||||
}
|
||||
|
||||
}
|
43
tests/lib/preview/office.php
Normal file
43
tests/lib/preview/office.php
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Olivier Paroz <owncloud@interfasys.ch>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test\Preview;
|
||||
|
||||
class Office extends Provider {
|
||||
|
||||
public function setUp() {
|
||||
$libreofficeBinary = \OC_Helper::findBinaryPath('libreoffice');
|
||||
$openofficeBinary = ($libreofficeBinary) ? null : \OC_Helper::findBinaryPath('openoffice');
|
||||
|
||||
if ($libreofficeBinary || $openofficeBinary) {
|
||||
parent::setUp();
|
||||
|
||||
$fileName = 'testimage.odt';
|
||||
$this->imgPath = $this->prepareTestFile($fileName, \OC::$SERVERROOT . '/tests/data/' . $fileName);
|
||||
$this->width = 595;
|
||||
$this->height = 842;
|
||||
$this->provider = new \OC\Preview\OpenDocument;
|
||||
} else {
|
||||
$this->markTestSkipped('No Office provider present');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
187
tests/lib/preview/provider.php
Normal file
187
tests/lib/preview/provider.php
Normal file
|
@ -0,0 +1,187 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Olivier Paroz <owncloud@interfasys.ch>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test\Preview;
|
||||
|
||||
abstract class Provider extends \Test\TestCase {
|
||||
|
||||
/** @var string */
|
||||
protected $imgPath;
|
||||
/** @var int */
|
||||
protected $width;
|
||||
/** @var int */
|
||||
protected $height;
|
||||
/** @var \OC\Preview\Provider */
|
||||
protected $provider;
|
||||
/** @var int */
|
||||
protected $maxWidth = 1024;
|
||||
/** @var int */
|
||||
protected $maxHeight = 1024;
|
||||
/** @var bool */
|
||||
protected $scalingUp = false;
|
||||
/** @var int */
|
||||
protected $userId;
|
||||
/** @var \OC\Files\View */
|
||||
protected $rootView;
|
||||
/** @var \OC\Files\Storage\Storage */
|
||||
protected $storage;
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$userManager = \OC::$server->getUserManager();
|
||||
$userManager->clearBackends();
|
||||
$backend = new \OC_User_Dummy();
|
||||
$userManager->registerBackend($backend);
|
||||
|
||||
$userId = $this->getUniqueID();
|
||||
$backend->createUser($userId, $userId);
|
||||
$this->loginAsUser($userId);
|
||||
|
||||
$this->storage = new \OC\Files\Storage\Temporary([]);
|
||||
\OC\Files\Filesystem::mount($this->storage, [], '/' . $userId . '/');
|
||||
|
||||
$this->rootView = new \OC\Files\View('');
|
||||
$this->rootView->mkdir('/' . $userId);
|
||||
$this->rootView->mkdir('/' . $userId . '/files');
|
||||
|
||||
$this->userId = $userId;
|
||||
}
|
||||
|
||||
protected function tearDown() {
|
||||
$this->logout();
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
public static function dimensionsDataProvider() {
|
||||
return [
|
||||
[-rand(5, 100), -rand(5, 100)],
|
||||
[rand(5, 100), rand(5, 100)],
|
||||
[-rand(5, 100), rand(5, 100)],
|
||||
[rand(5, 100), -rand(5, 100)],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Launches all the tests we have
|
||||
*
|
||||
* @dataProvider dimensionsDataProvider
|
||||
*
|
||||
* @param int $widthAdjustment
|
||||
* @param int $heightAdjustment
|
||||
*/
|
||||
public function testGetThumbnail($widthAdjustment, $heightAdjustment) {
|
||||
$ratio = round($this->width / $this->height, 2);
|
||||
$this->maxWidth = $this->width - $widthAdjustment;
|
||||
$this->maxHeight = $this->height - $heightAdjustment;
|
||||
|
||||
// Testing code
|
||||
/*print_r("w $this->width ");
|
||||
print_r("h $this->height ");
|
||||
print_r("r $ratio ");*/
|
||||
|
||||
$preview = $this->getPreview($this->provider);
|
||||
// The TXT provider uses the max dimensions to create its canvas,
|
||||
// so the ratio will always be the one of the max dimension canvas
|
||||
if (!$this->provider instanceof \OC\Preview\TXT) {
|
||||
$this->doesRatioMatch($preview, $ratio);
|
||||
}
|
||||
$this->doesPreviewFit($preview);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the test file to the filesystem
|
||||
*
|
||||
* @param string $fileName name of the file to create
|
||||
* @param string $fileContent path to file to use for test
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function prepareTestFile($fileName, $fileContent) {
|
||||
$imgData = file_get_contents($fileContent);
|
||||
$imgPath = '/' . $this->userId . '/files/' . $fileName;
|
||||
$this->rootView->file_put_contents($imgPath, $imgData);
|
||||
|
||||
$scanner = $this->storage->getScanner();
|
||||
$scanner->scan('');
|
||||
|
||||
return $imgPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a max size thumbnail can be created
|
||||
*
|
||||
* @param \OC\Preview\Provider $provider
|
||||
*
|
||||
* @return bool|\OCP\IImage
|
||||
*/
|
||||
private function getPreview($provider) {
|
||||
$preview = $provider->getThumbnail($this->imgPath, $this->maxWidth, $this->maxHeight, $this->scalingUp, $this->rootView);
|
||||
|
||||
$this->assertNotEquals(false, $preview);
|
||||
$this->assertEquals(true, $preview->valid());
|
||||
|
||||
return $preview;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the preview ratio matches the original ratio
|
||||
*
|
||||
* @param \OCP\IImage $preview
|
||||
* @param int $ratio
|
||||
*/
|
||||
private function doesRatioMatch($preview, $ratio) {
|
||||
$previewRatio = round($preview->width() / $preview->height(), 2);
|
||||
$this->assertEquals($ratio, $previewRatio);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a max size preview of smaller dimensions can be created
|
||||
*
|
||||
* @param \OCP\IImage $preview
|
||||
*/
|
||||
private function doesPreviewFit($preview) {
|
||||
$maxDimRatio = round($this->maxWidth / $this->maxHeight, 2);
|
||||
$previewRatio = round($preview->width() / $preview->height(), 2);
|
||||
|
||||
// Testing code
|
||||
/*print_r("mw $this->maxWidth ");
|
||||
print_r("mh $this->maxHeight ");
|
||||
print_r("mr $maxDimRatio ");
|
||||
$pw = $preview->width();
|
||||
$ph = $preview->height();
|
||||
print_r("pw $pw ");
|
||||
print_r("ph $ph ");
|
||||
print_r("pr $previewRatio ");*/
|
||||
|
||||
if ($maxDimRatio < $previewRatio) {
|
||||
$this->assertLessThanOrEqual($this->maxWidth, $preview->width());
|
||||
$this->assertLessThan($this->maxHeight, $preview->height());
|
||||
} elseif ($maxDimRatio > $previewRatio) {
|
||||
$this->assertLessThan($this->maxWidth, $preview->width());
|
||||
$this->assertLessThanOrEqual($this->maxHeight, $preview->height());
|
||||
} else { // Original had to be resized
|
||||
$this->assertLessThanOrEqual($this->maxWidth, $preview->width());
|
||||
$this->assertLessThanOrEqual($this->maxHeight, $preview->height());
|
||||
}
|
||||
}
|
||||
}
|
41
tests/lib/preview/svg.php
Normal file
41
tests/lib/preview/svg.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Olivier Paroz <owncloud@interfasys.ch>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test\Preview;
|
||||
|
||||
class SVG extends Provider {
|
||||
|
||||
public function setUp() {
|
||||
$checkImagick = new \Imagick();
|
||||
if (count($checkImagick->queryFormats('SVG')) === 1) {
|
||||
parent::setUp();
|
||||
|
||||
$fileName = 'testimagelarge.svg';
|
||||
$this->imgPath = $this->prepareTestFile($fileName, \OC::$SERVERROOT . '/tests/data/' . $fileName);
|
||||
$this->width = 3000;
|
||||
$this->height = 2000;
|
||||
$this->provider = new \OC\Preview\SVG;
|
||||
} else {
|
||||
$this->markTestSkipped('No SVG provider present');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
37
tests/lib/preview/txt.php
Normal file
37
tests/lib/preview/txt.php
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Olivier Paroz <owncloud@interfasys.ch>
|
||||
*
|
||||
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test\Preview;
|
||||
|
||||
class TXT extends Provider {
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$fileName = 'lorem-big.txt';
|
||||
$this->imgPath = $this->prepareTestFile($fileName, \OC::$SERVERROOT . '/tests/data/' . $fileName);
|
||||
// Arbitrary width and length which won't be used to calculate the ratio
|
||||
$this->width = 500;
|
||||
$this->height = 200;
|
||||
$this->provider = new \OC\Preview\TXT;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue