git-lfs/test
2016-06-02 12:11:45 +01:00
..
cmd WriteHeader() must always come before Write() in ResponseWriter 2016-06-02 10:23:19 +01:00
git-lfs-test-server-api Keep batch structures private, simplify adapter creation 2016-06-02 12:11:45 +01:00
README.md lfs: use github.com/stretchr/testify for assertions 2016-05-25 10:43:10 -06:00
test-batch-error-handling.sh Always reveal underlying error 2015-10-05 23:55:03 -04:00
test-batch-transfer-unsupported.sh introduce calc_oid() helper for integration tests 2015-09-21 11:50:22 -06:00
test-batch-transfer.sh Add Test To Validate Capital Letters Work in URLs 2015-10-06 10:32:44 -04:00
test-checkout.sh echo messages help us track down the cause of test failures 2015-10-20 16:10:41 -06:00
test-chunked-transfer-encoding-batched.sh introduce calc_oid() helper for integration tests 2015-09-21 11:50:22 -06:00
test-chunked-transfer-encoding.sh introduce calc_oid() helper for integration tests 2015-09-21 11:50:22 -06:00
test-clean.sh update the shebang lines to use bash 2015-07-29 20:37:31 -06:00
test-clone.sh Add tests for cloning with flags 2016-04-19 15:15:58 +01:00
test-commit-delete-push.sh always use 'git rev-parse' to figure out git and working tree dirs 2016-02-01 11:20:32 -07:00
test-config.sh Allow for an access mechanism to be specified in the .lfsconfig file 2016-04-05 15:31:44 -04:00
test-credentials-no-prompt.sh test: useHttpPath in auth tests 2016-05-31 16:12:18 -06:00
test-credentials.sh update credential tests with good and bad tests for pushes and fetches 2016-04-08 14:16:48 -06:00
test-env.sh Add missing config details to env command 2016-05-12 16:03:03 +01:00
test-ext.sh LFS Extensions: use lfs.extension instead of lfs-ext 2015-08-01 21:13:37 -04:00
test-fetch.sh test: include fetch test for unclean paths 2016-06-01 14:49:58 -06:00
test-fsck.sh Fixed fsck tests on Windows - must use native_path 2015-10-22 16:16:58 +01:00
test-happy-path.sh remove exit and put tests in the right order 2015-10-27 07:22:23 -06:00
test-install.sh Add git lfs update --manual option & promote it on hook install fail 2016-04-26 12:04:55 +01:00
test-logs.sh update the shebang lines to use bash 2015-07-29 20:37:31 -06:00
test-ls-files.sh tweak ls-files output 2015-09-25 10:32:30 -06:00
test-pointer.sh Fix pointer test on Linux 2016-04-08 14:45:08 +01:00
test-pre-push.sh introduce an uploadContext struct to share in push and pre-push 2016-04-06 13:06:34 -06:00
test-prune-worktree.sh Move prune worktree test into its own file to improve git version skip 2015-10-15 15:30:27 +01:00
test-prune.sh Move prune worktree test into its own file to improve git version skip 2015-10-15 15:30:27 +01:00
test-pull.sh add 'lfs pull' test with unicode filename 2016-02-21 11:10:36 -07:00
test-push-bad-dns.sh push GIT_TERMINAL_PROMPT tests to separate file so they run only on git 2.3+ 2015-09-30 15:50:59 -07:00
test-push-failures.sh push GIT_TERMINAL_PROMPT tests to separate file so they run only on git 2.3+ 2015-09-30 15:50:59 -07:00
test-push-file-with-branch-name.sh Fix git rev-list when a file exists with the same name as the branch 2016-03-19 11:40:30 -07:00
test-push-legacy-failures.sh push GIT_TERMINAL_PROMPT tests to separate file so they run only on git 2.3+ 2015-09-30 15:50:59 -07:00
test-push.sh these assertions should be more specific 2016-04-07 11:28:51 -06:00
test-reference-clone.sh Add support for reference clone 2016-04-05 22:06:44 +03:00
test-smudge.sh Add test for smudge exit code with/without skip download errors 2016-05-10 13:03:20 +01:00
test-status.sh skip these tests if GIT_LFS_TEST_DIR is unset 2015-09-08 14:12:51 -06:00
test-submodule-lfsconfig.sh test lfsconfig behavior with git submodule update --init --remote 2016-01-29 13:47:21 -07:00
test-submodule.sh test lfsconfig behavior with git submodule update --init --remote 2016-01-29 13:47:21 -07:00
test-track.sh Skip track absolute test on Windows, MinGW bash doesn't pass rooted correctly 2016-03-15 15:10:19 +00:00
test-uninstall.sh Fix smudge/clean filters to work with filenames that have leading dashes 2016-03-17 14:46:18 -07:00
test-untrack.sh update the shebang lines to use bash 2015-07-29 20:37:31 -06:00
test-unusual-filenames.sh Add a failing test for filenames starting with dashes 2016-03-17 14:45:50 -07:00
test-update.sh Add git lfs update --manual option & promote it on hook install fail 2016-04-26 12:04:55 +01:00
test-worktree.sh Add missing config details to env command 2016-05-12 16:03:03 +01:00
test-zero-len-file.sh add an integration test for zero len files 2016-02-02 10:15:07 -07:00
testenv.sh Fix auto tempdir for GNU mktemp, needs X's (BSD doesn't) 2016-03-24 17:41:42 +00:00
testhelpers.sh script,test,debian: GO15VENDOREXPERIMENT=1 2016-05-23 15:03:25 -06:00
testlib.sh Trying to get SSL integration test working, having cert issues 2016-03-09 17:31:04 +00:00
testutils.go Refactor remaining local store state into localstorage pkg 2016-05-17 10:28:42 +01:00

