/* * (C) Copyright 2006-2011 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.core.convert.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.nuxeo.ecm.core.api.Blob; import org.nuxeo.ecm.core.api.Blobs; import org.nuxeo.ecm.core.api.blobholder.BlobHolder; import org.nuxeo.ecm.core.api.blobholder.SimpleBlobHolder; import org.nuxeo.ecm.core.convert.api.ConversionService; import org.nuxeo.ecm.core.convert.api.ConverterCheckResult; import org.nuxeo.ecm.core.convert.api.ConverterNotAvailable; import org.nuxeo.ecm.core.convert.api.ConverterNotRegistered; import org.nuxeo.ecm.core.convert.extension.ChainedConverter; import org.nuxeo.ecm.core.convert.extension.Converter; import org.nuxeo.ecm.core.convert.extension.ConverterDescriptor; import org.nuxeo.ecm.core.convert.service.ConversionServiceImpl; import org.nuxeo.runtime.api.Framework; import org.nuxeo.runtime.model.RuntimeContext; import org.nuxeo.runtime.model.impl.DefaultRuntimeContext; import org.nuxeo.runtime.test.runner.Deploy; import org.nuxeo.runtime.test.runner.Features; import org.nuxeo.runtime.test.runner.FeaturesRunner; import org.nuxeo.runtime.test.runner.LocalDeploy; @RunWith(FeaturesRunner.class) @Features(ConvertFeature.class) @Deploy("org.nuxeo.ecm.core.mimetype") public class TestService { RuntimeContext rc; @Inject protected ConversionService cs; @Before public void init() { rc = new DefaultRuntimeContext(Framework.getRuntime()); } @After public void undeploy() { rc.destroy(); rc = null; } protected void deploy(String path) throws Exception { URL location = TestService.class.getResource("/".concat(path)); rc.deploy(location); } @Test public void testServiceRegistration() { assertNotNull(cs); } @Test public void testServiceContrib() throws Exception { deploy("OSGI-INF/converters-test-contrib1.xml"); assertNotNull(cs); Converter cv1 = ConversionServiceImpl.getConverter("dummy1"); assertNotNull(cv1); ConverterDescriptor desc1 = ConversionServiceImpl.getConverterDescriptor("dummy1"); assertNotNull(desc1); assertEquals("test/me", desc1.getDestinationMimeType()); assertSame(2, desc1.getSourceMimeTypes().size()); assertTrue(desc1.getSourceMimeTypes().contains("text/plain")); assertTrue(desc1.getSourceMimeTypes().contains("text/xml")); } @Test public void testConverterLookup() throws Exception { deploy("OSGI-INF/converters-test-contrib1.xml"); String converterName = cs.getConverterName("text/plain", "test/me"); assertEquals("dummy1", converterName); converterName = cs.getConverterName("text/plain2", "test/me"); assertNull(converterName); deploy("OSGI-INF/converters-test-contrib2.xml"); converterName = cs.getConverterName("test/me", "foo/bar"); assertEquals("dummy2", converterName); converterName = cs.getConverterName("text/plain", "foo/bar"); assertEquals("dummyChain", converterName); Converter cv = ConversionServiceImpl.getConverter("dummyChain"); assertNotNull(cv); boolean isChain = false; if (cv instanceof ChainedConverter) { ChainedConverter ccv = (ChainedConverter) cv; List<String> steps = ccv.getSteps(); assertNotNull(steps); assertSame(2, steps.size()); assertTrue(steps.contains("test/me")); assertTrue(steps.contains("foo/bar")); isChain = true; } assertTrue(isChain); converterName = cs.getConverterName("something", "somethingelse"); assertEquals("custom", converterName); converterName = cs.getConverterName("any", "somethingelse"); assertEquals("wildcard", converterName); converterName = cs.getConverterName("text/plain", "jacky/chan"); assertEquals("dummyChain2", converterName); Converter cv2 = ConversionServiceImpl.getConverter("dummyChain2"); assertNotNull(cv2); isChain = false; if (cv2 instanceof ChainedConverter) { ChainedConverter ccv = (ChainedConverter) cv2; List<String> steps = ccv.getSteps(); assertNull(steps); isChain = true; } assertTrue(isChain); } @Test public void testAvailability() throws Exception { deploy("OSGI-INF/converters-test-contrib1.xml"); deploy("OSGI-INF/converters-test-contrib2.xml"); deploy("OSGI-INF/converters-test-contrib4.xml"); ConverterCheckResult result = null; // ** not existing converter // check registration check boolean notRegistred = false; try { result = cs.isConverterAvailable("toto"); } catch (ConverterNotRegistered e) { notRegistred = true; } assertTrue(notRegistred); // check call notRegistred = false; try { cs.convert("toto", new SimpleBlobHolder(Blobs.createBlob("")), null); } catch (ConverterNotRegistered e) { notRegistred = true; } assertTrue(notRegistred); // not available converter notRegistred = false; try { result = cs.isConverterAvailable("NotAvailableConverter"); } catch (ConverterNotRegistered e) { notRegistred = true; } assertFalse(notRegistred); assertFalse(result.isAvailable()); assertNotNull(result.getErrorMessage()); assertNotNull(result.getInstallationMessage()); notRegistred = false; boolean notAvailable = false; try { cs.convert("NotAvailableConverter", new SimpleBlobHolder(Blobs.createBlob("")), null); } catch (ConverterNotRegistered e) { notRegistred = true; } catch (ConverterNotAvailable e) { notAvailable = true; } assertFalse(notRegistred); assertTrue(notAvailable); // ** available converter notRegistred = false; notAvailable = false; try { result = cs.isConverterAvailable("dummy2"); } catch (ConverterNotRegistered e) { notRegistred = true; } assertFalse(notRegistred); assertTrue(result.isAvailable()); assertNull(result.getErrorMessage()); assertNull(result.getInstallationMessage()); assertSame(2, result.getSupportedInputMimeTypes().size()); notRegistred = false; try { cs.convert("dummy2", new SimpleBlobHolder(Blobs.createBlob("")), null); } catch (ConverterNotRegistered e) { notRegistred = true; } catch (ConverterNotAvailable e) { notAvailable = true; } assertFalse(notRegistred); assertFalse(notAvailable); } @Test public void testChainConverterAvailability() throws Exception { deploy("OSGI-INF/converters-test-contrib3.xml"); deploy("OSGI-INF/converters-test-contrib4.xml"); deploy("OSGI-INF/converters-test-contrib5.xml"); ConverterCheckResult result = cs.isConverterAvailable("chainAvailable"); assertNotNull(result); assertTrue(result.isAvailable()); result = cs.isConverterAvailable("chainNotAvailable"); assertNotNull(result); assertFalse(result.isAvailable()); assertNotNull(result.getErrorMessage()); assertNotNull(result.getInstallationMessage()); } @Test public void testServiceConfig() throws Exception { deploy("OSGI-INF/convert-service-config-test.xml"); assertNotNull(cs); assertEquals(12, ConversionServiceImpl.getGCIntervalInMinutes()); assertEquals(132, ConversionServiceImpl.getMaxCacheSizeInKB()); assertFalse(ConversionServiceImpl.isCacheEnabled()); // override deploy("OSGI-INF/convert-service-config-override.xml"); assertEquals(34, ConversionServiceImpl.getGCIntervalInMinutes()); assertEquals(10, ConversionServiceImpl.getMaxCacheSizeInKB()); assertTrue(ConversionServiceImpl.isCacheEnabled()); assertEquals("/tmp/nosuchdirforcache", ConversionServiceImpl.getCacheBasePath()); } @Test public void testSupportedSourceMimeType() throws Exception { deploy("OSGI-INF/converters-test-contrib1.xml"); assertTrue(cs.isSourceMimeTypeSupported("dummy1", "text/plain")); assertTrue(cs.isSourceMimeTypeSupported("dummy1", "text/xml")); assertFalse(cs.isSourceMimeTypeSupported("dummy1", "application/pdf")); } @Test @LocalDeploy("org.nuxeo.ecm.core.convert:OSGI-INF/converters-test-pdf-contrib.xml") public void testUpdateMimeTypeAndFileName() { Map<String, Serializable> parameters = new HashMap<>(); Blob blob = Blobs.createBlob("dummy text", "text/plain"); BlobHolder result = cs.convert("dummyPdf", new SimpleBlobHolder(blob), parameters); Blob resultBlob = result.getBlob(); assertNotNull(resultBlob); assertEquals("application/pdf", resultBlob.getMimeType()); // cannot compute any filename assertNull(resultBlob.getFilename()); blob.setFilename("dummy.txt"); result = cs.convert("dummyPdf", new SimpleBlobHolder(blob), parameters); resultBlob = result.getBlob(); assertNotNull(resultBlob); assertEquals("application/pdf", resultBlob.getMimeType()); assertEquals("dummy.pdf", resultBlob.getFilename()); parameters.put("setMimeType", false); result = cs.convert("dummyPdf", new SimpleBlobHolder(blob), parameters); resultBlob = result.getBlob(); assertNotNull(resultBlob); assertEquals("application/pdf", resultBlob.getMimeType()); assertEquals("dummy.pdf", resultBlob.getFilename()); parameters = new HashMap<>(); parameters.put("tempFilename", true); result = cs.convert("dummyPdf", new SimpleBlobHolder(blob), parameters); resultBlob = result.getBlob(); assertNotNull(resultBlob); assertEquals("application/pdf", resultBlob.getMimeType()); assertEquals("dummy.pdf", resultBlob.getFilename()); } }