/*
* (C) Copyright 2006-2016 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* Nuxeo - initial API and implementation
*/
package org.nuxeo.ecm.platform.pictures.tiles.service.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.nuxeo.common.Environment;
import org.nuxeo.common.utils.FileUtils;
import org.nuxeo.ecm.core.api.Blob;
import org.nuxeo.ecm.core.api.Blobs;
import org.nuxeo.ecm.platform.picture.api.ImageInfo;
import org.nuxeo.ecm.platform.picture.magick.utils.ImageIdentifier;
import org.nuxeo.ecm.platform.pictures.tiles.api.PictureTiles;
import org.nuxeo.ecm.platform.pictures.tiles.api.PictureTilesImpl;
import org.nuxeo.ecm.platform.pictures.tiles.api.PictureTilingService;
import org.nuxeo.ecm.platform.pictures.tiles.api.imageresource.BlobResource;
import org.nuxeo.ecm.platform.pictures.tiles.magick.tiler.MagickTiler;
import org.nuxeo.ecm.platform.pictures.tiles.service.GCTask;
import org.nuxeo.ecm.platform.pictures.tiles.service.PictureTilingCacheGCManager;
import org.nuxeo.ecm.platform.pictures.tiles.service.PictureTilingComponent;
import org.nuxeo.ecm.platform.pictures.tiles.tilers.PictureTiler;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.test.NXRuntimeTestCase;
public class TestService extends NXRuntimeTestCase {
@Override
@Before
public void setUp() throws Exception {
super.setUp();
deployContrib("org.nuxeo.ecm.platform.pictures.tiles", "OSGI-INF/pictures-tiles-framework.xml");
deployBundle("org.nuxeo.ecm.platform.commandline.executor");
deployContrib("org.nuxeo.ecm.platform.picture.core", "OSGI-INF/commandline-imagemagick-contrib.xml");
PictureTilingComponent.getCache().clear();
PictureTilingComponent.setDefaultTiler(new MagickTiler());
PictureTilingComponent.endGC();
}
@After
public void setDown() {
PictureTilingComponent.endGC();
}
@Test
public void testLookup() {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
}
@Test
public void testTilingSimple() throws Exception {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
File file = FileUtils.getResourceFileFromContext("test.jpg");
Blob image = Blobs.createBlob(file);
PictureTiles tiles = pts.getTiles(new BlobResource(image), 255, 255, 20);
assertNotNull(tiles);
assertFalse(tiles.getZoomfactor() == 0);
}
@Test
public void testAdapter() throws Exception {
deployContrib("org.nuxeo.ecm.platform.pictures.tiles", "OSGI-INF/pictures-tiles-adapter-contrib.xml");
}
@Test
public void testTilingSpead() throws Exception {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
File file = FileUtils.getResourceFileFromContext("test.jpg");
Blob image = Blobs.createBlob(file);
image.setFilename("slow.jpg");
PictureTiles tiles = pts.getTiles(new BlobResource(image), 255, 255, 20, 0, 0, false);
assertNotNull(tiles);
assertFalse(tiles.getZoomfactor() == 0);
// System.out.println("ExecTime="
// + tiles.getInfo().get("JavaProcessExecTime"));
image.setFilename("quick.jpg");
PictureTiles tiles2 = pts.getTiles(new BlobResource(image), 255, 255, 20, 0, 0, false);
assertNotNull(tiles2);
assertFalse(tiles2.getZoomfactor() == 0);
// System.out.println("ExecTime="
// + tiles2.getInfo().get("JavaProcessExecTime"));
}
@Test
public void testLazy() throws Exception {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
File wdir = new File(Environment.getDefault().getTemp(), "testMe");
wdir.mkdirs();
pts.setWorkingDirPath(wdir.getPath());
File file = FileUtils.getResourceFileFromContext("test.jpg");
Blob image = Blobs.createBlob(file);
image.setFilename("test.jpg");
PictureTiles tiles = pts.getTiles(new BlobResource(image), 255, 255, 20, 0, 0, false);
assertNotNull(tiles);
Blob tile00 = tiles.getTile(0, 0);
assertNotNull(tile00);
Blob tile01 = tiles.getTile(0, 1);
assertNotNull(tile01);
Blob tile02 = tiles.getTile(0, 2);
assertNotNull(tile02);
}
@Test
public void testTilingWithShrink() throws Exception {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
File file = FileUtils.getResourceFileFromContext("test.jpg");
Blob image = Blobs.createBlob(file);
PictureTiles tiles = pts.getTiles(new BlobResource(image), 255, 255, 3);
assertNotNull(tiles);
assertFalse(tiles.getZoomfactor() == 0);
}
@Test
public void testTilingSimpleMagick() throws Exception {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
PictureTilingComponent.setDefaultTiler(new MagickTiler());
File file = FileUtils.getResourceFileFromContext("test.jpg");
Blob image = Blobs.createBlob(file);
PictureTiles tiles = pts.getTiles(new BlobResource(image), 255, 255, 5);
assertNotNull(tiles);
assertFalse(tiles.getZoomfactor() == 0);
}
/*
* @Test public void testTilingBench() throws Exception { PictureTilingService pts =
* Framework.getLocalService(PictureTilingService.class); assertNotNull(pts); benchTiler(pts, new GimpTiler());
* benchTiler(pts, new MagickTiler()); }
*/
@Test
public void testMagick() throws Exception {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
PictureTilingComponent.setDefaultTiler(new MagickTiler());
File file = FileUtils.getResourceFileFromContext("test.jpg");
Blob image = Blobs.createBlob(file);
PictureTiles tiles = pts.getTiles(new BlobResource(image), 200, 200, 2);
assertNotNull(tiles);
tiles.getTile(0, 1);
}
@Test
public void testMagick2() throws Exception {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
PictureTilingComponent.setDefaultTiler(new MagickTiler());
File file = FileUtils.getResourceFileFromContext("test.jpg");
Blob image = Blobs.createBlob(file);
PictureTiles tiles = pts.getTiles(new BlobResource(image), 200, 160, 2);
assertNotNull(tiles);
tiles.getTile(0, 1);
}
@Test
@Ignore
public void testBig() throws Exception {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
PictureTilingComponent.setDefaultTiler(new MagickTiler());
File file = new File("/home/tiry/photos/orion.jpg");
Blob image = Blobs.createBlob(file);
long t0 = System.currentTimeMillis();
PictureTiles tiles = pts.getTiles(new BlobResource(image), 100, 100, 180);
assertNotNull(tiles);
long t1 = System.currentTimeMillis();
System.out.println("Big picture " + tiles.getOriginalImageInfo().getWidth() + "x"
+ tiles.getOriginalImageInfo().getHeight() + " at zoom " + tiles.getZoomfactor() + " generated in "
+ (t1 - t0) + "ms");
}
protected void benchTiler(PictureTilingService pts, PictureTiler tiler) throws Exception {
PictureTilingComponent.setDefaultTiler(tiler);
File file = FileUtils.getResourceFileFromContext("test.jpg");
Blob image = Blobs.createBlob(file);
long t0 = System.currentTimeMillis();
int nb = 0;
for (int maxTiles = 2; maxTiles < 5; maxTiles = maxTiles + 2) {
long tt0 = System.currentTimeMillis();
PictureTiles tiles = pts.getTiles(new BlobResource(image), 200, 200, maxTiles);
assertNotNull(tiles);
int nxt = tiles.getXTiles();
int nyt = tiles.getYTiles();
int nbt = 0;
for (int i = 0; i < nxt; i++) {
for (int j = 0; j < nyt; j++) {
nbt++;
long t1 = System.currentTimeMillis();
Blob tile = tiles.getTile(i, j);
long t2 = System.currentTimeMillis();
// System.out.println("maxTile=" + maxTiles + " " + i + "-"
// + j + " :" + (t2 - t1));
}
}
nb = nb + nbt;
long tt1 = System.currentTimeMillis();
// System.out.println("maxTile=" + maxTiles
// + " total generation time :" + (tt1 - tt0));
// System.out.println("speed " + (nbt + 0.0) / ((tt1 - tt0) / 1000));
}
long t3 = System.currentTimeMillis();
// System.out.println("complete run for tiler : " + tiler.getName() +
// " :" + (t3 - t0));
// System.out.println("speed " + (nb + 0.0) / ((t3 - t0) / 1000));
}
@Test
public void testGC() throws Exception {
int gcRuns = PictureTilingCacheGCManager.getGCRuns();
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
benchTiler(pts, new MagickTiler());
testMagick2();
testMagick2();
long cacheSize = PictureTilingCacheGCManager.getCacheSizeInKBs();
// System.out.println("CacheSize = " + cacheSize + "KB");
assertTrue(cacheSize > 0);
int reduceSize = 500;
// System.out.println("performing GC with " + reduceSize
// + " KB target reduction");
PictureTilingCacheGCManager.doGC(reduceSize);
int gcRuns2 = PictureTilingCacheGCManager.getGCRuns();
assertEquals(1, gcRuns2 - gcRuns);
long newCacheSize = PictureTilingCacheGCManager.getCacheSizeInKBs();
// System.out.println("new cacheSize = " + newCacheSize + "KB");
// System.out.println("effective delta = " + (cacheSize - newCacheSize)
// + "KB");
assertTrue(cacheSize - newCacheSize > reduceSize);
}
public static final String NXP21214 = "NXP-21214: GC runs are not always correct";
@Test
@Ignore(NXP21214)
public void testGC2() throws Exception {
int reduceSize = 500;
int gcRuns = PictureTilingCacheGCManager.getGCRuns();
int gcCalls = PictureTilingCacheGCManager.getGCCalls();
PictureTilingComponent.endGC();
String maxStr = PictureTilingComponent.getEnvValue(PictureTilingCacheGCManager.MAX_DISK_SPACE_USAGE_KEY,
Long.toString(PictureTilingCacheGCManager.MAX_DISK_SPACE_USAGE_KB));
PictureTilingComponent.setEnvValue(PictureTilingCacheGCManager.MAX_DISK_SPACE_USAGE_KEY,
Integer.toString(reduceSize));
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
benchTiler(pts, new MagickTiler());
// System.out.println("Tiling run 1");
testMagick2();
// System.out.println("Tiling run 2");
testMagick2();
// System.out.println("Tiling run 3");
testMagick2();
long cacheSize = PictureTilingCacheGCManager.getCacheSizeInKBs();
// System.out.println("CacheSize = " + cacheSize + "KB");
assertTrue(cacheSize > 0);
GCTask.setGCIntervalInMinutes(-100);
PictureTilingComponent.startGC();
// System.out.println("waiting for GC to run");
Thread.sleep(600);
int gcRuns2 = PictureTilingCacheGCManager.getGCRuns();
int gcCalls2 = PictureTilingCacheGCManager.getGCCalls();
int runs = gcRuns2 - gcRuns;
int calls = gcCalls2 - gcCalls;
// System.out.println("GC runs = " + runs);
// System.out.println("GC calls = " + calls);
assertTrue(runs > 0);
assertTrue(calls > 2);
PictureTilingComponent.endGC();
long newCacheSize = PictureTilingCacheGCManager.getCacheSizeInKBs();
// System.out.println("new cacheSize = " + newCacheSize + "KB");
// System.out.println("effective delta = " + (cacheSize - newCacheSize)
// + "KB");
assertTrue(cacheSize - newCacheSize > reduceSize);
PictureTilingComponent.setEnvValue(PictureTilingCacheGCManager.MAX_DISK_SPACE_USAGE_KEY, maxStr);
}
@Test
public void testParametersContrib() throws Exception {
deployContrib("org.nuxeo.ecm.platform.pictures.tiles", "OSGI-INF/pictures-tiles-contrib.xml");
String cacheSize = PictureTilingComponent.getEnvValue(PictureTilingCacheGCManager.MAX_DISK_SPACE_USAGE_KEY,
"ERROR");
assertEquals("50000", cacheSize);
}
@Test
public void testBorderTiles() throws Exception {
PictureTilingService pts = Framework.getLocalService(PictureTilingService.class);
assertNotNull(pts);
PictureTilingComponent.setDefaultTiler(new MagickTiler());
File file = FileUtils.getResourceFileFromContext("chutes.jpg");
Blob image = Blobs.createBlob(file);
PictureTiles tiles = pts.getTiles(new BlobResource(image), 64, 64, 3);
assertNotNull(tiles);
tiles.getTile(2, 1);
String tilePath = ((PictureTilesImpl) tiles).getTileFilePath(2, 1);
ImageInfo info = ImageIdentifier.getInfo(tilePath);
int width = info.getWidth();
int height = info.getHeight();
if (width == 63) {
width = 64; // tolerance for rounding
}
assertEquals(64, width);
assertEquals(64, height);
tiles.getTile(2, 2);
tilePath = ((PictureTilesImpl) tiles).getTileFilePath(2, 2);
info = ImageIdentifier.getInfo(tilePath);
width = info.getWidth();
height = info.getHeight();
if (width == 63) {
width = 64; // tolerance for rounding
}
if (height == 15) {
height = 16; // tolerance for rounding
}
assertEquals(64, width);
assertEquals(16, height);
}
}