Git LFS Tests

Git LFS uses two form of tests: unit tests for the internals written in Go, and integration tests that run git and git-lfs in a real shell environment. You can run them separately:

$ script/test        # Tests the Go packages.
$ script/integration # Tests the commands in shell scripts.

CI servers should always run both:

$ script/cibuild

Internal Package Tests

The internal tests use Go's builtin testing package.

You can run individual tests by passing arguments to script/test:

# test a specific Go package
$ script/test lfs

# pass other `go test` arguments
$ script/test lfs -run TestSuccessStatus -v
github.com/kr/text
github.com/cheggaaa/pb
github.com/rubyist/tracerx
github.com/kr/pretty
github.com/github/git-lfs/git
github.com/technoweenie/assert
=== RUN TestSuccessStatus
--- PASS: TestSuccessStatus (0.00 seconds)
PASS
ok  	_/Users/rick/github/git-lfs/lfs	0.011s

Integration Tests

Git LFS integration tests are shell scripts that test the git-lfs command from the shell. Each test file can be run individually, or in parallel through script/integration. Some tests will change the pwd, so it's important that they run in separate OS processes.

$ test/test-happy-path.sh
compile git-lfs for test/test-happy-path.sh
LFSTEST_URL=/Users/rick/github/git-lfs/test/remote/url LFSTEST_DIR=/Users/rick/github/git-lfs/test/remote lfstest-gitserver
test: happy path ...                                               OK
  1. The integration tests should not rely on global system or git config.
  2. The tests should be cross platform (Linux, Mac, Windows).
  3. Tests should bootstrap an isolated, clean environment. See the Test Suite section.
  4. Successful test runs should have minimal output.
  5. Failing test runs should dump enough information to diagnose the bug. This includes stdout, stderr, any log files, and even the OS environment.

There are a few environment variables that you can set to change the test suite behavior:

  • GIT_LFS_TEST_DIR=path - This sets the directory that is used as the current working directory of the tests. By default, this will be in your temp dir. It's recommended that this is set to a directory outside of any Git repository.
  • GIT_LFS_TEST_MAXPROCS=N - This tells script/integration how many tests to run in parallel. Default: 4.
  • KEEPTRASH=1 - This will leave the local repository data in a tmp directory and the remote repository data in test/remote.
  • SKIPCOMPILE=1 - This skips the Git LFS compilation step. Speeds up the tests when you're running the same test script multiple times without changing any Go code.

Test Suite

The testenv.sh script includes some global variables used in tests. This should be automatically included in every test/test-*.sh script and script/integration.

testhelpers.sh defines some shell functions. Most are only used in the test scripts themselves. script/integration uses the setup() and shutdown() functions.

testlib.sh is a fork of a lightweight shell testing lib that is used internally at GitHub. Only the test/test-*.sh scripts should include this.

Tests live in this ./test directory, and must have a unique name like: test-{name}.sh. All tests should start with a basic template. See test/test-happy-path.sh for an example.

#!/usr/bin/env bash

. "test/testlib.sh"

begin_test "template"
(
  set -e

  echo "your tests go here"
)
end_test

The set -e command will bail on the test at the first command that returns a non zero exit status. Use simple shell commands like grep as assertions.

The test suite has standard setup and shutdown functions that should be run only once. If a test script is run by script/integration, it will skip the functions. Setup does the following:

  • Resets temporary test directories.
  • Compiles git-lfs with the latest code changes.
  • Compiles Go files in test/cmd to bin, and adds them the PATH.
  • Spins up a test Git and Git LFS server so the entire push/pull flow can be exercised.
  • Sets up a git credential helper that always returns a set username and password.

The test Git server writes a test/remote/url file when it's complete. This file is how individual test scripts detect if script/integration is being run. You can fake this by manually spinning up the Git server using the lfstest-gitserver line that is output after Git LFS is compiled.

By default, temporary directories in tmp and the test/remote directory are cleared after test runs. Send the "KEEPTRASH" if you want to keep these files around for debugging failed tests.