+# Copyright (c) 2019 Cisco and/or its affiliates.
+# Licensed 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.
+
/env
/download_dir
/archive_dir
+/dmm
+/.tox
outputs
output.xml
log.html
report.html
+*.log
*.pyc
*~
-*.log
.idea
-dmm/**
+ "Near start" means "before any nontrivial code".
- + Basically only copyright and long high-level comments are
- RECOMMENDED to appear before.
+ + Basically only copyright is RECOMMENDED to appear before.
+ Also code MUST put the line near start of function bodies
and subshell invocations.
-#!/usr/bin/env bash
-
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed 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:
select_topology || die
gather_build || die
check_download_dir || die
-activate_virtualenv "${CSIT_DIR}" || die
+activate_virtualenv || die
reserve_testbed || die
select_tags || die
compose_pybot_arguments || die
#!/usr/bin/env bash
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed 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:
select_topology || die
gather_build || die
check_download_dir || die
-activate_virtualenv "${CSIT_DIR}" || die
+activate_virtualenv || die
activate_docker_topology || die
select_vpp_device_tags || die
compose_pybot_arguments || die
--- /dev/null
+# Copyright (c) 2019 Cisco and/or its affiliates.
+# Licensed 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.
+
+This directory contains checker scripts and other files they need.
+Each checker script is assumed to be run from tox,
+when working directory is set to ${CSIT_DIR}.
+Each script should:
++ Return nonzero exit code when it fails.
+++ The tox might ignore the code when the check is not blocking.
++ Write less verbose output to stderr.
++ Write (to stderr) PASSED or FAILED to help with debugging.
++ Direct more verbose output to appropriately named .log file.
++ Only the output suitable for automated processing by an external caller
+ should be written to stdout.
+++ The level of "less verbose" depends on check and state of codebase.
++ TODO: Should we carefully document which files are
+ whitelisted/blacklisted for a particulat check?
--- /dev/null
+# Copyright (c) 2019 Cisco and/or its affiliates.
+# Licensed 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.
+
+set -exuo pipefail
+
+# This file should be executed from tox, as the assumend working directory
+# is different from where this file is located.
+# This file does not have executable flag nor shebang,
+# to dissuade non-tox callers.
+
+# This script run every executable *.py script anywhere within tests/ dir,
+# the working directory temporarily changed to where the *.py file is.
+# Proper virtualenv is assumed to be active.
+# If "git diff" sees any change, this script fails.
+# The diff output stored to autogen.log (overwriting).
+# The *.py files are assumed to be robot suite generators,
+# any change means the contribution does not match the generated code.
+
+# "set -eu" handles failures from the following two lines.
+BASH_CHECKS_DIR="$(dirname $(readlink -e "${BASH_SOURCE[0]}"))"
+BASH_FUNCTION_DIR="$(readlink -e "${BASH_CHECKS_DIR}/../../function")"
+source "${BASH_FUNCTION_DIR}/common.sh" || {
+ echo "Source failed." >&2
+ exit 1
+}
+
+work_dir="$(pwd)" || die
+trap "cd '${work_dir}'" EXIT || die
+file_list="$(find ./tests -type f -executable -name '*.py')" || die
+
+for gen in ${file_list}; do
+ directory="$(dirname "${gen}")" || die
+ filename="$(basename "${gen}")" || die
+ pushd "${directory}" || die
+ ./"${filename}" || die
+ popd || die
+done
+
+lines="$(git diff | tee "autogen.log" | wc -l)" || die
+if [ "${lines}" != "0" ]; then
+ # TODO: Decide which text goes to stdout and which to stderr.
+ warn "Autogen conflict diff nonzero lines: ${lines}"
+ # TODO: Disable if output size does more harm than good.
+ cat "autogen.log" >&2
+ warn
+ warn "Autogen checker: FAIL"
+ exit 1
+fi
+
+warn
+warn "Autogen checker: PASS"
--- /dev/null
+# Copyright (c) 2019 Cisco and/or its affiliates.
+# Licensed 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.
+
+set -exuo pipefail
+
+# This file should be executed from tox, as the assumend working directory
+# is different from where this file is located.
+# This file does not have executable flag nor shebang,
+# to dissuade non-tox callers.
+
+# This script runs a grep-based command and fails if it detects any lines
+# longer than 80 characters.
+# The grep output stored to lines.log (overwriting).
+
+# "set -eu" handles failures from the following two lines.
+BASH_CHECKS_DIR="$(dirname $(readlink -e "${BASH_SOURCE[0]}"))"
+BASH_FUNCTION_DIR="$(readlink -e "${BASH_CHECKS_DIR}/../../function")"
+source "${BASH_FUNCTION_DIR}/common.sh" || {
+ echo "Source failed." >&2
+ exit 1
+}
+
+# docs contains too many wide formatted tables.
+# .txt contains lines with wide URLs.
+piped_command='set -exuo pipefail && grep -rn ".\{81\}" "resources/" "tests/"'
+piped_command+=' | fgrep -v .svg | fgrep -v .txt | tee "lines.log" | wc -l'
+lines="$(bash -c "${piped_command}")" || die
+if [ "${lines}" != "0" ]; then
+ # TODO: Decide which text goes to stdout and which to stderr.
+ warn "Long lines detected: ${lines}"
+ ## TODO: Enable when output size does more good than harm.
+ # cat "lines.log" >&2
+ warn
+ warn "Line length checker: FAIL"
+ exit 1
+fi
+
+warn
+warn "Line length checker: PASS"
--- /dev/null
+# Copyright (c) 2019 Cisco and/or its affiliates.
+# Licensed 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.
+
+set -exuo pipefail
+
+# This file should be executed from tox, as the assumend working directory
+# is different from where this file is located.
+# This file does not have executable flag nor shebang,
+# to dissuade non-tox callers.
+
+# This script runs pylint and propagates its exit code.
+# Config is taken from pylint.cfg, and proper virtualenv is assumed to be active.
+# The pylint output stored to pylint.log (overwriting).
+
+# "set -eu" handles failures from the following two lines.
+BASH_CHECKS_DIR="$(dirname $(readlink -e "${BASH_SOURCE[0]}"))"
+BASH_FUNCTION_DIR="$(readlink -e "${BASH_CHECKS_DIR}/../../function")"
+source "${BASH_FUNCTION_DIR}/common.sh" || {
+ echo "Source failed." >&2
+ exit 1
+}
+pylint_args=("--rcfile=pylint.cfg" "resources/" "tests/")
+if pylint "${pylint_args[@]}" > "pylint.log"; then
+ warn
+ warn "Pylint checker: PASS"
+else
+ # TODO: Decide which text goes to stdout and which to stderr.
+ warn "Pylint exited with nonzero status."
+ ## TODO: Enable when output size does more good than harm.
+ # cat "pylint.log" >&2
+ warn
+ warn "Pylint checker: FAIL"
+ exit 1
+fi
--- /dev/null
+#!/usr/bin/env bash
+
+# Copyright (c) 2019 Cisco and/or its affiliates.
+# Licensed 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.
+
+set -exuo pipefail
+
+# This is a launcher script, to be called from Jenkins.
+# It runs tox at $CSIT_DIR (after activating virtualenv with its requirements).
+# Exit code of tox is propagated.
+
+# "set -eu" handles failures from the following two lines.
+BASH_ENTRY_DIR="$(dirname $(readlink -e "${BASH_SOURCE[0]}"))"
+BASH_FUNCTION_DIR="$(readlink -e "${BASH_ENTRY_DIR}/../function")"
+source "${BASH_FUNCTION_DIR}/common.sh" || {
+ echo "Source failed." >&2
+ exit 1
+}
+common_dirs || die
+cd "${CSIT_DIR}" || die
+activate_virtualenv "${CSIT_DIR}" "${CSIT_DIR}/tox-requirements.txt" || die
+tox # Return code is turned into Jenkins job vote.
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed 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:
set -exuo pipefail
+ # Update virtualenv pip package, delete and create virtualenv directory,
+ # activate the virtualenv, install requirements, set PYTHONPATH.
+
# Arguments:
- # - ${1} - Non-empty path to existing directory for creating virtualenv in.
+ # - ${1} - Path to existing directory for creating virtualenv in.
+ # If missing or empty, ${CSIT_DIR} is used.
+ # - ${2} - Path to requirements file, ${CSIT_DIR}/requirements.txt if empty.
# Variables read:
# - CSIT_DIR - Path to existing root of local CSIT git repository.
- # Variables set:
- # - ENV_DIR - Path to the created virtualenv subdirectory.
# Variables exported:
# - PYTHONPATH - CSIT_DIR, as CSIT Python scripts usually need this.
# Functions called:
# - die - Print to stderr and exit.
- # TODO: Do we really need to have ENV_DIR available as a global variable?
-
- if [[ "${1-}" == "" ]]; then
- die "Root location of virtualenv to create is not specified."
- fi
- ENV_DIR="${1}/env"
- rm -rf "${ENV_DIR}" || die "Failed to clean previous virtualenv."
+ # TODO: Do we want the callers to be able to set the env dir name?
+ # TODO: + In that case, do we want to support env switching?
+ # TODO: + In that case we want to make env_dir global.
+ # TODO: Do we want the callers to override PYTHONPATH loaction?
+ root_path="${1-$CSIT_DIR}"
+ env_dir="${root_path}/env"
+ req_path=${2-$CSIT_DIR/requirements.txt}
+ rm -rf "${env_dir}" || die "Failed to clean previous virtualenv."
pip install --upgrade virtualenv || {
die "Virtualenv package install failed."
}
- virtualenv "${ENV_DIR}" || {
+ virtualenv "${env_dir}" || {
die "Virtualenv creation failed."
}
set +u
- source "${ENV_DIR}/bin/activate" || die "Virtualenv activation failed."
+ source "${env_dir}/bin/activate" || die "Virtualenv activation failed."
set -u
- pip install -r "${CSIT_DIR}/requirements.txt" || {
- die "CSIT requirements installation failed."
+ pip install --upgrade -r "${req_path}" || {
+ die "Requirements installation failed."
}
-
# Most CSIT Python scripts assume PYTHONPATH is set and exported.
- export PYTHONPATH="${CSIT_DIR}" || die "Export failed."
+ export PYTHONPATH="${root_path}" || die "Export failed."
}
+++ /dev/null
-# Copyright (c) 2018 Cisco and/or its affiliates.
-# Licensed 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.
-
-"""Module defining sole constant holding copyright text for current year."""
-
-
-COPYRIGHT = '''# Copyright (c) 2018 Cisco and/or its affiliates.
-# Licensed 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.
-'''
\ No newline at end of file
-# Copyright (c) 2018 Cisco and/or its affiliates.
+# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed 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:
"""Module defining utilities for test directory regeneration."""
+from __future__ import print_function
+
from glob import glob
from os import getcwd
+import sys
from .DefaultTestcase import DefaultTestcase
+# Copied from https://stackoverflow.com/a/14981125
+def eprint(*args, **kwargs):
+ """Print to stderr."""
+ print(*args, file=sys.stderr, **kwargs)
+
+
class Regenerator(object):
"""Class containing file generating methods."""
- def __init__(self, testcase_class=DefaultTestcase):
+ def __init__(self, testcase_class=DefaultTestcase, quiet=True):
"""Initialize Testcase class to use.
TODO: See the type doc for testcase_class?
:param testcase_class: Subclass of DefaultTestcase for generation.
Default: DefaultTestcase
+ :param quiet: Reduce log prints (to stderr) when True (default).
:type testcase_class: subclass of DefaultTestcase accepting suite_id
+ :type quiet: boolean
"""
self.testcase_class = testcase_class
+ self.quiet = quiet
def regenerate_glob(self, pattern, protocol="ip4", tc_kwargs_list=None):
"""Regenerate files matching glob pattern based on arguments.
test cases, autonumbering them, taking arguments from list.
If the list is None, use default list, which depends on ip6 usage.
+ Log-like prints are emited to sys.stderr.
+
:param pattern: Glob pattern to select files. Example: *-ndrpdr.robot
:param is_ip6: Flag determining minimal frame size. Default: False
:param tc_kwargs_list: Arguments defining the testcases. Default: None
num = add_testcase(testcase, iface, suite_id, file_out, num,
**tc_kwargs)
- print "Regenerator starts at {cwd}".format(cwd=getcwd())
+ if not self.quiet:
+ eprint("Regenerator starts at {cwd}".format(cwd=getcwd()))
min_framesize = protocol_to_min_framesize[protocol]
kwargs_list = tc_kwargs_list if tc_kwargs_list else [
{"framesize": min_framesize, "phy_cores": 1},
{"framesize": "IMIX_v4_1", "phy_cores": 4}
]
for filename in glob(pattern):
- print "Regenerating filename:", filename
+ if not self.quiet:
+ eprint("Regenerating filename:", filename)
with open(filename, "r") as file_in:
text = file_in.read()
text_prolog = "".join(text.partition("*** Test Cases ***")[:-1])
with open(filename, "w") as file_out:
file_out.write(text_prolog)
add_testcases(testcase, iface, suite_id, file_out, kwargs_list)
- print "Regenerator ends."
- print # To make autogen check output more readable.
+ if not self.quiet:
+ eprint("Regenerator ends.")
+ eprint() # To make autogen check output more readable.
--- /dev/null
+# Copyright (c) 2019 Cisco and/or its affiliates.
+# Licensed 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.
+
+# Bump regularly.
+tox==3.7.0
+
+# Tox dependencies. Consult "pip freeze" after installing
+# bumped tox into an empty virtualenv.
+filelock==3.0.10
+pluggy==0.8.1
+py==1.7.0
+six==1.12.0
+toml==0.10.0
+virtualenv==16.4.0
--- /dev/null
+# Copyright (c) 2019 Cisco and/or its affiliates.
+# Licensed 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.
+
+# Idea of this file is motivated by OpenDylight,
+# especially its Integration/Test sub-project.
+
+# This file requires active virtualenv with tox package installed,
+# or python-tox system package installed.
+
+# Usage:
+# cd to CSIT root (other directories might use different tox.ini)
+# $ tox
+# will execute all checks.
+# $ tox -e pylint
+# will execute only checks defined in "pylint" tox environment.
+
+[tox]
+envlist = linelength, autogen, pylint
+# The following is needed as tox requires setup.py by default.
+skipsdist = true
+
+# TODO: Tox prints various warnings.
+# Figure out what they are about and fix them.
+
+[testenv:pylint]
+deps =
+ pylint==1.5.4
+ -r ./requirements.txt
+whitelist_externals = /bin/bash
+setenv = PYTHONPATH = {toxinidir}
+# Run pylint, but hide its return value until python warnings are cleared.
+commands = bash -c "bash resources/libraries/bash/entry/check/pylint.sh || true"
+
+# TODO: See FIXME in https://gerrit.fd.io/r/16423
+
+[testenv:linelength]
+whitelist_externals = /bin/bash
+# Fix all transgressions and remove the " || true" workaround.
+commands = bash -c "bash resources/libraries/bash/entry/check/line.sh || true"
+
+# It would be possible to add a check which fails
+# if number of long lines increases (from parent commit value),
+# and have it voting.
+# But that would basically prevent us from adding new suites righ now. :(
+
+[testenv:autogen]
+whitelist_externals = /bin/bash
+setenv = PYTHONPATH = {toxinidir}
+commands = bash resources/libraries/bash/entry/check/autogen.sh
+
+# TODO: Migrate current docs check here.
+# TODO: Create license checker.
+# TODO: Create voting "pylint violations should not increase" checker.
+# TODO: Create voting "linelength violations should not increase" checker.
+# TODO: Create Robot suite Documentation checker (backslash if not next mark).
+# TODO: Create .yaml specific checker, so people can override long line check.
+# TODO: Create .rst specific checker, if there is one allowing
+# to override line check.
+# TODO: You get the idea, replace line check with something smarter
+# wherever possible.
\ No newline at end of file