packages feed

hnix-store-remote-0.8.0.0: src/System/Nix/Store/Remote/Arbitrary.hs

-- due to recent generic-arbitrary
{-# OPTIONS_GHC -fconstraint-solver-iterations=0 #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module System.Nix.Store.Remote.Arbitrary where

import Data.Some (Some(Some))
import System.Nix.Arbitrary ()
import System.Nix.Derivation (Derivation'(..))
import System.Nix.StorePath (StorePath(..))
import System.Nix.Store.Types (RepairMode(..))
import System.Nix.Store.Remote.Types

import Test.QuickCheck (Arbitrary(..), arbitraryBoundedEnum, oneof, suchThat)
import Test.QuickCheck.Arbitrary.Generic (GenericArbitrary(..))

deriving via GenericArbitrary CheckMode
  instance Arbitrary CheckMode

deriving via GenericArbitrary SubstituteMode
  instance Arbitrary SubstituteMode

deriving via GenericArbitrary ProtoStoreConfig
  instance Arbitrary ProtoStoreConfig

-- Custom instance: major is always 1 (the only real protocol major version),
-- features are always empty (features are exchanged separately, not in wire format).
instance Arbitrary ProtoVersion where
  arbitrary = ProtoVersion 1 <$> arbitrary <*> pure mempty

instance Arbitrary ProtoFeature where
  arbitrary = arbitraryBoundedEnum

deriving via GenericArbitrary StoreText
  instance Arbitrary StoreText

-- * Logger

deriving via GenericArbitrary Activity
  instance Arbitrary Activity

deriving via GenericArbitrary ActivityID
  instance Arbitrary ActivityID

deriving via GenericArbitrary ActivityResult
  instance Arbitrary ActivityResult

deriving via GenericArbitrary Field
  instance Arbitrary Field

instance Arbitrary Trace where
  arbitrary = do
    -- we encode 0 position as Nothing
    tracePosition <- arbitrary `suchThat` (/= Just 0)
    traceHint <- arbitrary

    pure Trace{..}

instance Arbitrary ErrorInfo where
  arbitrary = do
    errorInfoLevel <- arbitrary
    errorInfoMessage <- arbitrary
    -- we encode 0 position as Nothing
    errorInfoPosition <- arbitrary `suchThat` (/= Just 0)
    errorInfoTraces <- arbitrary

    pure ErrorInfo{..}

deriving via GenericArbitrary LoggerOpCode
  instance Arbitrary LoggerOpCode

deriving via GenericArbitrary Logger
  instance Arbitrary Logger

deriving via GenericArbitrary Verbosity
  instance Arbitrary Verbosity

-- * GC

deriving via GenericArbitrary GCAction
  instance Arbitrary GCAction

deriving via GenericArbitrary GCOptions
  instance Arbitrary GCOptions

-- * Handshake

deriving via GenericArbitrary WorkerMagic
  instance Arbitrary WorkerMagic

deriving via GenericArbitrary TrustedFlag
  instance Arbitrary TrustedFlag

-- * Worker protocol

deriving via GenericArbitrary WorkerOp
  instance Arbitrary WorkerOp

-- ** Request

instance Arbitrary (Some StoreRequest) where
  arbitrary = oneof
    [ Some <$> (AddToStore <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary)
    , Some <$> (AddToStoreScanning <$> arbitrary <*> arbitrary <*> arbitrary)
    , Some <$> (AddTextToStore <$> arbitrary <*> arbitrary <*> pure RepairMode_DontRepair)
    , Some <$> (AddSignatures <$> arbitrary <*> arbitrary)
    , Some . AddIndirectRoot  <$> arbitrary
    , Some . AddTempRoot <$> arbitrary
    , Some <$> (BuildPaths <$> arbitrary <*> arbitrary)
    , do
        path <- arbitrary
        drv <- arbitrary
        buildMode' <- arbitrary
        -- Ensure store path name matches derivation name (helps with length issues)
        let path' = path { storePathName = name drv }
        pure $ Some (BuildDerivation path' drv buildMode')
    , Some . CollectGarbage <$> arbitrary
    , Some . EnsurePath <$> arbitrary
    , pure $ Some FindRoots
    , Some . IsValidPath <$> arbitrary
    , Some . NarFromPath <$> arbitrary
    , Some <$> (QueryValidPaths <$> arbitrary <*> arbitrary)
    , pure $ Some QueryAllValidPaths
    , Some . QuerySubstitutablePaths <$> arbitrary
    , Some . QueryPathInfo <$> arbitrary
    , Some . QueryReferrers <$> arbitrary
    , Some . QueryValidDerivers <$> arbitrary
    , Some . QueryDerivationOutputs <$> arbitrary
    , Some . QueryDerivationOutputNames <$> arbitrary
    , Some . QueryPathFromHashPart <$> arbitrary
    , Some . QueryMissing <$> arbitrary
    , pure $ Some OptimiseStore
    , Some <$> (SubmitOutput <$> arbitrary <*> arbitrary)
    , pure $ Some SyncWithGC
    , Some <$> (VerifyStore <$> arbitrary <*> arbitrary)
    ]

-- ** Reply

deriving via GenericArbitrary SuccessCodeReply
  instance Arbitrary SuccessCodeReply

deriving via GenericArbitrary GCResult
  instance Arbitrary GCResult

deriving via GenericArbitrary GCRoot
  instance Arbitrary GCRoot

deriving via GenericArbitrary Missing
  instance Arbitrary Missing