/*
* Copyright (c) 2013-2017 Cinchapi Inc.
*
* 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.
*/
package com.cinchapi.concourse.thrift;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.junit.Assert;
import org.junit.Test;
import com.cinchapi.concourse.lang.Criteria;
import com.cinchapi.concourse.lang.Language;
import com.cinchapi.concourse.util.Convert;
import com.cinchapi.concourse.util.Random;
import com.cinchapi.concourse.util.RandomStringGenerator;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
/**
* Unit tests for {@link ComplexTObject}.
*
* @author Jeff Nelson
*/
public class ComplexTObjectTest {
@Test
public void testSerializeNull() {
ComplexTObject converted = ComplexTObject.fromJavaObject(null);
Assert.assertNull(converted.getJavaObject());
}
@Test
public void testSerializeTNull() {
ComplexTObject converted = ComplexTObject.fromJavaObject(TObject.NULL);
Assert.assertEquals(converted.getJavaObject(), TObject.NULL);
}
@Test
public void testSerializeString() {
String expected = Random.getString();
String actual = ComplexTObject.fromJavaObject(expected).getJavaObject();
Assert.assertEquals(expected, actual);
}
@Test
public void testSerializePrimitive() {
Object expected = Random.getObject();
Object actual = ComplexTObject.fromJavaObject(expected).getJavaObject();
Assert.assertEquals(expected, actual);
}
@Test
public void testSerializeListBasic() {
List<? extends Object> expected = Lists.<Object> newArrayList(1, 2, 3,
4, 5, 6, 7, 8, "9");
List<? extends Object> actual = ComplexTObject.fromJavaObject(expected)
.getJavaObject();
Assert.assertEquals(expected, actual);
}
@Test
public void testSerializeList() {
int count = Random.getScaleCount();
List<Object> expected = Lists.newArrayListWithCapacity(count);
for (int i = 0; i < count; ++i) {
expected.add(Random.getObject());
}
List<Object> actual = ComplexTObject.fromJavaObject(expected)
.getJavaObject();
Assert.assertEquals(expected, actual);
}
@Test
public void testSerializeSet() {
int count = Random.getScaleCount();
Set<Object> expected = Sets.newHashSet();
for (int i = 0; i < count; ++i) {
expected.add(Random.getObject());
}
Set<Object> actual = ComplexTObject.fromJavaObject(expected)
.getJavaObject();
Assert.assertEquals(expected, actual);
}
@Test
public void testSerializeListOfLists() {
List<? extends Object> expected = Lists.<Object> newArrayList("1",
true, 1, Lists.<Object> newArrayList(1, 2, 3, "4"),
Lists.newArrayList(1, 2), Sets.<Object> newHashSet("1", true));
List<? extends Object> actual = ComplexTObject.fromJavaObject(expected)
.getJavaObject();;
Assert.assertEquals(expected, actual);
}
@Test
public void testSerializeSetOfSets() {
Set<? extends Object> expected = Sets.<Object> newHashSet("1", true, 1,
Sets.<Object> newHashSet(1, 2, 3, "4"), Sets.newHashSet(1, 2),
Lists.<Object> newArrayList("1", true));
Set<? extends Object> actual = ComplexTObject.fromJavaObject(expected)
.getJavaObject();
Assert.assertEquals(expected, actual);
}
@Test
public void testSerializeTreeSet() {
TreeSet<Integer> expected = Sets.newTreeSet();
expected.add(3);
expected.add(1);
expected.add(2);
expected.add(4);
Set<Integer> actual = ComplexTObject.fromJavaObject(expected)
.getJavaObject();
Assert.assertEquals(expected, actual);
}
@Test
public void testSerializeMap() {
Map<Object, Object> expected = Maps.newHashMap();
int count = Random.getScaleCount();
for (int i = 0; i < count; ++i) {
Object key = Random.getObject();
Object value = Random.getObject();
expected.put(key, value);
}
Map<Object, Object> actual = ComplexTObject.fromJavaObject(expected)
.getJavaObject();
Assert.assertEquals(expected, actual);
}
@Test
public void testSerializeTObject() {
TObject expected = Convert.javaToThrift(Random.getObject());
ComplexTObject complex = ComplexTObject.fromJavaObject(expected);
Assert.assertEquals(expected, complex.getJavaObject());
}
@Test
public void testSerializeTBinary() {
String str = "hello";
ComplexTObject complex = ComplexTObject.fromJavaObject(str.getBytes());
Assert.assertEquals(ByteBuffer.wrap(str.getBytes()),
complex.getJavaObject());
}
@Test
public void testSerializeTCriteria() {
Criteria criteria = Criteria.where().key(Random.getString())
.operator(Operator.EQUALS).value(Random.getObject()).build();
TCriteria expected = Language.translateToThriftCriteria(criteria);
ComplexTObject complex = ComplexTObject.fromJavaObject(expected);
Assert.assertEquals(expected, complex.getJavaObject());
}
@Test
public void testTObjectByteBuffer() {
TObject source = Convert.javaToThrift(Random.getObject());
ComplexTObject expected = ComplexTObject.fromJavaObject(source);
ByteBuffer buffer = expected.toByteBuffer();
ComplexTObject actual = ComplexTObject.fromByteBuffer(buffer);
Assert.assertEquals(expected, actual);
}
@Test
public void testScalarByteBuffer() {
Object source = Random.getObject();
ComplexTObject expected = ComplexTObject.fromJavaObject(source);
ByteBuffer buffer = expected.toByteBuffer();
ComplexTObject actual = ComplexTObject.fromByteBuffer(buffer);
Assert.assertEquals(expected, actual);
}
@Test
public void testMapByteBuffer() {
Map<Object, Object> source = Maps.newHashMap();
int count = Random.getScaleCount();
for (int i = 0; i < count; ++i) {
Object key = Random.getObject();
Object value = Random.getObject();
source.put(key, value);
}
ComplexTObject expected = ComplexTObject.fromJavaObject(source);
ByteBuffer buffer = expected.toByteBuffer();
ComplexTObject actual = ComplexTObject.fromByteBuffer(buffer);
Assert.assertEquals(expected, actual);
}
@Test
public void testListByteBuffer() {
int count = Random.getScaleCount();
List<Object> source = Lists.newArrayListWithCapacity(count);
for (int i = 0; i < count; ++i) {
source.add(Random.getObject());
}
ComplexTObject expected = ComplexTObject.fromJavaObject(source);
ByteBuffer buffer = expected.toByteBuffer();
ComplexTObject actual = ComplexTObject.fromByteBuffer(buffer);
Assert.assertEquals(expected, actual);
}
@Test
public void testSetByteBuffer() {
int count = Random.getScaleCount();
Set<Object> source = Sets.newHashSetWithExpectedSize(count);
for (int i = 0; i < count; ++i) {
source.add(Random.getObject());
}
ComplexTObject expected = ComplexTObject.fromJavaObject(source);
ByteBuffer buffer = expected.toByteBuffer();
ComplexTObject actual = ComplexTObject.fromByteBuffer(buffer);
Assert.assertEquals(expected, actual);
}
@Test
public void testTCriteriaByteBuffer() {
Criteria source = Criteria.where().key(Random.getString())
.operator(Operator.EQUALS).value(Random.getObject()).build();
ComplexTObject expected = ComplexTObject.fromJavaObject(source);
ByteBuffer buffer = expected.toByteBuffer();
ComplexTObject actual = ComplexTObject.fromByteBuffer(buffer);
Assert.assertEquals(expected, actual);
}
@Test
public void testListOFListsByteBuffer() {
List<Object> source = Lists.<Object> newArrayList("1", true, 1,
Lists.<Object> newArrayList(1, 2, 3, "4"),
Lists.newArrayList(1, 2), Sets.<Object> newHashSet("1", true));
ComplexTObject expected = ComplexTObject.fromJavaObject(source);
ByteBuffer buffer = expected.toByteBuffer();
ComplexTObject actual = ComplexTObject.fromByteBuffer(buffer);
Assert.assertEquals(expected, actual);
}
@Test
public void testCachedObject() {
Criteria criteria = Criteria.where().key(Random.getString())
.operator(Operator.EQUALS).value(Random.getObject()).build();
TCriteria expected = Language.translateToThriftCriteria(criteria);
ComplexTObject complex = ComplexTObject.fromJavaObject(expected);
TCriteria cachedObj = complex.getJavaObject();
// check if it is same reference
if(cachedObj != complex.getJavaObject()) {
Assert.fail();
}
}
@Test
public void testNullToByteBuffer(){
ComplexTObject expected = ComplexTObject.fromJavaObject(null);
ByteBuffer buffer = expected.toByteBuffer();
ComplexTObject actual = ComplexTObject.fromByteBuffer(buffer);
Assert.assertEquals(expected, actual);
}
@Test
public void testMapWithLargeValueToByteBuffer(){
Map<String, String> expected = Maps.newHashMap();
RandomStringGenerator rand = new RandomStringGenerator();
expected.put(rand.nextString(300), rand.nextString(400));
ByteBuffer buffer = ComplexTObject.fromJavaObject(expected).toByteBuffer();
Assert.assertEquals(expected, ComplexTObject.fromByteBuffer(buffer).getJavaObject());
}
}