Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exclude mutations that are over specified time limit #1171

Merged
merged 23 commits into from Jul 8, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
edcac2e
Filter out mutations are likely to be over our time limit
sanmai Mar 15, 2020
b0f353d
Merge branch 'master' into pr/2020-03/relative-timeout
sanmai Mar 16, 2020
f2b56cb
Optimize JUnit test lookups to stop on the first element
sanmai Mar 16, 2020
5be4620
Merge branch 'master' into pr/2020-03/relative-timeout
sanmai Mar 24, 2020
4ef9754
Merge branch 'pr/2020-03/relative-timeout' of github.com:sanmai/infec…
sanmai Mar 24, 2020
857a25e
Merge branch 'master' into pr/2020-03/relative-timeout
sanmai Mar 24, 2020
08b2f61
Merge branch 'master' into pr/2020-03/relative-timeout
sanmai Mar 25, 2020
81e1a4c
Log constrained
sanmai Mar 25, 2020
4a131a9
Add final report line
sanmai Mar 25, 2020
7870590
Address review comment
sanmai Mar 27, 2020
32433ed
Use S for skipped
sanmai Mar 30, 2020
9eaf9a4
Update MutationTestingRunnerTest
sanmai Mar 30, 2020
7695061
Update MutationTestingRunnerTest
sanmai Mar 30, 2020
15b7d2c
Merge branch 'master' into pr/2020-03/relative-timeout
sanmai Mar 31, 2020
35e012b
s/getTimeToTest/getNominalTestExecutionTime/g
sanmai Mar 30, 2020
9d07a64
Merge branch 'master' into pr/2020-03/relative-timeout
sanmai Jul 5, 2020
226aa54
Fix MutationTestingRunnerTest
sanmai Jul 5, 2020
f99f565
Fix tests
sanmai Jul 6, 2020
9c5b16f
Fix E2E tests
sanmai Jul 6, 2020
9a16224
Fix remaining E2E test
sanmai Jul 6, 2020
ba87ee0
Add OutputFormatterStyleConfiguratorTest
sanmai Jul 6, 2020
d4d5810
Merge branch 'master' into pr/2020-03/relative-timeout
sanmai Jul 7, 2020
cf7bbaf
Update tests/phpunit/Console/OutputFormatterStyleConfiguratorTest.php
sanmai Jul 8, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/Container.php
Expand Up @@ -447,7 +447,8 @@ public static function create(): self
$container->getParallelProcessRunner(),
$container->getEventDispatcher(),
$container->getFileSystem(),
$container->getConfiguration()->noProgress()
$container->getConfiguration()->noProgress(),
$container->getConfiguration()->getProcessTimeout()
);
},
LineRangeCalculator::class => static function (): LineRangeCalculator {
Expand Down
30 changes: 20 additions & 10 deletions src/Mutant/MutantExecutionResult.php
Expand Up @@ -77,17 +77,12 @@ public function __construct(

public static function createFromNonCoveredMutant(Mutant $mutant): self
{
$mutation = $mutant->getMutation();
return self::createFromMutant($mutant, DetectionStatus::NOT_COVERED);
}

return new self(
'',
'',
DetectionStatus::NOT_COVERED,
$mutant->getDiff(),
$mutant->getMutation()->getMutatorName(),
$mutation->getOriginalFilePath(),
$mutation->getOriginalStartingLine()
);
public static function createFromTimeConstrainedMutant(Mutant $mutant): self
{
return self::createFromMutant($mutant, DetectionStatus::TIMED_OUT);
}

public static function createFromProcess(MutantProcess $mutantProcess): self
Expand Down Expand Up @@ -141,4 +136,19 @@ public function getOriginalStartingLine(): int
{
return $this->originalStartingLine;
}

private static function createFromMutant(Mutant $mutant, string $detectionStatus): self
{
$mutation = $mutant->getMutation();

return new self(
'',
'',
$detectionStatus,
$mutant->getDiff(),
$mutant->getMutation()->getMutatorName(),
$mutation->getOriginalFilePath(),
$mutation->getOriginalStartingLine()
);
}
}
14 changes: 14 additions & 0 deletions src/Mutation/Mutation.php
Expand Up @@ -37,6 +37,8 @@

use function array_intersect_key;
use function array_keys;
use function array_map;
use function array_sum;
use function count;
use function implode;
use Infection\AbstractTestFramework\Coverage\TestLocation;
Expand Down Expand Up @@ -164,6 +166,18 @@ public function getAllTests(): array
return $this->tests;
}

/**
* Overall time needed to run known tests for a mutation, excluding dependencies.
*/
public function getTimeToTest(): float
theofidry marked this conversation as resolved.
Show resolved Hide resolved
{
// TODO this needs to be memoized

return array_sum(array_map(static function (TestLocation $data) {
sanmai marked this conversation as resolved.
Show resolved Hide resolved
return $data->getExecutionTime();
}, $this->tests));
}

public function getHash(): string
{
return $this->hash ?? $this->hash = $this->createHash();
Expand Down
4 changes: 2 additions & 2 deletions src/Process/Builder/MutantProcessBuilder.php
Expand Up @@ -53,7 +53,7 @@ class MutantProcessBuilder
public function __construct(TestFrameworkAdapter $testFrameworkAdapter, int $timeout)
{
$this->testFrameworkAdapter = $testFrameworkAdapter;
$this->timeout = $timeout;
$this->timeout = (float) $timeout;
}

public function createProcessForMutant(Mutant $mutant, string $testFrameworkExtraOptions = ''): MutantProcess
Expand All @@ -68,7 +68,7 @@ public function createProcessForMutant(Mutant $mutant, string $testFrameworkExtr
)
);

$process->setTimeout((float) $this->timeout);
$process->setTimeout($this->timeout);

if (method_exists($process, 'inheritEnvironmentVariables')) {
// in version 4.4.0 this method is deprecated and removed in 5.0.0
Expand Down
16 changes: 15 additions & 1 deletion src/Process/Runner/MutationTestingRunner.php
Expand Up @@ -61,21 +61,24 @@ final class MutationTestingRunner
private $eventDispatcher;
private $fileSystem;
private $runConcurrently;
private $timeout;

public function __construct(
MutantProcessBuilder $mutantProcessBuilder,
MutantFactory $mutantFactory,
ParallelProcessRunner $parallelProcessManager,
EventDispatcher $eventDispatcher,
Filesystem $fileSystem,
bool $runConcurrently
bool $runConcurrently,
int $timeout
) {
$this->processBuilder = $mutantProcessBuilder;
$this->mutantFactory = $mutantFactory;
$this->parallelProcessManager = $parallelProcessManager;
$this->eventDispatcher = $eventDispatcher;
$this->fileSystem = $fileSystem;
$this->runConcurrently = $runConcurrently;
$this->timeout = $timeout;
}

/**
Expand All @@ -101,6 +104,17 @@ public function run(iterable $mutations, int $threadCount, string $testFramework

return false;
})
->filter(function (Mutant $mutant) {
theofidry marked this conversation as resolved.
Show resolved Hide resolved
if ($mutant->getMutation()->getTimeToTest() < $this->timeout) {
return true;
}

$this->eventDispatcher->dispatch(new MutantProcessWasFinished(
MutantExecutionResult::createFromTimeConstrainedMutant($mutant)
));

return false;
})
->map(function (Mutant $mutant) use ($testFrameworkExtraOptions): MutantProcess {
$this->fileSystem->dumpFile($mutant->getFilePath(), $mutant->getMutatedCode());

Expand Down