blob: 91da3e6af927b1d5198c9085db94e20fb51a9d58 [file] [log] [blame]
#!/bin/bash
# Copyright 2021 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 `fx report-bug`.
export BT_FILE_DEPS=(
"scripts/fx"
"tools/devshell/report-bug"
"tools/devshell/lib/fx-cmd-locator.sh"
"tools/devshell/lib/fx-optional-features.sh"
"tools/devshell/lib/vars.sh"
"tools/devshell/lib/platform.sh"
)
BT_SET_UP() {
# shellcheck source=/dev/null
source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh"
fx="$(btf::setup_fx)"
}
# Ensure that "fx report-bug --help" and friends run and emit help.
TEST_report_bug_help() {
BT_EXPECT "${fx}" report-bug --help &>_out1
BT_EXPECT_FILE_CONTAINS_SUBSTRING _out1 "Report an issue on an fx <command>."
BT_EXPECT "${fx}" report-bug -h &>_out2
BT_EXPECT_FILE_CONTAINS_SUBSTRING _out2 "Report an issue on an fx <command>."
BT_EXPECT "${fx}" report-bug &>_out3
BT_EXPECT_FILE_CONTAINS_SUBSTRING _out3 "Report an issue on an fx <command>."
}
TEST_nothing_in_devshell_owners() {
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
# nothing here
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "Tools%3efx" # Default component.
BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${out}" "cc=" # no per-file, so empty.
}
TEST_per_file_component_in_devshell_owners() {
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
# per-file-COMPONENT report-bug=foo
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=foo"
BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${out}" "cc="
}
TEST_per_file_owners_in_devshell_owners() {
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=foo
# per-file-COMPONENT report-bug=bar
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=foo"
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=bar"
}
TEST_both_in_devshell_owners() {
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=foo
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=foo"
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=Tools%3efx" # Default component.
}
TEST_contrib_commands() {
mkdir "${BT_TEMP_DIR}/tools/devshell/contrib"
cat >"${BT_TEMP_DIR}/tools/devshell/contrib/test-command" <<EOF
#!/bin/bash
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
fx-info "test command"
EOF
chmod u+x "${BT_TEMP_DIR}/tools/devshell/contrib/test-command"
local out="_fx_report_bug_output"
cat >"${BT_TEMP_DIR}/tools/devshell/contrib/OWNERS" <<EOF
# nothing here
EOF
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
# per-file-COMPONENT test-command=foo3
EOF
BT_EXPECT "${fx}" report-bug test-command &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=Tools%3efx" # Not picked from parent dir.
BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${out}" "cc=" # no per-file, so empty.
}
TEST_contrib_commands2() {
mkdir "${BT_TEMP_DIR}/tools/devshell/contrib"
cat >"${BT_TEMP_DIR}/tools/devshell/contrib/test-command" <<EOF
#!/bin/bash
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
fx-info "test command"
EOF
chmod u+x "${BT_TEMP_DIR}/tools/devshell/contrib/test-command"
local out="_fx_report_bug_output"
cat >"${BT_TEMP_DIR}/tools/devshell/contrib/OWNERS" <<EOF
# per-file-COMPONENT test-command=foo3
EOF
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file test-command=bar
EOF
BT_EXPECT "${fx}" report-bug test-command &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=foo3"
BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${out}" "cc=" # Not picked from parent dir.
}
TEST_multiple_lines() {
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=foo
per-file report-bug=bar # An additional comment.
# per-file-COMPONENT report-bug=baz # An additional comment.
# per-file-COMPONENT report-bug=bop # An additional comment.
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=bar%2cfoo" # Note: alphabetized.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=baz%2cbop"
}
TEST_dot_fx_lines() {
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=foo
per-file report-bug.fx=bim,bar # Additional .fx owners.
# per-file-COMPONENT report-bug=baz #
# per-file-COMPONENT report-bug.fx=bop # An additional .fx component.
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=bar%2cbim%2cfoo" # Note: alphabetized.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=baz%2cbop"
}
TEST_multiple_lines_and_spacings() {
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=a
per-file report-bug=b
per-file report-bug =c ,e,d
per-file report-bug = h , g , f , # comma and comment to be stripped
#per-file-COMPONENT report-bug=z,y
# per-file-COMPONENT report-bug=u , w, v, x
# per-file-COMPONENT report-bug = s,s,t ,t ,t # duplicates on same line.
# per-file-COMPONENT report-bug = s,s,t ,t ,t # duplicate line, mostly.
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=a%2cb%2cc%2cd%2ce%2cf%2cg%2ch" # a,b,c,d,e,f,g,h
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=s%2ct%2cu%2cv%2cw%2cx%2cy%2cz" # s,t,u,v,w,x,y,z
}
TEST_OWNERS_component() {
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
#COMPONENT: s,s,t ,t ,t # duplicates on same line.
# COMPONENT: s,z,v,x
# COMPONENT : w, u, y, z
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_DOES_NOT_CONTAIN_SUBSTRING "${out}" "cc=" # no per-file, so empty.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=s%2ct%2cu%2cv%2cw%2cx%2cy%2cz" # s,t,u,v,w,x,y,z
}
TEST_OWNERS_list() {
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
t@g.com
s@g.com # comment.
s1@g.com
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=Tools%3efx" # Default component.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=s1%40g.com%2cs%40g.com%2ct%40g.com"
}
TEST_OWNERS_file_directive() {
mkdir "${BT_TEMP_DIR}/foo"
cat >"${BT_TEMP_DIR}/foo/OWNERS" <<EOF
t@g.com
s@g.com # comment.
s1@g.com
EOF
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file: report-bug= file:/foo/OWNERS
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=Tools%3efx" # Default component.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=s1%40g.com%2cs%40g.com%2ct%40g.com"
}
TEST_OWNERS_include_directive() {
mkdir "${BT_TEMP_DIR}/foo"
cat >"${BT_TEMP_DIR}/foo/OWNERS" <<EOF
t@g.com
s@g.com # comment.
s1@g.com
# COMPONENT: t>bar
EOF
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
include /foo/OWNERS
# COMPONENT: t>bim # This component overrides.
z@g.com # This owner appends.
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug -v report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=t%3ebim" # Default component.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=z%40g.com"
}
# The per-file-COMPONENT is found and not overridden by the component in the the
# per-file file.
TEST_OWNERS_file_directive_and_per_file_component() {
mkdir "${BT_TEMP_DIR}/foo"
cat >"${BT_TEMP_DIR}/foo/OWNERS" <<EOF
t@g.com
s@g.com # comment.
s1@g.com
# COMPONENT: t>bar
EOF
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=file:/foo/OWNERS
#per-file-COMPONENT report-bug=FT>y
# COMPONENT: t>bim
z@g.com
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug -v report-bug &>${out}
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=FT%3ey"
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=s1%40g.com%2cs%40g.com%2ct%40g.com"
}
TEST_OWNERS_deep() {
mkdir "${BT_TEMP_DIR}/bar"
cat >"${BT_TEMP_DIR}/bar/OWNERS" <<EOF
t@g.com
s@g.com # comment.
s1@g.com
# COMPONENT: t>baz
EOF
mkdir "${BT_TEMP_DIR}/foo"
cat >"${BT_TEMP_DIR}/foo/OWNERS" <<EOF
include /bar/OWNERS
# COMPONENT: t>bar
EOF
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=file:/foo/OWNERS
#per-file-COMPONENT report-bug=FT>y
# COMPONENT: t>bim
z@g.com
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug -v report-bug &>${out}
# WRONG: Should be FT>y. per-file-COMPONENT should be preferred.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=FT%3ey"
# Right: file authors preferred.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=s1%40g.com%2cs%40g.com%2ct%40g.com"
}
# In this test, the top-level OWNERS has a per-file owners, so that overrides
# the z@g.com listed there. That per-file OWNERS (foo/) has an owner, x@g.com,
# so that is used and the other owners found in its include file are ignored.
# Also, the per-file-COMPONENT is not overridden by includes.
TEST_OWNERS_deep2() {
mkdir "${BT_TEMP_DIR}/bar"
cat >"${BT_TEMP_DIR}/bar/OWNERS" <<EOF
t@g.com
s@g.com # comment.
s1@g.com
# COMPONENT: t>baz
EOF
mkdir "${BT_TEMP_DIR}/foo"
cat >"${BT_TEMP_DIR}/foo/OWNERS" <<EOF
include /bar/OWNERS
# COMPONENT: t>bar
x@g.com
EOF
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=file:/foo/OWNERS
#per-file-COMPONENT report-bug=FT>y
# COMPONENT: t>bim
z@g.com
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug -v report-bug &>${out}
# WRONG: Should be FT>y. per-file-COMPONENT should be preferred.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=FT%3ey"
# Right: file authors preferred.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=x%40g.com"
}
# Here the per-file owners and component go one deep.
TEST_OWNERS_deep3() {
mkdir "${BT_TEMP_DIR}/bar"
cat >"${BT_TEMP_DIR}/bar/OWNERS" <<EOF
t@g.com
s@g.com # comment.
s1@g.com
# COMPONENT: t>baz
EOF
mkdir "${BT_TEMP_DIR}/foo"
cat >"${BT_TEMP_DIR}/foo/OWNERS" <<EOF
include /bar/OWNERS
# COMPONENT: t>bar
x@g.com
EOF
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=file:/foo/OWNERS
# COMPONENT: t>bim
z@g.com
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug -v report-bug &>${out}
# WRONG: Should be FT>y. per-file-COMPONENT should be preferred.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=t%3ebar"
# Right: file authors preferred.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=x%40g.com"
}
# Here the per-file owners and component go into the include file
# because there are not owners or component in the perf-file file.
TEST_OWNERS_deep4() {
mkdir "${BT_TEMP_DIR}/bar"
cat >"${BT_TEMP_DIR}/bar/OWNERS" <<EOF
t@g.com
s@g.com # comment.
s1@g.com
# COMPONENT: t>baz
EOF
mkdir "${BT_TEMP_DIR}/foo"
cat >"${BT_TEMP_DIR}/foo/OWNERS" <<EOF
include /bar/OWNERS
EOF
cat >"${BT_TEMP_DIR}/tools/devshell/OWNERS" <<EOF
per-file report-bug=file:/foo/OWNERS
# COMPONENT: t>bim
z@g.com
EOF
local out="_fx_report_bug_output"
BT_EXPECT "${fx}" report-bug -v report-bug &>${out}
# WRONG: Should be FT>y. per-file-COMPONENT should be preferred.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "components=t%3ebaz"
# Right: file authors preferred.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "cc=s1%40g.com%2cs%40g.com%2ct%40g.com"
}
BT_RUN_TESTS "$@"