From dbe5cf42d2de1a74ce363b2514fc51de3e673ae8 Mon Sep 17 00:00:00 2001 From: Matthew Pickering Date: Fri, 19 Jan 2024 19:49:05 +0000 Subject: [PATCH 1/2] Don't inherit package database to tests I can't think of a reason why it would be desirable to expose the user's cabal store or local dist-newstyle to the test runner. In fact, this can break test output in certain situations depending on what is in your store. Tests should run in as hemertic environment as possible and not depend on anything to do with external system configuration. I have introduced a Note [Testsuite package environments] which explains what the environments are for the three different components of the testsuite. {- Note [Testsuite package environments] There are three different package environments which are used when running the testsuite. 1. Environment used to compile `cabal-tests` executable 2. Environment used to run test scripts "setup.test.hs" 3. Environment made available to tests themselves via `./Setup configure` These are all distinct from each other and should be specified separately. Where are these environments specified: 1. The build-depends on `cabal-tests` executable in `cabal-testsuite.cabal` 2. The build-depends of `test-runtime-deps` executable in `cabal-testsuite.cabal` These dependencies are injected in a special module (`Test.Cabal.ScriptEnv0`) which then is consulted in `Test.Cabal.Monad` in order to pass the right environmnet. This is mechanism by which the `./Setup` tests have access to the in-tree `Cabal` and `Cabal-syntax` libraries. 3. No specification, only the `GlobalPackageDb` is available (see `testPackageDBStack`) unless the test itself augments the environment with `withPackageDb`. At the moment, `cabal-install` tests always use the bootstrap cabal, which is a bit confusing but `cabal-install` is not flexible enough to be given additional package databases (yet). -} --- cabal-testsuite/main/cabal-tests.hs | 29 +++++++++++++++++++++++++ cabal-testsuite/src/Test/Cabal/Monad.hs | 19 +--------------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/cabal-testsuite/main/cabal-tests.hs b/cabal-testsuite/main/cabal-tests.hs index 2ea070bff07..8f8e8ec2807 100644 --- a/cabal-testsuite/main/cabal-tests.hs +++ b/cabal-testsuite/main/cabal-tests.hs @@ -34,6 +34,35 @@ import Data.Monoid ((<>)) import Data.Monoid (mempty) #endif +{- Note [Testsuite package environments] + +There are three different package environments which are used when running the +testsuite. + +1. Environment used to compile `cabal-tests` executable +2. Environment used to run test scripts "setup.test.hs" +3. Environment made available to tests themselves via `./Setup configure` + +These are all distinct from each other and should be specified separately. + +Where are these environments specified: + +1. The build-depends on `cabal-tests` executable in `cabal-testsuite.cabal` +2. The build-depends of `test-runtime-deps` executable in `cabal-testsuite.cabal` + These dependencies are injected in a special module (`Test.Cabal.ScriptEnv0`) which + then is consulted in `Test.Cabal.Monad` in order to pass the right environmnet. + This is mechanism by which the `./Setup` tests have access to the in-tree `Cabal` + and `Cabal-syntax` libraries. +3. No specification, only the `GlobalPackageDb` is available (see + `testPackageDBStack`) unless the test itself augments the environment with + `withPackageDb`. + +At the moment, `cabal-install` tests always use the bootstrap cabal, which is a +bit confusing but `cabal-install` is not flexible enough to be given additional +package databases (yet). + +-} + -- | Record for arguments that can be passed to @cabal-tests@ executable. data MainArgs = MainArgs { mainArgThreads :: Int, diff --git a/cabal-testsuite/src/Test/Cabal/Monad.hs b/cabal-testsuite/src/Test/Cabal/Monad.hs index c1ecf3dfecb..36621773309 100644 --- a/cabal-testsuite/src/Test/Cabal/Monad.hs +++ b/cabal-testsuite/src/Test/Cabal/Monad.hs @@ -289,24 +289,7 @@ runTestM mode m = withSystemTempDirectory "cabal-testsuite" $ \tmp_dir -> do -- them up we must configure them program_db <- configureAllKnownPrograms verbosity program_db3 - let ghcAndRunnedGhcAreTheSame :: Bool - ghcAndRunnedGhcAreTheSame = fromMaybe False $ do - ghc_program <- lookupProgram ghcProgram program_db - runner_ghc_program <- lookupProgram ghcProgram (runnerProgramDb senv) - return $ programPath ghc_program == programPath runner_ghc_program - - let db_stack = - case argGhcPath (testCommonArgs args) of - Nothing -> runnerPackageDbStack senv -- NB: canonicalized - -- Can't use the build package db stack since they - -- are all for the wrong versions! TODO: Make - -- this configurable - -- - -- Oleg: if runner ghc and provided ghc are the same, - -- use runnerPackageDbStack. See 'hasCabalForGhc' check. - Just _ - | ghcAndRunnedGhcAreTheSame -> runnerPackageDbStack senv - | otherwise -> [GlobalPackageDB] + let db_stack = [GlobalPackageDB] env = TestEnv { testSourceDir = script_dir, testTmpDir = tmp_dir, From b39b94b5300467bcbcf763b6652efaaec6ea13d5 Mon Sep 17 00:00:00 2001 From: Matthew Pickering Date: Mon, 22 Jan 2024 10:01:29 +0000 Subject: [PATCH 2/2] testsuite: Fix Executable-Relocatable test package database location We were attempting to register a package into the global package database, which then triggered some other check to do with relocatable packages to fail. The fix is to initialise and use a local package database, so the package would be built and installed into the local package database. --- .../PathsModule/Executable-Relocatable/setup.test.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cabal-testsuite/PackageTests/PathsModule/Executable-Relocatable/setup.test.hs b/cabal-testsuite/PackageTests/PathsModule/Executable-Relocatable/setup.test.hs index 76a4db87db3..ea88c7f9e41 100644 --- a/cabal-testsuite/PackageTests/PathsModule/Executable-Relocatable/setup.test.hs +++ b/cabal-testsuite/PackageTests/PathsModule/Executable-Relocatable/setup.test.hs @@ -4,4 +4,4 @@ import Test.Cabal.Prelude main = setupAndCabalTest $ do skipIfWindows skipUnlessGhcVersion ">= 8.0" - setup_build ["--enable-relocatable"] + withPackageDb $ setup_build ["--enable-relocatable"]