From d1dbf266f6bcc8ad18538223f736fefffba490d7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 27 Feb 2013 15:35:07 -0400 Subject: [PATCH] embed test suite into git annex; available by running: git annex test I have seen some other programs do this, and think it's pretty cool. Means you can test wherever it's deployed, as well as at build time. My other reason for doing it is less happy. Cabal's handling of test suites sucks, requiring duplicated info, and even when that's done, it fails to preprocess hsc files here. Building it in avoids that and avoids having to explicitly tell cabal to enable test suites, which would then make it link the test executable every time, which is unnecessarily slow. This also has the benefit that now "make fast test" does a max speed build and tests it. --- Command/Test.hs | 33 +++++++++++++++++++++++++++++++++ GitAnnex.hs | 2 ++ Makefile | 22 ++++------------------ test.hs => Test.hs | 7 ++++++- debian/changelog | 6 ++++-- doc/git-annex.mdwn | 4 ++++ git-annex.cabal | 19 ++----------------- 7 files changed, 55 insertions(+), 38 deletions(-) create mode 100644 Command/Test.hs rename test.hs => Test.hs (99%) diff --git a/Command/Test.hs b/Command/Test.hs new file mode 100644 index 0000000000..839829e0af --- /dev/null +++ b/Command/Test.hs @@ -0,0 +1,33 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Test where + +import Common.Annex +import Command +import qualified Command.Init +import qualified Command.Add +import qualified Command.Drop +import qualified Command.Get +import qualified Command.Move +import qualified Command.Copy +import qualified Command.Sync +import qualified Command.Whereis +import qualified Command.Fsck +import qualified Test + +def :: [Command] +def = [noCommit $ noRepo showHelp $ dontCheck repoExists $ + command "test" paramNothing seek "run built-in test suite"] + +seek :: [CommandSeek] +seek = [withWords start] + +start :: [String] -> CommandStart +start _ = do + liftIO $ Test.main + stop diff --git a/GitAnnex.hs b/GitAnnex.hs index 8b8b4ad1bf..278a66358e 100644 --- a/GitAnnex.hs +++ b/GitAnnex.hs @@ -77,6 +77,7 @@ import qualified Command.WebApp import qualified Command.XMPPGit #endif #endif +import qualified Command.Test cmds :: [Command] cmds = concat @@ -135,6 +136,7 @@ cmds = concat , Command.XMPPGit.def #endif #endif + , Command.Test.def ] options :: [Option] diff --git a/Makefile b/Makefile index 4f5b526efa..3835436b28 100644 --- a/Makefile +++ b/Makefile @@ -47,22 +47,8 @@ install: build-stamp install-docs ln -sf git-annex $(DESTDIR)$(PREFIX)/bin/git-annex-shell runghc Build/InstallDesktopFile.hs $(PREFIX)/bin/git-annex || true -test: -# workaround for, apparently, a cabal bug - hsc2hs Utility/Touch.hsc - cabal configure --enable-tests - cabal build - rm -f Utility/Touch.hs - cabal test - -testcoverage: - rm -f test.tix test - $(GHC) $(GHCFLAGS) -outputdir tmp/testcoverage --make -fhpc test - ./test - @echo "" - @hpc report test --exclude=Main --exclude=QC - @hpc markup test --exclude=Main --exclude=QC --destdir=.hpc >/dev/null - @echo "(See .hpc/ for test coverage details.)" +test: git-annex + ./git-annex test # hothasktags chokes on some tempolate haskell etc, so ignore errors tags: @@ -86,7 +72,7 @@ docs: $(mans) --exclude='bugs/*' --exclude='todo/*' --exclude='forum/*' clean: - rm -rf tmp dist git-annex $(mans) test configure *.tix .hpc \ + rm -rf tmp dist git-annex $(mans) configure *.tix .hpc \ doc/.ikiwiki html dist build-stamp tags Build/SysConfig.hs sdist: clean $(mans) @@ -175,4 +161,4 @@ androidapp: $(MAKE) -C standalone/android cp standalone/android/source/term/bin/Term-debug.apk tmp/git-annex.apk -.PHONY: git-annex test install tags +.PHONY: git-annex install tags diff --git a/test.hs b/Test.hs similarity index 99% rename from test.hs rename to Test.hs index 87898b4b5b..6d010917e9 100644 --- a/test.hs +++ b/Test.hs @@ -1,12 +1,14 @@ {- git-annex test suite - - - Copyright 2010-2012 Joey Hess + - Copyright 2010-2013 Joey Hess - - Licensed under the GNU GPL version 3 or higher. -} {-# OPTIONS_GHC -fno-warn-orphans #-} +module Test where + import Test.HUnit import Test.HUnit.Tools import Test.QuickCheck @@ -939,6 +941,9 @@ unannexed = runchecks [checkregularfile, checkcontent, checkwritable] prepare :: IO () prepare = do + whenM (doesDirectoryExist) tmpdir $ + error $ "The temporary directory " ++ tmpdir ++ "already exists; cannot run test suite." + -- While PATH is mostly avoided, the commit hook does run it, -- and so does git_annex_output. Make sure that the just-built -- git annex is used. diff --git a/debian/changelog b/debian/changelog index 177da816a6..fa36003af2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -git-annex (4.20130217) UNRELEASED; urgency=low +git-annex (4.20130227) unstable; urgency=low * annex.version is now set to 4 for direct mode repositories. * Should now fully support git repositories with core.symlinks=false; @@ -24,8 +24,10 @@ git-annex (4.20130217) UNRELEASED; urgency=low log was out of date. * Makefile now builds using cabal, taking advantage of cabal's automatic detection of appropriate build flags. + * test: The test suite is now built into the git-annex binary, and can + be run at any time. - -- Joey Hess Sun, 17 Feb 2013 16:42:16 -0400 + -- Joey Hess Wed, 27 Feb 2013 14:07:24 -0400 git-annex (3.20130216) unstable; urgency=low diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 3b2af9cb5f..a05104fa88 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -506,6 +506,10 @@ subdirectories). With --force, even files whose content is not currently available will be rekeyed. Use with caution. +* test + + This runs git-annex's built-in test suite. + * xmppgit This command is used internally to perform git pulls over XMPP. diff --git a/git-annex.cabal b/git-annex.cabal index d4298612e0..3aad55e1a8 100644 --- a/git-annex.cabal +++ b/git-annex.cabal @@ -1,5 +1,5 @@ Name: git-annex -Version: 4.20130217 +Version: 4.20130227 Cabal-Version: >= 1.8 License: GPL Maintainer: Joey Hess @@ -63,7 +63,7 @@ Executable git-annex Main-Is: git-annex.hs Build-Depends: MissingH, hslogger, directory, filepath, unix, containers, utf8-string, network (>= 2.0), mtl (>= 2.1.1), - bytestring, old-locale, time, + bytestring, old-locale, time, testpack, HUnit, extensible-exceptions, dataenc, SHA, process, json, base (>= 4.5 && < 4.8), monad-control, transformers-base, lifted-base, IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance, process, @@ -128,21 +128,6 @@ Executable git-annex Build-Depends: dns CPP-Options: -DWITH_DNS -Test-Suite test - Type: exitcode-stdio-1.0 - Main-Is: test.hs - Build-Depends: testpack, HUnit, MissingH, hslogger, directory, filepath, - unix, containers, utf8-string, network, mtl (>= 2.1.1), bytestring, - old-locale, time, extensible-exceptions, dataenc, SHA, - process, json, base (>= 4.5 && < 4.7), monad-control, - transformers-base, lifted-base, IfElse, text, QuickCheck (>= 2.1), - bloomfilter, edit-distance, process, SafeSemaphore, - uuid, random, regex-compat - Other-Modules: Utility.Touch - Include-Dirs: Utility - C-Sources: Utility/libdiskfree.c - GHC-Options: -threaded - source-repository head type: git location: git://git-annex.branchable.com/