blob: 4d16f1635057cc050d25747537e9cf0ee96491b7 [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.io;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.avro.AvroTypeException;
import org.apache.avro.Schema;
import org.apache.avro.Schema.Type;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericDatumWriter;
import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.junit.Assert;
import org.junit.Test;
public class TestEncoders {
private static EncoderFactory factory = EncoderFactory.get();
@Test
public void testBinaryEncoderInit() throws IOException {
OutputStream out = new ByteArrayOutputStream();
BinaryEncoder enc = factory.binaryEncoder(out, null);
Assert.assertTrue(enc == factory.binaryEncoder(out, enc));
}
@Test(expected=NullPointerException.class)
public void testBadBinaryEncoderInit() {
factory.binaryEncoder(null, null);
}
@Test
public void testBlockingBinaryEncoderInit() throws IOException {
OutputStream out = new ByteArrayOutputStream();
BinaryEncoder reuse = null;
reuse = factory.blockingBinaryEncoder(out, reuse);
Assert.assertTrue(reuse == factory.blockingBinaryEncoder(out, reuse));
// comparison
}
@Test(expected=NullPointerException.class)
public void testBadBlockintBinaryEncoderInit() {
factory.binaryEncoder(null, null);
}
@Test
public void testDirectBinaryEncoderInit() throws IOException {
OutputStream out = new ByteArrayOutputStream();
BinaryEncoder enc = factory.directBinaryEncoder(out, null);
Assert.assertTrue(enc == factory.directBinaryEncoder(out, enc));
}
@Test(expected=NullPointerException.class)
public void testBadDirectBinaryEncoderInit() {
factory.directBinaryEncoder(null, null);
}
@Test
public void testJsonEncoderInit() throws IOException {
Schema s = Schema.parse("\"int\"");
OutputStream out = new ByteArrayOutputStream();
factory.jsonEncoder(s, out);
JsonEncoder enc = factory.jsonEncoder(s,
new JsonFactory().createJsonGenerator(out, JsonEncoding.UTF8));
enc.configure(out);
}
@Test(expected=NullPointerException.class)
public void testBadJsonEncoderInitOS() throws IOException {
factory.jsonEncoder(Schema.create(Type.INT), (OutputStream)null);
}
@Test(expected=NullPointerException.class)
public void testBadJsonEncoderInit() throws IOException {
factory.jsonEncoder(Schema.create(Type.INT), (JsonGenerator)null);
}
@Test
public void testJsonEncoderNewlineDelimited() throws IOException {
OutputStream out = new ByteArrayOutputStream();
Schema ints = Schema.create(Type.INT);
Encoder e = factory.jsonEncoder(ints, out);
String separator = System.getProperty("line.separator");
GenericDatumWriter<Integer> writer = new GenericDatumWriter<Integer>(ints);
writer.write(1, e);
writer.write(2, e);
e.flush();
Assert.assertEquals("1"+separator+"2", out.toString());
}
@Test
public void testValidatingEncoderInit() throws IOException {
Schema s = Schema.parse("\"int\"");
OutputStream out = new ByteArrayOutputStream();
Encoder e = factory.directBinaryEncoder(out, null);
factory.validatingEncoder(s, e).configure(e);
}
@Test
public void testJsonRecordOrdering() throws IOException {
String value = "{\"b\": 2, \"a\": 1}";
Schema schema = new Schema.Parser().parse("{\"type\": \"record\", \"name\": \"ab\", \"fields\": [" +
"{\"name\": \"a\", \"type\": \"int\"}, {\"name\": \"b\", \"type\": \"int\"}" +
"]}");
GenericDatumReader<Object> reader = new GenericDatumReader<Object>(schema);
Decoder decoder = DecoderFactory.get().jsonDecoder(schema, value);
Object o = reader.read(null, decoder);
Assert.assertEquals("{\"a\": 1, \"b\": 2}", o.toString());
}
@Test(expected=AvroTypeException.class)
public void testJsonExcessFields() throws IOException {
String value = "{\"b\": { \"b3\": 1.4, \"b2\": 3.14, \"b1\": \"h\"}, \"a\": {\"a0\": 45, \"a2\":true, \"a1\": null}}";
Schema schema = new Schema.Parser().parse("{\"type\": \"record\", \"name\": \"ab\", \"fields\": [\n" +
"{\"name\": \"a\", \"type\": {\"type\":\"record\",\"name\":\"A\",\"fields\":\n" +
"[{\"name\":\"a1\", \"type\":\"null\"}, {\"name\":\"a2\", \"type\":\"boolean\"}]}},\n" +
"{\"name\": \"b\", \"type\": {\"type\":\"record\",\"name\":\"B\",\"fields\":\n" +
"[{\"name\":\"b1\", \"type\":\"string\"}, {\"name\":\"b2\", \"type\":\"float\"}, {\"name\":\"b3\", \"type\":\"double\"}]}}\n" +
"]}");
GenericDatumReader<Object> reader = new GenericDatumReader<Object>(schema);
Decoder decoder = DecoderFactory.get().jsonDecoder(schema, value);
reader.read(null, decoder);
}
@Test
public void testJsonRecordOrdering2() throws IOException {
String value = "{\"b\": { \"b3\": 1.4, \"b2\": 3.14, \"b1\": \"h\"}, \"a\": {\"a2\":true, \"a1\": null}}";
Schema schema = new Schema.Parser().parse("{\"type\": \"record\", \"name\": \"ab\", \"fields\": [\n" +
"{\"name\": \"a\", \"type\": {\"type\":\"record\",\"name\":\"A\",\"fields\":\n" +
"[{\"name\":\"a1\", \"type\":\"null\"}, {\"name\":\"a2\", \"type\":\"boolean\"}]}},\n" +
"{\"name\": \"b\", \"type\": {\"type\":\"record\",\"name\":\"B\",\"fields\":\n" +
"[{\"name\":\"b1\", \"type\":\"string\"}, {\"name\":\"b2\", \"type\":\"float\"}, {\"name\":\"b3\", \"type\":\"double\"}]}}\n" +
"]}");
GenericDatumReader<Object> reader = new GenericDatumReader<Object>(schema);
Decoder decoder = DecoderFactory.get().jsonDecoder(schema, value);
Object o = reader.read(null, decoder);
Assert.assertEquals("{\"a\": {\"a1\": null, \"a2\": true}, \"b\": {\"b1\": \"h\", \"b2\": 3.14, \"b3\": 1.4}}", o.toString());
}
@Test
public void testJsonRecordOrderingWithProjection() throws IOException {
String value = "{\"b\": { \"b3\": 1.4, \"b2\": 3.14, \"b1\": \"h\"}, \"a\": {\"a2\":true, \"a1\": null}}";
Schema writerSchema = new Schema.Parser().parse("{\"type\": \"record\", \"name\": \"ab\", \"fields\": [\n" +
"{\"name\": \"a\", \"type\": {\"type\":\"record\",\"name\":\"A\",\"fields\":\n" +
"[{\"name\":\"a1\", \"type\":\"null\"}, {\"name\":\"a2\", \"type\":\"boolean\"}]}},\n" +
"{\"name\": \"b\", \"type\": {\"type\":\"record\",\"name\":\"B\",\"fields\":\n" +
"[{\"name\":\"b1\", \"type\":\"string\"}, {\"name\":\"b2\", \"type\":\"float\"}, {\"name\":\"b3\", \"type\":\"double\"}]}}\n" +
"]}");
Schema readerSchema = new Schema.Parser().parse("{\"type\": \"record\", \"name\": \"ab\", \"fields\": [\n" +
"{\"name\": \"a\", \"type\": {\"type\":\"record\",\"name\":\"A\",\"fields\":\n" +
"[{\"name\":\"a1\", \"type\":\"null\"}, {\"name\":\"a2\", \"type\":\"boolean\"}]}}\n" +
"]}");
GenericDatumReader<Object> reader = new GenericDatumReader<Object>(writerSchema, readerSchema);
Decoder decoder = DecoderFactory.get().jsonDecoder(writerSchema, value);
Object o = reader.read(null, decoder);
Assert.assertEquals("{\"a\": {\"a1\": null, \"a2\": true}}", o.toString());
}
@Test
public void testJsonRecordOrderingWithProjection2() throws IOException {
String value = "{\"b\": { \"b1\": \"h\", \"b2\": [3.14, 3.56], \"b3\": 1.4}, \"a\": {\"a2\":true, \"a1\": null}}";
Schema writerSchema = new Schema.Parser().parse("{\"type\": \"record\", \"name\": \"ab\", \"fields\": [\n" +
"{\"name\": \"a\", \"type\": {\"type\":\"record\",\"name\":\"A\",\"fields\":\n" +
"[{\"name\":\"a1\", \"type\":\"null\"}, {\"name\":\"a2\", \"type\":\"boolean\"}]}},\n" +
"{\"name\": \"b\", \"type\": {\"type\":\"record\",\"name\":\"B\",\"fields\":\n" +
"[{\"name\":\"b1\", \"type\":\"string\"}, {\"name\":\"b2\", \"type\":{\"type\":\"array\", \"items\":\"float\"}}, {\"name\":\"b3\", \"type\":\"double\"}]}}\n" +
"]}");
Schema readerSchema = new Schema.Parser().parse("{\"type\": \"record\", \"name\": \"ab\", \"fields\": [\n" +
"{\"name\": \"a\", \"type\": {\"type\":\"record\",\"name\":\"A\",\"fields\":\n" +
"[{\"name\":\"a1\", \"type\":\"null\"}, {\"name\":\"a2\", \"type\":\"boolean\"}]}}\n" +
"]}");
GenericDatumReader<Object> reader = new GenericDatumReader<Object>(writerSchema, readerSchema);
Decoder decoder = DecoderFactory.get().jsonDecoder(writerSchema, value);
Object o = reader.read(null, decoder);
Assert.assertEquals("{\"a\": {\"a1\": null, \"a2\": true}}", o.toString());
}
}