--
-- Data vault for metrics
--
-- Copyright © 2013-2014 Anchor Systems, Pty Ltd and Others
--
-- The code in this file, and the program it is a part of, is
-- made available to you by its authors as open source software:
-- you can redistribute it and/or modify it under the terms of
-- the 3-clause BSD licence.
--
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Exception (throw)
import Data.HashMap.Strict (fromList)
import Test.Hspec
import Test.Hspec.QuickCheck
import Vaultaire.Types
main :: IO ()
main = hspec suite
suite :: Spec
suite = do
describe "WireFormat identity tests" $ do
prop "Daymap" (wireId :: DayMap -> Bool)
prop "ContentsOperation" (wireId :: ContentsOperation -> Bool)
prop "ContentsResponse" (wireId :: ContentsResponse -> Bool)
prop "WriteResult" (wireId :: WriteResult -> Bool)
prop "ReadStream" (wireId :: ReadStream -> Bool)
prop "Address" (wireId :: Address -> Bool)
prop "SourceDict" (wireId :: SourceDict -> Bool)
prop "ReadRequest" (wireId :: ReadRequest -> Bool)
prop "PassThrough" (wireId :: PassThrough -> Bool)
prop "TelemetryResponse" (wireId :: TeleResp -> Bool)
describe "source dict wire format" $
it "parses string to map" $ do
let hm = fromList [ ("metric","cpu")
, ("server","example")]
let expected = either error id $ makeSourceDict hm
let wire = either throw id $ fromWire "server:example,metric:cpu"
wire `shouldBe` expected
describe "Contents list bypass" $ do
prop "has same wire format for all" contentsListBypassId
it "has same wire format for known case" $ do
let al = [("metric","cpu"), ("server","www.example.com")]
let (Right source_dict) = makeSourceDict $ fromList al
let encoded = toWire source_dict
let expected = "\x02\
\\x01\x00\x00\x00\x00\x00\x00\x00\
\\x22\x00\x00\x00\x00\x00\x00\x00\
\metric:cpu,server:www.example.com,"
toWire (ContentsListEntry 1 source_dict) `shouldBe` expected
toWire (ContentsListBypass 1 encoded) `shouldBe` expected
contentsListBypassId :: SourceDict -> Address -> Bool
contentsListBypassId dict addr = toWire entry == toWire bypass
where
entry = ContentsListEntry addr dict
bypass = ContentsListBypass addr (toWire dict)
wireId :: (Eq w, WireFormat w) => w -> Bool
wireId op = id' op == op
where
id' = fromRight . fromWire . toWire
fromRight = either (error . show) id