Esempio n. 1
0
 /**
  * @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']);
     }
 }
Esempio n. 2
0
 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;
     }
 }
Esempio n. 3
0
 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;
     }
 }
Esempio n. 4
0
	/**
	 * 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);
	}
Esempio n. 5
0
 /**
  * @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));
 }