/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/
package com.liferay.portal.kernel.template;
import com.liferay.dynamic.data.mapping.kernel.DDMTemplate;
import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayInputStream;
import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;
import com.liferay.portal.kernel.test.ConsoleTestUtil;
import com.liferay.portal.kernel.test.ReflectionTestUtil;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
import com.liferay.portal.kernel.util.ProxyUtil;
import com.liferay.portal.template.CacheTemplateResource;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.Externalizable;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.net.URL;
import org.junit.Assert;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
/**
* @author Shuyang Zhou
*/
public class TemplateResourceExternalizationTest {
@ClassRule
@Rule
public static final AggregateTestRule aggregateTestRule =
new LiferayIntegrationTestRule();
@Test
public void testCacheTemplateResourceExternalization() throws Exception {
StringTemplateResource stringTemplateResource =
new StringTemplateResource("testId", "testContent");
CacheTemplateResource cacheTemplateResource = new CacheTemplateResource(
stringTemplateResource);
// writeExternal
UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
new UnsyncByteArrayOutputStream();
try (ObjectOutput objectOutput = new ObjectOutputStream(
unsyncByteArrayOutputStream)) {
cacheTemplateResource.writeExternal(objectOutput);
}
byte[] externalizedData = unsyncByteArrayOutputStream.toByteArray();
ObjectInput objectInput = new ObjectInputStream(
new UnsyncByteArrayInputStream(externalizedData));
Assert.assertEquals(
cacheTemplateResource.getLastModified(), objectInput.readLong());
Assert.assertEquals(stringTemplateResource, objectInput.readObject());
// readExternal
CacheTemplateResource newCacheTemplateResource =
new CacheTemplateResource();
objectInput = new ObjectInputStream(
new UnsyncByteArrayInputStream(externalizedData));
newCacheTemplateResource.readExternal(objectInput);
Assert.assertEquals(
stringTemplateResource,
ReflectionTestUtil.getFieldValue(
newCacheTemplateResource, "_templateResource"));
Assert.assertEquals(
cacheTemplateResource.getLastModified(),
newCacheTemplateResource.getLastModified());
}
@Test
public void testConstructors() throws Exception {
CacheTemplateResource.class.getConstructor();
DDMTemplateResource.class.getConstructor();
StringTemplateResource.class.getConstructor();
URLTemplateResource.class.getConstructor();
}
@Test
public void testDDMTemplateResourceExternalization() throws Exception {
String ddmTemplateKey = "testKey";
final long templateId = 100;
Class<?> clazz = getClass();
DDMTemplate ddmTemplate = (DDMTemplate)ProxyUtil.newProxyInstance(
clazz.getClassLoader(), new Class<?>[] {DDMTemplate.class},
new InvocationHandler() {
@Override
public Object invoke(
Object proxy, Method method, Object[] arguments)
throws Throwable {
String methodName = method.getName();
if (methodName.equals("getTemplateId")) {
return templateId;
}
throw new UnsupportedOperationException();
}
});
DDMTemplateResource ddmTemplateResource = new DDMTemplateResource(
ddmTemplateKey, ddmTemplate);
// writeExternal
UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
new UnsyncByteArrayOutputStream();
try (ObjectOutput objectOutput = new MockObjectOutput(
unsyncByteArrayOutputStream)) {
ddmTemplateResource.writeExternal(objectOutput);
}
byte[] externalizedData = unsyncByteArrayOutputStream.toByteArray();
DataInputStream dataInputStream = new DataInputStream(
new UnsyncByteArrayInputStream(externalizedData));
Assert.assertEquals(templateId, dataInputStream.readLong());
Assert.assertEquals(ddmTemplateKey, dataInputStream.readUTF());
// readExternal
DDMTemplateResource newDDMTemplateResource = new DDMTemplateResource();
MockObjectInput mockObjectInput = new MockObjectInput(
new DataInputStream(
new UnsyncByteArrayInputStream(externalizedData)));
UnsyncByteArrayOutputStream hijackedUnsyncByteArrayOutputStream =
ConsoleTestUtil.hijackStdErr();
try {
newDDMTemplateResource.readExternal(mockObjectInput);
Assert.fail();
}
catch (IOException ioe) {
Assert.assertEquals(
"Unable to retrieve ddm template with ID " + templateId,
ioe.getMessage());
}
finally {
ConsoleTestUtil.restoreStdErr(hijackedUnsyncByteArrayOutputStream);
}
Assert.assertEquals(null, newDDMTemplateResource.getTemplateId());
}
@Test
public void testExternalizableType() {
Assert.assertTrue(
Externalizable.class.isAssignableFrom(TemplateResource.class));
Assert.assertTrue(
TemplateResource.class.isAssignableFrom(
CacheTemplateResource.class));
Assert.assertTrue(
TemplateResource.class.isAssignableFrom(DDMTemplateResource.class));
Assert.assertTrue(
TemplateResource.class.isAssignableFrom(
StringTemplateResource.class));
Assert.assertTrue(
TemplateResource.class.isAssignableFrom(URLTemplateResource.class));
}
@Test
public void testStringTemplateResourceExternalization() throws Exception {
String templateId = "testId";
String templateContent = "testContent";
StringTemplateResource stringTemplateResource =
new StringTemplateResource(templateId, templateContent);
// writeExternal
UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
new UnsyncByteArrayOutputStream();
try (ObjectOutput objectOutput = new MockObjectOutput(
unsyncByteArrayOutputStream)) {
stringTemplateResource.writeExternal(objectOutput);
}
byte[] externalizedData = unsyncByteArrayOutputStream.toByteArray();
DataInputStream dataInputStream = new DataInputStream(
new UnsyncByteArrayInputStream(externalizedData));
Assert.assertEquals(
stringTemplateResource.getLastModified(),
dataInputStream.readLong());
Assert.assertEquals(templateContent, dataInputStream.readUTF());
Assert.assertEquals(templateId, dataInputStream.readUTF());
// readExternal
StringTemplateResource newStringTemplateResource =
new StringTemplateResource();
MockObjectInput mockObjectInput = new MockObjectInput(
new DataInputStream(
new UnsyncByteArrayInputStream(externalizedData)));
newStringTemplateResource.readExternal(mockObjectInput);
Assert.assertEquals(
stringTemplateResource.getLastModified(),
newStringTemplateResource.getLastModified());
Assert.assertEquals(
templateContent, newStringTemplateResource.getContent());
Assert.assertEquals(
templateId, newStringTemplateResource.getTemplateId());
}
@Test
public void testURLTemplateResourceExternalization() throws IOException {
String templateId = "testId";
Class<?> clazz = getClass();
ClassLoader classLoader = clazz.getClassLoader();
String resourcePath = clazz.getName();
resourcePath = resourcePath.replace('.', '/') + ".class";
URL url = classLoader.getResource(resourcePath);
URLTemplateResource urlTemplateResource = new URLTemplateResource(
templateId, url);
// writeExternal
UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
new UnsyncByteArrayOutputStream();
try (ObjectOutput objectOutput = new MockObjectOutput(
unsyncByteArrayOutputStream)) {
urlTemplateResource.writeExternal(objectOutput);
}
byte[] externalizedData = unsyncByteArrayOutputStream.toByteArray();
DataInputStream dataInputStream = new DataInputStream(
new UnsyncByteArrayInputStream(externalizedData));
Assert.assertEquals(templateId, dataInputStream.readUTF());
Assert.assertEquals(url.toExternalForm(), dataInputStream.readUTF());
// readExternal
URLTemplateResource newURLTemplateResource = new URLTemplateResource();
MockObjectInput mockObjectInput = new MockObjectInput(
new DataInputStream(
new UnsyncByteArrayInputStream(externalizedData)));
newURLTemplateResource.readExternal(mockObjectInput);
Assert.assertEquals(templateId, newURLTemplateResource.getTemplateId());
Assert.assertEquals(
url,
ReflectionTestUtil.getFieldValue(
newURLTemplateResource, "_templateURL"));
}
private static class MockObjectInput
extends DataInputStream implements ObjectInput {
public MockObjectInput(InputStream inputStream) {
super(inputStream);
}
@Override
public Object readObject() {
throw new UnsupportedOperationException();
}
}
private static class MockObjectOutput
extends DataOutputStream implements ObjectOutput {
public MockObjectOutput(OutputStream outputStream) {
super(outputStream);
}
@Override
public void writeObject(Object obj) {
throw new UnsupportedOperationException();
}
}
}