├── .travis.yml ├── Dockerfile ├── Makefile ├── README.md ├── bin ├── await ├── dynamodb_check ├── memcached_check ├── mongo_check ├── mysql_check ├── redis_check └── s3_check ├── docker-compose.yml ├── script └── ci │ └── deploy └── test └── await_test.bats /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | 3 | services: 4 | - docker 5 | 6 | script: 7 | - make test-ci 8 | 9 | deploy: 10 | provider: script 11 | script: script/ci/deploy 12 | on: 13 | branch: master 14 | 15 | env: 16 | global: 17 | - secure: "YhUW5Pxvx9N0tRtp7mmYd+9kpdmEUIjLN0SXjZjyChlfaw1zb3fEHc83S1vuFuOlBVwFlZmRUgVcU8oTQO6OD3DBJ+JKmHMl4i0P+XYcBLN3NNbNXDbs8F9m30Cgioi6HTMn++X3j0VtLnEVcVdnqYDIXcne2fxjJ4ApvB8u2qX/f8FiFANY0WHhXsoP+yV1zX7+S2tTF4JazgMfDxgm4jnQucdZ0+7g6t04Le501VuZCm7MXpsWKQ3ZxcM6TmAwzO52CUBzZEmvu4TlNEZmR7VDAPfm4AgTm5gFrNkkHIxM4Ah+hJvltOdzqmlGsPsu6neot2Wx+M2jmSa9319FmpZ+MNygnQ0pie9njdBIB5djWZRrDKhFLv7QCwOEQzS9SeTG5v3Qab5AWKPpRWGLDeaHliTVScyRMFFsMf0N87lzHW0l5iHV2Mx19RIPoMLoq+CJv5pZIuXaYxpwAbsHJLjf3j4IUmKpveUVtymsgYywF3Zt4+zh6KsHicw/MfLIZ4AlsQG7iCPkn0X8ZJt0bNStrTXS7zeXRSch4BQQSxDtYpvoZtfHU4pbnwTQX1iWBPHZsAN9bWfSoX/ykVDP9+RySDH+zsVWl14h28cGnsiS6cPtups6Fc9rlZrLg7WzrCdSjRjFfkBnO5LRjIdJcqcuvrevQFSTT6oYObBFwBQ=" 18 | - secure: "d1Pn9eFqcHcj2jP/Y7WzulDZJ1qNJxub8GjzyyPqfL1RzQXw6BkRbf4od+b8WD6eRwGGjOMsH6XtasVPreU85hVKsOz3z0o90aBilMcZe9tSZA1xZ3Z6t98vaDCHA35O8mJHZB7NA3tOrKE9o3foZaJQgSUqfi4smXt4UKHK2hAdck0T+ZJOzeKabYY64EDVQamDEdxcOhU3ZubDyMSlG3PT/rT7wB9RMmios4pAiW/PfF3HH2+EbV937NAB3Dk1faMLsXAFFKV+yzvmfdgw60gCLQNckNLs5puzAvpHooLKIA9vo2hqAZmHd0DrIPQ7e9KXla4F3RiWOa/jTyA2FFjA5ZmgSejU/7FO1sxRHRMI0X84t1y+/wu9mxdAYEGw4iFmnLHr+h898TuzsJXAm9NXcDRAz53p+aztDz5R59jhV6ZtgsaVnBWYRHB4WxLP1OwWjuPhvYKy47jb1FzMpV//EIZtE4in/viVKBJdYzAvdh9Mlyj2fPAaq/XoUqJwg3vE005+iy6hP41eqr26Ek02cy0gzLvXMJv+T4TqHTLwLQ2+grzmW+2JtJphLnwqK+PiTM1MW183T8nQQsH44niUjhY/bPruPL6ST8H0J+PnmiEO2DbEi058yC+V287Gj9cVmcK9s+CJJyK3YEqy6i5maZrVtfFOj7pUeybqUvs=" 19 | - secure: "GCH9VdUofBxlRK15NniBkpxOHwFXdzkwK5/VQtuiQT6i1lliS0h2fakC+43Ife3tgUzf/w3Awmn5hVXBx3VZfMJ9NK79N+pD6pl+ZBTk5BuOh37zUBnNljTj+io99WIlGqXrTqxkWGJ/qaIm+2Ifk+EmyrhcfHFNu3J5mWY3kdIC784q7Svcapqv5n/L8G8uRWK3a/ORx2nmtNE0OzsQ6CNLBhDr3yWt/qFsrrqDBcDeHwG9RnrF7rDsrJzCSOj8JRdEy/MLA1eBu0UIsHEe0EEGnTOx1pJ1puLZWZ/pbXzEANTKp3hDdVjGSpysY4ElIAM0X3oIOmJLlIbvtUChZG8QObD2+TypAwWL2Ul4H4oKtgxHKpK4WF3qExM1NAZVVyeL9uHf9tyria+bo37Oh7luD1bCgB40ED/zNIhaTxjovtTk/CoexNAGexefXQhrLUNNYiDFiywDF712CQaHtzOf55736U2WMveCP8BI5YSeGfJeGRskpUNom40znyI4o+GU3DpNhBt9YRaZd/P0NnIGNk7MUEfk8j1s+NNIWPjjC+pJRps8pkHPCYnEook73/Y7WuFZesc6ikeymTTJCwCSRT16q72EgOj4yfyrxlIknmz/aCtn5OFYG0Um3s1xlG7F2r4oYXHS9LO47MjIPEVYo/gqz6Jm6394nefIwYQ=" 20 | - COMMIT=${TRAVIS_COMMIT::8} 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.5 2 | 3 | RUN echo http://dl-cdn.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories \ 4 | && apk add --update --no-cache \ 5 | bash \ 6 | bats \ 7 | curl \ 8 | py2-pip \ 9 | && pip install \ 10 | boto3 \ 11 | pymemcache \ 12 | pymongo \ 13 | PyMySQL \ 14 | redis \ 15 | awscli 16 | 17 | RUN mkdir -p /usr/src/await/bin /usr/src/await/test 18 | WORKDIR /usr/src/await 19 | 20 | COPY bin /usr/src/await/bin/ 21 | COPY test /usr/src/await/test/ 22 | 23 | ENV PATH /usr/src/await/bin:$PATH 24 | 25 | CMD [ "await", "--help" ] 26 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .DEFAULT_GOAL := test-ci 2 | 3 | REPO := saltside/await 4 | 5 | # Version 6 | VERSION := 0.1.1 7 | MAJOR := $(word 1, $(subst ., ,$(VERSION))) 8 | MINOR := $(word 2, $(subst ., ,$(VERSION))) 9 | 10 | BIN_FILES := $(wildcard bin/*) 11 | TEST_FILES := $(wildcard test/*.bats) 12 | 13 | ENVIRONMENT := tmp/environment 14 | 15 | $(ENVIRONMENT): docker-compose.yml Dockerfile 16 | $(ENVIRONMENT): $(BIN_FILES) $(TEST_FILES) 17 | docker-compose build 18 | docker-compose up -d mongodb redis http dynamodb mysql memcached 19 | mkdir -p $(@D) 20 | touch $@ 21 | 22 | .PHONY: build 23 | build: $(ENVIRONMENT) 24 | 25 | .PHONY: test-bin 26 | test-bin: build 27 | docker-compose run --rm await bats $(TEST_FILES) 28 | 29 | .PHONY: test-lint 30 | test-lint: 31 | docker run --rm -v $(CURDIR):/data:ro -w /data nlknguyen/alpine-shellcheck \ 32 | bin/await 33 | 34 | .PHONY: test-ci 35 | test-ci: test-lint test-bin 36 | 37 | .PHONY: clean 38 | clean: 39 | docker-compose down 40 | rm -rf $(ENVIRONMENT) 41 | 42 | .PHONY: push 43 | push: 44 | docker build -f Dockerfile -t $(REPO):$(VERSION) . 45 | docker tag $(REPO):$(VERSION) latest 46 | docker tag $(REPO):$(VERSION) $(REPO):$(MAJOR) 47 | docker tag $(REPO):$(VERSION) $(REPO):$(MAJOR).$(MINOR) 48 | docker push $(REPO) 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Status 2 | 3 | [![Build Status](https://travis-ci.org/Saltside/await.svg?branch=master)](https://travis-ci.org/Saltside/await) 4 | 5 | ## Overview 6 | 7 | ## Resources 8 | * http 9 | * redis 10 | * mongodb 11 | * dynamodb 12 | * mysql 13 | * memcached 14 | 15 | ## Usage 16 | 17 | ## FAQ's 18 | 19 | ## Comments 20 | 21 | 22 | -------------------------------------------------------------------------------- /bin/await: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | usage() { 6 | cat <<'EOF' 7 | 8 | USAGE: await [-r RETRIES -i INTERVAL ] [ URI | "cmd" ] [ -- EXTRA_OPTS ] 9 | 10 | Forms: 11 | 12 | await [ -r RETRIES -i INTERVAL ] http://host:port -- [ CURL_OPTS ] 13 | await [ -r RETRIES -i INTERVAL ] https://host:port -- [ CURL_OPTS ] 14 | await [ -r RETRIES -i INTERVAL ] mongodb://host:port -- [ -t SELECTION_TIMEOUT ] 15 | await [ -r RETRIES -i INTERVAL ] redis://host:port -- [ -t CONNECTION_TIMEOUT ] 16 | await [ -r RETRIES -i INTERVAL ] memcached://host:port -- [ -t CONNECTION_TIMEOUT ] 17 | await [ -r RETRIES -i INTERVAL ] mysql://user:password@host:port -- [ -t CONNECTION_TIMEOUT ] 18 | await [ -r RETRIES -i INTERVAL ] dynamodb://host:port -- [ -t CONNECTION_TIMEOUT ] 19 | await [ -r RETRIES -i INTERVAL ] http://host:port -- [ -t CONNECTION_TIMEOUT ] 20 | await [ -r RETRIES -i INTERVAL ] cmd -- COMMAND [ OPTIONS ] 21 | EOF 22 | } 23 | 24 | await() { 25 | local retries="${1}" interval="${2}" counter=0 26 | local log 27 | log="$(mktemp)" 28 | 29 | shift 3 # 3 for -- 30 | 31 | while [ "${counter}" -lt "${retries}" ]; do 32 | if "$@" > /dev/null 2> "${log}"; then 33 | echo "OK!" 34 | return 0 35 | else 36 | # NOTE: The pre-increment usage. This makes the arithmatic expression 37 | # always exit 0. The post-increment form exits non-zero when counter 38 | # is zero. More information here: http://wiki.bash-hackers.org/syntax/arith_expr#arithmetic_expressions_and_return_codes 39 | ((++counter)) 40 | sleep "${interval}" 41 | fi 42 | done 43 | 44 | echo "failed with ${counter} retry(s)." 1>&2 45 | echo 1>&2 46 | cat "${log}" 1>&2 47 | return 2 48 | } 49 | 50 | main() { 51 | local retries=60 interval=1 52 | 53 | while getopts ":r:i:" opt; do 54 | case "${opt}" in 55 | r) 56 | retries="${OPTARG}" 57 | ;; 58 | i) 59 | interval="${OPTARG}" 60 | ;; 61 | \?) 62 | echo "Invalid option: -${OPTARG}" 1>&2 63 | return 1 64 | ;; 65 | :) 66 | echo "Option -${OPTARG} requires an argument." 1>&2 67 | return 1 68 | ;; 69 | esac 70 | done 71 | 72 | shift $((OPTIND-1)) 73 | 74 | local uri="${1:-}" 75 | shift 76 | 77 | # Shift off the -- used to separate await options from per-case connection 78 | # options. optparse does not do this in our case because we mix positional 79 | # and flag arguments. 80 | if [ "${1:-}" = '--' ]; then 81 | shift 82 | fi 83 | 84 | case "${uri}" in 85 | http://*|https://*) 86 | await "${retries}" "${interval}" -- curl -s --fail "$@" "${uri}" 87 | ;; 88 | mongodb://*) 89 | await "${retries}" "${interval}" -- mongo_check "$@" "${uri}" 90 | ;; 91 | redis://*) 92 | await "${retries}" "${interval}" -- redis_check "$@" "${uri}" 93 | ;; 94 | dynamodb://*) 95 | await "${retries}" "${interval}" -- dynamodb_check "$@" "${uri}" 96 | ;; 97 | mysql://*) 98 | await "${retries}" "${interval}" -- mysql_check "$@" "${uri}" 99 | ;; 100 | memcached://*) 101 | await "${retries}" "${interval}" -- memcached_check "$@" "${uri}" 102 | ;; 103 | http://*) 104 | await "${retries}" "${interval}" -- s3_check "$@" "${uri}" 105 | ;; 106 | cmd) 107 | if [ $# -ne 0 ]; then 108 | await "${retries}" "${interval}" -- "$@" 109 | else 110 | usage 1>&2 111 | return 1 112 | fi 113 | ;; 114 | *) 115 | usage 1>&2 116 | return 1 117 | ;; 118 | esac 119 | } 120 | 121 | main "$@" 122 | -------------------------------------------------------------------------------- /bin/dynamodb_check: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | import argparse 3 | from urlparse import urlparse 4 | import boto3 5 | from botocore.client import Config 6 | 7 | 8 | def main(args): 9 | parts = urlparse(args.url) 10 | 11 | config = Config(connect_timeout=args.timeout, 12 | read_timeout=args.timeout) 13 | 14 | if parts.port: 15 | port = parts.port 16 | else: 17 | port = 8000 18 | 19 | client = boto3.client("dynamodb", 20 | region_name="eu-west-1", 21 | aws_access_key_id="fake", 22 | aws_secret_access_key="fake", 23 | endpoint_url="http://%s:%s" % (parts.hostname, port), 24 | config=config) 25 | 26 | client.list_tables() 27 | 28 | if __name__ == "__main__": 29 | parser = argparse.ArgumentParser(description="Check dynamodb connection.") 30 | 31 | parser.add_argument("url", nargs="?") 32 | parser.add_argument("-t", "--timeout", type=int, nargs="?", 33 | default=1, 34 | help="timeout in seconds (default: 1)") 35 | 36 | args = parser.parse_args() 37 | main(args) 38 | -------------------------------------------------------------------------------- /bin/memcached_check: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | import argparse 3 | from urlparse import urlparse 4 | from pymemcache.client.base import Client 5 | 6 | 7 | def main(args): 8 | parts = urlparse(args.url) 9 | 10 | if parts.port: 11 | port = parts.port 12 | else: 13 | port = 11211 14 | 15 | client = Client((parts.hostname, port), 16 | connect_timeout=args.timeout, 17 | timeout=args.timeout) 18 | 19 | client.stats() 20 | 21 | if __name__ == "__main__": 22 | parser = argparse.ArgumentParser(description="Check memcached connection.") 23 | 24 | parser.add_argument("url", nargs="?") 25 | parser.add_argument("-t", "--timeout", type=int, nargs="?", 26 | default=1, 27 | help="timeout in seconds (default: 1)") 28 | 29 | args = parser.parse_args() 30 | main(args) 31 | -------------------------------------------------------------------------------- /bin/mongo_check: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | import argparse 3 | import pymongo 4 | 5 | 6 | def main(args): 7 | timeout = args.timeout * 1000 8 | 9 | client = pymongo.MongoClient( 10 | args.url, 11 | serverSelectionTimeoutMS=timeout) 12 | 13 | client.server_info() 14 | 15 | if __name__ == "__main__": 16 | parser = argparse.ArgumentParser(description="Check mongodb connection.") 17 | 18 | parser.add_argument("url", nargs="?") 19 | parser.add_argument("-t", "--timeout", type=float, nargs="?", 20 | default=1, 21 | help="timeout in seconds (default: 1)") 22 | 23 | args = parser.parse_args() 24 | main(args) 25 | -------------------------------------------------------------------------------- /bin/mysql_check: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | import argparse 3 | from urlparse import urlparse 4 | import pymysql.cursors 5 | 6 | 7 | def main(args): 8 | parts = urlparse(args.url) 9 | 10 | connection = pymysql.connect( 11 | host=parts.hostname, 12 | port=parts.port, 13 | user=parts.username, 14 | password=parts.password, 15 | connect_timeout=args.timeout) 16 | 17 | connection.ping() 18 | 19 | if __name__ == "__main__": 20 | parser = argparse.ArgumentParser(description="Check mysql connection.") 21 | 22 | parser.add_argument("url", nargs="?") 23 | parser.add_argument("-t", "--timeout", type=int, nargs="?", 24 | default=1, 25 | help="timeout in seconds (default: 1)") 26 | 27 | args = parser.parse_args() 28 | main(args) 29 | -------------------------------------------------------------------------------- /bin/redis_check: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | import argparse 3 | import redis 4 | 5 | 6 | def main(args): 7 | connection = redis.from_url(args.url, socket_connect_timeout=args.timeout) 8 | 9 | connection.ping() 10 | 11 | if __name__ == "__main__": 12 | parser = argparse.ArgumentParser(description="Check redis connection.") 13 | 14 | parser.add_argument("url", nargs="?") 15 | parser.add_argument("-t", "--timeout", type=float, nargs="?", 16 | default=1, 17 | help="timeout in seconds (default: 1)") 18 | 19 | args = parser.parse_args() 20 | main(args) 21 | -------------------------------------------------------------------------------- /bin/s3_check: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | import argparse 3 | from urlparse import urlparse 4 | import boto3 5 | from botocore.client import Config 6 | 7 | 8 | def main(args): 9 | parts = urlparse(args.url) 10 | 11 | config = Config(connect_timeout=args.timeout, 12 | read_timeout=args.timeout) 13 | 14 | if parts.port: 15 | port = parts.port 16 | else: 17 | port = 4572 18 | 19 | client = boto3.client("s3", 20 | aws_access_key_id="fake", 21 | aws_secret_access_key="fake", 22 | endpoint_url="http://%s:%s" % (parts.hostname, port), 23 | config=config) 24 | 25 | client.list_buckets() 26 | 27 | if __name__ == "__main__": 28 | parser = argparse.ArgumentParser(description="Check s3 connection.") 29 | 30 | parser.add_argument("url", nargs="?") 31 | parser.add_argument("-t", "--timeout", type=int, nargs="?", 32 | default=1, 33 | help="timeout in seconds (default: 1)") 34 | 35 | args = parser.parse_args() 36 | main(args) 37 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | mongodb: 4 | image: mongo:3 5 | 6 | redis: 7 | image: redis:latest 8 | 9 | http: 10 | image: nginx:latest 11 | 12 | dynamodb: 13 | image: deangiberson/aws-dynamodb-local:latest 14 | 15 | mysql: 16 | image: mysql 17 | environment: 18 | MYSQL_ROOT_PASSWORD: secret 19 | MYSQL_DATABASE: mydb 20 | 21 | memcached: 22 | image: memcached 23 | 24 | await: 25 | image: saltside/await 26 | build: . 27 | -------------------------------------------------------------------------------- /script/ci/deploy: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | docker login -e "${DOCKER_EMAIL}" -u "${DOCKER_USER}" -p "${DOCKER_PASS}" 6 | 7 | make push 8 | -------------------------------------------------------------------------------- /test/await_test.bats: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bats 2 | 3 | @test "successful redis connection" { 4 | run await redis://redis 5 | [ $status -eq 0 ] 6 | 7 | run await -r 1 redis://redis 8 | [ $status -eq 0 ] 9 | 10 | run await -i 0.5 redis://redis 11 | [ $status -eq 0 ] 12 | 13 | run await -r 1 -i 0.5 redis://redis 14 | [ $status -eq 0 ] 15 | 16 | run await -r 1 -i 0.5 redis://redis -- -t 1 17 | [ $status -eq 0 ] 18 | 19 | run await -r 1 -i 0.5 redis://redis -- --timeout 1 20 | [ $status -eq 0 ] 21 | } 22 | 23 | @test "unsuccessful redis connection" { 24 | run await -r 2 redis://unknown 25 | [ $status -eq 2 ] 26 | } 27 | 28 | @test "successful mongodb connection" { 29 | run await mongodb://mongodb 30 | [ $status -eq 0 ] 31 | 32 | run await -r 1 mongodb://mongodb 33 | [ $status -eq 0 ] 34 | 35 | run await -i 0.5 mongodb://mongodb 36 | [ $status -eq 0 ] 37 | 38 | run await -r 1 -i 0.5 mongodb://mongodb 39 | [ $status -eq 0 ] 40 | 41 | run await -r 1 -i 0.5 mongodb://mongodb -- -t 1 42 | [ $status -eq 0 ] 43 | 44 | run await mongodb://mongodb -- -t 1 45 | [ $status -eq 0 ] 46 | 47 | run await mongodb://mongodb -- --timeout 1 48 | [ $status -eq 0 ] 49 | } 50 | 51 | @test "unsuccessful mongodb connection" { 52 | run await -r 2 mongodb://unknown 53 | [ $status -eq 2 ] 54 | } 55 | 56 | @test "successful http connection" { 57 | run await http://http 58 | [ $status -eq 0 ] 59 | 60 | run await -r 5 http://http 61 | [ $status -eq 0 ] 62 | 63 | run await -i 0.5 http://http 64 | [ $status -eq 0 ] 65 | 66 | run await -r 5 -i 0.5 http://http 67 | [ $status -eq 0 ] 68 | 69 | run await -- http://http -m 5 70 | [ $status -eq 0 ] 71 | 72 | run await -r 2 -i 0.5 -- http://http -m 5 73 | [ $status -eq 0 ] 74 | } 75 | 76 | @test "unsuccessful http connection" { 77 | run await -r 2 http://unknown 78 | [ $status -eq 2 ] 79 | } 80 | 81 | @test "successful dynamodb connection" { 82 | run await dynamodb://dynamodb:8000 83 | [ $status -eq 0 ] 84 | 85 | run await -r 2 dynamodb://dynamodb:8000 86 | [ $status -eq 0 ] 87 | 88 | run await -i 0.5 dynamodb://dynamodb:8000 89 | [ $status -eq 0 ] 90 | 91 | run await -r 2 -i 0.5 dynamodb://dynamodb:8000 92 | [ $status -eq 0 ] 93 | 94 | run await -r 2 -i 0.5 dynamodb://dynamodb:8000 -- -t 1 95 | [ $status -eq 0 ] 96 | 97 | run await dynamodb://dynamodb:8000 -- -t 1 98 | [ $status -eq 0 ] 99 | 100 | run await dynamodb://dynamodb:8000 -- --timeout 1 101 | [ $status -eq 0 ] 102 | } 103 | 104 | @test "unsuccessful dynamodb connection" { 105 | run await -r 2 dynamodb://unknown:8000 106 | [ $status -eq 2 ] 107 | } 108 | 109 | @test "successful mysql connection" { 110 | run await mysql://root:secret@mysql:3306 111 | [ $status -eq 0 ] 112 | 113 | run await -r 5 mysql://root:secret@mysql:3306 114 | [ $status -eq 0 ] 115 | 116 | run await -i 0.5 mysql://root:secret@mysql:3306 117 | [ $status -eq 0 ] 118 | 119 | run await -r 5 -i 0.5 mysql://root:secret@mysql:3306 120 | [ $status -eq 0 ] 121 | 122 | run await -r 5 -i 0.5 mysql://root:secret@mysql:3306 -- -t 1 123 | [ $status -eq 0 ] 124 | 125 | run await mysql://root:secret@mysql:3306 -- -t 1 126 | [ $status -eq 0 ] 127 | 128 | run await mysql://root:secret@mysql:3306 -- --timeout 1 129 | [ $status -eq 0 ] 130 | } 131 | 132 | @test "unsuccessful mysql" { 133 | run await -r 1 mysql://unknown 134 | [ $status -eq 2 ] 135 | } 136 | 137 | @test "successful memcached connection" { 138 | run await memcached://memcached:11211 139 | [ $status -eq 0 ] 140 | 141 | run await -r 2 memcached://memcached:11211 142 | [ $status -eq 0 ] 143 | 144 | run await -i 0.5 memcached://memcached:11211 145 | [ $status -eq 0 ] 146 | 147 | run await -r 2 -i 0.5 memcached://memcached:11211 148 | [ $status -eq 0 ] 149 | 150 | run await -r 2 -i 0.5 memcached://memcached:11211 -- -t 1 151 | [ $status -eq 0 ] 152 | 153 | run await memcached://memcached:11211 -- -t 1 154 | [ $status -eq 0 ] 155 | 156 | run await memcached://memcached:11211 -- --timeout 1 157 | [ $status -eq 0 ] 158 | } 159 | 160 | @test "unsuccessful memcached connection" { 161 | run await -r 2 memcached://unknown:11211 162 | [ $status -eq 2 ] 163 | } 164 | 165 | @test "successfull command" { 166 | run await cmd -- true 167 | [ $status -eq 0 ] 168 | 169 | run await -r 2 cmd -- true 170 | [ $status -eq 0 ] 171 | 172 | run await -i 2 cmd -- true 173 | [ $status -eq 0 ] 174 | 175 | run await -r 2 -i 1 cmd -- true 176 | [ $status -eq 0 ] 177 | } 178 | 179 | @test "unsuccessfull command with retry" { 180 | run await -r 2 cmd -- false 181 | [ $status -eq 2 ] 182 | } 183 | 184 | @test "cmd without a command" { 185 | run await cmd 186 | [ $status -eq 1 ] 187 | echo "${output}" | grep -Fi 'usage' 188 | 189 | run await cmd -- 190 | [ $status -eq 1 ] 191 | echo "${output}" | grep -Fi 'usage' 192 | } 193 | 194 | @test "aws CLI is included in the image" { 195 | run aws --version 196 | [ $status -eq 0 ] 197 | } 198 | --------------------------------------------------------------------------------