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

Java tutorial

Introduction

Here is the source code for com.willetinc.hadoop.mapreduce.dynamodb.DynamoDBOutputFormatTest.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 java.io.IOException;
import java.util.Map;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.RecordWriter;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.easymock.Capture;
import org.junit.Test;

import com.amazonaws.services.dynamodb.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodb.model.AttributeValue;
import com.amazonaws.services.dynamodb.model.PutItemRequest;
import com.amazonaws.services.dynamodb.model.PutItemResult;
import com.willetinc.hadoop.mapreduce.dynamodb.io.DynamoDBItemWritable;
import com.willetinc.hadoop.mapreduce.dynamodb.io.NWritable;

/**
 * 
 */
public class DynamoDBOutputFormatTest {

    private static final String TABLE_NAME = "clickstream-log";
    private static final String ACCESS_KEY = "access_key";
    private static final String SECRET_KEY = "secret_key";

    private static final String HASHKEY_FIELD = "hashkey";
    private static final String HASHKEY_VALUE = "007";
    private static final String RANGEKEY_FIELD = "rangekey";
    private static final String RANGEKEY_VALUE = "005";

    private class MyTable extends DynamoDBItemWritable {
        public MyTable() {
            super(new NWritable(HASHKEY_FIELD) {
            }, new NWritable(RANGEKEY_FIELD) {
            });
        }
    }

    @Test
    public void testDynamoDBRecordWriter()
            throws InstantiationException, IllegalAccessException, IOException, InterruptedException {

        AmazonDynamoDBClient client = createMock(AmazonDynamoDBClient.class);
        TaskAttemptContext context = createMock(TaskAttemptContext.class);
        DynamoDBOutputFormat<MyTable, NullWritable> outputFormat = new DynamoDBOutputFormat<MyTable, NullWritable>();

        RecordWriter<MyTable, NullWritable> writer = outputFormat.getRecordWriter(client, TABLE_NAME);

        Capture<PutItemRequest> putCapture = new Capture<PutItemRequest>();
        expect(client.putItem(capture(putCapture))).andReturn(new PutItemResult());
        client.shutdown();

        AttributeValue hashKey = new AttributeValue().withN(HASHKEY_VALUE);
        AttributeValue rangeKey = new AttributeValue().withN(RANGEKEY_VALUE);

        MyTable record = new MyTable();
        record.setHashKeyValue(hashKey);
        record.setRangeKeyValue(rangeKey);

        replay(client);
        replay(context);

        writer.write(record, NullWritable.get());
        writer.close(context);
        PutItemRequest put = putCapture.getValue();
        Map<String, AttributeValue> item = put.getItem();

        assertEquals(2, item.size());
        assertEquals(hashKey, item.get(HASHKEY_FIELD));
        assertEquals(rangeKey, item.get(RANGEKEY_FIELD));

        verify(client);
        verify(context);
    }

    @Test
    public void testGetRecordWriter() throws IOException, InterruptedException {
        TaskAttemptContext context = createMock(TaskAttemptContext.class);
        Configuration conf = createMock(Configuration.class);
        DynamoDBOutputFormat<MyTable, NullWritable> outputFormat = new DynamoDBOutputFormat<MyTable, NullWritable>();

        expect(context.getConfiguration()).andReturn(conf);
        expect(conf.get(DynamoDBConfiguration.ACCESS_KEY_PROPERTY)).andReturn(ACCESS_KEY);
        expect(conf.get(DynamoDBConfiguration.SECRET_KEY_PROPERTY)).andReturn(SECRET_KEY);
        expect(conf.get(DynamoDBConfiguration.OUTPUT_TABLE_NAME_PROPERTY)).andReturn(TABLE_NAME);
        expect(conf.get(DynamoDBConfiguration.DYNAMODB_ENDPOINT)).andReturn("test");

        replay(context);
        replay(conf);

        DynamoDBOutputFormat<MyTable, NullWritable>.DynamoDBRecordWriter writer = (DynamoDBOutputFormat<MyTable, NullWritable>.DynamoDBRecordWriter) outputFormat
                .getRecordWriter(context);
        assertEquals(TABLE_NAME, writer.getTableName());

        verify(context);
        verify(conf);
    }
}