|  | #!/bin/sh | 
|  |  | 
|  | test_description='external credential helper tests | 
|  |  | 
|  | This is a tool for authors of external helper tools to sanity-check | 
|  | their helpers. If you have written the "git-credential-foo" helper, | 
|  | you check it with: | 
|  |  | 
|  | make GIT_TEST_CREDENTIAL_HELPER=foo t0303-credential-external.sh | 
|  |  | 
|  | This assumes that your helper is capable of both storing and | 
|  | retrieving credentials (some helpers may be read-only, and they will | 
|  | fail these tests). | 
|  |  | 
|  | Please note that the individual tests do not verify all of the | 
|  | preconditions themselves, but rather build on each other. A failing | 
|  | test means that tests later in the sequence can return false "OK" | 
|  | results. | 
|  |  | 
|  | If your helper supports time-based expiration with a configurable | 
|  | timeout, you can test that feature with: | 
|  |  | 
|  | make GIT_TEST_CREDENTIAL_HELPER=foo \ | 
|  | GIT_TEST_CREDENTIAL_HELPER_TIMEOUT="foo --timeout=1" \ | 
|  | t0303-credential-external.sh | 
|  |  | 
|  | If your helper requires additional setup before the tests are started, | 
|  | you can set GIT_TEST_CREDENTIAL_HELPER_SETUP to a sequence of shell | 
|  | commands. | 
|  | ' | 
|  |  | 
|  | . ./test-lib.sh | 
|  | . "$TEST_DIRECTORY"/lib-credential.sh | 
|  |  | 
|  | # If we're not given a specific external helper to run against, | 
|  | # there isn't much to test. But we can still run through our | 
|  | # battery of tests with a fake helper and check that the | 
|  | # test themselves are self-consistent and clean up after | 
|  | # themselves. | 
|  | # | 
|  | # We'll use the "store" helper, since we can easily inspect | 
|  | # its state by looking at the on-disk file. But since it doesn't | 
|  | # implement any caching or expiry logic, we'll cheat and override | 
|  | # the "check" function to just report all results as OK. | 
|  | if test -z "$GIT_TEST_CREDENTIAL_HELPER"; then | 
|  | GIT_TEST_CREDENTIAL_HELPER=store | 
|  | GIT_TEST_CREDENTIAL_HELPER_TIMEOUT=store | 
|  | check () { | 
|  | test "$1" = "approve" || return 0 | 
|  | git -c credential.helper=store credential approve | 
|  | } | 
|  | check_cleanup=t | 
|  | fi | 
|  |  | 
|  | test -z "$GIT_TEST_CREDENTIAL_HELPER_SETUP" || | 
|  | eval "$GIT_TEST_CREDENTIAL_HELPER_SETUP" | 
|  |  | 
|  | # clean before the test in case there is cruft left | 
|  | # over from a previous run that would impact results | 
|  | helper_test_clean "$GIT_TEST_CREDENTIAL_HELPER" | 
|  |  | 
|  | helper_test "$GIT_TEST_CREDENTIAL_HELPER" | 
|  | helper_test_password_expiry_utc "$GIT_TEST_CREDENTIAL_HELPER" | 
|  | helper_test_oauth_refresh_token "$GIT_TEST_CREDENTIAL_HELPER" | 
|  |  | 
|  | if test -z "$GIT_TEST_CREDENTIAL_HELPER_TIMEOUT"; then | 
|  | say "# skipping timeout tests (GIT_TEST_CREDENTIAL_HELPER_TIMEOUT not set)" | 
|  | else | 
|  | helper_test_timeout "$GIT_TEST_CREDENTIAL_HELPER_TIMEOUT" | 
|  | fi | 
|  |  | 
|  | # clean afterwards so that we are good citizens | 
|  | # and don't leave cruft in the helper's storage, which | 
|  | # might be long-term system storage | 
|  | helper_test_clean "$GIT_TEST_CREDENTIAL_HELPER" | 
|  |  | 
|  | if test "$check_cleanup" = "t" | 
|  | then | 
|  | test_expect_success 'test cleanup removes everything' ' | 
|  | test_must_be_empty "$HOME/.git-credentials" | 
|  | ' | 
|  | fi | 
|  |  | 
|  | test_done |