packages feed

cron-0.5.0: bench/Main.hs

{-# LANGUAGE OverloadedStrings #-}
module Main
    ( main
    ) where


-------------------------------------------------------------------------------
import           Criterion
import           Criterion.Main
import           Data.Attoparsec.Text (Parser, parseOnly)
import           Data.Text            (Text)
import qualified Data.Text            as T
import           Data.Time
-------------------------------------------------------------------------------
import           System.Cron
-------------------------------------------------------------------------------


main :: IO ()
main = defaultMain
  [ parserBenchmarks
  , scheduleMatchesBenchmarks
  , nextMatchBenchmarks
  , serializeBenchmarks
  , describeBenchmarks
  ]


-------------------------------------------------------------------------------
parserBenchmarks :: Benchmark
parserBenchmarks = bgroup "parsers"
  [ parserBench "cronSchedule" cronSchedule cronScheduleText
  , parserBench "cronScheduleLoose" cronScheduleLoose cronScheduleText
  , parserBench "crontab" crontab cronTabText
  , bgroup "crontabEntry"
      [ parserBench "schedule" crontabEntry cronScheduleText
      , parserBench "env set" crontabEntry envSetText
      ]
  ]


-------------------------------------------------------------------------------
scheduleMatchesBenchmarks :: Benchmark
scheduleMatchesBenchmarks = bgroup "scheduleMatches"
  [
    bench "match" (whnf (scheduleMatches weekly) matchingTime)
  , bench "no match" (whnf (scheduleMatches weekly) nonMatchingTime)
  ]
  where
    matchingTime = mkTime 2016 2 14 0 0 0
    nonMatchingTime = mkTime 2016 2 15 0 0 0


-------------------------------------------------------------------------------
nextMatchBenchmarks :: Benchmark
nextMatchBenchmarks =
  bench "nextMatch" (whnf (nextMatch weekly) now)
  where
    now = mkTime 2016 2 14 0 0 0

-------------------------------------------------------------------------------
serializeBenchmarks :: Benchmark
serializeBenchmarks = bgroup "serialization"
  [
    bench "cronSchedule" (whnf serializeCronSchedule weekly)
  , bench "crontab" (whnf serializeCrontab exampleCrontab)
  ]


-------------------------------------------------------------------------------
describeBenchmarks :: Benchmark
describeBenchmarks = bgroup "description"
  [
    bgroup "verbose" [
      bench "simple" (whnf (describe verbose) simpleCronSchedule)
    , bench "complicated" (whnf (describe verbose) complexCronSchedule)
    ]
  , bgroup "non-verbose" [
      bench "simple" (whnf (describe notVerbose) simpleCronSchedule)
    , bench "complicated" (whnf (describe notVerbose) complexCronSchedule)
    ]
  ]


-------------------------------------------------------------------------------
parserBench :: String -> Parser a -> Text -> Benchmark
parserBench n parser txt = bench n (whnf (parseOnly parser) txt)


-------------------------------------------------------------------------------
cronScheduleText :: Text
cronScheduleText = "*/2 * 3 * 4,5,6"


-------------------------------------------------------------------------------
envSetText :: Text
envSetText = "FOO=BAR"

-------------------------------------------------------------------------------
cronTabText :: Text
cronTabText = T.unlines (concat (zipWith (\x y -> [x,y]) (replicate 50 cronScheduleText) (repeat envSetText)))


-------------------------------------------------------------------------------
mkCronSchedule :: Text -> CronSchedule
mkCronSchedule t = let (Right cs) = parseCronSchedule t in cs


-------------------------------------------------------------------------------
simpleCronSchedule :: CronSchedule
simpleCronSchedule = mkCronSchedule "1 2 3 * *"


-------------------------------------------------------------------------------
complexCronSchedule :: CronSchedule
complexCronSchedule = mkCronSchedule "1-10 3 1-20/2 * 3,5"


-------------------------------------------------------------------------------
exampleCrontab :: Crontab
exampleCrontab = Crontab (concat (zipWith (\x y -> [x,y]) (replicate 50 cmd) (repeat envSet)))
  where
    cmd = CommandEntry weekly (CronCommand "do something")
    envSet = EnvVariable "FOO" "BAR"


-------------------------------------------------------------------------------
mkTime
    :: Integer
    -> Int
    -> Int
    -> DiffTime
    -> DiffTime
    -> DiffTime
    -> UTCTime
mkTime y m d hr mn s = UTCTime day time
  where day = fromGregorian y m d
        time = s + 60 * mn + 60 * 60 * hr