ekg-rrd 0.2.1.65 → 0.2.1.69
raw patch · 2 files changed
+263/−2 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- ekg-rrd.cabal +3/−2
- test/Tests/System/Metrics/RRDTool/Tests.hs +260/−0
ekg-rrd.cabal view
@@ -1,5 +1,5 @@ name: ekg-rrd-version: 0.2.1.65+version: 0.2.1.69 synopsis: Passes ekg statistics to rrdtool description: Simple API for passing ekg monitoring statistics to a round-robin database (RRD) using rrdtool. homepage: https://bitbucket.org/davecturner/ekg-rrd@@ -30,6 +30,7 @@ test-suite test type: exitcode-stdio-1.0 main-is: Main.hs+ other-modules: Tests.System.Metrics.RRDTool.Tests hs-source-dirs: test default-language: Haskell2010 build-depends: base@@ -52,5 +53,5 @@ source-repository this type: hg location: https://bitbucket.org/davecturner/ekg-rrd- tag: f75f521cc764bc2079f5c67a112345bf7a8a2b0d+ tag: 5ef08e3f15641c976ffc5386790e4bafb4b71cd3
+ test/Tests/System/Metrics/RRDTool/Tests.hs view
@@ -0,0 +1,260 @@+{-# LANGUAGE OverloadedStrings #-}++module Tests.System.Metrics.RRDTool.Tests (tests) where++import Test.Framework as TF+import Test.HUnit+import Test.Framework.Providers.HUnit++import System.Metrics+import System.Metrics.RRDTool.Internals+import Data.Time+import qualified Data.Text as T+import qualified Data.HashMap.Strict as HM++tests :: TF.Test+tests = testGroup "System.Metrics.RRDTool"+ [ defineDataSourceTests+ , showMaybeValueTests+ , updateRRDArgsTests+ , gcSourcesTests+ , defineRoundRobinArchiveTests+ , createRRDArgsTests+ ]++defineDataSourceTests :: TF.Test+defineDataSourceTests = testGroup "defineDataSource"+ [ testCase "derive" $ "DS:data_source_name:DERIVE:900:U:U"+ @=? defineDataSource (testDataSource { dsType = DsDerive, dsHeartBeat = 900 })+ , testCase "gauge" $ "DS:data_source_name:GAUGE:900:U:U"+ @=? defineDataSource (testDataSource { dsType = DsGauge, dsHeartBeat = 900 })+ , testCase "min 0" $ "DS:data_source_name:DERIVE:900:0:U"+ @=? defineDataSource (testDataSource { dsType = DsDerive, dsHeartBeat = 900, dsMin = Just 0 })+ , testCase "min 10" $ "DS:data_source_name:DERIVE:900:10:U"+ @=? defineDataSource (testDataSource { dsType = DsDerive, dsHeartBeat = 900, dsMin = Just 10 })+ , testCase "min (-1)" $ "DS:data_source_name:DERIVE:900:18446744073709551615:U"+ @=? defineDataSource (testDataSource { dsType = DsDerive, dsHeartBeat = 900, dsMin = Just (-1) })+ , testCase "max 10" $ "DS:data_source_name:DERIVE:900:U:10"+ @=? defineDataSource (testDataSource { dsType = DsDerive, dsHeartBeat = 900, dsMax = Just 10 })+ , testCase "max maxBound" $ "DS:data_source_name:DERIVE:900:U:18446744073709551615"+ @=? defineDataSource (testDataSource { dsType = DsDerive, dsHeartBeat = 900, dsMax = Just (-1) })+ , testCase "name" $ "DS:other_data_source_name:DERIVE:900:U:U"+ @=? defineDataSource (testDataSource { dsType = DsDerive, dsHeartBeat = 900, dsName = "other_data_source_name" })+ ]+ where+ testDataSource = undefinedDataSource+ { dsName = "data_source_name"+ , dsMin = Nothing+ , dsMax = Nothing+ }++undefinedDataSource :: DataSource+undefinedDataSource = DataSource+ { dsName = error "dsName undefined"+ , dsMetric = error "dsMetric undefined"+ , dsType = error "dsType undefined"+ , dsHeartBeat = error "dsHeartBeat undefined"+ , dsMin = error "dsMin undefined"+ , dsMax = error "dsMax undefined"+ }++showMaybeValueTests :: TF.Test+showMaybeValueTests = testGroup "showMaybeValue"+ [ testCase "U" $ "U" @=? showMaybeValue Nothing+ , testCase "0" $ "0" @=? showMaybeValue (Just 0)+ , testCase "10" $ "10" @=? showMaybeValue (Just 10)+ , testCase "maxBound" $ "9223372036854775807" @=? showMaybeValue (Just maxBound)+ , testCase "maxBound+1" $ "9223372036854775808" @=? showMaybeValue (Just $ maxBound + 1)+ , testCase "-1" $ "18446744073709551615" @=? showMaybeValue (Just (-1))+ ]++updateRRDArgsTests :: TF.Test+updateRRDArgsTests = testGroup "updateRRDArgs"+ [ testCase "No update" $ updateRRDArgs rrd HM.empty (testTime 0)+ @?= Nothing+ , testCase "Unknown DS" $ updateRRDArgs rrd+ (HM.singleton "data-source-4" $ Counter 0) (testTime 0)+ @?= Nothing++ , testCase "Counter update" $ updateRRDArgs rrd+ (HM.singleton "data-source-1" $ Counter 0) (testTime 0)+ @?= Just ["update","test.rrd","-t","data-source-1","1413331200:0"]+ , testCase "Gauge update" $ updateRRDArgs rrd+ (HM.singleton "data-source-1" $ Gauge 0) (testTime 0)+ @?= Just ["update","test.rrd","-t","data-source-1","1413331200:0"]++ , testCase "Multiple updates" $ updateRRDArgs rrd+ (HM.fromList [("data-source-1",Counter 0),("data-source-2",Gauge 1)])+ (testTime 0)+ @?= Just ["update","test.rrd","-t","data-source-1:data-source-2"+ ,"1413331200:0:1"]++ , testCase "maxbound" $ updateRRDArgs rrd+ (HM.singleton "data-source-1" $ Gauge maxBound) (testTime 0)+ @?= Just ["update","test.rrd","-t","data-source-1","1413331200:9223372036854775807"]+ , testCase "minbound" $ updateRRDArgs rrd+ (HM.singleton "data-source-1" $ Gauge minBound) (testTime 0)+ @?= Just ["update","test.rrd","-t","data-source-1","1413331200:9223372036854775808"]+ , testCase "value of -1" $ updateRRDArgs rrd+ (HM.singleton "data-source-1" $ Gauge (-1)) (testTime 0)+ @?= Just ["update","test.rrd","-t","data-source-1","1413331200:18446744073709551615"]++ , testCase "Label update is undefined" $ updateRRDArgs rrd+ (HM.singleton "data-source-1" $ System.Metrics.Label "label") (testTime 0)+ @?= Just ["update","test.rrd","-t","data-source-1","1413331200:U"]+ ]+ where+ rrd = RoundRobinDatabase+ { rrdToolPath = error "rrdToolPath undefined"+ , rrdFilePath = "test.rrd"+ , rrdArchives = error "rrdArchives undefined"+ , rrdSources = HM.fromList+ [("data-source-1", undefinedDataSource {dsName="data-source-1"})+ ,("data-source-2", undefinedDataSource {dsName="data-source-2"})+ ,("data-source-3", undefinedDataSource {dsName="data-source-3"})+ ]+ , rrdStore = error "rrdStore undefined"+ , rrdStep = error "rrdStep undefined"+ }++testTime :: NominalDiffTime -> UTCTime+testTime = flip addUTCTime $ UTCTime (fromGregorian 2014 10 15) 0++gcSourcesTests :: TF.Test+gcSourcesTests = testGroup "gcSource"+ [ testCase "source names" $ HM.fromList+ (map (\ds -> (dsMetric ds, ())) (gcSources $ error "undefined heartbeat"))+ @?= HM.fromList (map (\ds -> (T.pack ds, ())) $ words $+ "rts.gc.num_gcs rts.gc.mutator_wall_ms rts.gc.gc_cpu_ms "+ ++ "rts.gc.bytes_allocated rts.gc.num_bytes_usage_samples "+ ++ "rts.gc.current_bytes_slop rts.gc.max_bytes_slop "+ ++ "rts.gc.cumulative_bytes_used rts.gc.gc_wall_ms "+ ++ "rts.gc.mutator_cpu_ms rts.gc.peak_megabytes_allocated "+ ++ "rts.gc.max_bytes_used rts.gc.bytes_copied rts.gc.wall_ms "+ ++ "rts.gc.current_bytes_used rts.gc.cpu_ms")++ , testCounter "rts.gc.num_gcs" "num_gcs"+ , testCounter "rts.gc.bytes_allocated" "bytes_allocated"+ , testCounter "rts.gc.num_gcs" "num_gcs"+ , testCounter "rts.gc.num_bytes_usage_samples" "num_bytes_usage_sam"+ , testCounter "rts.gc.cumulative_bytes_used" "cumulative_bytes_us"+ , testCounter "rts.gc.bytes_copied" "bytes_copied"+ , testCounter "rts.gc.mutator_cpu_ms" "mutator_cpu_ms"+ , testCounter "rts.gc.mutator_wall_ms" "mutator_wall_ms"+ , testCounter "rts.gc.gc_cpu_ms" "gc_cpu_ms"+ , testCounter "rts.gc.gc_wall_ms" "gc_wall_ms"+ , testCounter "rts.gc.cpu_ms" "cpu_ms"+ , testCounter "rts.gc.wall_ms" "wall_ms"++ , testGauge "rts.gc.max_bytes_used" "max_bytes_used"+ , testGauge "rts.gc.current_bytes_used" "current_bytes_used"+ , testGauge "rts.gc.current_bytes_slop" "current_bytes_slop"+ , testGauge "rts.gc.max_bytes_slop" "max_bytes_slop"+ , testGauge "rts.gc.peak_megabytes_allocated" "peak_megabytes_allo"+ ]++ where++ gcSourcesMap = HM.fromList [(dsMetric ds, ds) | ds <- gcSources 123]++ testCounter = testGcSource DsDerive+ testGauge = testGcSource DsGauge++ testGcSource sourceType metric source = testCase (T.unpack metric) $+ HM.lookup metric gcSourcesMap @?= Just (DataSource+ { dsName = source+ , dsMetric = metric+ , dsType = sourceType+ , dsHeartBeat = 123+ , dsMin = Just 0+ , dsMax = Nothing+ })++defineRoundRobinArchiveTests :: TF.Test+defineRoundRobinArchiveTests = testGroup "defineRoundRobinArchive"+ [ testCase "last" $ "RRA:LAST:0.5:1:8064"+ @=? defineRoundRobinArchive (RoundRobinArchive CFLast 0.5 1 8064)+ , testCase "average" $ "RRA:AVERAGE:0.75:2:8065"+ @=? defineRoundRobinArchive (RoundRobinArchive CFAverage 0.75 2 8065)+ , testCase "min" $ "RRA:MIN:0.25:3:8066"+ @=? defineRoundRobinArchive (RoundRobinArchive CFMin 0.25 3 8066)+ , testCase "max" $ "RRA:MAX:0.0:4:8067"+ @=? defineRoundRobinArchive (RoundRobinArchive CFMax 0.0 4 8067)+ ]++createRRDArgsTests :: TF.Test+createRRDArgsTests = testGroup "createRRDArgs"+ [ testCase "create"+ $ ["create","test.rrd","--no-overwrite","-s","234"+ ,"DS:data-source-1:GAUGE:567:0:U","DS:data-source-2:DERIVE:568:2:5"+ ,"RRA:LAST:0.5:1:8064","RRA:AVERAGE:0.5:6:105120"]+ @=? createRRDArgs (RoundRobinDatabase+ { rrdFilePath = "test.rrd"+ , rrdToolPath = error "rrdToolPath undefined"+ , rrdStore = error "rrdStore undefined"+ , rrdStep = 234+ , rrdSources = HM.fromList+ [ ("1", undefinedDataSource+ { dsName = "data-source-1"+ , dsType = DsGauge+ , dsHeartBeat = 567+ , dsMin = Just 0+ , dsMax = Nothing+ })+ , ("2", undefinedDataSource+ { dsName = "data-source-2"+ , dsType = DsDerive+ , dsHeartBeat = 568+ , dsMin = Just 2+ , dsMax = Just 5+ })+ ]+ , rrdArchives =+ [ RoundRobinArchive+ { rraCf = CFLast+ , rraXff = 0.5+ , rraPdpCount = 1+ , rraRecordCount = 8064+ }+ , RoundRobinArchive+ { rraCf = CFAverage+ , rraXff = 0.5+ , rraPdpCount = 6+ , rraRecordCount = 105120+ }+ ]+ })+ , testCase "create with other RRAs"+ $ ["create","test.rrd","--no-overwrite","-s","234"+ ,"DS:data-source-1:GAUGE:567:0:U"+ ,"RRA:MIN:0.5:4:8064","RRA:MAX:0.75:12:13000"]+ @=? createRRDArgs (RoundRobinDatabase+ { rrdFilePath = "test.rrd"+ , rrdToolPath = error "rrdToolPath undefined"+ , rrdStore = error "rrdStore undefined"+ , rrdStep = 234+ , rrdSources = HM.fromList+ [ ("1", undefinedDataSource+ { dsName = "data-source-1"+ , dsType = DsGauge+ , dsHeartBeat = 567+ , dsMin = Just 0+ , dsMax = Nothing+ })+ ]+ , rrdArchives =+ [ RoundRobinArchive+ { rraCf = CFMin+ , rraXff = 0.5+ , rraPdpCount = 4+ , rraRecordCount = 8064+ }+ , RoundRobinArchive+ { rraCf = CFMax+ , rraXff = 0.75+ , rraPdpCount = 12+ , rraRecordCount = 13000+ }+ ]+ })+ ]