packages feed

hs-opentelemetry-api-1.0.0.0: test/OpenTelemetry/Trace/TraceFlagsSpec.hs

module OpenTelemetry.Trace.TraceFlagsSpec where

import Data.Word (Word8)
import OpenTelemetry.Trace.Core
import Test.Hspec


spec :: Spec
spec = describe "TraceFlags" $ do
  -- Trace API §TraceFlags: sampled flag (bit 0)
  -- https://opentelemetry.io/docs/specs/otel/trace/api/#traceflags
  describe "sampled bit" $ do
    it "starts unsampled by default" $ do
      defaultTraceFlags `shouldSatisfy` (not . isSampled)
    specify "setSampled updates flags correctly" $ do
      setSampled defaultTraceFlags `shouldSatisfy` isSampled
    specify "unsetSampled updates flags correctly" $ do
      unsetSampled (setSampled defaultTraceFlags) `shouldSatisfy` (not . isSampled)

  -- Trace API §TraceFlags: random trace flag (W3C Level 2, bit 1)
  -- https://opentelemetry.io/docs/specs/otel/trace/api/#traceflags
  describe "W3C Level 2 random bit" $ do
    it "starts without random flag by default" $ do
      defaultTraceFlags `shouldSatisfy` (not . isRandom)

    it "setRandom sets bit 1" $ do
      setRandom defaultTraceFlags `shouldSatisfy` isRandom

    it "unsetRandom clears bit 1" $ do
      unsetRandom (setRandom defaultTraceFlags) `shouldSatisfy` (not . isRandom)

    it "random and sampled are independent" $ do
      let both = setRandom (setSampled defaultTraceFlags)
      both `shouldSatisfy` isSampled
      both `shouldSatisfy` isRandom
      unsetSampled both `shouldSatisfy` isRandom
      unsetSampled both `shouldSatisfy` (not . isSampled)
      unsetRandom both `shouldSatisfy` isSampled
      unsetRandom both `shouldSatisfy` (not . isRandom)

    it "random flag roundtrips through Word8" $ do
      let flags = setRandom (setSampled defaultTraceFlags)
          w = traceFlagsValue flags
      w `shouldBe` (0x03 :: Word8)
      traceFlagsFromWord8 w `shouldSatisfy` isSampled
      traceFlagsFromWord8 w `shouldSatisfy` isRandom

    it "traceFlagsFromWord8 preserves random bit from remote context" $ do
      let remoteFlags = traceFlagsFromWord8 0x02
      remoteFlags `shouldSatisfy` isRandom
      remoteFlags `shouldSatisfy` (not . isSampled)