@Test
  public void testReduceDriverMutable() {
    try {
      {
        TestTaskContext<
                ReduceFunction<Tuple2<StringValue, IntValue>>, Tuple2<StringValue, IntValue>>
            context =
                new TestTaskContext<
                    ReduceFunction<Tuple2<StringValue, IntValue>>, Tuple2<StringValue, IntValue>>(
                    1024 * 1024);
        context.getTaskConfig().setRelativeMemoryDriver(0.5);

        List<Tuple2<StringValue, IntValue>> data = DriverTestData.createReduceMutableData();
        TupleTypeInfo<Tuple2<StringValue, IntValue>> typeInfo =
            (TupleTypeInfo<Tuple2<StringValue, IntValue>>) TypeExtractor.getForObject(data.get(0));
        MutableObjectIterator<Tuple2<StringValue, IntValue>> input =
            new RegularToMutableObjectIterator<Tuple2<StringValue, IntValue>>(
                data.iterator(), typeInfo.createSerializer(new ExecutionConfig()));
        TypeComparator<Tuple2<StringValue, IntValue>> comparator =
            typeInfo.createComparator(
                new int[] {0}, new boolean[] {true}, 0, new ExecutionConfig());

        GatheringCollector<Tuple2<StringValue, IntValue>> result =
            new GatheringCollector<Tuple2<StringValue, IntValue>>(
                typeInfo.createSerializer(new ExecutionConfig()));

        context.setDriverStrategy(DriverStrategy.SORTED_PARTIAL_REDUCE);
        context.setInput1(input, typeInfo.createSerializer(new ExecutionConfig()));
        context.setComparator1(comparator);
        context.setCollector(result);
        context.setUdf(new ConcatSumFirstMutableReducer());

        ReduceCombineDriver<Tuple2<StringValue, IntValue>> driver =
            new ReduceCombineDriver<Tuple2<StringValue, IntValue>>();
        driver.setup(context);
        driver.prepare();
        driver.run();

        Object[] res = result.getList().toArray();
        Object[] expected = DriverTestData.createReduceMutableDataGroupedResult().toArray();

        DriverTestData.compareTupleArrays(expected, res);
      }
      {
        TestTaskContext<
                ReduceFunction<Tuple2<StringValue, IntValue>>, Tuple2<StringValue, IntValue>>
            context =
                new TestTaskContext<
                    ReduceFunction<Tuple2<StringValue, IntValue>>, Tuple2<StringValue, IntValue>>(
                    1024 * 1024);
        context.getTaskConfig().setRelativeMemoryDriver(0.5);

        List<Tuple2<StringValue, IntValue>> data = DriverTestData.createReduceMutableData();
        TupleTypeInfo<Tuple2<StringValue, IntValue>> typeInfo =
            (TupleTypeInfo<Tuple2<StringValue, IntValue>>) TypeExtractor.getForObject(data.get(0));
        MutableObjectIterator<Tuple2<StringValue, IntValue>> input =
            new RegularToMutableObjectIterator<Tuple2<StringValue, IntValue>>(
                data.iterator(), typeInfo.createSerializer(new ExecutionConfig()));
        TypeComparator<Tuple2<StringValue, IntValue>> comparator =
            typeInfo.createComparator(
                new int[] {0}, new boolean[] {true}, 0, new ExecutionConfig());

        GatheringCollector<Tuple2<StringValue, IntValue>> result =
            new GatheringCollector<Tuple2<StringValue, IntValue>>(
                typeInfo.createSerializer(new ExecutionConfig()));

        context.setDriverStrategy(DriverStrategy.SORTED_PARTIAL_REDUCE);
        context.setInput1(input, typeInfo.createSerializer(new ExecutionConfig()));
        context.setComparator1(comparator);
        context.setCollector(result);
        context.setUdf(new ConcatSumSecondMutableReducer());

        ReduceCombineDriver<Tuple2<StringValue, IntValue>> driver =
            new ReduceCombineDriver<Tuple2<StringValue, IntValue>>();
        driver.setup(context);
        driver.prepare();
        driver.run();

        Object[] res = result.getList().toArray();
        Object[] expected = DriverTestData.createReduceMutableDataGroupedResult().toArray();

        DriverTestData.compareTupleArrays(expected, res);
      }
    } catch (Exception e) {
      System.err.println(e.getMessage());
      e.printStackTrace();
      Assert.fail(e.getMessage());
    }
  }