package com.ldbc.driver.validation;
import com.google.common.collect.Lists;
import com.ldbc.driver.csv.simple.SimpleCsvFileWriter;
import com.ldbc.driver.util.Tuple;
import com.ldbc.driver.util.Tuple2;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.lang.String.format;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class ResultsLogValidationTest
{
private static final List<Tuple2<String,Long>> DELAYS = Lists.newArrayList(
Tuple.tuple2( "A", 1l ),
Tuple.tuple2( "B", 1l ),
Tuple.tuple2( "B", 1l ),
Tuple.tuple2( "C", 4l ),
Tuple.tuple2( "B", 5l ),
Tuple.tuple2( "C", 6l ),
Tuple.tuple2( "C", 10l ),
Tuple.tuple2( "B", 11l ),
Tuple.tuple2( "D", 1000l ),
Tuple.tuple2( "E", 10000l )
);
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test
public void shouldPassValidationWhenResultsAreGood()
{
long excessiveDelayThresholdAsMilli = 10;
long excessiveDelayCount = 10;
Map<String,Long> excessiveDelayCountPerType = new HashMap<>();
excessiveDelayCountPerType.put( "A", 1l );
excessiveDelayCountPerType.put( "B", 2l );
excessiveDelayCountPerType.put( "C", 3l );
long minDelayAsMilli = 0;
long maxDelayAsMilli = 0;
long meanDelayAsMilli = 0;
Map<String,Long> minDelayAsMilliPerType = new HashMap<>();
Map<String,Long> maxDelayAsMilliPerType = new HashMap<>();
Map<String,Long> meanDelayAsMilliPerType = new HashMap<>();
ResultsLogValidationSummary summary = new ResultsLogValidationSummary(
excessiveDelayThresholdAsMilli,
excessiveDelayCount,
excessiveDelayCountPerType,
minDelayAsMilli,
maxDelayAsMilli,
meanDelayAsMilli,
minDelayAsMilliPerType,
maxDelayAsMilliPerType,
meanDelayAsMilliPerType
);
long toleratedExcessiveDelayCount = excessiveDelayCount;
Map<String,Long> toleratedExcessiveDelayCountPerType = new HashMap<>();
toleratedExcessiveDelayCountPerType.put( "A", excessiveDelayCountPerType.get( "A" ) );
toleratedExcessiveDelayCountPerType.put( "B", excessiveDelayCountPerType.get( "B" ) );
toleratedExcessiveDelayCountPerType.put( "C", excessiveDelayCountPerType.get( "C" ) );
ResultsLogValidator validator = new ResultsLogValidator();
ResultsLogValidationTolerances tolerances = new ResultsLogValidationTolerances(
excessiveDelayThresholdAsMilli,
toleratedExcessiveDelayCount,
toleratedExcessiveDelayCountPerType
);
ResultsLogValidationResult result = validator.validate(
summary,
tolerances
);
assertTrue( result.toString(), result.isSuccessful() );
}
@Test
public void shouldFailValidationWhenExcessiveDelayCountIsExceeded()
{
long excessiveDelayThresholdAsMilli = 10;
long excessiveDelayCount = 10;
Map<String,Long> excessiveDelayCountPerType = new HashMap<>();
excessiveDelayCountPerType.put( "A", 1l );
excessiveDelayCountPerType.put( "B", 2l );
excessiveDelayCountPerType.put( "C", 3l );
long minDelayAsMilli = 0;
long maxDelayAsMilli = 0;
long meanDelayAsMilli = 0;
Map<String,Long> minDelayAsMilliPerType = new HashMap<>();
Map<String,Long> maxDelayAsMilliPerType = new HashMap<>();
Map<String,Long> meanDelayAsMilliPerType = new HashMap<>();
ResultsLogValidationSummary summary = new ResultsLogValidationSummary(
excessiveDelayThresholdAsMilli,
excessiveDelayCount,
excessiveDelayCountPerType,
minDelayAsMilli,
maxDelayAsMilli,
meanDelayAsMilli,
minDelayAsMilliPerType,
maxDelayAsMilliPerType,
meanDelayAsMilliPerType
);
long toleratedExcessiveDelayCount = excessiveDelayCount - 1;
Map<String,Long> toleratedExcessiveDelayCountPerType = new HashMap<>();
toleratedExcessiveDelayCountPerType.put( "A", excessiveDelayCountPerType.get( "A" ) );
toleratedExcessiveDelayCountPerType.put( "B", excessiveDelayCountPerType.get( "B" ) );
toleratedExcessiveDelayCountPerType.put( "C", excessiveDelayCountPerType.get( "C" ) );
ResultsLogValidator validator = new ResultsLogValidator();
ResultsLogValidationTolerances tolerances = new ResultsLogValidationTolerances(
excessiveDelayThresholdAsMilli,
toleratedExcessiveDelayCount,
toleratedExcessiveDelayCountPerType
);
ResultsLogValidationResult result = validator.validate(
summary,
tolerances
);
assertFalse( result.toString(), result.isSuccessful() );
Assert.assertThat( result.toString(), result.errors().size(), equalTo( 1 ) );
Assert.assertThat(
result.toString(),
result.errors().get( 0 ).errorType(),
equalTo( ResultsLogValidationResult.ValidationErrorType.TOO_MANY_LATE_OPERATIONS )
);
}
@Test
public void shouldFailValidationWhenExcessiveDelayCountPerTypeIsExceeded()
{
long excessiveDelayThresholdAsMilli = 10;
long excessiveDelayCount = 10;
Map<String,Long> excessiveDelayCountPerType = new HashMap<>();
excessiveDelayCountPerType.put( "A", 1l );
excessiveDelayCountPerType.put( "B", 2l );
excessiveDelayCountPerType.put( "C", 3l );
long minDelayAsMilli = 0;
long maxDelayAsMilli = 0;
long meanDelayAsMilli = 0;
Map<String,Long> minDelayAsMilliPerType = new HashMap<>();
Map<String,Long> maxDelayAsMilliPerType = new HashMap<>();
Map<String,Long> meanDelayAsMilliPerType = new HashMap<>();
ResultsLogValidationSummary summary = new ResultsLogValidationSummary(
excessiveDelayThresholdAsMilli,
excessiveDelayCount,
excessiveDelayCountPerType,
minDelayAsMilli,
maxDelayAsMilli,
meanDelayAsMilli,
minDelayAsMilliPerType,
maxDelayAsMilliPerType,
meanDelayAsMilliPerType
);
long toleratedExcessiveDelayCount = excessiveDelayCount;
Map<String,Long> toleratedExcessiveDelayCountPerType = new HashMap<>();
toleratedExcessiveDelayCountPerType.put( "A", excessiveDelayCountPerType.get( "A" ) );
toleratedExcessiveDelayCountPerType.put( "B", excessiveDelayCountPerType.get( "B" ) - 1 );
toleratedExcessiveDelayCountPerType.put( "C", excessiveDelayCountPerType.get( "C" ) );
ResultsLogValidator validator = new ResultsLogValidator();
ResultsLogValidationTolerances tolerances = new ResultsLogValidationTolerances(
excessiveDelayThresholdAsMilli,
toleratedExcessiveDelayCount,
toleratedExcessiveDelayCountPerType
);
ResultsLogValidationResult result = validator.validate(
summary,
tolerances
);
assertFalse( result.toString(), result.isSuccessful() );
Assert.assertThat( result.toString(), result.errors().size(), equalTo( 1 ) );
Assert.assertThat(
result.toString(),
result.errors().get( 0 ).errorType(),
equalTo( ResultsLogValidationResult.ValidationErrorType.TOO_MANY_LATE_OPERATIONS_FOR_TYPE )
);
}
@Test
public void shouldReturnExpectedSummaryWhenComputedThenSerializedAndMarshaled() throws IOException
{
// Given
long excessiveDelayThreshold = 5;
ResultsLogValidationSummaryCalculator calculator = new ResultsLogValidationSummaryCalculator(
10000,
excessiveDelayThreshold
);
// When
for ( Tuple2<String,Long> delay : DELAYS )
{
calculator.recordDelay( delay._1(), delay._2() );
}
ResultsLogValidationSummary summary = calculator.snapshot();
String serializedSummary = summary.toJson();
System.out.println( serializedSummary );
ResultsLogValidationSummary summaryAfterMarshal = ResultsLogValidationSummary.fromJson(
serializedSummary
);
// Then
doSummaryAsserts( summary );
doSummaryAsserts( summaryAfterMarshal );
}
@Test
public void shouldReturnExpectedSummaryWhenValidatedFromFile() throws IOException, ValidationException
{
// Given
long excessiveDelayThreshold = 5;
File file = temporaryFolder.newFile();
try ( SimpleCsvFileWriter writer =
new SimpleCsvFileWriter( file, SimpleCsvFileWriter.DEFAULT_COLUMN_SEPARATOR ) )
{
writer.writeRow(
"operation_type",
"scheduled_start_time",
"actual_start_time",
"duration",
"result_code"
);
for ( Tuple2<String,Long> delay : DELAYS )
{
writer.writeRow(
// operation type
delay._1(),
// scheduled start time
Long.toString( 0 ),
// actual start time
Long.toString( delay._2() ),
// duration
Long.toString( 0 ),
// result code
Long.toString( 0 )
);
}
}
// When
ResultsLogValidator validator = new ResultsLogValidator();
ResultsLogValidationSummary summary = validator.compute( file, excessiveDelayThreshold );
String serializedSummary = summary.toJson();
System.out.println( serializedSummary );
ResultsLogValidationSummary summaryAfterMarshal = ResultsLogValidationSummary.fromJson(
serializedSummary
);
// Then
doSummaryAsserts( summary );
doSummaryAsserts( summaryAfterMarshal );
}
private void doSummaryAsserts( ResultsLogValidationSummary summary )
{
assertThat( summary.excessiveDelayThresholdAsMilli(), equalTo( 5l ) );
assertThat( summary.excessiveDelayCount(), equalTo( 5l ) );
assertThat(
format( "Found: %s", summary.excessiveDelayCountPerType().keySet().toString() ),
summary.excessiveDelayCountPerType().size(), equalTo( 5 )
);
assertThat( summary.excessiveDelayCountPerType().get( "A" ), equalTo( 0l ) );
assertThat( summary.excessiveDelayCountPerType().get( "B" ), equalTo( 1l ) );
assertThat( summary.excessiveDelayCountPerType().get( "C" ), equalTo( 2l ) );
assertThat( summary.excessiveDelayCountPerType().get( "D" ), equalTo( 1l ) );
assertThat( summary.excessiveDelayCountPerType().get( "E" ), equalTo( 1l ) );
assertThat( summary.minDelayAsMilli(), equalTo( 1l ) );
assertThat( summary.maxDelayAsMilli(), equalTo( 10000l ) );
assertThat( summary.meanDelayAsMilli(), equalTo( 1104l ) );
assertThat( summary.minDelayAsMilliPerType().size(), equalTo( 5 ) );
assertThat( summary.minDelayAsMilliPerType().get( "A" ), equalTo( 1l ) );
assertThat( summary.minDelayAsMilliPerType().get( "B" ), equalTo( 1l ) );
assertThat( summary.minDelayAsMilliPerType().get( "C" ), equalTo( 4l ) );
assertThat( summary.minDelayAsMilliPerType().get( "D" ), equalTo( 1000l ) );
assertThat( summary.minDelayAsMilliPerType().get( "E" ), equalTo( 10000l ) );
assertThat( summary.maxDelayAsMilliPerType().size(), equalTo( 5 ) );
assertThat( summary.maxDelayAsMilliPerType().get( "A" ), equalTo( 1l ) );
assertThat( summary.maxDelayAsMilliPerType().get( "B" ), equalTo( 11l ) );
assertThat( summary.maxDelayAsMilliPerType().get( "C" ), equalTo( 10l ) );
assertThat( summary.maxDelayAsMilliPerType().get( "D" ), equalTo( 1000l ) );
assertThat( summary.maxDelayAsMilliPerType().get( "E" ), equalTo( 10000l ) );
assertThat( summary.meanDelayAsMilliPerType().size(), equalTo( 5 ) );
assertThat( summary.meanDelayAsMilliPerType().get( "A" ), equalTo( 1l ) );
assertThat( summary.meanDelayAsMilliPerType().get( "B" ), equalTo( 5l ) );
assertThat( summary.meanDelayAsMilliPerType().get( "C" ), equalTo( 7l ) );
assertThat( summary.meanDelayAsMilliPerType().get( "D" ), equalTo( 1000l ) );
assertThat( summary.meanDelayAsMilliPerType().get( "E" ), equalTo( 10000l ) );
}
}