/** * @dataProvider providesFilesToCheck * @param array $expectedErrors * @param string $fileToVerify */ public function testMethodsToCheck($expectedErrors, $fileToVerify) { $checker = new CodeChecker(new TestList(new EmptyCheck())); $errors = $checker->analyseFile(\OC::$SERVERROOT . "/tests/data/app/code-checker/{$fileToVerify}"); $this->assertCount(sizeof($expectedErrors), $errors); foreach ($expectedErrors as $int => $expectedError) { $this->assertEquals($expectedError[0], $errors[$int]['disallowedToken']); $this->assertEquals($expectedError[1], $errors[$int]['errorCode']); } }
protected function execute(InputInterface $input, OutputInterface $output) { $appId = $input->getArgument('app-id'); $checkList = new EmptyCheck(); foreach ($input->getOption('checker') as $checker) { if (!isset($this->checkers[$checker])) { throw new \InvalidArgumentException('Invalid checker: ' . $checker); } $checkerClass = $this->checkers[$checker]; $checkList = new $checkerClass($checkList); } $codeChecker = new CodeChecker($checkList); $codeChecker->listen('CodeChecker', 'analyseFileBegin', function ($params) use($output) { if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $output->writeln("<info>Analysing {$params}</info>"); } }); $codeChecker->listen('CodeChecker', 'analyseFileFinished', function ($filename, $errors) use($output) { $count = count($errors); // show filename if the verbosity is low, but there are errors in a file if ($count > 0 && OutputInterface::VERBOSITY_VERBOSE > $output->getVerbosity()) { $output->writeln("<info>Analysing {$filename}</info>"); } // show error count if there are errros present or the verbosity is high if ($count > 0 || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $output->writeln(" {$count} errors"); } usort($errors, function ($a, $b) { return $a['line'] > $b['line']; }); foreach ($errors as $p) { $line = sprintf("%' 4d", $p['line']); $output->writeln(" <error>line {$line}: {$p['disallowedToken']} - {$p['reason']}</error>"); } }); $errors = $codeChecker->analyse($appId); if (empty($errors)) { $output->writeln('<info>App is compliant - awesome job!</info>'); return 0; } else { $output->writeln('<error>App is not compliant</error>'); return 101; } }
protected function execute(InputInterface $input, OutputInterface $output) { $appId = $input->getArgument('app-id'); $checkList = new EmptyCheck(); foreach ($input->getOption('checker') as $checker) { if (!isset($this->checkers[$checker])) { throw new \InvalidArgumentException('Invalid checker: ' . $checker); } $checkerClass = $this->checkers[$checker]; $checkList = new $checkerClass($checkList); } $codeChecker = new CodeChecker($checkList); $codeChecker->listen('CodeChecker', 'analyseFileBegin', function ($params) use($output) { if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $output->writeln("<info>Analysing {$params}</info>"); } }); $codeChecker->listen('CodeChecker', 'analyseFileFinished', function ($filename, $errors) use($output) { $count = count($errors); // show filename if the verbosity is low, but there are errors in a file if ($count > 0 && OutputInterface::VERBOSITY_VERBOSE > $output->getVerbosity()) { $output->writeln("<info>Analysing {$filename}</info>"); } // show error count if there are errors present or the verbosity is high if ($count > 0 || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $output->writeln(" {$count} errors"); } usort($errors, function ($a, $b) { return $a['line'] > $b['line']; }); foreach ($errors as $p) { $line = sprintf("%' 4d", $p['line']); $output->writeln(" <error>line {$line}: {$p['disallowedToken']} - {$p['reason']}</error>"); } }); $errors = $codeChecker->analyse($appId); if (!$input->getOption('skip-validate-info')) { $infoChecker = new InfoChecker($this->infoParser); $infoChecker->listen('InfoChecker', 'mandatoryFieldMissing', function ($key) use($output) { $output->writeln("<error>Mandatory field missing: {$key}</error>"); }); $infoChecker->listen('InfoChecker', 'deprecatedFieldFound', function ($key, $value) use($output) { if ($value === [] || is_null($value) || $value === '') { $output->writeln("<info>Deprecated field available: {$key}</info>"); } else { $output->writeln("<info>Deprecated field available: {$key} => {$value}</info>"); } }); $infoChecker->listen('InfoChecker', 'duplicateRequirement', function ($minMax) use($output) { $output->writeln("<error>Duplicate {$minMax} ownCloud version requirement found</error>"); }); $infoChecker->listen('InfoChecker', 'differentVersions', function ($versionFile, $infoXML) use($output) { $output->writeln("<error>Different versions provided (appinfo/version: {$versionFile} - appinfo/info.xml: {$infoXML})</error>"); }); $infoChecker->listen('InfoChecker', 'sameVersions', function ($path) use($output) { $output->writeln("<info>Version file isn't needed anymore and can be safely removed ({$path})</info>"); }); $infoChecker->listen('InfoChecker', 'migrateVersion', function ($version) use($output) { $output->writeln("<info>Migrate the app version to appinfo/info.xml (add <version>{$version}</version> to appinfo/info.xml and remove appinfo/version)</info>"); }); if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { $infoChecker->listen('InfoChecker', 'mandatoryFieldFound', function ($key, $value) use($output) { $output->writeln("<info>Mandatory field available: {$key} => {$value}</info>"); }); $infoChecker->listen('InfoChecker', 'optionalFieldFound', function ($key, $value) use($output) { $output->writeln("<info>Optional field available: {$key} => {$value}</info>"); }); $infoChecker->listen('InfoChecker', 'unusedFieldFound', function ($key, $value) use($output) { $output->writeln("<info>Unused field available: {$key} => {$value}</info>"); }); } $infoErrors = $infoChecker->analyse($appId); $errors = array_merge($errors, $infoErrors); } if (empty($errors)) { $output->writeln('<info>App is compliant - awesome job!</info>'); return 0; } else { $output->writeln('<error>App is not compliant</error>'); return 101; } }
/** * check the code of an app with some static code checks * @param string $folder the folder of the app to check * @return boolean true for app is o.k. and false for app is not o.k. */ public static function checkCode($folder) { // is the code checker enabled? if(!OC_Config::getValue('appcodechecker', false)) { return true; } $codeChecker = new CodeChecker(new PrivateCheck(new EmptyCheck())); $errors = $codeChecker->analyseFolder($folder); return empty($errors); }
/** * @dataProvider validFilesData * @param string $fileToVerify */ public function testPassValidUsage($fileToVerify) { $checker = new CodeChecker(new DeprecationCheck(new EmptyCheck())); $errors = $checker->analyseFile(\OC::$SERVERROOT . "/tests/data/app/code-checker/{$fileToVerify}"); $this->assertEquals(0, count($errors)); }