packages feed

instana-haskell-trace-sdk-0.7.0.0: test/integration/Instana/SDK/IntegrationTest/TestSuites.hs

module Instana.SDK.IntegrationTest.TestSuites (allSuites) where


import qualified Data.Aeson                                 as Aeson
import qualified Instana.SDK.IntegrationTest.BracketApi     as BracketApi
import qualified Instana.SDK.IntegrationTest.Connection     as Connection
import qualified Instana.SDK.IntegrationTest.HttpTracing    as HttpTracing
import qualified Instana.SDK.IntegrationTest.LowLevelApi    as LowLevelApi
import qualified Instana.SDK.IntegrationTest.Metrics        as Metrics
import qualified Instana.SDK.IntegrationTest.ServiceName    as ServiceName
import qualified Instana.SDK.IntegrationTest.SpecCompliance as SpecCompliance
import           Instana.SDK.IntegrationTest.Suite          (ConditionalSuite (..),
                                                             Suite (..))
import qualified Instana.SDK.IntegrationTest.Suite          as Suite
import qualified Instana.SDK.IntegrationTest.WaiMiddleware  as WaiMiddleware


allSuites :: Aeson.Array -> [ConditionalSuite]
allSuites specificationComplianceTestCases =
  [ testBracketApi
  , testLowLevelApi
  , testConnectionEstablishment
  , testConnectionLoss
  , testAgentRestart
  , testPidTranslation
  , testServiceName
  , testHttpTracing
  , testWaiMiddleware
  , testSpecComplianceW3cOn
      specificationComplianceTestCases
      "Low Level API"
      "http/low/level/api"
  , testSpecComplianceW3cOff
      specificationComplianceTestCases
      "Low Level API"
      "http/low/level/api"
  , testSpecComplianceW3cOn
      specificationComplianceTestCases
      "Bracket API"
      "http/bracket/api"
  , testSpecComplianceW3cOff
      specificationComplianceTestCases
      "Bracket API"
      "http/bracket/api"
  , testSpecComplianceW3cOnWaiMiddleware specificationComplianceTestCases "api"
  , testSpecComplianceW3cOffWaiMiddleware specificationComplianceTestCases "api"
  , testMetrics
  ]


testBracketApi :: ConditionalSuite
testBracketApi =
  Run $
    Suite
      { Suite.label = "Bracket API"
      , Suite.tests = BracketApi.allTests
      , Suite.options = Suite.defaultOptions
      }


testLowLevelApi :: ConditionalSuite
testLowLevelApi =
  Run $
    Suite
      { Suite.label = "Low Level API"
      , Suite.tests = LowLevelApi.allTests
      , Suite.options = Suite.defaultOptions
      }


testConnectionEstablishment :: ConditionalSuite
testConnectionEstablishment =
  Run $
    Suite
      { Suite.label = "Initial Connection Establishment"
      , Suite.tests = (\pid -> [
          Connection.shouldRetryInitialConnectionEstablishment pid
        ])
      , Suite.options = Suite.withStartupDelay
      }


testConnectionLoss :: ConditionalSuite
testConnectionLoss =
  Run $
    Suite
      { Suite.label = "Connection Loss"
      , Suite.tests = (\pid -> [
          Connection.shouldReestablishLostConnection pid
        ])
      , Suite.options = Suite.withConnectionLoss
      }


testAgentRestart :: ConditionalSuite
testAgentRestart =
  Run $
    Suite
      { Suite.label = "Agent Restart"
      , Suite.tests = (\pid -> [
          Connection.shouldReconnectAfterAgentRestart pid
        ])
      , Suite.options = Suite.defaultOptions
      }


testPidTranslation :: ConditionalSuite
testPidTranslation =
  Run $
    Suite
      { Suite.label =  "PID translation"
      , Suite.tests = (\pid -> [
          Connection.shouldUseTranslatedPid pid
        ])
      , Suite.options = Suite.withPidTranslation
      }


