2018-04-29 00:30:44 +02:00
|
|
|
{-# LANGUAGE FlexibleContexts #-}
|
2018-04-11 22:56:31 +02:00
|
|
|
{-# LANGUAGE LambdaCase #-}
|
|
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
|
2014-08-03 14:17:43 +02:00
|
|
|
module Main where
|
|
|
|
|
2018-04-11 22:56:31 +02:00
|
|
|
import Control.DeepSeq
|
|
|
|
import qualified Control.Exception as Exc
|
2018-05-14 23:47:58 +02:00
|
|
|
import Control.Applicative ((<|>))
|
2018-04-05 00:32:21 +02:00
|
|
|
import Control.Monad
|
2018-04-11 22:56:31 +02:00
|
|
|
import Data.Fix
|
2018-11-25 11:08:17 +01:00
|
|
|
import Data.List (isSuffixOf)
|
2018-05-15 06:13:30 +02:00
|
|
|
import Data.Maybe
|
2018-04-11 22:56:31 +02:00
|
|
|
import Data.String.Interpolate.IsString
|
|
|
|
import Data.Text (unpack)
|
2018-05-03 06:32:00 +02:00
|
|
|
import Data.Time
|
2015-12-21 06:55:53 +01:00
|
|
|
import qualified EvalTests
|
2018-04-11 22:56:31 +02:00
|
|
|
import qualified Nix
|
|
|
|
import Nix.Expr.Types
|
2018-09-23 22:03:44 +02:00
|
|
|
import Nix.String
|
2018-04-18 02:25:59 +02:00
|
|
|
import Nix.Options
|
2018-04-11 22:56:31 +02:00
|
|
|
import Nix.Parser
|
2019-03-22 23:16:01 +01:00
|
|
|
import Nix.Standard
|
2019-03-18 03:04:38 +01:00
|
|
|
import Nix.Value
|
2018-02-09 15:32:53 +01:00
|
|
|
import qualified NixLanguageTests
|
2018-03-28 06:59:27 +02:00
|
|
|
import qualified ParserTests
|
|
|
|
import qualified PrettyTests
|
2018-06-25 12:55:05 +02:00
|
|
|
import qualified ReduceExprTests
|
2018-09-09 17:01:09 +02:00
|
|
|
import qualified PrettyParseTests
|
2018-05-08 21:16:13 +02:00
|
|
|
import System.Directory
|
2018-03-29 01:30:54 +02:00
|
|
|
import System.Environment
|
2018-04-11 22:56:31 +02:00
|
|
|
import System.FilePath.Glob
|
2018-04-07 21:02:33 +02:00
|
|
|
import System.Posix.Files
|
2018-03-28 06:59:27 +02:00
|
|
|
import Test.Tasty
|
2018-04-10 20:05:22 +02:00
|
|
|
import Test.Tasty.HUnit
|
2016-01-23 22:46:30 +01:00
|
|
|
|
2018-04-10 20:05:22 +02:00
|
|
|
ensureLangTestsPresent :: Assertion
|
|
|
|
ensureLangTestsPresent = do
|
2018-04-11 22:56:31 +02:00
|
|
|
exist <- fileExist "data/nix/tests/local.mk"
|
|
|
|
unless exist $
|
|
|
|
errorWithoutStackTrace $ unlines
|
|
|
|
[ "Directory data/nix does not have any files."
|
|
|
|
, "Did you forget to run"
|
|
|
|
++ " \"git submodule update --init --recursive\"?" ]
|
2018-04-07 21:09:49 +02:00
|
|
|
|
2018-04-10 20:05:22 +02:00
|
|
|
ensureNixpkgsCanParse :: Assertion
|
2018-04-11 22:56:31 +02:00
|
|
|
ensureNixpkgsCanParse =
|
|
|
|
consider "default.nix" (parseNixFile "default.nix") $ \case
|
|
|
|
Fix (NAbs (ParamSet params _ _) _) -> do
|
|
|
|
let rev = getString "rev" params
|
|
|
|
sha256 = getString "sha256" params
|
|
|
|
consider "fetchTarball expression" (pure $ parseNixTextLoc [i|
|
|
|
|
builtins.fetchTarball {
|
|
|
|
url = "https://github.com/NixOS/nixpkgs/archive/#{rev}.tar.gz";
|
|
|
|
sha256 = "#{sha256}";
|
|
|
|
}|]) $ \expr -> do
|
2018-05-08 22:47:50 +02:00
|
|
|
NVStr ns <- do
|
2019-03-18 05:58:35 +01:00
|
|
|
time <- getCurrentTime
|
2019-03-22 23:16:01 +01:00
|
|
|
runWithBasicEffectsIO (defaultOptions time) $
|
2019-03-18 03:04:38 +01:00
|
|
|
Nix.nixEvalExprLoc Nothing expr
|
2018-09-09 17:01:09 +02:00
|
|
|
let dir = hackyStringIgnoreContext ns
|
|
|
|
exists <- fileExist (unpack dir)
|
|
|
|
unless exists $
|
|
|
|
errorWithoutStackTrace $
|
|
|
|
"Directory " ++ show dir ++ " does not exist"
|
|
|
|
files <- globDir1 (compile "**/*.nix") (unpack dir)
|
|
|
|
when (length files == 0) $
|
|
|
|
errorWithoutStackTrace $
|
|
|
|
"Directory " ++ show dir ++ " does not have any files"
|
|
|
|
forM_ files $ \file -> do
|
|
|
|
unless ("azure-cli/default.nix" `isSuffixOf` file ||
|
|
|
|
"os-specific/linux/udisks/2-default.nix" `isSuffixOf` file) $ do
|
|
|
|
-- Parse and deepseq the resulting expression tree, to ensure the
|
|
|
|
-- parser is fully executed.
|
|
|
|
_ <- consider file (parseNixFileLoc file) $ Exc.evaluate . force
|
|
|
|
return ()
|
2018-04-11 22:56:31 +02:00
|
|
|
v -> error $ "Unexpected parse from default.nix: " ++ show v
|
|
|
|
where
|
|
|
|
getExpr k m = let Just (Just r) = lookup k m in r
|
|
|
|
getString k m =
|
|
|
|
let Fix (NStr (DoubleQuoted [Plain str])) = getExpr k m in str
|
|
|
|
|
|
|
|
consider path action k = action >>= \case
|
|
|
|
Failure err -> errorWithoutStackTrace $
|
|
|
|
"Parsing " ++ path ++ " failed: " ++ show err
|
2018-04-29 00:30:44 +02:00
|
|
|
Success expr -> k expr
|
2018-04-07 21:09:49 +02:00
|
|
|
|
2018-04-10 20:05:22 +02:00
|
|
|
main :: IO ()
|
|
|
|
main = do
|
2018-04-11 22:56:31 +02:00
|
|
|
nixLanguageTests <- NixLanguageTests.genTests
|
2018-04-08 09:26:48 +02:00
|
|
|
evalComparisonTests <- EvalTests.genEvalCompareTests
|
2018-05-15 06:13:30 +02:00
|
|
|
let allOrLookup var = lookupEnv "ALL_TESTS" <|> lookupEnv var
|
2018-05-14 23:47:58 +02:00
|
|
|
nixpkgsTestsEnv <- allOrLookup "NIXPKGS_TESTS"
|
2018-09-09 17:01:09 +02:00
|
|
|
prettyTestsEnv <- lookupEnv "PRETTY_TESTS"
|
2018-04-11 22:56:31 +02:00
|
|
|
|
2018-05-08 21:16:13 +02:00
|
|
|
pwd <- getCurrentDirectory
|
|
|
|
setEnv "NIX_REMOTE" ("local?root=" ++ pwd ++ "/")
|
2018-05-07 22:17:44 +02:00
|
|
|
|
2018-03-29 01:30:54 +02:00
|
|
|
defaultMain $ testGroup "hnix" $
|
2018-02-09 15:32:53 +01:00
|
|
|
[ ParserTests.tests
|
|
|
|
, EvalTests.tests
|
2018-06-25 12:55:05 +02:00
|
|
|
, PrettyTests.tests
|
|
|
|
, ReduceExprTests.tests] ++
|
2018-09-09 17:01:09 +02:00
|
|
|
[ PrettyParseTests.tests
|
|
|
|
(fromIntegral (read (fromMaybe "0" prettyTestsEnv) :: Int)) ] ++
|
2018-05-07 07:13:30 +02:00
|
|
|
[ evalComparisonTests ] ++
|
2018-05-01 01:43:04 +02:00
|
|
|
[ testCase "Nix language tests present" ensureLangTestsPresent
|
2018-05-07 21:45:51 +02:00
|
|
|
, nixLanguageTests ] ++
|
2018-04-11 22:56:31 +02:00
|
|
|
[ testCase "Nixpkgs parses without errors" ensureNixpkgsCanParse
|
2018-05-07 07:13:30 +02:00
|
|
|
| isJust nixpkgsTestsEnv ]
|