Page MenuHomePhabricator

D10007.id24055.diff
No OneTemporary

D10007.id24055.diff

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 @@
+<?php
+
+/**
+ * Karma wrapper.
+ */
+final class KarmaTestEngine extends ArcanistUnitTestEngine {
+
+ protected function supportsRunAllTests() {
+ // In fact, this is the only mode that `karma` supports.
+ return true;
+ }
+
+ public function run() {
+ $working_copy = $this->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));
+ }
+
+}

File Metadata

Mime Type
text/plain
Expires
Tue, Mar 18, 9:52 PM (1 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7707085
Default Alt Text
D10007.id24055.diff (3 KB)

Event Timeline