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