You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mrunit.apache.org by br...@apache.org on 2012/08/03 18:29:09 UTC

svn commit: r1369090 - in /mrunit/trunk/src: main/java/org/apache/hadoop/mrunit/ main/java/org/apache/hadoop/mrunit/internal/counters/ main/java/org/apache/hadoop/mrunit/mapreduce/ test/java/org/apache/hadoop/mrunit/

Author: brock
Date: Fri Aug  3 16:29:08 2012
New Revision: 1369090

URL: http://svn.apache.org/viewvc?rev=1369090&view=rev
Log:
MRUNIT-64: Multiple Input Key, Value Pairs should be supported (2)

Modified:
    mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriver.java
    mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriverBase.java
    mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapReduceDriver.java
    mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriver.java
    mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriverBase.java
    mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/internal/counters/CounterWrapper.java
    mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapDriver.java
    mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/ReduceDriver.java
    mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapDriver.java
    mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapReduceDriver.java
    mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestReduceDriver.java

Modified: mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriver.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriver.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriver.java (original)
+++ mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriver.java Fri Aug  3 16:29:08 2012
@@ -39,13 +39,11 @@ import org.apache.hadoop.mrunit.types.Pa
 import org.apache.hadoop.util.ReflectionUtils;
 
 /**
- * Harness that allows you to test a Mapper instance. You provide the input key
- * and value that should be sent to the Mapper, and outputs you expect to be
+ * Harness that allows you to test a Mapper instance. You provide the input
+ * (k, v)* pairs that should be sent to the Mapper, and outputs you expect to be
  * sent by the Mapper to the collector for those inputs. By calling runTest(),
  * the harness will deliver the input to the Mapper and will check its outputs
- * against the expected results. This is designed to handle a single (k, v) ->
- * (k, v)* case from the Mapper, representing a single unit test. Multiple input
- * (k, v) pairs should go in separate unit tests.
+ * against the expected results.
  */
 @SuppressWarnings("deprecation")
 public class MapDriver<K1, V1, K2, V2> extends MapDriverBase<K1, V1, K2, V2> {
@@ -115,7 +113,11 @@ public class MapDriver<K1, V1, K2, V2> e
    * Identical to setInputKey() but with fluent programming style
    * 
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v)*. Replaced by {@link #withInput()} and
+   *             {@link #withAll()}
    */
+  @Deprecated
   public MapDriver<K1, V1, K2, V2> withInputKey(final K1 key) {
     setInputKey(key);
     return this;
@@ -126,7 +128,11 @@ public class MapDriver<K1, V1, K2, V2> e
    * 
    * @param val
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v)*. Replaced by {@link #withInput()} and
+   *             {@link #withAll()}
    */
+  @Deprecated
   public MapDriver<K1, V1, K2, V2> withInputValue(final V1 val) {
     setInputValue(val);
     return this;
@@ -154,6 +160,17 @@ public class MapDriver<K1, V1, K2, V2> e
   }
 
   /**
+   * Identical to addAll() but returns self for fluent programming style
+   * 
+   * @param inputRecords
+   * @return this
+   */
+  public MapDriver<K1, V1, K2, V2> withAll(final List<Pair<K1, V1>> inputRecords) {
+    addAll(inputRecords);
+    return this;
+  }
+  
+  /**
    * Works like addOutput(), but returns self for fluent style
    * 
    * @param outputRecord
@@ -175,6 +192,18 @@ public class MapDriver<K1, V1, K2, V2> e
   }
 
   /**
+   * Functions like addAllOutput() but returns self for fluent programming style
+   * 
+   * @param outputRecords
+   * @return this
+   */
+  public MapDriver<K1, V1, K2, V2> withAllOutput(
+      final List<Pair<K2, V2>> outputRecords) {
+    addAllOutput(outputRecords);
+    return this;
+  }
+  
+  /**
    * Identical to setInputFromString, but with a fluent programming style
    * 
    * @param input
@@ -240,9 +269,15 @@ public class MapDriver<K1, V1, K2, V2> e
 
   @Override
   public List<Pair<K2, V2>> run() throws IOException {
-    if (inputKey == null || inputVal == null) {
+    // handle inputKey and inputVal for backwards compatibility
+    if (inputKey != null && inputVal != null) {
+      setInput(inputKey, inputVal);
+    }
+
+    if (inputs == null || inputs.isEmpty()) {
       throw new IllegalStateException("No input was provided");
     }
+
     if (myMapper == null) {
       throw new IllegalStateException("No Mapper class was provided");
     }
@@ -256,7 +291,10 @@ public class MapDriver<K1, V1, K2, V2> e
 
     ReflectionUtils.setConf(myMapper, new JobConf(getConfiguration()));
 
-    myMapper.map(inputKey, inputVal, outputCollectable, reporter);
+    for (Pair<K1, V1> kv : inputs) {
+      myMapper.map(kv.getFirst(), kv.getSecond(), outputCollectable, reporter);
+    }
+
     myMapper.close();
     return outputCollectable.getOutputs();
   }

Modified: mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriverBase.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriverBase.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriverBase.java (original)
+++ mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapDriverBase.java Fri Aug  3 16:29:08 2012
@@ -49,6 +49,9 @@ public abstract class MapDriverBase<K1, 
    * Sets the input key to send to the mapper
    * 
    * @param key
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v)*. Replaced by {@link #setInput()},
+   *             {@link #addInput()}, and {@link #addAll()}
    */
   @Deprecated
   public void setInputKey(final K1 key) {
@@ -63,6 +66,9 @@ public abstract class MapDriverBase<K1, 
    * Sets the input value to send to the mapper
    * 
    * @param val
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v)*. Replaced by {@link #setInput()},
+   *             {@link #addInput()}, and {@link #addAll()}
    */
   @Deprecated
   public void setInputValue(final V1 val) {

Modified: mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapReduceDriver.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapReduceDriver.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapReduceDriver.java (original)
+++ mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/MapReduceDriver.java Fri Aug  3 16:29:08 2012
@@ -216,6 +216,31 @@ public class MapReduceDriver<K1, V1, K2,
   }
 
   /**
+   * Identical to addAll() but returns self for fluent programming style
+   * 
+   * @param inputs
+   *          List of (k, v) pairs to add
+   * @return this
+   */
+  public MapReduceDriver<K1, V1, K2, V2, K3, V3> withAll(
+      final List<Pair<K1, V1>> inputs) {
+    addAll(inputs);
+    return this;
+  }
+  
+  /**
+   * Works like addAllOutput(), but returns self for fluent style
+   * 
+   * @param outputRecords
+   * @return this
+   */
+  public MapReduceDriver<K1, V1, K2, V2, K3, V3> withAllOutput(
+      final List<Pair<K3, V3>> outputRecords) {
+    addAllOutput(outputRecords);
+    return this;
+  }
+  
+  /**
    * Works like addOutput(), but returns self for fluent style
    * 
    * @param outputRecord
@@ -298,27 +323,32 @@ public class MapReduceDriver<K1, V1, K2,
 
       final List<Pair<OUTKEY, OUTVAL>> reduceOutputs = new ArrayList<Pair<OUTKEY, OUTVAL>>();
 
-      for (final Pair<K2, List<V2>> input : inputs) {
-        final K2 inputKey = input.getFirst();
-        final List<V2> inputValues = input.getSecond();
-        final StringBuilder sb = new StringBuilder();
-        formatValueList(inputValues, sb);
-        LOG.debug("Reducing input (" + inputKey.toString() + ", "
-            + sb.toString() + ")");
+      if (!inputs.isEmpty()) {
+        if (LOG.isDebugEnabled()) {
+          final StringBuilder sb = new StringBuilder();
+          for (Pair<K2, List<V2>> input : inputs) {
+            formatValueList(input.getSecond(), sb);
+            LOG.debug("Reducing input (" + input.getFirst() + ", " + sb + ")");
+            sb.delete(0, sb.length());
+          }
+        }
 
         final ReduceDriver<K2, V2, OUTKEY, OUTVAL> reduceDriver = ReduceDriver
             .newReduceDriver(reducer).withCounters(getCounters())
-            .withConfiguration(configuration).withInputKey(inputKey)
-            .withInputValues(inputValues);
+            .withConfiguration(configuration).withAll(inputs);
+
         if (getOutputCopyingOrInputFormatConfiguration() != null) {
           reduceDriver
               .withOutputCopyingOrInputFormatConfiguration(getOutputCopyingOrInputFormatConfiguration());
         }
+
         if (outputFormatClass != null) {
           reduceDriver.withOutputFormat(outputFormatClass, inputFormatClass);
         }
+
         reduceOutputs.addAll(reduceDriver.run());
       }
+
       return reduceOutputs;
     }
   }
@@ -338,13 +368,10 @@ public class MapReduceDriver<K1, V1, K2,
     List<Pair<K2, V2>> mapOutputs = new ArrayList<Pair<K2, V2>>();
 
     // run map component
-    for (final Pair<K1, V1> input : inputList) {
-      LOG.debug("Mapping input " + input.toString() + ")");
-
-      mapOutputs.addAll(MapDriver.newMapDriver(myMapper)
-          .withConfiguration(configuration).withCounters(getCounters())
-          .withInput(input).withMapInputPath(getMapInputPath()).run());
-    }
+    LOG.debug("Starting map phase with mapper: " + myMapper);
+    mapOutputs.addAll(MapDriver.newMapDriver(myMapper)
+        .withCounters(getCounters()).withConfiguration(configuration)
+        .withAll(inputList).withMapInputPath(getMapInputPath()).run());
 
     if (myCombiner != null) {
       // User has specified a combiner. Run this and replace the mapper outputs

Modified: mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriver.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriver.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriver.java (original)
+++ mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriver.java Fri Aug  3 16:29:08 2012
@@ -43,9 +43,7 @@ import org.apache.hadoop.util.Reflection
  * sent to the Reducer (as if they came from a Mapper), and outputs you expect
  * to be sent by the Reducer to the collector. By calling runTest(), the harness
  * will deliver the input to the Reducer and will check its outputs against the
- * expected results. This is designed to handle a single (k, v*) -> (k, v)* case
- * from the Reducer, representing a single unit test. Multiple input (k, v*)
- * sets should go in separate unit tests.
+ * expected results.
  */
 @SuppressWarnings("deprecation")
 public class ReduceDriver<K1, V1, K2, V2> extends
@@ -120,7 +118,11 @@ public class ReduceDriver<K1, V1, K2, V2
    * Identical to setInputKey() but with fluent programming style
    * 
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #withInput(Object, List)},
+   *             {@link #withAll(List)}, and {@link #withInput(Pair)}
    */
+  @Deprecated
   public ReduceDriver<K1, V1, K2, V2> withInputKey(final K1 key) {
     setInputKey(key);
     return this;
@@ -131,7 +133,11 @@ public class ReduceDriver<K1, V1, K2, V2
    * 
    * @param val
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #withInput(Object, List)},
+   *             {@link #withAll(List)}, and {@link #withInput(Pair)}
    */
+  @Deprecated
   public ReduceDriver<K1, V1, K2, V2> withInputValue(final V1 val) {
     addInputValue(val);
     return this;
@@ -142,7 +148,11 @@ public class ReduceDriver<K1, V1, K2, V2
    * 
    * @param values
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #withInput(Object, List)},
+   *             {@link #withAll(List)}, and {@link #withInput(Pair)}
    */
+  @Deprecated
   public ReduceDriver<K1, V1, K2, V2> withInputValues(final List<V1> values) {
     addInputValues(values);
     return this;
@@ -160,6 +170,29 @@ public class ReduceDriver<K1, V1, K2, V2
   }
 
   /**
+   * Identical to addInput() but returns self for fluent programming style
+   * 
+   * @param input
+   * @return this
+   */
+  public ReduceDriver<K1, V1, K2, V2> withInput(final Pair<K1, List<V1>> input) {
+    addInput(input);
+    return this;
+  }
+
+  /**
+   * Identical to addAll() but returns self for fluent programming style
+   * 
+   * @param inputs
+   * @return this
+   */
+  public ReduceDriver<K1, V1, K2, V2> withAll(
+      final List<Pair<K1, List<V1>>> inputs) {
+    addAll(inputs);
+    return this;
+  }
+  
+  /**
    * Works like addOutput(), but returns self for fluent style
    * 
    * @param outputRecord
@@ -185,6 +218,18 @@ public class ReduceDriver<K1, V1, K2, V2
   }
 
   /**
+   * Works like addAllOutput(), but returns self for fluent style
+   * 
+   * @param outputRecord
+   * @return this
+   */
+  public ReduceDriver<K1, V1, K2, V2> withAllOutput(
+      final List<Pair<K2, V2>> outputRecords) {
+    addAllOutput(outputRecords);
+    return this;
+  }
+  
+  /**
    * Identical to setInput, but with a fluent programming style
    * 
    * @param input
@@ -250,9 +295,16 @@ public class ReduceDriver<K1, V1, K2, V2
 
   @Override
   public List<Pair<K2, V2>> run() throws IOException {
-    if (inputKey == null || getInputValues().isEmpty()) {
+    // handle inputKey and inputValues for backwards compatibility
+    if (inputKey != null && !getInputValues().isEmpty()) {
+      clearInput();
+      addInput(inputKey, getInputValues());
+    }
+
+    if (inputs == null || inputs.isEmpty()) {
       throw new IllegalStateException("No input was provided");
     }
+    
     if (myReducer == null) {
       throw new IllegalStateException("No Reducer class was provided");
     }
@@ -266,8 +318,11 @@ public class ReduceDriver<K1, V1, K2, V2
 
     ReflectionUtils.setConf(myReducer, new JobConf(getConfiguration()));
 
-    myReducer.reduce(inputKey, getInputValues().iterator(), outputCollectable,
-        reporter);
+    for (Pair<K1, List<V1>> kv : inputs) {
+      myReducer.reduce(kv.getFirst(), kv.getSecond().iterator(),
+          outputCollectable, reporter);
+    }
+    
     myReducer.close();
     return outputCollectable.getOutputs();
   }

Modified: mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriverBase.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriverBase.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriverBase.java (original)
+++ mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/ReduceDriverBase.java Fri Aug  3 16:29:08 2012
@@ -52,6 +52,8 @@ public abstract class ReduceDriverBase<K
    * Returns a list of values.
    * 
    * @return List of values
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #getInputValues(Object)}
    */
   @Deprecated
   public List<V1> getInputValues() {
@@ -59,8 +61,26 @@ public abstract class ReduceDriverBase<K
   }
 
   /**
+   * Returns a list of values for the given key
+   * 
+   * @param key
+   * @return List for the given key, or null if key does not exist
+   */
+  public List<V1> getInputValues(final K1 key) {
+    for (Pair<K1, List<V1>> p : inputs) {
+      if (p.getFirst().equals(key)) {
+        return p.getSecond();
+      }
+    }
+    return null;
+  }
+  
+  /**
    * Sets the input key to send to the Reducer
    * 
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #setInput()},
+   *             {@link #addInput()}, and {@link #addAll()}
    */
   @Deprecated
   public void setInputKey(final K1 key) {
@@ -71,6 +91,9 @@ public abstract class ReduceDriverBase<K
    * adds an input value to send to the reducer
    * 
    * @param val
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #setInput()},
+   *             {@link #addInput()}, and {@link #addAll()}
    */
   @Deprecated
   public void addInputValue(final V1 val) {
@@ -81,6 +104,9 @@ public abstract class ReduceDriverBase<K
    * Sets the input values to send to the reducer; overwrites existing ones
    * 
    * @param values
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #setInput()},
+   *             {@link #addInput()}, and {@link #addAll()}
    */
   @Deprecated
   public void setInputValues(final List<V1> values) {
@@ -92,6 +118,9 @@ public abstract class ReduceDriverBase<K
    * Adds a set of input values to send to the reducer
    * 
    * @param values
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #setInput()},
+   *             {@link #addInput()}, and {@link #addAll()}
    */
   @Deprecated
   public void addInputValues(final List<V1> values) {

Modified: mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/internal/counters/CounterWrapper.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/internal/counters/CounterWrapper.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/internal/counters/CounterWrapper.java (original)
+++ mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/internal/counters/CounterWrapper.java Fri Aug  3 16:29:08 2012
@@ -91,7 +91,7 @@ public class CounterWrapper {
     }
   }
 
-  public Collection<String> getGroupNames() {
+  public Iterable<String> getGroupNames() {
     if (mapred != null) {
       return mapred.getGroupNames();
     } else {
@@ -104,7 +104,7 @@ public class CounterWrapper {
    */
   public Collection<Pair<String, String>> findCounterValues() {
     final Collection<Pair<String, String>> counters = new LinkedList<Pair<String, String>>();
-    final Collection<String> groupNames = getGroupNames();
+    final Iterable<String> groupNames = getGroupNames();
     if (mapred != null) {
       for (String groupName : groupNames) {
         final Group group = mapred.getGroup(groupName);

Modified: mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapDriver.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapDriver.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapDriver.java (original)
+++ mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/MapDriver.java Fri Aug  3 16:29:08 2012
@@ -117,6 +117,9 @@ extends MapDriverBase<K1, V1, K2, V2> im
    * Identical to setInputKey() but with fluent programming style
    * 
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v)*. Replaced by {@link #withInput()} and
+   *             {@link #withAll()}
    */
   @Deprecated
   public MapDriver<K1, V1, K2, V2> withInputKey(final K1 key) {
@@ -129,6 +132,9 @@ extends MapDriverBase<K1, V1, K2, V2> im
    * 
    * @param val
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v)*. Replaced by {@link #withInput()} and
+   *             {@link #withAll()}
    */
   @Deprecated
   public MapDriver<K1, V1, K2, V2> withInputValue(final V1 val) {
@@ -252,7 +258,7 @@ extends MapDriverBase<K1, V1, K2, V2> im
       setInput(inputKey, inputVal);
     }
 
-    if (inputs == null || inputs.size() == 0) {
+    if (inputs == null || inputs.isEmpty()) {
       throw new IllegalStateException("No input was provided");
     }
    	

Modified: mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/ReduceDriver.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/ReduceDriver.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/ReduceDriver.java (original)
+++ mrunit/trunk/src/main/java/org/apache/hadoop/mrunit/mapreduce/ReduceDriver.java Fri Aug  3 16:29:08 2012
@@ -121,6 +121,9 @@ public class ReduceDriver<K1, V1, K2, V2
    * Identical to setInputKey() but with fluent programming style
    * 
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #withInput(Object, List)},
+   *             {@link #withAll(List)}, and {@link #withInput(Pair)}
    */
   @Deprecated
   public ReduceDriver<K1, V1, K2, V2> withInputKey(final K1 key) {
@@ -133,6 +136,9 @@ public class ReduceDriver<K1, V1, K2, V2
    * 
    * @param val
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #withInput(Object, List)},
+   *             {@link #withAll(List)}, and {@link #withInput(Pair)}
    */
   @Deprecated
   public ReduceDriver<K1, V1, K2, V2> withInputValue(final V1 val) {
@@ -145,6 +151,9 @@ public class ReduceDriver<K1, V1, K2, V2
    * 
    * @param values
    * @return this
+   * @deprecated MRUNIT-64. Moved to list implementation to support multiple
+   *             input (k, v*)*. Replaced by {@link #withInput(Object, List)},
+   *             {@link #withAll(List)}, and {@link #withInput(Pair)}
    */
   @Deprecated
   public ReduceDriver<K1, V1, K2, V2> withInputValues(final List<V1> values) {
@@ -278,7 +287,7 @@ public class ReduceDriver<K1, V1, K2, V2
       addInput(inputKey, getInputValues());
     }
     
-    if (inputs.isEmpty()) {
+    if (inputs == null || inputs.isEmpty()) {
       throw new IllegalStateException("No input was provided");
     }
     

Modified: mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapDriver.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapDriver.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapDriver.java (original)
+++ mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapDriver.java Fri Aug  3 16:29:08 2012
@@ -191,6 +191,19 @@ public class TestMapDriver {
   }
   
   @Test
+  public void testAddAll() throws IOException {
+    final List<Pair<Text, Text>> inputs = new ArrayList<Pair<Text, Text>>();
+    inputs.add(new Pair<Text, Text>(new Text("foo"), new Text("bar")));
+    inputs.add(new Pair<Text, Text>(new Text("foo"), new Text("bar")));
+
+    final List<Pair<Text, Text>> outputs = new ArrayList<Pair<Text, Text>>();
+    outputs.add(new Pair<Text, Text>(new Text("foo"), new Text("bar")));
+    outputs.add(new Pair<Text, Text>(new Text("foo"), new Text("bar")));
+
+    driver.withAll(inputs).withAllOutput(outputs).runTest();
+  }
+  
+  @Test
   public void testUnexpectedOutput() throws IOException {
     thrown
         .expectAssertionErrorMessage("1 Error(s): (Received unexpected output (foo, bar) at position 1.)");

Modified: mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapReduceDriver.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapReduceDriver.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapReduceDriver.java (original)
+++ mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestMapReduceDriver.java Fri Aug  3 16:29:08 2012
@@ -124,6 +124,20 @@ public class TestMapReduceDriver {
   }
 
   @Test
+  public void testAddAll() throws IOException {
+    final List<Pair<Text, LongWritable>> inputs = new ArrayList<Pair<Text, LongWritable>>();
+    inputs.add(new Pair<Text, LongWritable>(new Text("foo"), new LongWritable(FOO_IN_A)));
+    inputs.add(new Pair<Text, LongWritable>(new Text("foo"), new LongWritable(FOO_IN_B)));
+    inputs.add(new Pair<Text, LongWritable>(new Text("bar"), new LongWritable(BAR_IN)));
+
+    final List<Pair<Text, LongWritable>> outputs = new ArrayList<Pair<Text, LongWritable>>();
+    outputs.add(new Pair<Text, LongWritable>(new Text("bar"), new LongWritable(BAR_IN)));
+    outputs.add(new Pair<Text, LongWritable>(new Text("foo"), new LongWritable(FOO_OUT)));
+
+    driver.withAll(inputs).withAllOutput(outputs).runTest();
+  }
+  
+  @Test
   public void testTestRun3OrderInsensitive() throws IOException {
     driver.withInput(new Text("foo"), new LongWritable(FOO_IN_A))
         .withInput(new Text("bar"), new LongWritable(BAR_IN))

Modified: mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestReduceDriver.java
URL: http://svn.apache.org/viewvc/mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestReduceDriver.java?rev=1369090&r1=1369089&r2=1369090&view=diff
==============================================================================
--- mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestReduceDriver.java (original)
+++ mrunit/trunk/src/test/java/org/apache/hadoop/mrunit/TestReduceDriver.java Fri Aug  3 16:29:08 2012
@@ -244,6 +244,22 @@ public class TestReduceDriver {
   }
 
   @Test
+  public void testAddAll() throws IOException {
+    final List<LongWritable> vals = new ArrayList<LongWritable>();
+    vals.add(new LongWritable(IN_A));
+    vals.add(new LongWritable(IN_B));
+
+    final List<Pair<Text, List<LongWritable>>> inputs = new ArrayList<Pair<Text, List<LongWritable>>>();
+    inputs.add(new Pair<Text, List<LongWritable>>(new Text("foo"), vals));
+
+    final List<Pair<Text, LongWritable>> expected = new ArrayList<Pair<Text, LongWritable>>();
+    expected.add(new Pair<Text, LongWritable>(new Text("foo"),
+        new LongWritable(OUT_VAL)));
+
+    driver.withAll(inputs).withAllOutput(expected).runTest();
+  }
+  
+  @Test
   public void testNoInput() throws IOException {
     driver = ReduceDriver.newReduceDriver();
     thrown.expectMessage(IllegalStateException.class, "No input was provided");