com.willetinc.hadoop.mapreduce.dynamodb.DynamoDBQueryInputFormatTest.java Source code

Java tutorial

Introduction

Here is the source code for com.willetinc.hadoop.mapreduce.dynamodb.DynamoDBQueryInputFormatTest.java

Source

/**
 * Copyright 2012 Willet 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.willetinc.hadoop.mapreduce.dynamodb;

import static org.easymock.EasyMock.*;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.junit.Test;

import com.amazonaws.services.dynamodb.model.AttributeValue;
import com.amazonaws.services.dynamodb.model.ComparisonOperator;
import com.willetinc.hadoop.mapreduce.dynamodb.DynamoDBConfiguration;
import com.willetinc.hadoop.mapreduce.dynamodb.DynamoDBQueryInputFormat;
import com.willetinc.hadoop.mapreduce.dynamodb.Types;

public class DynamoDBQueryInputFormatTest {

    @Test
    public void testGetHashKeyType() {
        Configuration conf = createMock(Configuration.class);
        expect(conf.getInt(DynamoDBConfiguration.HASH_KEY_TYPE_PROPERTY, Types.STRING.ordinal()))
                .andReturn(Types.NUMBER.ordinal());

        replay(conf);
        Types type = DynamoDBQueryInputFormat.getHashKeyType(conf);
        assertEquals(Types.NUMBER, type);
        verify(conf);
    }

    @Test
    public void testSetHashKeyType() {
        Configuration conf = createMock(Configuration.class);

        conf.setInt(DynamoDBConfiguration.HASH_KEY_TYPE_PROPERTY, Types.NUMBER.ordinal());

        replay(conf);
        DynamoDBQueryInputFormat.setHashKeyType(conf, Types.NUMBER);
        verify(conf);
    }

    @Test
    public void testSetHashKeyValue() {
        Configuration conf = createMock(Configuration.class);
        final String VALUE = "TEST";
        Types type = Types.STRING;
        AttributeValue attr = new AttributeValue().withS(VALUE);

        conf.setInt(DynamoDBConfiguration.HASH_KEY_TYPE_PROPERTY, type.ordinal());
        conf.set(DynamoDBConfiguration.HASH_KEY_VALUE_PROPERTY, VALUE);

        replay(conf);

        DynamoDBQueryInputFormat.setHashKeyValue(conf, type, attr);

        verify(conf);
    }

    @Test
    public void testGetHashKeyValue() {
        Configuration conf = createMock(Configuration.class);
        final String VALUE = "TEST";
        Types type = Types.STRING;

        expect(conf.getInt(DynamoDBConfiguration.HASH_KEY_TYPE_PROPERTY, Types.STRING.ordinal()))
                .andReturn(type.ordinal());
        expect(conf.get(DynamoDBConfiguration.HASH_KEY_VALUE_PROPERTY)).andReturn(VALUE);
        expect(conf.getInt(DynamoDBConfiguration.HASH_KEY_TYPE_PROPERTY, Types.STRING.ordinal()))
                .andReturn(type.ordinal());
        expect(conf.get(DynamoDBConfiguration.HASH_KEY_VALUE_PROPERTY)).andReturn(null);

        replay(conf);

        assertEquals(VALUE, DynamoDBQueryInputFormat.getHashKeyValue(conf).getS());
        assertNull(DynamoDBQueryInputFormat.getHashKeyValue(conf));

        verify(conf);
    }

    @Test
    public void testGetRangeKeyType() {
        Configuration conf = createMock(Configuration.class);
        expect(conf.getInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, Types.STRING.ordinal()))
                .andReturn(Types.NUMBER.ordinal());

        replay(conf);
        Types type = DynamoDBQueryInputFormat.getRangeKeyType(conf);
        assertEquals(Types.NUMBER, type);
        verify(conf);
    }

    @Test
    public void testSetRangeKeyType() {
        Configuration conf = createMock(Configuration.class);

        conf.setInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, Types.NUMBER.ordinal());

        replay(conf);
        DynamoDBQueryInputFormat.setRangeKeyType(conf, Types.NUMBER);
        verify(conf);
    }

    @Test
    public void testGetInterpolateAcrossRangeKeyValues() {
        Configuration conf = createMock(Configuration.class);
        expect(conf.getBoolean(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_PROPERTY, false)).andReturn(true);

        replay(conf);
        boolean result = DynamoDBQueryInputFormat.getInterpolateAcrossRangeKeyValues(conf);
        assertEquals(true, result);
        verify(conf);
    }

    @Test
    public void testSetInterpolateAcrossRangeKeyValues() {
        Configuration conf = createMock(Configuration.class);

        conf.setBoolean(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_PROPERTY, true);

        replay(conf);
        DynamoDBQueryInputFormat.setInterpolateAcrossRangeKeyValues(conf, true);
        verify(conf);
    }

    @Test
    public void testGetRangeKeyOperator() {
        Configuration conf = createMock(Configuration.class);
        expect(conf.getInt(DynamoDBConfiguration.RANGE_KEY_OPERATOR_PROPERTY, ComparisonOperator.EQ.ordinal()))
                .andReturn(ComparisonOperator.BETWEEN.ordinal());

        replay(conf);
        ComparisonOperator operator = DynamoDBQueryInputFormat.getRangeKeyComparisonOperator(conf);
        assertEquals(ComparisonOperator.BETWEEN, operator);
        verify(conf);
    }

    @Test
    public void testSetRangeKeyOperator() {
        Configuration conf = createMock(Configuration.class);

        conf.setInt(DynamoDBConfiguration.RANGE_KEY_OPERATOR_PROPERTY, ComparisonOperator.BETWEEN.ordinal());

        replay(conf);
        DynamoDBQueryInputFormat.setRangeKeyComparisonOperator(conf, ComparisonOperator.BETWEEN);
        verify(conf);
    }

    @Test
    public void testSetRangeKeyValues() {
        Configuration conf = createMock(Configuration.class);
        final String[] VALUES = new String[] { "TEST1", "TEST2" };
        Types type = Types.STRING;

        List<AttributeValue> attrs = new ArrayList<AttributeValue>();
        for (String value : VALUES) {
            attrs.add(new AttributeValue().withS(value));
        }

        conf.setBoolean(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_PROPERTY, false);
        conf.setInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, type.ordinal());
        conf.setStrings(DynamoDBConfiguration.RANGE_KEY_VALUES_PROPERTY, VALUES);

        replay(conf);

        DynamoDBQueryInputFormat.setRangeKeyValues(conf, type, attrs);

        verify(conf);
    }

    @Test
    public void testGetRangeKeyValues() {
        Configuration conf = createMock(Configuration.class);
        final String[] VALUES = new String[] { "TEST1", "TEST2" };
        Types type = Types.STRING;

        List<AttributeValue> attrs = new ArrayList<AttributeValue>();
        for (String value : VALUES) {
            attrs.add(new AttributeValue().withS(value));
        }

        expect(conf.getInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, Types.STRING.ordinal()))
                .andReturn(type.ordinal());
        expect(conf.getStrings(DynamoDBConfiguration.RANGE_KEY_VALUES_PROPERTY)).andReturn(VALUES);

        replay(conf);

        Collection<AttributeValue> results = DynamoDBQueryInputFormat.getRangeKeyValues(conf);
        int i = 0;
        for (AttributeValue result : results) {
            assertEquals(VALUES[i++], result.getS());
        }

        verify(conf);
    }

    @Test
    public void testSetRangeKeyCondition() {
        Configuration conf = createMock(Configuration.class);
        final String[] VALUES = new String[] { "TEST1", "TEST2" };
        Types type = Types.STRING;
        ComparisonOperator operator = ComparisonOperator.BETWEEN;

        List<AttributeValue> attrs = new ArrayList<AttributeValue>();
        for (String value : VALUES) {
            attrs.add(new AttributeValue().withS(value));
        }

        conf.setBoolean(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_PROPERTY, false);
        conf.setInt(DynamoDBConfiguration.RANGE_KEY_OPERATOR_PROPERTY, ComparisonOperator.BETWEEN.ordinal());
        conf.setInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, type.ordinal());
        conf.setStrings(DynamoDBConfiguration.RANGE_KEY_VALUES_PROPERTY, VALUES);

        replay(conf);

        DynamoDBQueryInputFormat.setRangeKeyCondition(conf, type, operator, attrs);

        verify(conf);
    }

    @Test
    public void testInputSplitReadAndWriteHashKey() throws IOException {
        String HASH_KEY_STRING = "TEST";
        String RANGE_KEY_NUMBER = "007";

        // configure input split
        Types hashKeyType = Types.STRING;
        AttributeValue hashKeyValue = new AttributeValue().withS(HASH_KEY_STRING);
        Types rangeKeyType = Types.NUMBER;
        Collection<AttributeValue> rangeKeyValues = new ArrayList<AttributeValue>();
        rangeKeyValues.add(new AttributeValue().withN(RANGE_KEY_NUMBER));
        ComparisonOperator rangeKeyOpperator = ComparisonOperator.EQ;

        DynamoDBQueryInputFormat.DynamoDBQueryInputSplit inputSplit = new DynamoDBQueryInputFormat.DynamoDBQueryInputSplit(
                hashKeyType, hashKeyValue, rangeKeyType, rangeKeyValues, rangeKeyOpperator);

        // write values to byte array
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(bout);
        inputSplit.write(out);

        out.flush();

        // read values back in from byte array
        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
        DataInputStream in = new DataInputStream(bin);
        DynamoDBQueryInputFormat.DynamoDBQueryInputSplit readSplit = new DynamoDBQueryInputFormat.DynamoDBQueryInputSplit();
        readSplit.readFields(in);

        // verify loaded values
        assertEquals(hashKeyType, readSplit.getHashKeyType());
        assertEquals(HASH_KEY_STRING, readSplit.getHashKeyValue().getS());
        assertEquals(rangeKeyType, readSplit.getRangeKeyType());
        assertEquals(rangeKeyOpperator, readSplit.getRangeKeyOperator());
        assertArrayEquals(rangeKeyValues.toArray(), readSplit.getRangeKeyValues().toArray());
        assertTrue(readSplit.hasRangeKey());
    }

    @Test
    public void testGetRangeKeyInterpolateMinValue() {
        Configuration conf = createMock(Configuration.class);
        final String VALUE = "TEST";
        Types type = Types.STRING;

        expect(conf.getInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, Types.STRING.ordinal()))
                .andReturn(type.ordinal());
        expect(conf.get(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_MIN_VALUE_PROPERTY)).andReturn(VALUE);

        replay(conf);

        AttributeValue attr = DynamoDBQueryInputFormat.getRangeKeyInterpolateMinValue(conf);
        assertEquals(VALUE, attr.getS());

        verify(conf);
    }

    @Test
    public void testSetRangeKeyInterpolateMinValue() {
        Configuration conf = createMock(Configuration.class);
        final String VALUE = "TEST";
        Types type = Types.STRING;
        AttributeValue attr = new AttributeValue().withS(VALUE);

        conf.setBoolean(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_PROPERTY, true);
        conf.setInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, type.ordinal());
        conf.set(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_MIN_VALUE_PROPERTY, VALUE);

        replay(conf);

        DynamoDBQueryInputFormat.setRangeKeyInterpolateMinValue(conf, type, attr);

        verify(conf);
    }

    @Test
    public void testGetRangeKeyInterpolateMaxValue() {
        Configuration conf = createMock(Configuration.class);
        final String VALUE = "TEST";
        Types type = Types.STRING;

        expect(conf.getInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, Types.STRING.ordinal()))
                .andReturn(type.ordinal());
        expect(conf.get(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_MAX_VALUE_PROPERTY)).andReturn(VALUE);

        replay(conf);

        AttributeValue attr = DynamoDBQueryInputFormat.getRangeKeyInterpolateMaxValue(conf);
        assertEquals(VALUE, attr.getS());

        verify(conf);
    }

    @Test
    public void testSetRangeKeyInterpolateMaxValue() {
        Configuration conf = createMock(Configuration.class);
        final String VALUE = "TEST";
        Types type = Types.STRING;
        AttributeValue attr = new AttributeValue().withS(VALUE);

        conf.setBoolean(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_PROPERTY, true);
        conf.setInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, type.ordinal());
        conf.set(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_MAX_VALUE_PROPERTY, VALUE);

        replay(conf);

        DynamoDBQueryInputFormat.setRangeKeyInterpolateMaxValue(conf, type, attr);

        verify(conf);
    }

    @Test
    public void testSetRangeKeyInterpolateRange() {
        Configuration conf = createMock(Configuration.class);
        final String MIN_VALUE = "TEST1";
        final String MAX_VALUE = "TEST2";
        Types type = Types.STRING;

        AttributeValue min_attr = new AttributeValue().withS(MIN_VALUE);
        AttributeValue max_attr = new AttributeValue().withS(MAX_VALUE);

        conf.setBoolean(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_PROPERTY, true);
        conf.setInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, type.ordinal());
        conf.set(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_MIN_VALUE_PROPERTY, MIN_VALUE);

        conf.setBoolean(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_PROPERTY, true);
        conf.setInt(DynamoDBConfiguration.RANGE_KEY_TYPE_PROPERTY, type.ordinal());
        conf.set(DynamoDBConfiguration.RANGE_KEY_INTERPOLATE_MAX_VALUE_PROPERTY, MAX_VALUE);

        replay(conf);

        DynamoDBQueryInputFormat.setRangeKeyInterpolateRange(conf, type, min_attr, max_attr);

        verify(conf);

    }

}