• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2021 Google LLC
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14"""Tests the functionality of the docker module."""
15import unittest
16from unittest import mock
17
18import docker
19import test_helpers
20import workspace_utils
21
22CONTAINER_NAME = 'example-container'
23config = test_helpers.create_run_config(oss_fuzz_project_name='project',
24                                        workspace='/workspace')
25config.workspace = '/workspace'
26WORKSPACE = workspace_utils.Workspace(config)
27SANITIZER = 'example-sanitizer'
28LANGUAGE = 'example-language'
29
30
31class GetProjectImageTest(unittest.TestCase):
32  """Tests for get_project_image."""
33
34  def test_get_project_image(self):
35    """Tests that get_project_image_name works as intended."""
36    project = 'my-project'
37    self.assertEqual(docker.get_project_image_name(project),
38                     'gcr.io/oss-fuzz/my-project')
39
40
41class GetDeleteImagesTest(unittest.TestCase):
42  """Tests for delete_images."""
43
44  @mock.patch('utils.execute')
45  def test_delete_images(self, mock_execute):  # pylint: disable=no-self-use
46    """Tests that get_project_image_name works as intended."""
47    images = ['image']
48    docker.delete_images(images)
49    expected_calls = [
50        mock.call(['docker', 'rmi', '-f'] + images),
51        mock.call(['docker', 'builder', 'prune', '-f'])
52    ]
53
54    mock_execute.assert_has_calls(expected_calls)
55
56
57class GetBaseDockerRunArgsTest(unittest.TestCase):
58  """Tests get_base_docker_run_args."""
59
60  @mock.patch('utils.get_container_name', return_value=CONTAINER_NAME)
61  def test_get_base_docker_run_args_container(self, _):
62    """Tests that get_base_docker_run_args works as intended when inside a
63    container."""
64    docker_args, docker_container = docker.get_base_docker_run_args(
65        WORKSPACE, SANITIZER, LANGUAGE)
66    self.assertEqual(docker_container, CONTAINER_NAME)
67    expected_docker_args = []
68    expected_docker_args = [
69        '--cap-add',
70        'SYS_PTRACE',
71        '-e',
72        'FUZZING_ENGINE=libfuzzer',
73        '-e',
74        'ARCHITECTURE=x86_64',
75        '-e',
76        'CIFUZZ=True',
77        '-e',
78        f'SANITIZER={SANITIZER}',
79        '-e',
80        f'FUZZING_LANGUAGE={LANGUAGE}',
81        '-e',
82        f'OUT={WORKSPACE.out}',
83        '--volumes-from',
84        CONTAINER_NAME,
85    ]
86    self.assertEqual(docker_args, expected_docker_args)
87
88  @mock.patch('utils.get_container_name', return_value=None)
89  def test_get_base_docker_run_args_no_container(self, _):
90    """Tests that get_base_docker_run_args works as intended when not inside a
91    container."""
92    docker_args, docker_container = docker.get_base_docker_run_args(
93        WORKSPACE, SANITIZER, LANGUAGE)
94    self.assertEqual(docker_container, None)
95    expected_docker_args = [
96        '--cap-add', 'SYS_PTRACE', '-e', 'FUZZING_ENGINE=libfuzzer', '-e',
97        'ARCHITECTURE=x86_64', '-e', 'CIFUZZ=True', '-e',
98        f'SANITIZER={SANITIZER}', '-e', f'FUZZING_LANGUAGE={LANGUAGE}', '-e',
99        f'OUT={WORKSPACE.out}', '-v',
100        f'{WORKSPACE.workspace}:{WORKSPACE.workspace}'
101    ]
102    self.assertEqual(docker_args, expected_docker_args)
103
104
105class GetBaseDockerRunCommandTest(unittest.TestCase):
106  """Tests get_base_docker_run_args."""
107
108  @mock.patch('utils.get_container_name', return_value=None)
109  def test_get_base_docker_run_command_no_container(self, _):
110    """Tests that get_base_docker_run_args works as intended when not inside a
111    container."""
112    docker_args, docker_container = docker.get_base_docker_run_command(
113        WORKSPACE, SANITIZER, LANGUAGE)
114    self.assertEqual(docker_container, None)
115    expected_docker_command = [
116        'docker', 'run', '--rm', '--privileged', '--cap-add', 'SYS_PTRACE',
117        '-e', 'FUZZING_ENGINE=libfuzzer', '-e', 'ARCHITECTURE=x86_64', '-e',
118        'CIFUZZ=True', '-e', f'SANITIZER={SANITIZER}', '-e',
119        f'FUZZING_LANGUAGE={LANGUAGE}', '-e', f'OUT={WORKSPACE.out}', '-v',
120        f'{WORKSPACE.workspace}:{WORKSPACE.workspace}'
121    ]
122    self.assertEqual(docker_args, expected_docker_command)
123