blob: 660ef7f26e0db4a64a1e779dfac6b08346bc833f [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.ignite.internal.binary;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import org.apache.ignite.IgniteBinary;
import org.apache.ignite.binary.BinaryBasicIdMapper;
import org.apache.ignite.binary.BinaryBasicNameMapper;
import org.apache.ignite.binary.BinaryNameMapper;
import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.binary.BinaryObjectException;
import org.apache.ignite.binary.BinaryRawWriter;
import org.apache.ignite.binary.BinaryReader;
import org.apache.ignite.binary.BinaryType;
import org.apache.ignite.binary.BinaryWriter;
import org.apache.ignite.binary.Binarylizable;
import org.apache.ignite.configuration.BinaryConfiguration;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.junit.Test;
/**
* Binary meta data test.
*/
public class GridDefaultBinaryMappersBinaryMetaDataSelfTest extends GridCommonAbstractTest {
/** */
private static IgniteConfiguration cfg;
/** */
private static int idx;
/** {@inheritDoc} */
@Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
BinaryConfiguration bCfg = new BinaryConfiguration();
bCfg.setNameMapper(new BinaryBasicNameMapper(false));
bCfg.setIdMapper(new BinaryBasicIdMapper(false));
bCfg.setClassNames(Arrays.asList(TestObject1.class.getName(), TestObject2.class.getName()));
cfg.setBinaryConfiguration(bCfg);
cfg.setMarshaller(new BinaryMarshaller());
CacheConfiguration ccfg = new CacheConfiguration(DEFAULT_CACHE_NAME);
cfg.setCacheConfiguration(ccfg);
GridDefaultBinaryMappersBinaryMetaDataSelfTest.cfg = cfg;
return cfg;
}
/** {@inheritDoc} */
@Override protected void beforeTest() throws Exception {
idx = 0;
startGrid();
}
/** {@inheritDoc} */
@Override protected void afterTest() throws Exception {
stopGrid();
}
/**
* @return Binaries API.
*/
protected IgniteBinary binaries() {
return grid().binary();
}
/**
* @throws Exception If failed.
*/
@Test
public void testGetAll() throws Exception {
binaries().toBinary(new TestObject2());
Collection<BinaryType> metas = binaries().types();
assertEquals(2, metas.size());
for (BinaryType meta : metas) {
Collection<String> fields;
if (expectedTypeName(TestObject1.class.getName()).equals(meta.typeName())) {
fields = meta.fieldNames();
assertEquals(7, fields.size());
assertTrue(fields.contains("intVal"));
assertTrue(fields.contains("strVal"));
assertTrue(fields.contains("arrVal"));
assertTrue(fields.contains("obj1Val"));
assertTrue(fields.contains("obj2Val"));
assertTrue(fields.contains("decVal"));
assertTrue(fields.contains("decArrVal"));
assertEquals("int", meta.fieldTypeName("intVal"));
assertEquals("String", meta.fieldTypeName("strVal"));
assertEquals("byte[]", meta.fieldTypeName("arrVal"));
assertEquals("Object", meta.fieldTypeName("obj1Val"));
assertEquals("Object", meta.fieldTypeName("obj2Val"));
assertEquals("decimal", meta.fieldTypeName("decVal"));
assertEquals("decimal[]", meta.fieldTypeName("decArrVal"));
}
else if (expectedTypeName(TestObject2.class.getName()).equals(meta.typeName())) {
fields = meta.fieldNames();
assertEquals(7, fields.size());
assertTrue(fields.contains("boolVal"));
assertTrue(fields.contains("dateVal"));
assertTrue(fields.contains("uuidArrVal"));
assertTrue(fields.contains("objVal"));
assertTrue(fields.contains("mapVal"));
assertTrue(fields.contains("decVal"));
assertTrue(fields.contains("decArrVal"));
assertEquals("boolean", meta.fieldTypeName("boolVal"));
assertEquals("Date", meta.fieldTypeName("dateVal"));
assertEquals("UUID[]", meta.fieldTypeName("uuidArrVal"));
assertEquals("Object", meta.fieldTypeName("objVal"));
assertEquals("Map", meta.fieldTypeName("mapVal"));
assertEquals("decimal", meta.fieldTypeName("decVal"));
assertEquals("decimal[]", meta.fieldTypeName("decArrVal"));
}
else
assert false : meta.typeName();
}
}
/**
* @throws Exception If failed.
*/
@Test
public void testNoConfiguration() throws Exception {
binaries().toBinary(new TestObject3());
assertNotNull(binaries().type(TestObject3.class));
}
/**
* @throws Exception If failed.
*/
@Test
public void testReflection() throws Exception {
BinaryType meta = binaries().type(TestObject1.class);
assertNotNull(meta);
assertEquals(expectedTypeName(TestObject1.class.getName()), meta.typeName());
Collection<String> fields = meta.fieldNames();
assertEquals(7, fields.size());
assertTrue(fields.contains("intVal"));
assertTrue(fields.contains("strVal"));
assertTrue(fields.contains("arrVal"));
assertTrue(fields.contains("obj1Val"));
assertTrue(fields.contains("obj2Val"));
assertTrue(fields.contains("decVal"));
assertTrue(fields.contains("decArrVal"));
assertEquals("int", meta.fieldTypeName("intVal"));
assertEquals("String", meta.fieldTypeName("strVal"));
assertEquals("byte[]", meta.fieldTypeName("arrVal"));
assertEquals("Object", meta.fieldTypeName("obj1Val"));
assertEquals("Object", meta.fieldTypeName("obj2Val"));
assertEquals("decimal", meta.fieldTypeName("decVal"));
assertEquals("decimal[]", meta.fieldTypeName("decArrVal"));
}
/**
* @param clsName Class name.
* @return Type name.
*/
private String expectedTypeName(String clsName) {
BinaryNameMapper mapper = cfg.getBinaryConfiguration().getNameMapper();
if (mapper == null)
mapper = BinaryContext.defaultNameMapper();
return mapper.typeName(clsName);
}
/**
* @throws Exception If failed.
*/
@Test
public void testBinaryMarshalAware() throws Exception {
binaries().toBinary(new TestObject2());
BinaryType meta = binaries().type(TestObject2.class);
assertNotNull(meta);
assertEquals(expectedTypeName(TestObject2.class.getName()), meta.typeName());
Collection<String> fields = meta.fieldNames();
assertEquals(7, fields.size());
assertTrue(fields.contains("boolVal"));
assertTrue(fields.contains("dateVal"));
assertTrue(fields.contains("uuidArrVal"));
assertTrue(fields.contains("objVal"));
assertTrue(fields.contains("mapVal"));
assertTrue(fields.contains("decVal"));
assertTrue(fields.contains("decArrVal"));
assertEquals("boolean", meta.fieldTypeName("boolVal"));
assertEquals("Date", meta.fieldTypeName("dateVal"));
assertEquals("UUID[]", meta.fieldTypeName("uuidArrVal"));
assertEquals("Object", meta.fieldTypeName("objVal"));
assertEquals("Map", meta.fieldTypeName("mapVal"));
assertEquals("decimal", meta.fieldTypeName("decVal"));
assertEquals("decimal[]", meta.fieldTypeName("decArrVal"));
}
/**
* @throws Exception If failed.
*/
@Test
public void testMerge() throws Exception {
binaries().toBinary(new TestObject2());
idx = 1;
binaries().toBinary(new TestObject2());
BinaryType meta = binaries().type(TestObject2.class);
assertNotNull(meta);
assertEquals(expectedTypeName(TestObject2.class.getName()), meta.typeName());
Collection<String> fields = meta.fieldNames();
assertEquals(9, fields.size());
assertTrue(fields.contains("boolVal"));
assertTrue(fields.contains("dateVal"));
assertTrue(fields.contains("uuidArrVal"));
assertTrue(fields.contains("objVal"));
assertTrue(fields.contains("mapVal"));
assertTrue(fields.contains("charVal"));
assertTrue(fields.contains("colVal"));
assertTrue(fields.contains("decVal"));
assertTrue(fields.contains("decArrVal"));
assertEquals("boolean", meta.fieldTypeName("boolVal"));
assertEquals("Date", meta.fieldTypeName("dateVal"));
assertEquals("UUID[]", meta.fieldTypeName("uuidArrVal"));
assertEquals("Object", meta.fieldTypeName("objVal"));
assertEquals("Map", meta.fieldTypeName("mapVal"));
assertEquals("char", meta.fieldTypeName("charVal"));
assertEquals("Collection", meta.fieldTypeName("colVal"));
assertEquals("decimal", meta.fieldTypeName("decVal"));
assertEquals("decimal[]", meta.fieldTypeName("decArrVal"));
}
/**
* @throws Exception If failed.
*/
@Test
public void testSerializedObject() throws Exception {
TestObject1 obj = new TestObject1();
obj.intVal = 10;
obj.strVal = "str";
obj.arrVal = new byte[] {2, 4, 6};
obj.obj1Val = null;
obj.obj2Val = new TestObject2();
obj.decVal = BigDecimal.ZERO;
obj.decArrVal = new BigDecimal[] { BigDecimal.ONE };
BinaryObject po = binaries().toBinary(obj);
info(po.toString());
BinaryType meta = po.type();
assertNotNull(meta);
assertEquals(expectedTypeName(TestObject1.class.getName()), meta.typeName());
Collection<String> fields = meta.fieldNames();
assertEquals(7, fields.size());
assertTrue(fields.contains("intVal"));
assertTrue(fields.contains("strVal"));
assertTrue(fields.contains("arrVal"));
assertTrue(fields.contains("obj1Val"));
assertTrue(fields.contains("obj2Val"));
assertTrue(fields.contains("decVal"));
assertTrue(fields.contains("decArrVal"));
assertEquals("int", meta.fieldTypeName("intVal"));
assertEquals("String", meta.fieldTypeName("strVal"));
assertEquals("byte[]", meta.fieldTypeName("arrVal"));
assertEquals("Object", meta.fieldTypeName("obj1Val"));
assertEquals("Object", meta.fieldTypeName("obj2Val"));
assertEquals("decimal", meta.fieldTypeName("decVal"));
assertEquals("decimal[]", meta.fieldTypeName("decArrVal"));
}
/**
*/
private static class TestObject1 {
/** */
private int intVal;
/** */
private String strVal;
/** */
private byte[] arrVal;
/** */
private TestObject1 obj1Val;
/** */
private TestObject2 obj2Val;
/** */
private BigDecimal decVal;
/** */
private BigDecimal[] decArrVal;
}
/**
*/
private static class TestObject2 implements Binarylizable {
/** {@inheritDoc} */
@Override public void writeBinary(BinaryWriter writer) throws BinaryObjectException {
writer.writeBoolean("boolVal", false);
writer.writeDate("dateVal", new Date());
writer.writeUuidArray("uuidArrVal", null);
writer.writeObject("objVal", null);
writer.writeMap("mapVal", new HashMap<>());
writer.writeDecimal("decVal", BigDecimal.ZERO);
writer.writeDecimalArray("decArrVal", new BigDecimal[] { BigDecimal.ONE });
if (idx == 1) {
writer.writeChar("charVal", (char)0);
writer.writeCollection("colVal", null);
}
BinaryRawWriter raw = writer.rawWriter();
raw.writeChar((char)0);
raw.writeCollection(null);
}
/** {@inheritDoc} */
@Override public void readBinary(BinaryReader reader) throws BinaryObjectException {
// No-op.
}
}
/**
*/
private static class TestObject3 {
/** */
private int intVal;
}
}