/**
* 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.sqoop.json.util;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import org.apache.sqoop.common.SqoopException;
import org.apache.sqoop.json.JSONUtils;
import org.apache.sqoop.schema.ByteArraySchema;
import org.apache.sqoop.schema.NullSchema;
import org.apache.sqoop.schema.Schema;
import org.apache.sqoop.schema.type.Array;
import org.apache.sqoop.schema.type.Binary;
import org.apache.sqoop.schema.type.Bit;
import org.apache.sqoop.schema.type.Date;
import org.apache.sqoop.schema.type.DateTime;
import org.apache.sqoop.schema.type.Decimal;
import org.apache.sqoop.schema.type.Enum;
import org.apache.sqoop.schema.type.FixedPoint;
import org.apache.sqoop.schema.type.FloatingPoint;
import org.apache.sqoop.schema.type.Map;
import org.apache.sqoop.schema.type.Set;
import org.apache.sqoop.schema.type.Text;
import org.apache.sqoop.schema.type.Time;
import org.apache.sqoop.schema.type.Unknown;
import org.json.simple.JSONObject;
import org.testng.annotations.Test;
/**
*
*/
public class TestSchemaSerialization {
@Test
public void testSchemaNull() {
// a null schema is treated as a NullSchema
JSONObject extractJson = SchemaSerialization.extractSchema(null);
JSONObject restoreJson = JSONUtils.parse(extractJson.toJSONString());
assertEquals(NullSchema.getInstance(), SchemaSerialization.restoreSchema(restoreJson));
}
@Test
public void testNullSchemaObject() {
transferAndAssert(NullSchema.getInstance());
}
@SuppressWarnings("unused")
@Test(expectedExceptions = SqoopException.class)
public void testEmptySchemaName() {
Schema schema = new Schema("");
}
@SuppressWarnings("unused")
@Test(expectedExceptions = SqoopException.class)
public void testNullSchemaName() {
Schema schema = new Schema(null);
}
@SuppressWarnings("unused")
@Test(expectedExceptions = SqoopException.class)
public void testSchemaWithNullColumnName() {
Schema schema = new Schema("test").addColumn(new Text(null));
}
@SuppressWarnings("unused")
@Test(expectedExceptions = SqoopException.class)
public void testSchemaWithEmptyColumnName() {
Schema schema = new Schema("test").addColumn(new Text(""));
}
@Test
public void testByteArraySchemaObject() {
transferAndAssert(ByteArraySchema.getInstance());
}
@Test
public void testArray() {
// create an array type containing decimals
Schema array = new Schema("array").addColumn(new Array("a", new Decimal("a1", 5, 2)).setSize(1L));
transferAndAssert(array);
}
@Test
public void testBinary() {
Schema binary = new Schema("b").addColumn(new Binary("A", 100L));
transferAndAssert(binary);
}
@Test
public void testBit() {
Schema bit = new Schema("b").addColumn(new Bit("B"));
transferAndAssert(bit);
}
@Test
public void testDate() {
Schema date = new Schema("d").addColumn(new Date("d"));
transferAndAssert(date);
}
@Test
public void testDateTime() {
Schema dateTime = new Schema("dt").addColumn(new DateTime("dt", Boolean.FALSE, Boolean.TRUE));
transferAndAssert(dateTime);
}
@Test
public void testDecimal() {
Schema decimal = new Schema("d").addColumn(new Decimal("d", 5, 2));
transferAndAssert(decimal);
}
@Test
public void testEnum() {
Schema e = new Schema("e").addColumn(new Enum("e", Collections
.unmodifiableSet(new HashSet<String>(Arrays.asList(new String[] { "A", "B" })))));
transferAndAssert(e);
}
@Test
public void testFixedPoint() {
Schema f = new Schema("f").addColumn(new FixedPoint("fp", 4L, Boolean.FALSE));
transferAndAssert(f);
}
@Test
public void testFloatingPoint() {
Schema fp = new Schema("fp").addColumn(new FloatingPoint("k", 4L));
transferAndAssert(fp);
}
@Test
public void testMap() {
Schema m = new Schema("m").addColumn(new Map("m", new Text("m1"), new Decimal("m2", 5, 2)));
transferAndAssert(m);
}
@Test
public void testSet() {
Schema s = new Schema("s").addColumn(new Set("b", new Binary("b1")));
transferAndAssert(s);
}
@Test
public void testText() {
Schema t = new Schema("t").addColumn(new Text("x", 10L));
transferAndAssert(t);
}
@Test
public void testTime() {
Schema t = new Schema("t").addColumn(new Time("t", Boolean.FALSE));
transferAndAssert(t);
}
@Test
public void testUnknown() {
Schema t = new Schema("t").addColumn(new Unknown("u", 4L));
transferAndAssert(t);
}
@Test
public void testNullable() {
Schema nullable = new Schema("n").addColumn(new Text("x", Boolean.FALSE));
transferAndAssert(nullable);
}
@Test
public void testAllTypes() {
Schema allTypes = new Schema("all-types")
.addColumn(new Array("a", new Text("a1")))
.addColumn(new Binary("b"))
.addColumn(new Bit("c"))
.addColumn(new Date("d"))
.addColumn(new DateTime("e", true, true))
.addColumn(new Decimal("f", 5, 2))
.addColumn(new Enum("g", Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(new String[] { "X", "Y" })))))
.addColumn(new FixedPoint("h", 2L, false))
.addColumn(new FloatingPoint("i", 4L))
.addColumn(new Map("j", new Text("j1"), new Text("j2")))
.addColumn(new Set("k", new Text("k1")))
.addColumn(new Text("l"))
.addColumn(new Time("m", true))
.addColumn(new Unknown("u"))
;
transferAndAssert(allTypes);
}
@Test
public void testComplex() {
Schema complex = new Schema("complex")
.addColumn(new Map("a", new Text("a1"), new Set("a2", new Array("a3", new Text("a4")))));
transferAndAssert(complex);
}
private void transferAndAssert(Schema schema) {
Schema transferred = transfer(schema);
assertEquals(schema, transferred);
}
protected Schema transfer(Schema schema) {
JSONObject extractJson = SchemaSerialization.extractSchema(schema);
String transferredString = extractJson.toJSONString();
JSONObject restoreJson = JSONUtils.parse(transferredString);
return SchemaSerialization.restoreSchema(restoreJson);
}
}