| #!/usr/bin/env bash |
| ################################################################################ |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| ################################################################################ |
| |
| ### Some general purpose helper functions that can be used in test scripts. |
| |
| _on_exit_commands=() |
| |
| function _on_exit_callback { |
| # Export the exit code so that it could be used by the callback commands |
| export TRAPPED_EXIT_CODE=$? |
| # Un-register the callback, to avoid multiple invocations: some shells may treat some signals as subset of others. |
| trap "" INT EXIT |
| # Fast exit, if there is another keyboard interrupt. |
| trap "exit -1" INT |
| |
| for command in "${_on_exit_commands[@]-}"; do |
| eval "${command}" |
| done |
| } |
| |
| # Register for multiple signals: some shells interpret them as mutually exclusive. |
| trap _on_exit_callback INT EXIT |
| |
| # Helper method to register a command that should be called on current script exit. |
| # It allows to have multiple "on exit" commands to be called, compared to the built-in `trap "$command" EXIT`. |
| # Note: tests should not use `trap $command INT|EXIT` directly, to avoid having "Highlander" situation. |
| function on_exit { |
| local command="$1" |
| |
| # Keep commands in reverse order, so commands would be executed in LIFO order. |
| _on_exit_commands=("${command}" "${_on_exit_commands[@]-}") |
| } |