unclogging-0.1.0.0: test/Test/Unclogging.hs
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE TemplateHaskell #-}
module Test.Unclogging (spec) where
import Control.Carrier.Unclog
import Control.Effect.Unclog.Json
import Data.Aeson
import Data.Foldable
import Data.Maybe
import Data.Traversable
import Test.Tasty
import Test.Tasty.HUnit
import Unclog
import UnliftIO
spec :: TestTree
spec =
testGroup
"all emitted logs arrive at all subscribers"
[ testCase "using an IORef" do
let emittedNumbers = map fromInteger [1 .. 200]
threads = [1 .. 5000]
json i = (["i" .= Number i] :: Object)
refs <- for threads \n -> (n,) <$> newIORef []
let subs = map (\(_, r) -> refSubscriber r) refs
runUnclogging (colourSubscriber Debug stdout : subs) do
for_ emittedNumbers \i -> do
$debug $ json i
$info $ json i
$warn $ json i
$fatal $ json i
results <- for refs \(n, r) -> do
r' <- readIORef r
pure (n, fromMaybe (error "didn't deserialize correctly") . decodeStrict @Value . payload <$> reverse r')
let targetPayload = foldMap (replicate 4 . Object . json) emittedNumbers
for_ results \(n, r) -> do
assertEqual ("payload of thread number " <> show @Integer n) targetPayload r
]