gobblin.converter.http.AvroToRestJsonEntryConverterTest.java Source code

Java tutorial

Introduction

Here is the source code for gobblin.converter.http.AvroToRestJsonEntryConverterTest.java

Source

/*
 * 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 gobblin.converter.http;

import java.io.File;
import java.io.IOException;

import gobblin.configuration.WorkUnitState;
import gobblin.converter.DataConversionException;

import org.apache.avro.Schema;
import org.apache.avro.file.DataFileReader;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericRecord;
import org.apache.commons.io.FileUtils;
import org.json.JSONException;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import org.skyscreamer.jsonassert.JSONAssert;
import org.testng.Assert;
import org.testng.annotations.Test;

@Test(groups = { "gobblin.converter" })
public class AvroToRestJsonEntryConverterTest {

    public void testConversionWithJsonTemplate() throws DataConversionException, IOException, JSONException {
        JsonParser parser = new JsonParser();
        String expectedResourceKey = "/sobject/user/John";
        String expectedJsonStr = "{ \"name\" : \"John\", \"favoriteNumber\" : 9, \"city\" : \"Mountain view\" }";
        RestEntry<JsonObject> expected = new RestEntry<JsonObject>(expectedResourceKey,
                parser.parse(expectedJsonStr).getAsJsonObject());

        WorkUnitState workUnitState = new WorkUnitState();
        workUnitState.setProp(AvroToRestJsonEntryConverter.CONVERTER_AVRO_REST_ENTRY_RESOURCE_KEY,
                "/sobject/user/${name}");
        String template = "name=${name},favoriteNumber=${favorite_number},city=${address.city}";
        workUnitState.setProp(AvroToRestJsonEntryConverter.CONVERTER_AVRO_REST_JSON_ENTRY_TEMPLATE, template);

        testConversion(expected, workUnitState);
    }

    public void testConversionWithJsonNestedTemplate() throws DataConversionException, IOException, JSONException {
        JsonParser parser = new JsonParser();
        String expectedResourceKey = "/sobject/user/John";
        String expectedJsonStr = "{ \"name\" : \"John\", \"favoriteNumber\" : 9, \"address\" : { \"city\" : \"Mountain view\"} }";
        RestEntry<JsonObject> expected = new RestEntry<JsonObject>(expectedResourceKey,
                parser.parse(expectedJsonStr).getAsJsonObject());

        WorkUnitState workUnitState = new WorkUnitState();
        workUnitState.setProp(AvroToRestJsonEntryConverter.CONVERTER_AVRO_REST_ENTRY_RESOURCE_KEY,
                "/sobject/user/${name}");
        String template = "name=${name},favoriteNumber=${favorite_number},address.city=${address.city}";
        workUnitState.setProp(AvroToRestJsonEntryConverter.CONVERTER_AVRO_REST_JSON_ENTRY_TEMPLATE, template);

        testConversion(expected, workUnitState);
    }

    public void testEqualConversion() throws DataConversionException, IOException, JSONException {
        JsonParser parser = new JsonParser();
        String expectedResourceKey = "/sobject/user/John";
        String expectedJsonStr = "{ \"name\" : \"John\", \"favorite_number\" : 9, \"favorite_color\" : \"blue\", \"date_of_birth\" : 1462387756716, \"last_modified\" : 0, \"created\" : 1462387756716, \"address\" : {\"city\" : \"Mountain view\", \"street_number\" : 2029 } }";
        RestEntry<JsonObject> expected = new RestEntry<JsonObject>(expectedResourceKey,
                parser.parse(expectedJsonStr).getAsJsonObject());

        WorkUnitState workUnitState = new WorkUnitState();
        workUnitState.setProp(AvroToRestJsonEntryConverter.CONVERTER_AVRO_REST_ENTRY_RESOURCE_KEY,
                "/sobject/user/${name}");

        testConversion(expected, workUnitState);
    }

    private void testConversion(RestEntry<JsonObject> expected, WorkUnitState actualWorkUnitState)
            throws DataConversionException, IOException, JSONException {
        Schema schema = new Schema.Parser().parse(getClass().getResourceAsStream("/converter/nested.avsc"));
        GenericDatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord>(schema);

        File tmp = File.createTempFile(this.getClass().getSimpleName(), null);
        tmp.deleteOnExit();
        try {
            FileUtils.copyInputStreamToFile(getClass().getResourceAsStream("/converter/nested.avro"), tmp);
            DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(tmp, datumReader);
            GenericRecord avroRecord = dataFileReader.next();

            AvroToRestJsonEntryConverter converter = new AvroToRestJsonEntryConverter();
            RestEntry<JsonObject> actual = converter.convertRecord(null, avroRecord, actualWorkUnitState).iterator()
                    .next();

            Assert.assertEquals(actual.getResourcePath(), expected.getResourcePath());
            JSONAssert.assertEquals(expected.getRestEntryVal().toString(), actual.getRestEntryVal().toString(),
                    false);

            converter.close();
            dataFileReader.close();
        } finally {
            if (tmp != null) {
                tmp.delete();
            }
        }
    }
}