MAPREDUCE-6054. native-task: Speed up tests. Contributed by Todd Lipcon.

Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/bfd1d75d
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/bfd1d75d
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/bfd1d75d

Branch: refs/heads/trunk
Commit: bfd1d75d875b6ba261fdb1825d0f151b026c2d24
Parents: fad4524
Author: Todd Lipcon <t...@apache.org>
Authored: Wed Aug 27 12:25:07 2014 -0700
Committer: Todd Lipcon <t...@apache.org>
Committed: Wed Aug 27 12:25:49 2014 -0700

----------------------------------------------------------------------
 .../CHANGES.MAPREDUCE-2841.txt                  |  2 +-
 .../mapred/nativetask/util/BytesUtil.java       |  7 +-
 .../hadoop/mapred/nativetask/kvtest/KVJob.java  |  8 +-
 .../hadoop/mapred/nativetask/kvtest/KVTest.java | 94 +++++++++-----------
 .../mapred/nativetask/kvtest/TestInputFile.java | 13 ++-
 .../nativetask/testutil/BytesFactory.java       | 71 +++++++++------
 .../nativetask/testutil/MockValueClass.java     |  8 ++
 .../mapred/nativetask/utils/TestBytesUtil.java  |  7 ++
 8 files changed, 123 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/bfd1d75d/hadoop-mapreduce-project/CHANGES.MAPREDUCE-2841.txt
