blob: 382939122dbac54bfab4d5bea1f3405a8ee52c34 [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.avro.generic;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.apache.avro.Foo;
import org.apache.avro.Interop;
import org.apache.avro.Kind;
import org.apache.avro.MD5;
import org.apache.avro.Node;
import org.apache.avro.Schema.Field;
import org.apache.avro.Schema.Type;
import org.apache.avro.specific.SpecificData;
import org.junit.Test;
/** Unit test for performing a deep copy of an object with a schema */
public class TestDeepCopy {
@Test
public void testDeepCopy() {
// Set all non-default fields in an Interop instance:
Interop.Builder interopBuilder = Interop.newBuilder();
interopBuilder.setArrayField(
Arrays.asList(new Double[] { 1.1, 1.2, 1.3, 1.4 }));
interopBuilder.setBoolField(true);
interopBuilder.setBytesField(ByteBuffer.wrap(new byte[] { 1, 2, 3, 4 }));
interopBuilder.setDoubleField(3.14d);
interopBuilder.setEnumField(Kind.B);
interopBuilder.setFixedField(new MD5(new byte[] {
4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1 }));
interopBuilder.setFloatField(6.022f);
interopBuilder.setIntField(32);
interopBuilder.setLongField(64L);
Map<java.lang.String,org.apache.avro.Foo> map =
new HashMap<java.lang.String,org.apache.avro.Foo>(1);
map.put("foo", Foo.newBuilder().setLabel("bar").build());
interopBuilder.setMapField(map);
interopBuilder.setNullField(null);
Node.Builder rootBuilder = Node.newBuilder().setLabel("/");
Node.Builder homeBuilder = Node.newBuilder().setLabel("home");
homeBuilder.setChildren(new ArrayList<Node>(0));
rootBuilder.setChildren(Arrays.asList(new Node[] { homeBuilder.build() }));
interopBuilder.setRecordField(rootBuilder.build());
interopBuilder.setStringField("Hello");
interopBuilder.setUnionField(Arrays.asList(new ByteBuffer[] {
ByteBuffer.wrap(new byte[] { 1, 2 }) }));
Interop interop = interopBuilder.build();
// Verify that deepCopy works for all fields:
for (Field field : Interop.SCHEMA$.getFields()) {
// Original field and deep copy should be equivalent:
if (interop.get(field.pos()) instanceof ByteBuffer) {
assertTrue(Arrays.equals(((ByteBuffer)interop.get(field.pos())).array(),
((ByteBuffer)GenericData.get().deepCopy(field.schema(),
interop.get(field.pos()))).array()));
}
else {
assertEquals(interop.get(field.pos()),
SpecificData.get().deepCopy(
field.schema(), interop.get(field.pos())));
}
// Original field and deep copy should be different instances:
if ((field.schema().getType() != Type.ENUM)
&& (field.schema().getType() != Type.NULL)
&& (field.schema().getType() != Type.BOOLEAN)
&& (field.schema().getType() != Type.INT)
&& (field.schema().getType() != Type.LONG)
&& (field.schema().getType() != Type.FLOAT)
&& (field.schema().getType() != Type.DOUBLE)
&& (field.schema().getType() != Type.STRING)) {
assertFalse("Field " + field.name() + " is same instance in deep copy",
interop.get(field.pos()) ==
GenericData.get().deepCopy(
field.schema(), interop.get(field.pos())));
}
}
}
}