summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Silverstone <daniel.silverstone@codethink.co.uk>2017-05-13 15:14:47 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2017-07-02 11:56:43 +0100
commitaedd1964a467e4f9aaca49ca5fa2bb40a81e1ca8 (patch)
tree14891672f6f66442bfcbf72b1d33144d428c53bb
parent015aebc6b6227f9103977aa2824e5234fd25093f (diff)
downloadgitano-aedd1964a467e4f9aaca49ca5fa2bb40a81e1ca8.tar.gz
Add hook testsdsilvers/hooks
Basic hook tests which verify preauth commandline and post receive hooks.
-rw-r--r--Makefile14
-rw-r--r--plugins/testing-hooks.lua76
-rw-r--r--testing/01-hooks.yarn73
3 files changed, 156 insertions, 7 deletions
diff --git a/Makefile b/Makefile
index b5e3296..44d7db0 100644
--- a/Makefile
+++ b/Makefile
@@ -32,13 +32,13 @@ BINS := gitano-setup
TEST_BIN_NAMES := gitano-test-tool
-TESTS := 01-basics 02-commands-as 02-commands-config 02-commands-copy \
- 02-commands-count-objects 02-commands-create 02-commands-destroy \
- 02-commands-fsck 02-commands-gc 02-commands-graveyard \
- 02-commands-git-upload-archive 02-commands-group 02-commands-help \
- 02-commands-keyring \
- 02-commands-ls 02-commands-rename 02-commands-rsync \
- 02-commands-sshkey 02-commands-user 02-commands-whoami 03-cgit-support \
+TESTS := 01-basics 01-hooks 02-commands-as 02-commands-config 02-commands-copy \
+ 02-commands-count-objects 02-commands-create 02-commands-destroy \
+ 02-commands-fsck 02-commands-gc 02-commands-graveyard \
+ 02-commands-git-upload-archive 02-commands-group 02-commands-help \
+ 02-commands-keyring \
+ 02-commands-ls 02-commands-rename 02-commands-rsync \
+ 02-commands-sshkey 02-commands-user 02-commands-whoami 03-cgit-support \
03-shallow-push 03-treedelta-rules 03-force-pushing
diff --git a/plugins/testing-hooks.lua b/plugins/testing-hooks.lua
new file mode 100644
index 0000000..f428001
--- /dev/null
+++ b/plugins/testing-hooks.lua
@@ -0,0 +1,76 @@
+-- Plugin for testing hooks
+--
+-- This is a testing plugin which will not be installed as part of
+-- Gitano. Its purpose is to allow the test suite to verify various parts
+-- of the hooking system in Gitano.
+--
+-- Copyright 2017 Daniel Silverstone <daniel.silverstone@digital-scurf.org>
+-- All rights reserved.
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions
+-- are met:
+-- 1. Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+-- 2. Redistributions in binary form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in the
+-- documentation and/or other materials provided with the distribution.
+-- 3. Neither the name of the author nor the names of their contributors
+-- may be used to endorse or promote products derived from this software
+-- without specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+-- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+-- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+-- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+-- SUCH DAMAGE.
+
+local gitano = require "gitano"
+
+local function _check(what, hookname)
+ local aborts = "," .. (os.getenv("HOOK_"..what) or "") .. ","
+ return (aborts:find("," .. hookname .. ","))
+end
+
+local function _abort(...) return _check("ABORT", ...) end
+local function _decline(...) return _check("DECLINE", ...) end
+
+-- This function allows us to verify behaviour of the preauth_cmdline hook
+local function preauth_cmdline_hookfunc(cancel, ip, user, keytag, cmd, ...)
+ if _abort("PREAUTH_CMDLINE") then
+ return nil, "Aborted on request"
+ end
+ if _decline("PREAUTH_CMDLINE") then
+ return "stop", true, "Declined on request"
+ end
+ if os.getenv("PREAUTH_CMDLINE_REMOVEME") and cmd == "removeme" then
+ return "update", cancel, ip, user, keytag, ...
+ end
+ return "continue"
+end
+
+gitano.hooks.add(gitano.hooks.names.PREAUTH_CMDLINE,
+ 10, preauth_cmdline_hookfunc)
+
+-- This function is meant to allow us to check that the POST_RECEIVE hook works
+local function post_receive_hookfunc(repo, updates)
+ if _abort("POST_RECEIVE") then
+ return nil, "Aborted on request"
+ end
+ if _decline("POST_RECEIVE") then
+ io.stdout:write("HOOKFUNC_STOPPED")
+ io.stdout:flush()
+ return "stop"
+ end
+ return "continue"
+end
+
+-- We deliberately install the hook between core behaviour and supple
+gitano.hooks.add(gitano.hooks.names.POST_RECEIVE,
+ -100, post_receive_hookfunc)
diff --git a/testing/01-hooks.yarn b/testing/01-hooks.yarn
new file mode 100644
index 0000000..b3e4413
--- /dev/null
+++ b/testing/01-hooks.yarn
@@ -0,0 +1,73 @@
+<!-- -*- markdown -*- -->
+Basic hook support tests
+========================
+
+In these tests we verify the various hooks function at some basic level.
+
+For example, we check that we can abort some of the hooks and that we can
+alter behaviour or add behaviour to certain hooks which might commonly be
+used for the sorts of things plugins want.
+
+Preauthorization commandline hook
+---------------------------------
+
+The preauth_cmdline hook is used to allow plugins to adjust (or reject) the
+parsed command line before Gitano even looks up what command it might be for.
+This could be used to add aliases for certain commands, or just stop things
+from happening...
+
+ SCENARIO preauth_cmdline can be manipulated
+ GIVEN a standard instance
+
+ WHEN testinstance adminkey runs ls
+ THEN stdout contains gitano-admin
+
+ GIVEN HOOK_ABORT is in the environment set to PREAUTH_CMDLINE
+
+ WHEN testinstance adminkey, expecting failure, runs ls
+ THEN stderr contains Aborted on request
+
+ GIVEN HOOK_ABORT is not in the environment
+ AND HOOK_DECLINE is in the environment set to PREAUTH_CMDLINE
+
+ WHEN testinstance adminkey, expecting failure, runs ls
+ THEN stderr contains Declined on request
+
+ GIVEN HOOK_DECLINE is not in the environment
+ AND PREAUTH_CMDLINE_REMOVEME is in the environment set to 1
+
+ WHEN testinstance adminkey runs removeme ls
+ THEN stdout contains gitano-admin
+
+ GIVEN PREAUTH_CMDLINE_REMOVEME is not in the environment
+
+ WHEN testinstance adminkey, expecting failure, runs removeme ls
+ THEN stderr contains removeme
+
+ FINALLY the instance is torn down
+
+Post Receieve hook
+------------------
+
+The `POST_RECEIVE` hook allows plugins to perform actions during post-receive.
+This is after the commits have made it into the repository, and after the refs
+have been updated. The `POST_RECEIVE` hook gets given the set of updates which
+were applied to the repository and it gets to take action. Generally we don't
+recommend that hooks _stop_ the chain, but they can, which lets us do things
+like preventing Supple running.
+
+ SCENARIO supple isn't even considered when post_receive hooks "stop"
+ ASSUMING gitano is being accessed over ssh
+
+ GIVEN a standard instance
+ AND testinstance using adminkey has patched gitano-admin with post-receive-alert.patch
+ AND HOOK_DECLINE is in the environment set to POST_RECEIVE
+ WHEN testinstance using adminkey clones gitano-admin.git as gitano-admin
+ AND testinstance using adminkey pushes an empty commit in gitano-admin
+ WHEN testinstance using bypasskey pushes an empty commit in gitano-admin
+ THEN the output does not contain PERIL
+ AND the output does not contain CRITICAL FAILURE
+ AND the output does not contain XYZZY
+ AND the output contains HOOKFUNC_STOPPED
+
+ FINALLY the instance is torn down