diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -199,6 +199,7 @@ 'ComprehensiveLintEngine' => 'lint/engine/ComprehensiveLintEngine.php', 'GoTestResultParser' => 'unit/engine/GoTestResultParser.php', 'GoTestResultParserTestCase' => 'unit/engine/__tests__/GoTestResultParserTestCase.php', + 'KarmaTestEngine' => 'unit/engine/KarmaTestEngine.php', 'NoseTestEngine' => 'unit/engine/NoseTestEngine.php', 'PHPUnitTestEngineTestCase' => 'unit/engine/__tests__/PHPUnitTestEngineTestCase.php', 'PhpunitResultParser' => 'unit/engine/PhpunitResultParser.php', @@ -367,6 +368,7 @@ 'ComprehensiveLintEngine' => 'ArcanistLintEngine', 'GoTestResultParser' => 'ArcanistTestResultParser', 'GoTestResultParserTestCase' => 'ArcanistTestCase', + 'KarmaTestEngine' => 'ArcanistUnitTestEngine', 'NoseTestEngine' => 'ArcanistUnitTestEngine', 'PHPUnitTestEngineTestCase' => 'ArcanistTestCase', 'PhpunitResultParser' => 'ArcanistTestResultParser', diff --git a/src/unit/engine/KarmaTestEngine.php b/src/unit/engine/KarmaTestEngine.php new file mode 100644 --- /dev/null +++ b/src/unit/engine/KarmaTestEngine.php @@ -0,0 +1,70 @@ +getWorkingCopy(); + $project_root = $working_copy->getProjectRoot(); + $config_manager = $this->getConfigurationManager(); + + $config = $config_manager->getConfigFromAnySource('unit.karma.config'); + $junit = $config_manager->getConfigFromAnySource('unit.karma.junit'); + $coverage = $config_manager->getConfigFromAnySource('unit.karma.coverage'); + + if (!$config) { + throw new ArcanistUsageException( + 'No configuration is configured. Set `unit.karma.config` '. + 'in your `.arcconfig` file.'); + } + + if (!$junit) { + throw new ArcanistUsageException( + 'No JUnit output file is configured. Set `unit.karma.junit` '. + 'in your `.arcconfig` file.'); + } + + if ($this->getEnableCoverage() && !$coverage) { + throw new ArcanistUsageException( + 'No coverage output file is configured. Set `unit.karma.coverage` '. + 'in your `.arcconfig` file.'); + } + + $future = $this->buildTestFuture($config); + $future->resolvex(); + + return $this->parseTestResults($junit, $coverage); + } + + private function buildTestFuture($config) { + $flags = array( + '--log-level=info', + '--no-colors', + ); + + $reporters = array(); + $reporters[] = 'junit'; + + if ($this->getEnableCoverage()) { + $reporters[] = 'coverage'; + } + $flags[] = '--reporters='.implode(',', $reporters); + + $future = id(new ExecFuture('karma start %Ls %s', $flags, $config)) + ->setCWD($this->getWorkingCopy()->getProjectRoot()); + return $future; + } + + private function parseTestResults($junit) { + $parser = new ArcanistXUnitTestResultParser(); + return $parser->parseTestResults(Filesystem::readFile($junit)); + } + +}