From d2f1ada8fe81714f1db0150faaffae9dcf26ce38 Mon Sep 17 00:00:00 2001 From: Stefan Graupner Date: Fri, 24 Nov 2017 23:03:22 +0100 Subject: [PATCH] refs #31: Validation failure handling --- lib/Spec/Exception/ValidationFailed.php | 16 +++++++ lib/Spec/Jobs/ValidatorRunJob.php | 57 +++++++++++++++---------- 2 files changed, 51 insertions(+), 22 deletions(-) create mode 100644 lib/Spec/Exception/ValidationFailed.php diff --git a/lib/Spec/Exception/ValidationFailed.php b/lib/Spec/Exception/ValidationFailed.php new file mode 100644 index 00000000..14763beb --- /dev/null +++ b/lib/Spec/Exception/ValidationFailed.php @@ -0,0 +1,16 @@ + + */ + +namespace OParl\Spec\Exception; + + +class ValidationFailed extends \RuntimeException +{ + public static function validatorQuitUnexpectedly() + { + return new self("Validator quit unexpectedly."); + } +} \ No newline at end of file diff --git a/lib/Spec/Jobs/ValidatorRunJob.php b/lib/Spec/Jobs/ValidatorRunJob.php index e1e6eac4..b60abf2b 100644 --- a/lib/Spec/Jobs/ValidatorRunJob.php +++ b/lib/Spec/Jobs/ValidatorRunJob.php @@ -10,6 +10,7 @@ use Illuminate\Contracts\Filesystem\Filesystem; use Illuminate\Contracts\Logging\Log; use Illuminate\Mail\Mailer; +use OParl\Spec\Exception\ValidationFailed; use Symfony\Component\Process\Process; class ValidatorRunJob extends Job @@ -47,30 +48,35 @@ public function handle(Log $log, Filesystem $fs, Mailer $mailer) { $log->info("Beginning Validation for {$this->endpoint}"); - $json = $this->runValidator($log, $fs); + try { + $json = $this->runValidator($log, $fs); - $this->saveResult($json); + $this->saveResult($json); - // TODO: l10n/i18n for validation results - Carbon::setLocale('de'); + // TODO: l10n/i18n for validation results + Carbon::setLocale('de'); - $title = sprintf( - 'OParl Validierung am %s für %s', - Carbon::now()->format('d.m.Y'), - $this->endpoint - ); + $title = sprintf( + 'OParl Validierung am %s für %s', + Carbon::now()->format('d.m.Y'), + $this->endpoint + ); - $data = [ - 'endpoint' => $this->endpoint, - 'urlEncodedEndpoint' => urlencode($this->endpoint), - 'result' => $json, - 'validationDate' => Carbon::now()->format('d.m.Y'), - 'title' => $title, - ]; + $data = [ + 'endpoint' => $this->endpoint, + 'urlEncodedEndpoint' => urlencode($this->endpoint), + 'result' => $json, + 'validationDate' => Carbon::now()->format('d.m.Y'), + 'title' => $title, + ]; - $log->info("Finished Validation for {$this->endpoint}"); + $log->info("Finished Validation for {$this->endpoint}"); - $mailer->to($this->email)->send(new ValidationCompleted($data)); + $mailer->to($this->email)->send(new ValidationCompleted($data)); + } catch (ValidationFailed $e) { + // TODO: proper failure handling including an informative mail + $log->error("Failed validation for {$this->endpoint}"); + } } /** @@ -87,7 +93,7 @@ protected function runValidator(Log $log, Filesystem $fs) $fs->makeDirectory('validation'); } - $validationResultFile = storage_path('app/validation/'.uniqid('validation-').'.json'); + $validationResultFile = storage_path('app/validation/'.uniqid('validation-').'.result'); $validatorCmd = sprintf('./validate --porcelain -fjson -o%s "%s"', $validationResultFile, $this->endpoint); $validator = new Process($validatorCmd); @@ -107,10 +113,17 @@ protected function runValidator(Log $log, Filesystem $fs) $log->debug($validatorLogPrefix.$data); }); - $json = (array) json_decode(file_get_contents($validationResultFile), true); - unlink($validationResultFile); + if ($validator->getExitCode() !== 0) { + throw ValidationFailed::validatorQuitUnexpectedly(); + } + + $result = (array) json_decode(file_get_contents($validationResultFile), true); + + if (file_exists($validationResultFile)) { + unlink($validationResultFile); + } - return $json; + return $result; } /**