{-# LANGUAGE OverloadedStrings #-} module Main where import Control.Monad.IO.Class import qualified Data.ByteString.Lazy as BS import qualified Data.Text as T import Test.Hspec import Test.HUnit.Base import System.Nagios.Plugin import System.Nagios.Plugin.Ekg main :: IO () main = hspec suite suite :: Spec suite = describe "checkEkg'" $ do validJson <- runIO $ BS.readFile "tests/data/ekg_sample_output.json" (_, validState) <- runIO . runNagiosPlugin' $ checkEkg' validJson let (validStatus, validOutput) = finishState validState let invalidJson = "{ \"iamnotarealmetric\": \"noreallyimnot\" }" (_, borkedState) <- runIO . runNagiosPlugin' $ checkEkg' invalidJson let (borkedStatus, borkedOutput) = finishState borkedState let emptyString = "" (_, emptyState) <- runIO . runNagiosPlugin' $ checkEkg' emptyString let (emptyStatus, emptyOutput) = finishState emptyState it "exits with OK status given valid input" $ validStatus @?= OK it "outputs the correct perfdata" $ validOutput @?= "OK: perfdata only | iterations=41734c;;;; rts_gc_bytes_allocated=0c;;;; rts_gc_bytes_copied=0c;;;; rts_gc_cpu_ms=0c;;;; rts_gc_cumulative_bytes_used=0c;;;; rts_gc_current_bytes_slop=0.0;;;; rts_gc_current_bytes_used=0.0;;;; rts_gc_gc_cpu_ms=0c;;;; rts_gc_gc_wall_ms=0c;;;; rts_gc_max_bytes_slop=0.0;;;; rts_gc_max_bytes_used=0.0;;;; rts_gc_mutator_cpu_ms=0c;;;; rts_gc_mutator_wall_ms=0c;;;; rts_gc_num_bytes_usage_samples=0c;;;; rts_gc_num_gcs=0c;;;; rts_gc_par_avg_bytes_copied=0.0;;;; rts_gc_par_max_bytes_copied=0.0;;;; rts_gc_par_tot_bytes_copied=0.0;;;; rts_gc_peak_megabytes_allocated=0.0;;;; rts_gc_wall_ms=0c;;;; ekg_server_timestamp_ms=1435212142955c;;;;" it "exits with CRITICAL status given invalid JSON input" $ borkedStatus @?= Critical it "outputs correct failure message on invalid JSON input" $ borkedOutput @?= "CRITICAL: failed to parse EKG output: MetricNode must be an object, not String \"noreallyimnot\"" it "exits with CRITICAL status given empty input" $ emptyStatus @?= Critical it "outputs correct failure message on empty input" $ emptyOutput @?= "CRITICAL: failed to parse EKG output: not enough input"