blob: 6a2f612642c9d16520d35591e964bca5af961873 [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.nio.ByteBuffer;
import java.sql.Time;
import java.util.concurrent.ThreadLocalRandom;
import org.apache.ignite.configuration.BinaryConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.marshaller.MarshallerContextTestImpl;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
*
*/
@RunWith(JUnit4.class)
public class BinaryFieldExtractionSelfTest extends GridCommonAbstractTest {
/**
* Create marshaller.
*
* @return Binary marshaller.
* @throws Exception If failed.
*/
protected BinaryMarshaller createMarshaller() throws Exception {
BinaryContext ctx = new BinaryContext(BinaryCachingMetadataHandler.create(), new IgniteConfiguration(),
log());
BinaryMarshaller marsh = new BinaryMarshaller();
BinaryConfiguration bCfg = new BinaryConfiguration();
IgniteConfiguration iCfg = new IgniteConfiguration();
iCfg.setBinaryConfiguration(bCfg);
marsh.setContext(new MarshallerContextTestImpl(null));
IgniteUtils.invoke(BinaryMarshaller.class, marsh, "setBinaryContext", ctx, iCfg);
return marsh;
}
/**
* @throws Exception If failed.
*/
@Test
public void testPrimitiveMarshalling() throws Exception {
BinaryMarshaller marsh = createMarshaller();
ThreadLocalRandom rnd = ThreadLocalRandom.current();
TestObject obj = new TestObject(0);
BinaryObjectImpl binObj = toBinary(obj, marsh);
BinaryFieldEx[] fields = new BinaryFieldEx[] {
(BinaryFieldEx)binObj.type().field("bVal"),
(BinaryFieldEx)binObj.type().field("cVal"),
(BinaryFieldEx)binObj.type().field("sVal"),
(BinaryFieldEx)binObj.type().field("iVal"),
(BinaryFieldEx)binObj.type().field("lVal"),
(BinaryFieldEx)binObj.type().field("fVal"),
(BinaryFieldEx)binObj.type().field("dVal")
};
ByteBuffer buf = ByteBuffer.allocate(1024 * 1024);
for (int i = 0; i < 100; i++) {
TestObject to = new TestObject(rnd.nextLong());
BinaryObjectImpl bObj = toBinary(to, marsh);
for (BinaryFieldEx field : fields)
field.writeField(bObj, buf);
buf.flip();
for (BinaryFieldEx field : fields)
assertEquals(field.value(bObj), field.readField(buf));
buf.flip();
}
}
/**
* @throws Exception If failed.
*/
@Test
public void testTimeMarshalling() throws Exception {
BinaryMarshaller marsh = createMarshaller();
TimeValue obj = new TimeValue(11111L);
BinaryObjectImpl binObj = toBinary(obj, marsh);
BinaryFieldEx field = (BinaryFieldEx)binObj.type().field("time");
ByteBuffer buf = ByteBuffer.allocate(16);
field.writeField(binObj, buf);
buf.flip();
assertEquals(field.value(binObj), field.<Time>readField(buf));
}
/**
* @throws Exception If failed.
*/
@Test
public void testDecimalFieldMarshalling() throws Exception {
BinaryMarshaller marsh = createMarshaller();
BigDecimal values[] = new BigDecimal[] { BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN,
new BigDecimal("-100.5"), BigDecimal.valueOf(Long.MAX_VALUE, 0),
BigDecimal.valueOf(Long.MIN_VALUE, 0), BigDecimal.valueOf(Long.MAX_VALUE, 8),
BigDecimal.valueOf(Long.MIN_VALUE, 8)};
DecimalValue decVal = new DecimalValue(values[0]);
BinaryObjectImpl binObj = toBinary(decVal, marsh);
BinaryFieldEx field = (BinaryFieldEx)binObj.type().field("decVal");
ByteBuffer buf = ByteBuffer.allocate(64);
for (BigDecimal value : values) {
decVal = new DecimalValue(value);
binObj = toBinary(decVal, marsh);
field.writeField(binObj, buf);
buf.flip();
assertEquals(field.value(binObj), field.readField(buf));
buf.clear();
}
}
/**
* @param obj Object to transform to a binary object.
* @param marsh Binary marshaller.
* @return Binary object.
*/
protected BinaryObjectImpl toBinary(Object obj, BinaryMarshaller marsh) throws Exception {
byte[] bytes = marsh.marshal(obj);
return new BinaryObjectImpl(binaryContext(marsh), bytes, 0);
}
/**
* Get binary context for the current marshaller.
*
* @param marsh Marshaller.
* @return Binary context.
*/
protected static BinaryContext binaryContext(BinaryMarshaller marsh) {
GridBinaryMarshaller impl = U.field(marsh, "impl");
return impl.context();
}
/**
*
*/
private static class TestObject {
/** */
private byte bVal;
/** */
private char cVal;
/** */
private short sVal;
/** */
private int iVal;
/** */
private long lVal;
/** */
private float fVal;
/** */
private double dVal;
/**
* @param seed Seed.
*/
private TestObject(long seed) {
bVal = (byte)seed;
cVal = (char)seed;
sVal = (short)seed;
iVal = (int)seed;
lVal = seed;
fVal = seed;
dVal = seed;
}
}
/** */
private static class TimeValue {
/** */
private Time time;
/**
* @param time Time.
*/
TimeValue(long time) {
this.time = new Time(time);
}
}
/**
*
*/
private static class DecimalValue {
/** */
private BigDecimal decVal;
/**
*
* @param decVal Value to use
*/
private DecimalValue(BigDecimal decVal) {
this.decVal = decVal;
}
}
}