blob: fe2546a82ac3faff5d6b224714ee7605f9cc35c4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.felix.scr.impl.metadata;
import static org.junit.Assert.assertArrayEquals;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.felix.scr.impl.metadata.MetadataStoreHelper.MetaDataReader;
import org.apache.felix.scr.impl.metadata.MetadataStoreHelper.MetaDataWriter;
import org.xml.sax.SAXException;
public class ComponentMetaDataCacheTest extends ComponentBase
{
public void testCachedComponentMetadata10() throws Exception
{
doTestCachedComponentMetadata("/components_10.xml", DSVersion.DS10);
}
public void testCachedComponentMetadata11() throws Exception
{
doTestCachedComponentMetadata("/components_11.xml", DSVersion.DS11);
}
public void testCachedComponentMetadata12() throws Exception
{
doTestCachedComponentMetadata("/components_12.xml", DSVersion.DS12);
}
public void testCachedComponentMetadata13() throws Exception
{
doTestCachedComponentMetadata("/components_13.xml", DSVersion.DS13);
}
public void testCachedComponentMetadata14() throws Exception
{
doTestCachedComponentMetadata("/components_14.xml", DSVersion.DS14);
}
private void doTestCachedComponentMetadata(String xmlFile, DSVersion version)
throws IOException, SAXException, Exception
{
final List<?> metadataList = readMetadata(xmlFile);
assertEquals("Component Descriptors size not as expected", 1,
metadataList.size());
final ComponentMetadata actualCM = (ComponentMetadata) metadataList.get(0);
ByteArrayOutputStream out = new ByteArrayOutputStream();
DataOutputStream dataOut = new DataOutputStream(out);
MetaDataWriter metaDataWriter = new MetaDataWriter();
actualCM.validate();
actualCM.store(dataOut, metaDataWriter);
MetaDataReader metaDataReader = new MetaDataReader();
DataInputStream dataIn = new DataInputStream(
new ByteArrayInputStream(out.toByteArray()));
ComponentMetadata cachedCM = ComponentMetadata.load(dataIn, metaDataReader);
assertEquals("Expected version not found", version, cachedCM.getDSVersion());
assertEqualsCM(actualCM, cachedCM);
}
private static void assertEqualsCM(ComponentMetadata actualCM,
ComponentMetadata cachedCM)
{
assertEquals("DS version is not equal", actualCM.getDSVersion(),
cachedCM.getDSVersion());
assertEquals("Component name is not equal", actualCM.getName(),
cachedCM.getName());
assertEquals("Activate method name not equal", actualCM.getActivate(),
cachedCM.getActivate());
assertEquals("Activate method declaration not equal",
actualCM.isActivateDeclared(), cachedCM.isActivateDeclared());
assertEquals("Activate fields not equal", actualCM.getActivationFields(),
cachedCM.getActivationFields());
assertEquals("Deactivate method name not equal", actualCM.getDeactivate(),
cachedCM.getDeactivate());
assertEquals("Deactivate method declaration not equal",
actualCM.isDeactivateDeclared(), cachedCM.isDeactivateDeclared());
assertEquals("Modified method name not equal", actualCM.getModified(),
cachedCM.getModified());
assertEquals("Configuration Policy not equal", actualCM.getConfigurationPolicy(),
cachedCM.getConfigurationPolicy());
assertEquals("Configuration Pid not equal", actualCM.getConfigurationPid(),
cachedCM.getConfigurationPid());
assertEquals("Factory Identifier not equal", actualCM.getFactoryIdentifier(),
cachedCM.getFactoryIdentifier());
assertEquals("Factory check not equal", actualCM.isFactory(),
cachedCM.isFactory());
assertEquals("Activation policy flag not equal", actualCM.isImmediate(),
cachedCM.isImmediate());
assertEquals("Implementation Class Name not equal",
actualCM.getImplementationClassName(), cachedCM.getImplementationClassName());
assertEquals("Number of Init parameters not equal",
actualCM.getNumberOfConstructorParameters(),
cachedCM.getNumberOfConstructorParameters());
checkServiceMetadata(actualCM, cachedCM);
checkReferenceMetadata(actualCM, cachedCM);
checkProperties(actualCM.getProperties(), cachedCM.getProperties());
checkProperties(actualCM.getFactoryProperties(), cachedCM.getFactoryProperties());
}
private static void checkServiceMetadata(ComponentMetadata actualCM,
ComponentMetadata cachedCM)
{
ServiceMetadata sm1 = actualCM.getServiceMetadata();
ServiceMetadata sm2 = cachedCM.getServiceMetadata();
if (sm1 != null && sm2 != null)
{
sm2.validate(cachedCM);
assertEquals("Service scope not equal", sm1.getScope(), sm2.getScope());
String[] implementedInterfaces1 = sm1.getProvides();
String[] implementedInterfaces2 = sm2.getProvides();
assertEquals("Service Provides length not equal",
implementedInterfaces1.length, implementedInterfaces2.length);
for (int i = 0; i < implementedInterfaces1.length; i++)
{
assertEquals("Implemented interfaces not same", implementedInterfaces1[i],
implementedInterfaces2[i]);
}
}
}
private static void checkReferenceMetadata(ComponentMetadata actualCM,
ComponentMetadata cachedCM)
{
List<ReferenceMetadata> references1 = actualCM.getDependencies();
List<ReferenceMetadata> references2 = cachedCM.getDependencies();
assertEquals("Number of references not same", references1.size(),
references2.size());
for (int i = 0; i < references1.size(); i++)
{
ReferenceMetadata r1 = references1.get(i);
ReferenceMetadata r2 = references2.get(i);
r2.validate(cachedCM);
assertEquals("Reference name not equal", r1.getName(), r2.getName());
assertEquals("Reference interface not equal", r1.getInterface(),
r2.getInterface());
assertEquals("Reference cardinality not equal", r1.getCardinality(),
r2.getCardinality());
assertEquals("Reference policy not equal", r1.getPolicy(), r2.getPolicy());
assertEquals("Reference policy option not equal", r1.getPolicyOption(),
r2.getPolicyOption());
assertEquals("Reference target not equal", r1.getTarget(), r2.getTarget());
assertEquals("Reference target property name not equal",
r1.getTargetPropertyName(), r2.getTargetPropertyName());
assertEquals("Reference bind not equal", r1.getBind(), r2.getBind());
assertEquals("Reference unbind not equal", r1.getUnbind(), r2.getUnbind());
assertEquals("Reference updated not equal", r1.getUpdated(), r2.getUpdated());
assertEquals("Reference field not equal", r1.getField(), r2.getField());
assertEquals("Reference field option not equal", r1.getFieldOption(),
r2.getFieldOption());
assertEquals("Reference field collection type not equal",
r1.getFieldCollectionType(), r2.getFieldCollectionType());
assertEquals("Reference scope not equal", r1.getScope(), r2.getScope());
assertEquals("Reference parameter index not equal", r1.getParameterIndex(),
r2.getParameterIndex());
assertEquals("Reference parameter collection type not equal",
r1.getParameterCollectionType(), r2.getParameterCollectionType());
}
}
private static void checkProperties(Map<String, Object> properties1,
Map<String, Object> properties2)
{
assertEquals("Properties size not equal", properties1.size(), properties2.size());
for (String key : properties1.keySet())
{
assertTrue("Properties not equal", properties2.containsKey(key));
checkPropertyValues(properties1.get(key), properties2.get(key));
}
}
private static void checkPropertyValues(Object value1, Object value2)
{
assertEquals("Property Values type not same", value1.getClass(),
value2.getClass());
if (value1.getClass().isArray())
{
if (value1 instanceof char[])
{
char[] v1 = (char[]) value1;
char[] v2 = (char[]) value2;
assertEquals("Length of property values not equal", v1.length, v1.length);
assertArrayEquals("Property Values not equal", v1, v2);
}
else if (value1 instanceof int[])
{
int[] v1 = (int[]) value1;
int[] v2 = (int[]) value2;
assertEquals("Length of property values not equal", v1.length, v1.length);
assertArrayEquals("Property Values not equal", v1, v2);
}
else if (value1 instanceof short[])
{
short[] v1 = (short[]) value1;
short[] v2 = (short[]) value2;
assertEquals("Length of property values not equal", v1.length, v1.length);
assertArrayEquals("Property Values not equal", v1, v2);
}
else if (value1 instanceof long[])
{
long[] v1 = (long[]) value1;
long[] v2 = (long[]) value2;
assertEquals("Length of property values not equal", v1.length, v1.length);
assertArrayEquals("Property Values not equal", v1, v2);
}
else if (value1 instanceof double[])
{
double[] v1 = (double[]) value1;
double[] v2 = (double[]) value2;
assertEquals("Length of property values not equal", v1.length, v1.length);
assertArrayEquals("Property Values not equal", v1, v2, 0);
}
else if (value1 instanceof float[])
{
float[] v1 = (float[]) value1;
float[] v2 = (float[]) value2;
assertEquals("Length of property values not equal", v1.length, v1.length);
assertArrayEquals("Property Values not equal", v1, v2, 0);
}
else if (value1 instanceof boolean[])
{
boolean[] v1 = (boolean[]) value1;
boolean[] v2 = (boolean[]) value2;
assertEquals("Length of property values not equal", v1.length, v1.length);
assertArrayEquals("Property Values not equal", v1, v2);
}
else if (value1 instanceof byte[])
{
byte[] v1 = (byte[]) value1;
byte[] v2 = (byte[]) value2;
assertEquals("Length of property values not equal", v1.length, v1.length);
assertArrayEquals("Property Values not equal", v1, v2);
}
else if (value1 instanceof String[])
{
String[] v1 = (String[]) value1;
String[] v2 = (String[]) value2;
assertEquals("Length of property values not equal", v1.length, v1.length);
assertArrayEquals("Property Values not equal", v1, v2);
}
}
else
{
assertEquals("Properties values not equal", value1, value2);
}
}
}