packages feed

pqi-conformance-0.0.1.0: src/library/Pqi/Conformance.hs

-- | A reusable differential-testing toolkit for @pqi@ adapters.
--
-- An adapter's test suite calls 'specs' with a @'Proxy' \@MyConnection@. The
-- battery runs the same operation on the candidate and on the FFI reference
-- and asserts that the protocol-derived observations match.
--
-- The throwaway PostgreSQL container lifecycle is baked into 'specs', so
-- adapter test suites only need @hspec (specs (Proxy \@MyConnection))@; they
-- don't have to know about @testcontainers@ at all. The SCRAM-SHA-256
-- authentication spec is part of the @connectdb@ group and boots its own
-- password-auth container.
module Pqi.Conformance
  ( specs,
  )
where

import Pqi (IsConnection)
import Pqi.Conformance.Harness
import qualified Pqi.Conformance.Operation.BackendPID as BackendPID
import qualified Pqi.Conformance.Operation.Cancel as Cancel
import qualified Pqi.Conformance.Operation.CancelCleanup as CancelCleanup
import qualified Pqi.Conformance.Operation.ClientEncoding as ClientEncoding
import qualified Pqi.Conformance.Operation.CmdStatus as CmdStatus
import qualified Pqi.Conformance.Operation.CmdTuples as CmdTuples
import qualified Pqi.Conformance.Operation.ConnectPoll as ConnectPoll
import qualified Pqi.Conformance.Operation.ConnectStart as ConnectStart
import qualified Pqi.Conformance.Operation.Connectdb as Connectdb
import qualified Pqi.Conformance.Operation.ConnectionNeedsPassword as ConnectionNeedsPassword
import qualified Pqi.Conformance.Operation.ConnectionUsedPassword as ConnectionUsedPassword
import qualified Pqi.Conformance.Operation.ConsumeInput as ConsumeInput
import qualified Pqi.Conformance.Operation.Db as Db
import qualified Pqi.Conformance.Operation.DescribePortal as DescribePortal
import qualified Pqi.Conformance.Operation.DescribePrepared as DescribePrepared
import qualified Pqi.Conformance.Operation.DisableNoticeReporting as DisableNoticeReporting
import qualified Pqi.Conformance.Operation.EnableNoticeReporting as EnableNoticeReporting
import qualified Pqi.Conformance.Operation.EnterPipelineMode as EnterPipelineMode
import qualified Pqi.Conformance.Operation.ErrorMessage as ErrorMessage
import qualified Pqi.Conformance.Operation.EscapeByteaConn as EscapeByteaConn
import qualified Pqi.Conformance.Operation.EscapeIdentifier as EscapeIdentifier
import qualified Pqi.Conformance.Operation.EscapeStringConn as EscapeStringConn
import qualified Pqi.Conformance.Operation.Exec as Exec
import qualified Pqi.Conformance.Operation.ExecParams as ExecParams
import qualified Pqi.Conformance.Operation.ExecPrepared as ExecPrepared
import qualified Pqi.Conformance.Operation.ExitPipelineMode as ExitPipelineMode
import qualified Pqi.Conformance.Operation.Fformat as Fformat
import qualified Pqi.Conformance.Operation.Finish as Finish
import qualified Pqi.Conformance.Operation.Flush as Flush
import qualified Pqi.Conformance.Operation.Fmod as Fmod
import qualified Pqi.Conformance.Operation.Fname as Fname
import qualified Pqi.Conformance.Operation.Fnumber as Fnumber
import qualified Pqi.Conformance.Operation.Fsize as Fsize
import qualified Pqi.Conformance.Operation.Ftable as Ftable
import qualified Pqi.Conformance.Operation.Ftablecol as Ftablecol
import qualified Pqi.Conformance.Operation.Ftype as Ftype
import qualified Pqi.Conformance.Operation.GetCancel as GetCancel
import qualified Pqi.Conformance.Operation.GetCopyData as GetCopyData
import qualified Pqi.Conformance.Operation.GetNotice as GetNotice
import qualified Pqi.Conformance.Operation.GetResult as GetResult
import qualified Pqi.Conformance.Operation.Getisnull as Getisnull
import qualified Pqi.Conformance.Operation.Getlength as Getlength
import qualified Pqi.Conformance.Operation.Getvalue as Getvalue
import qualified Pqi.Conformance.Operation.GetvalueCopy as GetvalueCopy
import qualified Pqi.Conformance.Operation.Host as Host
import qualified Pqi.Conformance.Operation.IsBusy as IsBusy
import qualified Pqi.Conformance.Operation.IsNullConnection as IsNullConnection
import qualified Pqi.Conformance.Operation.Isnonblocking as Isnonblocking
import qualified Pqi.Conformance.Operation.LoClose as LoClose
import qualified Pqi.Conformance.Operation.LoCreat as LoCreat
import qualified Pqi.Conformance.Operation.LoCreate as LoCreate
import qualified Pqi.Conformance.Operation.LoExport as LoExport
import qualified Pqi.Conformance.Operation.LoImport as LoImport
import qualified Pqi.Conformance.Operation.LoImportWithOid as LoImportWithOid
import qualified Pqi.Conformance.Operation.LoOpen as LoOpen
import qualified Pqi.Conformance.Operation.LoRead as LoRead
import qualified Pqi.Conformance.Operation.LoSeek as LoSeek
import qualified Pqi.Conformance.Operation.LoTell as LoTell
import qualified Pqi.Conformance.Operation.LoTruncate as LoTruncate
import qualified Pqi.Conformance.Operation.LoUnlink as LoUnlink
import qualified Pqi.Conformance.Operation.LoWrite as LoWrite
import qualified Pqi.Conformance.Operation.NewNullConnection as NewNullConnection
import qualified Pqi.Conformance.Operation.Nfields as Nfields
import qualified Pqi.Conformance.Operation.Notifies as Notifies
import qualified Pqi.Conformance.Operation.Nparams as Nparams
import qualified Pqi.Conformance.Operation.Ntuples as Ntuples
import qualified Pqi.Conformance.Operation.Options as Options
import qualified Pqi.Conformance.Operation.ParameterStatus as ParameterStatus
import qualified Pqi.Conformance.Operation.Paramtype as Paramtype
import qualified Pqi.Conformance.Operation.Pass as Pass
import qualified Pqi.Conformance.Operation.PipelineStatus as PipelineStatus
import qualified Pqi.Conformance.Operation.PipelineSync as PipelineSync
import qualified Pqi.Conformance.Operation.Port as Port
import qualified Pqi.Conformance.Operation.Prepare as Prepare
import qualified Pqi.Conformance.Operation.ProtocolVersion as ProtocolVersion
import qualified Pqi.Conformance.Operation.PutCopyData as PutCopyData
import qualified Pqi.Conformance.Operation.PutCopyEnd as PutCopyEnd
import qualified Pqi.Conformance.Operation.Reset as Reset
import qualified Pqi.Conformance.Operation.ResetPoll as ResetPoll
import qualified Pqi.Conformance.Operation.ResetStart as ResetStart
import qualified Pqi.Conformance.Operation.ResultErrorField as ResultErrorField
import qualified Pqi.Conformance.Operation.ResultErrorMessage as ResultErrorMessage
import qualified Pqi.Conformance.Operation.ResultStatus as ResultStatus
import qualified Pqi.Conformance.Operation.SendDescribePortal as SendDescribePortal
import qualified Pqi.Conformance.Operation.SendDescribePrepared as SendDescribePrepared
import qualified Pqi.Conformance.Operation.SendFlushRequest as SendFlushRequest
import qualified Pqi.Conformance.Operation.SendPrepare as SendPrepare
import qualified Pqi.Conformance.Operation.SendQuery as SendQuery
import qualified Pqi.Conformance.Operation.SendQueryParams as SendQueryParams
import qualified Pqi.Conformance.Operation.SendQueryPrepared as SendQueryPrepared
import qualified Pqi.Conformance.Operation.ServerVersion as ServerVersion
import qualified Pqi.Conformance.Operation.SetClientEncoding as SetClientEncoding
import qualified Pqi.Conformance.Operation.SetErrorVerbosity as SetErrorVerbosity
import qualified Pqi.Conformance.Operation.SetSingleRowMode as SetSingleRowMode
import qualified Pqi.Conformance.Operation.Setnonblocking as Setnonblocking
import qualified Pqi.Conformance.Operation.Socket as Socket
import qualified Pqi.Conformance.Operation.Status as Status
import qualified Pqi.Conformance.Operation.TransactionStatus as TransactionStatus
import qualified Pqi.Conformance.Operation.UnsafeFreeResult as UnsafeFreeResult
import qualified Pqi.Conformance.Operation.User as User
import Pqi.Conformance.Prelude
import Test.Hspec

