sapling/tests/integration/test-hooks.t
Thomas Orozco 196a363236 mononoke: rebuild test framework
Summary:
Our test framework as it stands right now is a light passthrough to the hg `run-tests.py` test framework, which attempts to place all the files it needs to run (including tests) into a `python_binary`, then runs the hg test runner from that directory.

It heavily relies on how Buck works to offer functionality:

- It expects that all the sources it registers for its master binary will all be in the same directory when it builds
- It expects that the sources will be symlinks to the real files so that `--interactive` can work.

This has a few problems:

- It doesn't work in `mode/opt`. The archive that gets built in `mode/opt` doesn't actually have all the sources we registered, so it's impossible to run tests.
- To add a new test, you must rebuild everything. We don't do that very often, but it'd be nice if we didn't have to.
- Iterating on the runner itself is painful, because as far as Buck is concerned, it depends on the entire world. This means that every change to the runner has to scan a lot more stuff than necessary. There's some functionality I'd like to get into the runner (like reporting test timings) that hasn't been easy to add as a result.

This diff attempts to solve these problems by separating concerns a little more:

- The runner is now just a simple `python_binary`, so it's easier to make changes to it.
- The runner now provides the logic of working from local files when needed (this means you can add a new test and it'll work immediately),
- All the binaries we need are dependencies of the integration test target, not the runner's. However, to make it possible to run the runner incrementally while iterating on something, there's a manifest target that points at all the various paths the runner needs to work. This will also help integrate the test runner with other build frameworks if necessary (e.g. for open-sourcing).
- We have separate targets for various assets we need to run the tests (e.g. the hg test framework).
- The runner now controls whether to use the network blackhole. This was necessary because the network blackhole breaks PAR archives (because tmp is no longer owned by the right owner, because we use a user namespace). We should be able to bring this back at some point if we want to by using a proper chroot for opt tests.

I included a README to explain this new design as well.

There are some things that could yet stand to be improved here (notably, I think we should put assets and tests in different directories for the sake of clarity), but so far I've been aiming at providing a 1-1 translation of the old system into the new one. I am planning to make further improvements in followup diffs.

Reviewed By: farnz

Differential Revision: D15921732

fbshipit-source-id: 09052591c419acf97f7e360b1e88ef1f412da6e5
2019-06-25 08:41:31 -07:00

222 lines
6.9 KiB
Perl

$ . "${TEST_FIXTURES}/library.sh"
setup configuration
$ setup_mononoke_config
$ cd "$TESTTMP/mononoke-config"
$ cat >> repos/repo/server.toml <<CONFIG
> [[bookmarks]]
> name="master_bookmark"
> CONFIG
$ mkdir -p common/hooks
$ cat > common/hooks/file_size_hook.lua <<CONFIG
> hook = function (ctx)
> if ctx.file.len() > 10 then
> return false, "File is too large"
> end
> return true
> end
> CONFIG
$ register_hook file_size_hook common/hooks/file_size_hook.lua PerAddedOrModifiedFile <(
> echo 'bypass_commit_string="@allow_large_files"'
> )
$ cat > common/hooks/no_owners_file_deletes.lua <<CONFIG
> hook = function (ctx)
> for _, f in ipairs(ctx.files) do
> if f.is_deleted() and string.match(f.path, ".*OWNERS$") then
> return false, "Deletion of OWNERS files is not allowed"
> end
> end
> return true
> end
> CONFIG
$ register_hook no_owners_file_deletes common/hooks/no_owners_file_deletes.lua PerChangeset <(
> echo 'bypass_commit_string="@allow_delete_owners"'
> )
$ cat > common/hooks/no_owners2_file_deletes_pushvars.lua <<CONFIG
> hook = function (ctx)
> for _, f in ipairs(ctx.files) do
> if f.is_deleted() and string.match(f.path, ".*OWNERS2$") then
> return false, "Deletion of OWNERS files is not allowed"
> end
> end
> return true
> end
> CONFIG
$ register_hook no_owners2_file_deletes_pushvars common/hooks/no_owners2_file_deletes_pushvars.lua PerChangeset <(
> echo 'bypass_pushvar="ALLOW_DELETE_OWNERS=true"'
> )
$ setup_common_hg_configs
$ cd $TESTTMP
setup common configuration
$ cat >> $HGRCPATH <<EOF
> [ui]
> ssh="$DUMMYSSH"
> EOF
setup repo
$ hg init repo-hg
$ cd repo-hg
$ setup_hg_server
$ hg debugdrawdag <<EOF
> C
> |
> B
> |
> A
> EOF
create master bookmark
$ hg bookmark master_bookmark -r tip
blobimport them into Mononoke storage and start Mononoke
$ cd ..
$ blobimport repo-hg/.hg repo
start mononoke
$ mononoke
$ wait_for_mononoke $TESTTMP/repo
Clone the repo
$ hgclone_treemanifest ssh://user@dummy/repo-hg repo2 --noupdate --config extensions.remotenames= -q
$ cd repo2
$ setup_hg_client
$ cat >> .hg/hgrc <<EOF
> [extensions]
> pushrebase =
> remotenames =
> EOF
$ hg up -q 0
$ echo 1 > 1 && hg add 1 && hg ci -m 1
$ hgmn push -r . --to master_bookmark -q
Delete a file, make sure that file_size_hook is not called on deleted files
$ hgmn up -q tip
$ hg rm 1
$ hg ci -m 'delete a file'
$ hgmn push -r . --to master_bookmark
pushing rev 8ecfb5e6aa64 to destination ssh://user@dummy/repo bookmark master_bookmark
searching for changes
adding changesets
adding manifests
adding file changes
added 0 changesets with 0 changes to 0 files
updating bookmark master_bookmark
Add OWNERS file, then delete it. Make sure deletion is not allowed
$ touch OWNERS && hg add OWNERS && hg ci -m 'add OWNERS'
$ hgmn push -r . --to master_bookmark -q
$ hg rm OWNERS
$ hg ci -m 'remove OWNERS'
$ hgmn push -r . --to master_bookmark
pushing rev 2d1a0bcf73ee to destination ssh://user@dummy/repo bookmark master_bookmark
searching for changes
remote: Command failed
remote: Error:
remote: hooks failed:
remote: no_owners_file_deletes for 2d1a0bcf73ee48cde9073fd52b6bbb71e4459c9b: Deletion of OWNERS files is not allowed
remote: Root cause:
remote: ErrorMessage {
remote: msg: "hooks failed:\nno_owners_file_deletes for 2d1a0bcf73ee48cde9073fd52b6bbb71e4459c9b: Deletion of OWNERS files is not allowed",
remote: }
abort: stream ended unexpectedly (got 0 bytes, expected 4)
[255]
Bypass owners check
$ cat >> .hg/hgrc <<CONFIG
> [extensions]
> amend=
> CONFIG
$ hg amend -m 'remove OWNERS\n@allow_delete_owners'
$ hgmn push -r . --to master_bookmark
pushing rev 67730b0d6122 to destination ssh://user@dummy/repo bookmark master_bookmark
searching for changes
adding changesets
adding manifests
adding file changes
added 0 changesets with 0 changes to 0 files
updating bookmark master_bookmark
Add OWNERS2 file. This time bypass it with pushvars
$ touch OWNERS2 && hg ci -Aqm 'add OWNERS2'
$ hgmn push -r . --to master_bookmark -q
$ hg rm OWNERS2
$ hg ci -m 'remove OWNERS2'
$ hgmn push -r . --to master_bookmark
pushing rev 55334cb4e1e4 to destination ssh://user@dummy/repo bookmark master_bookmark
searching for changes
remote: Command failed
remote: Error:
remote: hooks failed:
remote: no_owners2_file_deletes_pushvars for 55334cb4e1e487f6de665629326eb1aaddccde53: Deletion of OWNERS files is not allowed
remote: Root cause:
remote: ErrorMessage {
remote: msg: "hooks failed:\nno_owners2_file_deletes_pushvars for 55334cb4e1e487f6de665629326eb1aaddccde53: Deletion of OWNERS files is not allowed",
remote: }
abort: stream ended unexpectedly (got 0 bytes, expected 4)
[255]
$ hgmn push -r . --to master_bookmark --pushvars "ALLOW_DELETE_OWNERS=true"
pushing rev 55334cb4e1e4 to destination ssh://user@dummy/repo bookmark master_bookmark
searching for changes
adding changesets
adding manifests
adding file changes
added 0 changesets with 0 changes to 0 files
updating bookmark master_bookmark
Send large file
$ hg up -q 0
$ echo 'aaaaaaaaaaa' > largefile
$ hg ci -Aqm 'largefile'
$ hgmn push -r . --to master_bookmark
pushing rev 3e0db158edcc to destination ssh://user@dummy/repo bookmark master_bookmark
searching for changes
remote: Command failed
remote: Error:
remote: hooks failed:
remote: file_size_hook for 3e0db158edcc82d93b971f44c13ac74836db5714: File is too large
remote: Root cause:
remote: ErrorMessage {
remote: msg: "hooks failed:\nfile_size_hook for 3e0db158edcc82d93b971f44c13ac74836db5714: File is too large",
remote: }
abort: stream ended unexpectedly (got 0 bytes, expected 4)
[255]
Bypass large file hook
$ hg amend -m '@allow_large_files'
$ hgmn push -r . --to master_bookmark
pushing rev 51fea0e7527d to destination ssh://user@dummy/repo bookmark master_bookmark
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 0 changes to 0 files
updating bookmark master_bookmark
Send large file inside a directory
$ hg up -q 0
$ mkdir dir/
$ echo 'aaaaaaaaaaa' > dir/largefile
$ hg ci -Aqm 'dir/largefile'
$ hgmn push -r . --to master_bookmark
pushing rev cbc62a724366 to destination ssh://user@dummy/repo bookmark master_bookmark
searching for changes
remote: Command failed
remote: Error:
remote: hooks failed:
remote: file_size_hook for cbc62a724366fbea4663ca3e1f1a834af9f2f992: File is too large
remote: Root cause:
remote: ErrorMessage {
remote: msg: "hooks failed:\nfile_size_hook for cbc62a724366fbea4663ca3e1f1a834af9f2f992: File is too large",
remote: }
abort: stream ended unexpectedly (got 0 bytes, expected 4)
[255]