----------------------------------------------------------------------
diff --git a/hadoop-mapreduce-project/CHANGES.MAPREDUCE-2841.txt 
b/hadoop-mapreduce-project/CHANGES.MAPREDUCE-2841.txt
index 4dc08cb..6384757 100644
--- a/hadoop-mapreduce-project/CHANGES.MAPREDUCE-2841.txt
+++ b/hadoop-mapreduce-project/CHANGES.MAPREDUCE-2841.txt
@@ -16,4 +16,4 @@ MAPREDUCE-6006. native-task: add native tests to maven and 
fix bug in pom.xml (B
 MAPREDUCE-6026. native-task: fix logging (Manu Zhang via todd)
 MAPREDUCE-6035. native-task: sources/test-sources jar distribution (Manu Zhang 
via todd)
 MAPREDUCE-5977. Fix or suppress native-task gcc warnings (Manu Zhang via todd)
-
+MAPREDUCE-6054. native-task: Speed up tests (todd)

http://git-wip-us.apache.org/repos/asf/hadoop/blob/bfd1d75d/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/java/org/apache/hadoop/mapred/nativetask/util/BytesUtil.java
----------------------------------------------------------------------
diff --git 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/java/org/apache/hadoop/mapred/nativetask/util/BytesUtil.java
 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/java/org/apache/hadoop/mapred/nativetask/util/BytesUtil.java
index d90ae8d..e33b23e 100644
--- 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/java/org/apache/hadoop/mapred/nativetask/util/BytesUtil.java
+++ 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/java/org/apache/hadoop/mapred/nativetask/util/BytesUtil.java
@@ -23,6 +23,9 @@ import com.google.common.primitives.Longs;
 
 public class BytesUtil {
 
+  private static final char[] HEX_CHARS =
+      "0123456789abcdef".toCharArray();
+
   /**
    * Converts a big-endian byte array to a long value.
    *
@@ -124,7 +127,9 @@ public class BytesUtil {
         || " `~!@#$%^&*()-_=+[]{}|;:'\",.<>/?".indexOf(ch) >= 0 ) {
         result.append((char)ch);
       } else {
-        result.append(String.format("\\x%02X", ch));
+        result.append("\\x");
+        result.append(HEX_CHARS[(ch >> 4) & 0x0F]);
+        result.append(HEX_CHARS[ch & 0x0F]);
       }
     }
     return result.toString();

http://git-wip-us.apache.org/repos/asf/hadoop/blob/bfd1d75d/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVJob.java
----------------------------------------------------------------------
diff --git 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVJob.java
 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVJob.java
index 6d683f8..3215d0b 100644
--- 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVJob.java
+++ 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVJob.java
@@ -20,7 +20,11 @@ package org.apache.hadoop.mapred.nativetask.kvtest;
 import java.io.IOException;
 import java.util.zip.CRC32;
 
+import com.google.common.base.Stopwatch;
 import com.google.common.primitives.Longs;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
@@ -36,6 +40,7 @@ import 
org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 public class KVJob {
   public static final String INPUTPATH = "nativetask.kvtest.inputfile.path";
   public static final String OUTPUTPATH = "nativetask.kvtest.outputfile.path";
+  private static final Log LOG = LogFactory.getLog(KVJob.class);
   Job job = null;
 
   public static class ValueMapper<KTYPE, VTYPE> extends Mapper<KTYPE, VTYPE, 
KTYPE, VTYPE> {
@@ -82,8 +87,9 @@ public class KVJob {
       final TestInputFile testfile = new 
TestInputFile(Integer.valueOf(conf.get(
           TestConstants.FILESIZE_KEY, "1000")),
           keyclass.getName(), valueclass.getName(), conf);
+      Stopwatch sw = new Stopwatch().start();
       testfile.createSequenceTestFile(inputpath);
-
+      LOG.info("Created test file " + inputpath + " in " + sw.elapsedMillis() 
+ "ms");
     }
     job.setInputFormatClass(SequenceFileInputFormat.class);
     FileInputFormat.addInputPath(job, new Path(inputpath));

http://git-wip-us.apache.org/repos/asf/hadoop/blob/bfd1d75d/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVTest.java
----------------------------------------------------------------------
diff --git 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVTest.java
 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVTest.java
index 7c4f3af..893a422 100644
--- 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVTest.java
+++ 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/KVTest.java
@@ -20,32 +20,29 @@ package org.apache.hadoop.mapred.nativetask.kvtest;
 import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.List;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.mapred.nativetask.testutil.ResultVerifier;
 import org.apache.hadoop.mapred.nativetask.testutil.ScenarioConfiguration;
 import org.apache.hadoop.mapred.nativetask.testutil.TestConstants;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
+import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
+
 @RunWith(Parameterized.class)
 public class KVTest {
   private static final Log LOG = LogFactory.getLog(KVTest.class);
 
-  private static Class<?>[] keyclasses = null;
-  private static Class<?>[] valueclasses = null;
-  private static String[] keyclassNames = null;
-  private static String[] valueclassNames = null;
-
   private static Configuration nativekvtestconf = 
ScenarioConfiguration.getNativeConfiguration();
   private static Configuration hadoopkvtestconf = 
ScenarioConfiguration.getNormalConfiguration();
   static {
@@ -53,50 +50,46 @@ public class KVTest {
     hadoopkvtestconf.addResource(TestConstants.KVTEST_CONF_PATH);
   }
 
-  @Parameters(name = "key:{0}\nvalue:{1}")
-  public static Iterable<Class<?>[]> data() {
-    final String valueclassesStr = nativekvtestconf
-        .get(TestConstants.NATIVETASK_KVTEST_VALUECLASSES);
-    LOG.info(valueclassesStr);
-    valueclassNames = valueclassesStr.replaceAll("\\s", "").split(";");// 
delete
-    // " "
-    final ArrayList<Class<?>> tmpvalueclasses = new ArrayList<Class<?>>();
-    for (int i = 0; i < valueclassNames.length; i++) {
+  private static List<Class<?>> parseClassNames(String spec) {
+    List<Class<?>> ret = Lists.newArrayList();
+      Iterable<String> classNames = Splitter.on(';').trimResults()
+        .omitEmptyStrings().split(spec);
+    for (String className : classNames) {
       try {
-        if (valueclassNames[i].equals("")) {
-          continue;
-        }
-        tmpvalueclasses.add(Class.forName(valueclassNames[i]));
-      } catch (final ClassNotFoundException e) {
-        e.printStackTrace();
+        ret.add(Class.forName(className));
+      } catch (ClassNotFoundException e) {
+        throw new RuntimeException(e);
       }
     }
-    valueclasses = tmpvalueclasses.toArray(new Class[tmpvalueclasses.size()]);
-    final String keyclassesStr = 
nativekvtestconf.get(TestConstants.NATIVETASK_KVTEST_KEYCLASSES);
-    LOG.info(keyclassesStr);
-    keyclassNames = keyclassesStr.replaceAll("\\s", "").split(";");// delete
-    // " "
-    final ArrayList<Class<?>> tmpkeyclasses = new ArrayList<Class<?>>();
-    for (int i = 0; i < keyclassNames.length; i++) {
-      try {
-        if (keyclassNames[i].equals("")) {
-          continue;
-        }
-        tmpkeyclasses.add(Class.forName(keyclassNames[i]));
-      } catch (final ClassNotFoundException e) {
-        e.printStackTrace();
-      }
+    return ret;
+  }
+
+  /**
+   * Parameterize the test with the specified key and value types.
+   */
+  @Parameters(name = "key:{0}\nvalue:{1}")
+  public static Iterable<Class<?>[]> data() throws Exception {
+    // Parse the config.
+    final String valueClassesStr = nativekvtestconf
+        .get(TestConstants.NATIVETASK_KVTEST_VALUECLASSES);
+    LOG.info("Parameterizing with value classes: " + valueClassesStr);
+    List<Class<?>> valueClasses = parseClassNames(valueClassesStr);
+    
+    final String keyClassesStr = nativekvtestconf.get(
+        TestConstants.NATIVETASK_KVTEST_KEYCLASSES);
+    LOG.info("Parameterizing with key classes: " + keyClassesStr);
+    List<Class<?>> keyClasses = parseClassNames(keyClassesStr);
+
+    // Generate an entry for each key type.
+    List<Class<?>[]> pairs = Lists.newArrayList();
+    for (Class<?> keyClass : keyClasses) {
+      pairs.add(new Class<?>[]{ keyClass, LongWritable.class });
     }
-    keyclasses = tmpkeyclasses.toArray(new Class[tmpkeyclasses.size()]);
-    final Class<?>[][] kvgroup = new Class<?>[keyclassNames.length * 
valueclassNames.length][2];
-    for (int i = 0; i < keyclassNames.length; i++) {
-      final int tmpindex = i * valueclassNames.length;
-      for (int j = 0; j < valueclassNames.length; j++) {
-        kvgroup[tmpindex + j][0] = keyclasses[i];
-        kvgroup[tmpindex + j][1] = valueclasses[j];
-      }
+    // ...and for each value type.
+    for (Class<?> valueClass : valueClasses) {
+      pairs.add(new Class<?>[]{ LongWritable.class, valueClass });
     }
-    return Arrays.asList(kvgroup);
+    return pairs;
   }
 
   private final Class<?> keyclass;
@@ -105,12 +98,10 @@ public class KVTest {
   public KVTest(Class<?> keyclass, Class<?> valueclass) {
     this.keyclass = keyclass;
     this.valueclass = valueclass;
-
   }
 
   @Test
   public void testKVCompability() {
-
     try {
       final String nativeoutput = this.runNativeTest(
           "Test:" + keyclass.getSimpleName() + "--" + 
valueclass.getSimpleName(), keyclass, valueclass);
@@ -135,11 +126,6 @@ public class KVTest {
     }
   }
 
-  @Before
-  public void startUp() {
-
-  }
-
   private String runNativeTest(String jobname, Class<?> keyclass, Class<?> 
valueclass) throws IOException {
     final String inputpath = 
nativekvtestconf.get(TestConstants.NATIVETASK_KVTEST_INPUTDIR) + "/"
         + keyclass.getName()

http://git-wip-us.apache.org/repos/asf/hadoop/blob/bfd1d75d/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/TestInputFile.java
----------------------------------------------------------------------
diff --git 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/TestInputFile.java
 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/TestInputFile.java
index 80e1055..4c77f4c 100644
--- 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/TestInputFile.java
+++ 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/kvtest/TestInputFile.java
@@ -36,6 +36,7 @@ import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.io.SequenceFile;
 import org.apache.hadoop.io.VIntWritable;
 import org.apache.hadoop.io.VLongWritable;
+import org.apache.hadoop.io.Writable;
 import org.apache.hadoop.mapred.nativetask.testutil.BytesFactory;
 import org.apache.hadoop.mapred.nativetask.testutil.ScenarioConfiguration;
 import org.apache.hadoop.mapred.nativetask.testutil.TestConstants;
@@ -123,7 +124,7 @@ public class TestInputFile {
   }
   
   public void createSequenceTestFile(String filepath, int base,  byte start) 
throws Exception {
-    LOG.info("create file " + filepath);
+    LOG.info("creating file " + filepath + "(" + filesize + " bytes)");
     LOG.info(keyClsName + " " + valueClsName);
     Class<?> tmpkeycls, tmpvaluecls;
     try {
@@ -178,6 +179,9 @@ public class TestInputFile {
     int valuebytesnum = 0;
     int offset = 0;
 
+    Writable keyWritable = BytesFactory.newObject(null, keyClsName);
+    Writable valWritable = BytesFactory.newObject(null, valueClsName);
+
     while (offset < buflen) {
       final int remains = buflen - offset;
       keybytesnum = keyMaxBytesNum;
@@ -202,9 +206,12 @@ public class TestInputFile {
 
       System.arraycopy(databuf, offset, value, 0, valuebytesnum);
       offset += valuebytesnum;
-      
+
+      BytesFactory.updateObject(keyWritable, key);
+      BytesFactory.updateObject(valWritable, value);
+     
       try {
-        writer.append(BytesFactory.newObject(key, this.keyClsName), 
BytesFactory.newObject(value, this.valueClsName));
+        writer.append(keyWritable, valWritable);
       } catch (final IOException e) {
         e.printStackTrace();
         throw new Exception("sequence file create failed", e);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/bfd1d75d/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/BytesFactory.java
----------------------------------------------------------------------
diff --git 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/BytesFactory.java
 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/BytesFactory.java
index 5185371..bee2f0c 100644
--- 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/BytesFactory.java
+++ 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/BytesFactory.java
@@ -19,8 +19,10 @@ package org.apache.hadoop.mapred.nativetask.testutil;
 
 import java.util.Random;
 
+import com.google.common.base.Preconditions;
 import com.google.common.primitives.Ints;
 import com.google.common.primitives.Longs;
+
 import org.apache.hadoop.io.BooleanWritable;
 import org.apache.hadoop.io.ByteWritable;
 import org.apache.hadoop.io.BytesWritable;
@@ -32,43 +34,58 @@ import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.UTF8;
 import org.apache.hadoop.io.VIntWritable;
 import org.apache.hadoop.io.VLongWritable;
+import org.apache.hadoop.io.Writable;
 import org.apache.hadoop.mapred.nativetask.util.BytesUtil;
 
 
 public class BytesFactory {
   public static Random r = new Random();
 
-  public static Object newObject(byte[] seed, String className) {
-    r.setSeed(seed.hashCode());
-    if (className.equals(IntWritable.class.getName())) {
-      return new IntWritable(Ints.fromByteArray(seed));
-    } else if (className.equals(FloatWritable.class.getName())) {
-      return new FloatWritable(r.nextFloat());
-    } else if (className.equals(DoubleWritable.class.getName())) {
-      return new DoubleWritable(r.nextDouble());
-    } else if (className.equals(LongWritable.class.getName())) {
-      return new LongWritable(Longs.fromByteArray(seed));
-    } else if (className.equals(VIntWritable.class.getName())) {
-      return new VIntWritable(Ints.fromByteArray(seed));
-    } else if (className.equals(VLongWritable.class.getName())) {
-      return new VLongWritable(Longs.fromByteArray(seed));
-    } else if (className.equals(BooleanWritable.class.getName())) {
-      return new BooleanWritable(seed[0] % 2 == 1 ? true : false);
-    } else if (className.equals(Text.class.getName())) {
-      return new Text(BytesUtil.toStringBinary(seed));
-    } else if (className.equals(ByteWritable.class.getName())) {
-      return new ByteWritable(seed.length > 0 ? seed[0] : 0);
-    } else if (className.equals(BytesWritable.class.getName())) {
-      return new BytesWritable(seed);
-    } else if (className.equals(UTF8.class.getName())) {
-      return new UTF8(BytesUtil.toStringBinary(seed));
-    } else if (className.equals(MockValueClass.class.getName())) {
-      return new MockValueClass(seed);
+  public static void updateObject(Writable obj, byte[] seed) {
+    if (obj instanceof IntWritable) {
+      ((IntWritable)obj).set(Ints.fromByteArray(seed));
+    } else if (obj instanceof FloatWritable) {
+      ((FloatWritable)obj).set(r.nextFloat());
+    } else if (obj instanceof DoubleWritable) {
+      ((DoubleWritable)obj).set(r.nextDouble());
+    } else if (obj instanceof LongWritable) {
+      ((LongWritable)obj).set(Longs.fromByteArray(seed));
+    } else if (obj instanceof VIntWritable) {
+      ((VIntWritable)obj).set(Ints.fromByteArray(seed));
+    } else if (obj instanceof VLongWritable) {
+      ((VLongWritable)obj).set(Longs.fromByteArray(seed));
+    } else if (obj instanceof BooleanWritable) {
+      ((BooleanWritable)obj).set(seed[0] % 2 == 1 ? true : false);
+    } else if (obj instanceof Text) {
+      ((Text)obj).set(BytesUtil.toStringBinary(seed));
+    } else if (obj instanceof ByteWritable) {
+      ((ByteWritable)obj).set(seed.length > 0 ? seed[0] : 0);
+    } else if (obj instanceof BytesWritable) {
+      ((BytesWritable)obj).set(seed, 0, seed.length);
+    } else if (obj instanceof UTF8) {
+      ((UTF8)obj).set(BytesUtil.toStringBinary(seed));
+    } else if (obj instanceof MockValueClass) {
+      ((MockValueClass)obj).set(seed);
     } else {
-      return null;
+      throw new IllegalArgumentException("unknown writable: " +
+                                         obj.getClass().getName());
     }
   }
 
+  public static Writable newObject(byte[] seed, String className) {
+    Writable ret;
+    try {
+      Class<?> clazz = Class.forName(className);
+      Preconditions.checkArgument(Writable.class.isAssignableFrom(clazz));
+      ret = (Writable)clazz.newInstance();
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+    if (seed != null) {
+      updateObject(ret, seed);
+    }
+    return ret;
+  }
 
   public static <VTYPE> byte[] fromBytes(byte[] bytes) throws Exception {
     throw new Exception("Not supported");

http://git-wip-us.apache.org/repos/asf/hadoop/blob/bfd1d75d/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/MockValueClass.java
----------------------------------------------------------------------
diff --git 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/MockValueClass.java
 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/MockValueClass.java
index b27f00f..a476a2d 100644
--- 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/MockValueClass.java
+++ 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/testutil/MockValueClass.java
@@ -51,6 +51,14 @@ public class MockValueClass implements Writable {
     txt = new Text(BytesUtil.toStringBinary(array));
   }
 
+  public void set(byte[] seed) {
+    a = seed.length;
+    array = new byte[seed.length];
+    System.arraycopy(seed, 0, array, 0, seed.length);
+    longWritable.set(a);
+    txt.set(BytesUtil.toStringBinary(array));
+  }
+
   @Override
   public void write(DataOutput out) throws IOException {
     out.writeInt(a);

http://git-wip-us.apache.org/repos/asf/hadoop/blob/bfd1d75d/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/utils/TestBytesUtil.java
----------------------------------------------------------------------
diff --git 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/utils/TestBytesUtil.java
 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/utils/TestBytesUtil.java
index 57b77cd..c09f08c 100644
--- 
a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/utils/TestBytesUtil.java
+++ 
b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/test/java/org/apache/hadoop/mapred/nativetask/utils/TestBytesUtil.java
@@ -53,4 +53,11 @@ public class TestBytesUtil extends TestCase {
 
     Assert.assertEquals(d, BytesUtil.toDouble(doubleBytes));
   }
+  
+  public void testToStringBinary() {
+    Assert.assertEquals("\\x01\\x02ABC",
+        BytesUtil.toStringBinary(new byte[] { 1, 2, 65, 66, 67 }));
+    Assert.assertEquals("\\x10\\x11",
+        BytesUtil.toStringBinary(new byte[] { 16, 17 }));
+  }
 }

Reply via email to