-- | The full conformance battery: every per-operation spec under one shared
-- trust-auth container, plus SCRAM-SHA-256 authentication (which boots its own
-- password-auth container). Every operation spec is differential against the
-- FFI reference.
specs :: (IsConnection c) => Proxy c -> Spec
specs proxy = parallel do
  containerHook do
    -- Connection lifecycle
    Connectdb.spec proxy
    ConnectStart.spec proxy
    ConnectPoll.spec proxy
    NewNullConnection.spec proxy
    IsNullConnection.spec proxy
    Finish.spec proxy
    Reset.spec proxy
    ResetStart.spec proxy
    ResetPoll.spec proxy
    -- Connection information accessors
    Db.spec proxy
    User.spec proxy
    Pass.spec proxy
    Host.spec proxy
    Port.spec proxy
    Options.spec proxy
    Status.spec proxy
    TransactionStatus.spec proxy
    ParameterStatus.spec proxy
    ProtocolVersion.spec proxy
    ServerVersion.spec proxy
    ErrorMessage.spec proxy
    Socket.spec proxy
    BackendPID.spec proxy
    ConnectionNeedsPassword.spec proxy
    ConnectionUsedPassword.spec proxy
    -- Querying
    Exec.spec proxy
    ExecParams.spec proxy
    Prepare.spec proxy
    ExecPrepared.spec proxy
    DescribePrepared.spec proxy
    DescribePortal.spec proxy
    -- Escaping
    EscapeStringConn.spec proxy
    EscapeByteaConn.spec proxy
    EscapeIdentifier.spec proxy
    -- Asynchronous command processing
    SendQuery.spec proxy
    SendQueryParams.spec proxy
    SendPrepare.spec proxy
    SendQueryPrepared.spec proxy
    SendDescribePrepared.spec proxy
    SendDescribePortal.spec proxy
    GetResult.spec proxy
    ConsumeInput.spec proxy
    IsBusy.spec proxy
    Setnonblocking.spec proxy
    Isnonblocking.spec proxy
    SetSingleRowMode.spec proxy
    Flush.spec proxy
    -- Pipelining
    PipelineStatus.spec proxy
    EnterPipelineMode.spec proxy
    ExitPipelineMode.spec proxy
    PipelineSync.spec proxy
    SendFlushRequest.spec proxy
    -- Cancellation
    GetCancel.spec proxy
    Cancel.spec proxy
    CancelCleanup.spec proxy
    -- Notifications and notices
    Notifies.spec proxy
    DisableNoticeReporting.spec proxy
    EnableNoticeReporting.spec proxy
    GetNotice.spec proxy
    -- Copy sub-protocol
    PutCopyData.spec proxy
    PutCopyEnd.spec proxy
    GetCopyData.spec proxy
    -- Large objects
    LoCreat.spec proxy
    LoCreate.spec proxy
    LoImport.spec proxy
    LoImportWithOid.spec proxy
    LoExport.spec proxy
    LoOpen.spec proxy
    LoWrite.spec proxy
    LoRead.spec proxy
    LoSeek.spec proxy
    LoTell.spec proxy
    LoTruncate.spec proxy
    LoClose.spec proxy
    LoUnlink.spec proxy
    -- Connection control
    ClientEncoding.spec proxy
    SetClientEncoding.spec proxy
    SetErrorVerbosity.spec proxy
    -- Result inspection
    ResultStatus.spec proxy
    ResultErrorMessage.spec proxy
    ResultErrorField.spec proxy
    UnsafeFreeResult.spec proxy
    Ntuples.spec proxy
    Nfields.spec proxy
    Fname.spec proxy
    Fnumber.spec proxy
    Ftable.spec proxy
    Ftablecol.spec proxy
    Fformat.spec proxy
    Ftype.spec proxy
    Fmod.spec proxy
    Fsize.spec proxy
    Getvalue.spec proxy
    GetvalueCopy.spec proxy
    Getisnull.spec proxy
    Getlength.spec proxy
    Nparams.spec proxy
    Paramtype.spec proxy
    CmdStatus.spec proxy
    CmdTuples.spec proxy