| #!/bin/bash | |
| # Copyright 2020 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| ### Test expected behavior of metrics collection | |
| BT_FILE_DEPS=( | |
| "scripts/fx" | |
| "tools/devshell/metrics" | |
| "tools/devshell/lib/fx-cmd-locator.sh" | |
| "tools/devshell/lib/fx-optional-features.sh" | |
| "tools/devshell/lib/vars.sh" | |
| "tools/devshell/lib/platform.sh" | |
| "tools/devshell/lib/metrics.sh" | |
| "tools/devshell/lib/style.sh" | |
| ) | |
| BT_MOCKED_TOOLS=( | |
| # commands defined in tools/devshell/lib/metrics.sh constants: | |
| "tools/devshell/emu" | |
| "tools/devshell/set" | |
| "tools/devshell/shell" | |
| "tools/devshell/fidlcat" | |
| "tools/devshell/run-test" | |
| "tools/devshell/run-test-component" | |
| "tools/devshell/run-host-tests" | |
| "tools/devshell/build" | |
| "tools/devshell/test" | |
| # this is a fake command that is a substring of a valid command | |
| "tools/devshell/fidl" | |
| ) | |
| declare fx mycurl metrics_log | |
| BT_SET_UP() { | |
| source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh" | |
| fx="$(btf::setup_fx_with_metrics)" | |
| mycurl="$(btf::make_mock_binary curl)" | |
| btf::add_binary_to_path "${mycurl}" | |
| metrics_log="${BT_TEMP_DIR}/metrics_log" | |
| BT_ASSERT_FILE_DOES_NOT_EXIST "${BT_TEMP_DIR}/.fx-metrics-config" | |
| source "${BT_TEMP_DIR}/tools/devshell/lib/vars.sh" | |
| source "${BT_TEMP_DIR}/tools/devshell/lib/metrics.sh" | |
| metrics-write-config 1 TESTUUID "${metrics_log}" | |
| metrics-read-config | |
| } | |
| verify_execution_event() { | |
| local cmd="$1" | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${metrics_log}" "t=event" | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${metrics_log}" "ec=fx" | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${metrics_log}" "ea=${cmd}" | |
| for f in "${mycurl}".mock_state*; do | |
| if \ | |
| btf::does-mock-args-contain "${f}" "--data-urlencode" "t=event" && \ | |
| btf::does-mock-args-contain "${f}" "--data-urlencode" "ec=fx" && \ | |
| btf::does-mock-args-contain "${f}" "--data-urlencode" "ea=${cmd}"; then | |
| return 0 | |
| fi | |
| done | |
| btf::_fail 1 \ | |
| "Couldn't find expected arguments in any of ${mycurl}.mock_state* files" | |
| } | |
| # A previous version of metrics would match command names incorrectly, | |
| # matching substrings. This test validates that it is fixed. | |
| TEST_metrics_doesnt_match_cmd_substring() { | |
| local cmd="fidl" | |
| local arg="someargs" | |
| track-command-execution "${cmd}" "$arg" | |
| track-command-finished "200" "0" "${cmd}" "$arg" | |
| verify_execution_event ${cmd} | |
| # verify that the "fidl" command doesn't trigger the all args tracking that | |
| # should be enabled for the "fidlcat" command | |
| for f in "${mycurl}".mock_state*; do | |
| if btf::does-mock-args-contain "${f}" "--data-urlencode" "el=${arg}"; then | |
| btf::_fail 1 \ | |
| "Found unexpected arguments in calls to curl. fx ${cmd} should not track arguments: ${f}" | |
| break | |
| fi | |
| done | |
| } | |
| TEST_metrics_no_arguments_tracking() { | |
| local cmd="build" | |
| local arg="something" | |
| track-command-execution "${cmd}" "$arg" | |
| track-command-finished "200" "0" "${cmd}" "$arg" | |
| verify_execution_event "${cmd}" | |
| # the "build" command does not track arguments: | |
| for f in "${mycurl}".mock_state*; do | |
| if btf::does-mock-args-contain "${f}" "--data-urlencode" "el=${arg}"; then | |
| btf::_fail 1 \ | |
| "Found unexpected arguments in calls to curl. fx ${cmd} should not track arguments: ${f}" | |
| return 1 | |
| fi | |
| done | |
| } | |
| TEST_metrics_track_arguments() { | |
| local cmd="set" | |
| local arg="some argument" | |
| track-command-execution "${cmd}" "$arg" | |
| track-command-finished "200" "0" "${cmd}" "$arg" | |
| verify_execution_event ${cmd} | |
| # The "set" command tracks all arguments, let's verify: | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${metrics_log}" "el=${arg}" | |
| for f in "${mycurl}".mock_state*; do | |
| if btf::does-mock-args-contain "${f}" "--data-urlencode" "el=${arg}"; then | |
| return 0 # success | |
| fi | |
| done | |
| btf::_fail 1 \ | |
| "Could not find execution arguments in calls to curl. fx ${cmd} should track all arguments: ${mycurl}.mock_state*" | |
| } | |
| TEST_metrics_track_specific_arguments() { | |
| local cmd="shell" | |
| local subcmd="uname" | |
| local arg="$subcmd blah" | |
| track-command-execution "${cmd}" "$arg" | |
| track-command-finished "200" "0" "${cmd}" "$arg" | |
| verify_execution_event ${cmd} | |
| # The "shell" command tracks one subcommand, let's verify: | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${metrics_log}" "el=${subcmd}" | |
| for f in "${mycurl}".mock_state*; do | |
| if btf::does-mock-args-contain "${f}" "--data-urlencode" "el=${arg}"; \ | |
| then | |
| btf::_fail 1 \ | |
| "Too many execution arguments in calls to curl. fx ${cmd} should \ | |
| track precisely one argument: ${mycurl}.mock_state*" | |
| fi | |
| if btf::does-mock-args-contain "${f}" "--data-urlencode" "el=${subcmd}"; then | |
| return 0 # success | |
| fi | |
| done | |
| btf::_fail 1 \ | |
| "Could not find execution arguments in calls to curl. fx ${cmd} \ | |
| should track all arguments: ${mycurl}.mock_state*" | |
| } | |
| TEST_metrics_track_unknown_arguments() { | |
| local cmd="shell" | |
| local subcmd="\$mandragora" | |
| local replacement_text="\$unknown_subcommand" | |
| local arg="$subcmd blah" | |
| track-command-execution "${cmd}" "$arg" | |
| track-command-finished "200" "0" "${cmd}" "$arg" | |
| verify_execution_event ${cmd} | |
| # The "shell" command tracks one subcommand, let's verify: | |
| BT_EXPECT_FILE_CONTAINS_SUBSTRING "${metrics_log}" "el=${replacement_text}" | |
| for f in "${mycurl}".mock_state*; do | |
| if btf::does-mock-args-contain "${f}" "--data-urlencode" "el=${arg}"; \ | |
| then | |
| btf::_fail 1 \ | |
| "Too many execution arguments in calls to curl. fx ${cmd} should \ | |
| track precisely one argument: ${mycurl}.mock_state*" | |
| fi | |
| if btf::does-mock-args-contain "${f}" "--data-urlencode" "el=${replacement_text}"; then | |
| return 0 # success | |
| fi | |
| done | |
| btf::_fail 1 \ | |
| "Could not find execution arguments in calls to curl. fx ${cmd} \ | |
| should track all arguments: ${mycurl}.mock_state*" | |
| } | |
| TEST_metrics_custom_track() { | |
| local cmd="test" | |
| local action="myaction" | |
| local label="mylabel" | |
| track-command-execution "${cmd}" "$arg" | |
| track-subcommand-custom-event "${cmd}" "${action}" "${label}" | |
| track-command-finished "200" "0" "${cmd}" "$arg" | |
| verify_execution_event ${cmd} | |
| for f in "${mycurl}".mock_state*; do | |
| if btf::does-mock-args-contain "${f}" "--data-urlencode" "ec=fx_custom_${cmd}"; then | |
| return 0 # success | |
| fi | |
| done | |
| btf::_fail 1 \ | |
| "Could not find custom tracking in calls to curl. fx ${cmd} should allow for custom tracking in one of: ${mycurl}.mock_state*" | |
| } | |
| TEST_metrics_no_custom_track() { | |
| local cmd="build" | |
| local action="myaction" | |
| local label="mylabel" | |
| track-command-execution "${cmd}" "$arg" | |
| track-subcommand-custom-event "${cmd}" "${action}" "${label}" | |
| track-command-finished "200" "0" "${cmd}" "$arg" | |
| verify_execution_event ${cmd} | |
| for f in "${mycurl}".mock_state*; do | |
| if btf::does-mock-args-contain "${f}" "--data-urlencode" "ec=fx_custom_${cmd}"; then | |
| btf::_fail 1 \ | |
| "Found custom tracking in calls to curl. fx ${cmd} should not allow for custom tracking in one of: ${mycurl}.mock_state*" | |
| return 1 | |
| fi | |
| done | |
| } | |
| BT_RUN_TESTS "$@" |