Mark tests requiring to start and interact with docker containers

Most tests currently present in this project run containers and interact
with them to test their functionality.

Change-Id: Ib122091f711874d9b9dcdd66f1d1d9d0e7e42a1c
diff --git a/README.md b/README.md
index 656824f..de7adff 100644
--- a/README.md
+++ b/README.md
@@ -172,6 +172,9 @@
 pipenv run pytest --skip-slow
 ```
 
+There are also other marks, allowing to select tests (refer to
+[this section](#test-marks)).
+
 To run specific tests, execute one of the following:
 
 ```sh
@@ -184,7 +187,27 @@
 # Run a specific test
 pipenv run \
   pytest tests/container-images/base/test_container_build_base.py::test_build_base
+
+# Run tests with a specific marker
+pipenv run pytest -m "docker"
 ```
 
 For a more detailed description of how to use `pytest`, refer to the
 [official documentation](https://docs.pytest.org/en/latest/contents.html).
+
+## Test marks
+
+### docker
+
+Marks tests which start up docker containers. These tests will interact with
+the containers by either using `docker exec` or sending HTTP-requests. Make
+sure that your system supports this kind of interaction.
+
+### incremental
+
+Marks test classes in which the contained test functions have to run
+incrementally.
+
+### slow
+
+Marks tests that need an above average time to run.
diff --git a/setup.cfg b/setup.cfg
index 1f82615..1b1ff54 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,2 +1,5 @@
 [tool:pytest]
-norecursedirs=tests/helpers
+norecursedirs = tests/helpers
+
+markers =
+  docker: Tests that require to run and interact with a docker container
diff --git a/tests/container-images/apache-git-http-backend/test_container_disable_protocol_apache_git_http_backend.py b/tests/container-images/apache-git-http-backend/test_container_disable_protocol_apache_git_http_backend.py
index ad6b4e6..57d6a0d 100755
--- a/tests/container-images/apache-git-http-backend/test_container_disable_protocol_apache_git_http_backend.py
+++ b/tests/container-images/apache-git-http-backend/test_container_disable_protocol_apache_git_http_backend.py
@@ -37,6 +37,7 @@
     return container_run, request.param
 
 
+@pytest.mark.docker
 @pytest.mark.slow
 def test_apache_git_http_backend_disable_protocol(
     container_run_with_disabled_protocol,
diff --git a/tests/container-images/apache-git-http-backend/test_container_integration_apache_git_http_backend.py b/tests/container-images/apache-git-http-backend/test_container_integration_apache_git_http_backend.py
index 6bc4416..f8350d1 100755
--- a/tests/container-images/apache-git-http-backend/test_container_integration_apache_git_http_backend.py
+++ b/tests/container-images/apache-git-http-backend/test_container_integration_apache_git_http_backend.py
@@ -44,6 +44,7 @@
     return repo
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_apache_running(
     container_run, base_url, apache_credentials_dir
 ):
@@ -53,6 +54,7 @@
     assert request.status_code == 200
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_repo_creation(
     container_run, apache_credentials_dir, basic_auth_creds, repo_creation_url
 ):
@@ -66,6 +68,7 @@
     assert request.status_code == 201
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_repo_creation_fails_without_credentials(
     container_run, apache_credentials_dir, repo_creation_url
 ):
@@ -75,6 +78,7 @@
     assert request.status_code == 401
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_repo_creation_fails_wrong_fs_permissions(
     container_run, apache_credentials_dir, basic_auth_creds, repo_creation_url
 ):
@@ -90,6 +94,7 @@
     assert request.status_code == 500
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_repo_creation_push_repo(
     container_run,
     base_url,
diff --git a/tests/container-images/apache-git-http-backend/test_container_structure_apache_git_http_backend.py b/tests/container-images/apache-git-http-backend/test_container_structure_apache_git_http_backend.py
index 241e42d..6c530d0 100755
--- a/tests/container-images/apache-git-http-backend/test_container_structure_apache_git_http_backend.py
+++ b/tests/container-images/apache-git-http-backend/test_container_structure_apache_git_http_backend.py
@@ -12,6 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import pytest
+
 
 def test_apache_git_http_backend_inherits_from_base(apache_git_http_backend_image):
     contains_tag = False
@@ -22,11 +24,13 @@
     assert contains_tag
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_contains_apache2(container_run):
     exit_code, _ = container_run.exec_run("which httpd")
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_http_site_configured(container_run):
     exit_code, _ = container_run.exec_run(
         "test -f /etc/apache2/conf.d/git-http-backend.conf"
@@ -34,6 +38,7 @@
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_https_site_configured(container_run):
     exit_code, _ = container_run.exec_run(
         "test -f /etc/apache2/conf.d/git-https-backend.conf"
@@ -41,11 +46,13 @@
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_contains_start_script(container_run):
     exit_code, _ = container_run.exec_run("test -f /var/tools/start")
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_apache_git_http_backend_contains_repo_creation_cgi_script(container_run):
     exit_code, _ = container_run.exec_run("test -f /var/cgi/create_repo.sh")
     assert exit_code == 0
diff --git a/tests/container-images/base/test_container_structure_base.py b/tests/container-images/base/test_container_structure_base.py
index 0af742b..a53bcef 100755
--- a/tests/container-images/base/test_container_structure_base.py
+++ b/tests/container-images/base/test_container_structure_base.py
@@ -22,11 +22,13 @@
     container_run.stop(timeout=1)
 
 
+@pytest.mark.docker
 def test_base_contains_git(container_run):
     exit_code, _ = container_run.exec_run("which git")
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_base_has_non_root_user_gerrit(container_run):
     exit_code, output = container_run.exec_run("id -u gerrit")
     assert exit_code == 0
@@ -34,6 +36,7 @@
     assert uid != 0
 
 
+@pytest.mark.docker
 def test_base_gerrit_no_root_permissions(container_run):
     exit_code, _ = container_run.exec_run("su -c 'rm -rf /bin' gerrit")
     assert exit_code > 0
diff --git a/tests/container-images/gerrit-base/test_container_structure_gerrit_base.py b/tests/container-images/gerrit-base/test_container_structure_gerrit_base.py
index 08a311c..a42083c 100755
--- a/tests/container-images/gerrit-base/test_container_structure_gerrit_base.py
+++ b/tests/container-images/gerrit-base/test_container_structure_gerrit_base.py
@@ -33,12 +33,14 @@
     assert contains_tag
 
 
+@pytest.mark.docker
 def test_gerrit_base_contains_java8(container_run):
     _, output = container_run.exec_run("java -version")
     output = output.strip().decode("utf-8")
     assert re.search(re.compile('openjdk version "1.8.[0-9]_[0-9]+"'), output)
 
 
+@pytest.mark.docker
 def test_gerrit_base_java_path(container_run):
     exit_code, output = container_run.exec_run(
         '/bin/ash -c "readlink -f $(which java)"'
@@ -48,6 +50,7 @@
     assert output == "/usr/lib/jvm/java-1.8-openjdk/jre/bin/java"
 
 
+@pytest.mark.docker
 def test_gerrit_base_contains_gerrit_war(container_run):
     exit_code, _ = container_run.exec_run("test -f /var/war/gerrit.war")
     assert exit_code == 0
@@ -56,6 +59,7 @@
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_gerrit_base_war_contains_gerrit(container_run):
     exit_code, output = container_run.exec_run("java -jar /var/war/gerrit.war version")
     assert exit_code == 0
@@ -70,11 +74,13 @@
     assert re.search(re.compile("gerrit version.*"), output)
 
 
+@pytest.mark.docker
 def test_gerrit_base_site_permissions(container_run):
     exit_code, _ = container_run.exec_run("test -O /var/gerrit")
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_gerrit_base_war_dir_permissions(container_run):
     exit_code, _ = container_run.exec_run("test -O /var/war")
     assert exit_code == 0
diff --git a/tests/container-images/gerrit-init/test_container_integration_gerrit_init.py b/tests/container-images/gerrit-init/test_container_integration_gerrit_init.py
index 6118c23..3ea7d5e 100644
--- a/tests/container-images/gerrit-init/test_container_integration_gerrit_init.py
+++ b/tests/container-images/gerrit-init/test_container_integration_gerrit_init.py
@@ -60,6 +60,7 @@
     container_run.stop(timeout=1)
 
 
+@pytest.mark.docker
 @pytest.mark.incremental
 class TestGerritInitEmptySite:
     @pytest.mark.timeout(60)
@@ -86,6 +87,7 @@
         assert container_run_default.attrs["State"]["ExitCode"] == 0
 
 
+@pytest.mark.docker
 @pytest.mark.incremental
 class TestGerritInitPluginInstallation:
     def test_gerrit_init_plugins_are_installed(self, container_run_endless):
diff --git a/tests/container-images/gerrit-init/test_container_structure_gerrit_init.py b/tests/container-images/gerrit-init/test_container_structure_gerrit_init.py
index 0b6c3bf..8411c30 100755
--- a/tests/container-images/gerrit-init/test_container_structure_gerrit_init.py
+++ b/tests/container-images/gerrit-init/test_container_structure_gerrit_init.py
@@ -46,11 +46,13 @@
     assert contains_tag
 
 
+@pytest.mark.docker
 def test_gerrit_init_contains_expected_scripts(container_run, expected_script):
     exit_code, _ = container_run.exec_run("test -f %s" % expected_script)
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_gerrit_init_contains_expected_tools(container_run, expected_tool):
     exit_code, _ = container_run.exec_run("which %s" % expected_tool)
     assert exit_code == 0
diff --git a/tests/container-images/gerrit-master/test_container_integration_gerrit_master.py b/tests/container-images/gerrit-master/test_container_integration_gerrit_master.py
index 025d18a..17337b2 100644
--- a/tests/container-images/gerrit-master/test_container_integration_gerrit_master.py
+++ b/tests/container-images/gerrit-master/test_container_integration_gerrit_master.py
@@ -69,8 +69,9 @@
     return request.param
 
 
-@pytest.mark.slow
+@pytest.mark.docker
 @pytest.mark.incremental
+@pytest.mark.slow
 class TestGerritMasterStartScript:
     @pytest.mark.timeout(60)
     def test_gerrit_master_gerrit_starts_up(self, container_run):
diff --git a/tests/container-images/gerrit-master/test_container_structure_gerrit_master.py b/tests/container-images/gerrit-master/test_container_structure_gerrit_master.py
index a45e7b1..d35c8e9 100755
--- a/tests/container-images/gerrit-master/test_container_structure_gerrit_master.py
+++ b/tests/container-images/gerrit-master/test_container_structure_gerrit_master.py
@@ -33,6 +33,7 @@
     assert contains_tag
 
 
+@pytest.mark.docker
 def test_gerrit_master_contains_start_script(container_run):
     exit_code, _ = container_run.exec_run("test -f /var/tools/start")
     assert exit_code == 0
diff --git a/tests/container-images/gerrit-slave/test_container_integration_gerrit_slave.py b/tests/container-images/gerrit-slave/test_container_integration_gerrit_slave.py
index ff6ac92..363110e 100644
--- a/tests/container-images/gerrit-slave/test_container_integration_gerrit_slave.py
+++ b/tests/container-images/gerrit-slave/test_container_integration_gerrit_slave.py
@@ -69,8 +69,9 @@
     return test_setup.gerrit_container
 
 
-@pytest.mark.slow
+@pytest.mark.docker
 @pytest.mark.incremental
+@pytest.mark.slow
 class TestGerritSlave:
     @pytest.fixture(params=CONFIG_FILES)
     def config_file_to_test(self, request):
diff --git a/tests/container-images/gerrit-slave/test_container_structure_gerrit_slave.py b/tests/container-images/gerrit-slave/test_container_structure_gerrit_slave.py
index 25b5ea2..179a93e 100755
--- a/tests/container-images/gerrit-slave/test_container_structure_gerrit_slave.py
+++ b/tests/container-images/gerrit-slave/test_container_structure_gerrit_slave.py
@@ -38,16 +38,19 @@
     assert contains_tag
 
 
+@pytest.mark.docker
 def test_gerrit_slave_contains_expected_scripts(container_run, expected_script):
     exit_code, _ = container_run.exec_run("test -f %s" % expected_script)
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_gerrit_slave_contains_initialized_gerrit_site(container_run):
     exit_code, _ = container_run.exec_run("/var/gerrit/bin/gerrit.sh check")
     assert exit_code == 3
 
 
+@pytest.mark.docker
 def test_gerrit_slave_gerrit_is_configured_slave(container_run):
     exit_code, output = container_run.exec_run(
         "git config -f /var/gerrit/etc/gerrit.config --get container.slave"
diff --git a/tests/container-images/git-gc/test_container_structure_gitgc.py b/tests/container-images/git-gc/test_container_structure_gitgc.py
index 9abbd20..4918115 100644
--- a/tests/container-images/git-gc/test_container_structure_gitgc.py
+++ b/tests/container-images/git-gc/test_container_structure_gitgc.py
@@ -31,11 +31,13 @@
     assert contains_tag
 
 
+@pytest.mark.docker
 def test_gitgc_log_dir_writable_by_gerrit(container_run):
     exit_code, _ = container_run.exec_run("touch /var/log/git/test.log")
     assert exit_code == 0
 
 
+@pytest.mark.docker
 def test_gitgc_contains_gc_script(container_run):
     exit_code, _ = container_run.exec_run("test -f /var/tools/gc-all.sh")
     assert exit_code == 0