public boolean processRow( StepMetaInterface smi, StepDataInterface sdi ) throws KettleException {
    meta = (AggregateRowsMeta) smi;
    data = (AggregateRowsData) sdi;

    Object[] r = getRow(); // get row, set busy!
    if ( r == null ) {
      // no more input to be expected...
      Object[] agg = buildAggregate(); // build a resume
      putRow( data.outputRowMeta, agg );
      setOutputDone();
      return false;
    }

    if ( first ) {
      first = false;

      data.outputRowMeta = getInputRowMeta().clone();
      meta.getFields( data.outputRowMeta, getStepname(), null, null, this, repository, metaStore );

      for ( int i = 0; i < meta.getFieldName().length; i++ ) {
        data.fieldnrs[i] = getInputRowMeta().indexOfValue( meta.getFieldName()[i] );
        if ( data.fieldnrs[i] < 0 ) {
          logError( BaseMessages.getString( PKG, "AggregateRows.Log.CouldNotFindField", meta.getFieldName()[i] ) );
          setErrors( 1 );
          stopAll();
          return false;
        }
        data.counts[i] = 0L;
      }
    }

    AddAggregate( getInputRowMeta(), r );

    if ( checkFeedback( getLinesRead() ) ) {
      if ( log.isBasic() ) {
        logBasic( BaseMessages.getString( PKG, "AggregateRows.Log.LineNumber" ) + getLinesRead() );
      }
    }

    return true;
  }
@Test
  public void testProcessRow() throws KettleException {
    AggregateRows aggregateRows =  new AggregateRows( stepMockHelper.stepMeta, stepMockHelper.stepDataInterface, 0, stepMockHelper.transMeta, stepMockHelper.trans );
    aggregateRows.init( stepMockHelper.initStepMetaInterface, stepMockHelper.initStepDataInterface );
    aggregateRows.setInputRowSets( new ArrayList<RowSet>( Arrays.asList( createSourceRowSet( "TEST" ) ) ) );

    int fieldSize = stepMockHelper.initStepMetaInterface.getFieldName().length;
    AggregateRowsData data = new AggregateRowsData();
    data.fieldnrs = new int[ fieldSize ];
    data.counts = new long[ fieldSize ];
    data.values = new Object[ fieldSize ];

    assertTrue( aggregateRows.processRow( stepMockHelper.initStepMetaInterface,  data ) );
    assertTrue( aggregateRows.getErrors() == 0 );
    assertTrue( aggregateRows.getLinesRead() > 0 );

    RowMetaInterface outputRowMeta = mock( RowMetaInterface.class );
    when( outputRowMeta.size() ).thenReturn( fieldSize );
    data.outputRowMeta = outputRowMeta;

    assertFalse( aggregateRows.processRow( stepMockHelper.initStepMetaInterface,  data ) );
    assertTrue( aggregateRows.getLinesWritten() > 0 );
  }