/** * (c) Copyright 2013 WibiData, Inc. * * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * 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 org.kiji.mapreduce.input; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.IOException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.SerializationUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.mapreduce.Job; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.kiji.mapreduce.KijiMRTestLayouts; import org.kiji.mapreduce.MapReduceJobInput; import org.kiji.mapreduce.framework.KijiConfKeys; import org.kiji.schema.EntityId; import org.kiji.schema.HBaseEntityId; import org.kiji.schema.KijiClientTest; import org.kiji.schema.KijiDataRequest; import org.kiji.schema.KijiDataRequestBuilder; import org.kiji.schema.KijiTable; import org.kiji.schema.KijiURI; import org.kiji.schema.filter.KijiRowFilter; import org.kiji.schema.filter.StripValueRowFilter; import org.kiji.schema.util.ResourceUtils; import org.kiji.schema.util.TestingFileUtils; public class TestKijiTableMapReduceJobInput extends KijiClientTest { private File mTempDir; private Path mTempPath; private KijiTable mTable; @Before public void setUp() throws Exception { mTempDir = TestingFileUtils.createTempDir("test", "dir"); mTempPath = new Path("file://" + mTempDir); getConf().set("fs.defaultFS", mTempPath.toString()); getConf().set("fs.default.name", mTempPath.toString()); getKiji().createTable(KijiMRTestLayouts.getTestLayout()); // Set the working directory so that it gets cleaned up after the test: getConf().set("mapred.working.dir", new Path(mTempPath, "workdir").toString()); mTable = getKiji().openTable("test"); } @After public void tearDown() throws Exception { FileUtils.deleteDirectory(mTempDir); ResourceUtils.releaseOrLog(mTable); mTempDir = null; mTempPath = null; mTable = null; } @Test public void testConfigure() throws IOException { final Job job = new Job(); // Request the latest 3 versions of column 'info:email': KijiDataRequestBuilder builder = KijiDataRequest.builder(); builder.newColumnsDef().withMaxVersions(3).add("info", "email"); KijiDataRequest dataRequest = builder.build(); // Read from 'here' to 'there': final EntityId startRow = HBaseEntityId.fromHBaseRowKey(Bytes.toBytes("here")); final EntityId limitRow = HBaseEntityId.fromHBaseRowKey(Bytes.toBytes("there")); final KijiRowFilter filter = new StripValueRowFilter(); final KijiTableMapReduceJobInput.RowOptions rowOptions = KijiTableMapReduceJobInput.RowOptions.create(startRow, limitRow, filter); final MapReduceJobInput kijiTableJobInput = new KijiTableMapReduceJobInput(mTable.getURI(), dataRequest, rowOptions); kijiTableJobInput.configure(job); // Check that the job was configured correctly. final Configuration conf = job.getConfiguration(); assertEquals( mTable.getURI(), KijiURI.newBuilder(conf.get(KijiConfKeys.KIJI_INPUT_TABLE_URI)).build()); final KijiDataRequest decoded = (KijiDataRequest) SerializationUtils.deserialize( Base64.decodeBase64(conf.get(KijiConfKeys.KIJI_INPUT_DATA_REQUEST))); assertEquals(dataRequest, decoded); final String confStartRow = Base64.encodeBase64String(startRow.getHBaseRowKey()); final String confLimitRow = Base64.encodeBase64String(limitRow.getHBaseRowKey()); assertEquals(confStartRow, conf.get(KijiConfKeys.KIJI_START_ROW_KEY)); assertEquals(confLimitRow, conf.get(KijiConfKeys.KIJI_LIMIT_ROW_KEY)); assertEquals(filter.toJson().toString(), conf.get(KijiConfKeys.KIJI_ROW_FILTER)); } }