testServiceName :: ConditionalSuite
testServiceName =
  Run $
    Suite
      { Suite.label = "INSTANA_SERVICE_NAME env var"
      , Suite.tests = ServiceName.allTests
      , Suite.options = Suite.withCustomServiceName "Custom Service Name"
      }


testHttpTracing :: ConditionalSuite
testHttpTracing =
  Run $
    Suite
      { Suite.label = "HTTP Tracing"
      , Suite.tests = HttpTracing.allTests
      , Suite.options = Suite.defaultOptions {
            Suite.appsUnderTest =
              [ Suite.testServer
              , Suite.downstreamTarget
              ]
          }
      }


testSpecComplianceW3cOn :: Aeson.Array -> String -> String -> ConditionalSuite
testSpecComplianceW3cOn specificationComplianceTestCases apiLabel route =
  Run $
    Suite
      { Suite.label =
          "Specification Compliance (WC3 Trace Correlation On/" ++
          apiLabel ++ ")"
      , Suite.tests =
          SpecCompliance.allTestsW3cCorrelationOn
            specificationComplianceTestCases
            Suite.testServer
            route
      , Suite.options = Suite.defaultOptions {
            Suite.appsUnderTest =
              [ Suite.testServer
              , Suite.downstreamTarget
              ]
          }
      }


testSpecComplianceW3cOff :: Aeson.Array -> String -> String -> ConditionalSuite
testSpecComplianceW3cOff specificationComplianceTestCases apiLabel route =
  Run $
    Suite
      { Suite.label =
          "Specification Compliance (WC3 Trace Correlation Off/" ++
          apiLabel ++ ")"
      , Suite.tests =
          SpecCompliance.allTestsW3cCorrelationOff
            specificationComplianceTestCases
            Suite.testServer
            route
      , Suite.options = Suite.withW3cTraceCorrelationDisabled {
            Suite.appsUnderTest =
              [ Suite.testServer
              , Suite.downstreamTarget
              ]
          }
      }


testWaiMiddleware :: ConditionalSuite
testWaiMiddleware =
  Run $
    Suite
      { Suite.label = "WAI Middleware"
      , Suite.tests = WaiMiddleware.allTests
      , Suite.options = Suite.defaultOptions {
            Suite.appsUnderTest =
              [ Suite.testServerWithMiddleware
              , Suite.downstreamTarget
              ]
          }
      }


testSpecComplianceW3cOnWaiMiddleware ::
  Aeson.Array
  -> String
  -> ConditionalSuite
testSpecComplianceW3cOnWaiMiddleware specificationComplianceTestCases route =
  Run $
    Suite
      { Suite.label =
          "Specification Compliance (WC3 Trace Correlation On/WAI Middleware)"
      , Suite.tests =
          SpecCompliance.allTestsW3cCorrelationOn
            specificationComplianceTestCases
            Suite.testServerWithMiddleware
            route
      , Suite.options = Suite.defaultOptions {
            Suite.appsUnderTest =
              [ Suite.testServerWithMiddleware
              , Suite.downstreamTarget
              ]
          }
      }


testSpecComplianceW3cOffWaiMiddleware ::
  Aeson.Array
  -> String
  -> ConditionalSuite
testSpecComplianceW3cOffWaiMiddleware specificationComplianceTestCases route =
  Run $
    Suite
      { Suite.label =
          "Specification Compliance (WC3 Trace Correlation Off/WAI Middleware)"
      , Suite.tests =
          SpecCompliance.allTestsW3cCorrelationOff
            specificationComplianceTestCases
            Suite.testServerWithMiddleware
            route
      , Suite.options = Suite.withW3cTraceCorrelationDisabled {
            Suite.appsUnderTest =
              [ Suite.testServerWithMiddleware
              , Suite.downstreamTarget
              ]
          }
      }


testMetrics :: ConditionalSuite
testMetrics =
  Run $
    Suite
      { Suite.label =  "Metrics"
      , Suite.tests = (\pid -> [
          Metrics.shouldReportMetrics pid
        ])
      , Suite.options = Suite.withPidTranslation
      }