#!/usr/bin/env python # # Copyright (C) 2018 The Android Open Source Project # # 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. # import os import unittest try: from unittest import mock except ImportError: # TODO: Remove when we stop supporting Python 2 import mock from google.auth import exceptions as auth_exceptions from vts.utils.python.gcs import gcs_api_utils def simple_ListFilesWithPrefix(dir_path): return [ '%s/file1' % dir_path, '%s/file2' % dir_path, '%s/file3' % dir_path, '%s/file4' % dir_path ] def simple_DownloadFile(src_file_path, dest_file_path): return None def simple_UploadFile(src_file_path, dest_file_path): return None def simple_PrefixExists(dir_path): if dir_path is 'valid_source_dir': return True else: return False def simple_os_path_exists(path): return True def simple__init__(key_path, bucket_name): return None def simple_PrepareDownloadDestination(src_dir, dest_dir): return os.path.join(dest_dir, os.path.basename(src_dir)) class GcsApiUtilsTest(unittest.TestCase): """Unit tests for gcs_utils module.""" def SetUp(self): """Setup tasks.""" self.category = "category_default" self.name = "name_default" @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.ListFilesWithPrefix', side_effect=simple_ListFilesWithPrefix) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.__init__', side_effect=simple__init__) def testCountFiles(self, simple__init__, simple_ListFilesWithPrefix): """Tests the CountFiles function.""" _gcs_api_utils = gcs_api_utils.GcsApiUtils('key/path', 'vts-fuzz') length = _gcs_api_utils.CountFiles('corpus/ILight/ILight_corpus_seed') simple_ListFilesWithPrefix.assert_called() self.assertEqual(length, 4) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.ListFilesWithPrefix', side_effect=simple_ListFilesWithPrefix) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.__init__', side_effect=simple__init__) def testPrefixExists(self, simple__init__, simple_ListFilesWithPrefix): """Tests the PrefixExists function.""" _gcs_api_utils = gcs_api_utils.GcsApiUtils('key/path', 'vts-fuzz') dir_exist = _gcs_api_utils.PrefixExists( 'corpus/ILight/ILight_corpus_seed') simple_ListFilesWithPrefix.assert_called() self.assertEqual(dir_exist, True) @mock.patch('os.path.exists', side_effect=simple_os_path_exists) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.__init__', side_effect=simple__init__) def testPrepareDownloadDestination(self, simple__init__, simple_os_path_exists): """Tests the PrepareDownloadDestination function.""" _gcs_api_utils = gcs_api_utils.GcsApiUtils('key/path', 'vts-fuzz') local_dest_folder = _gcs_api_utils.PrepareDownloadDestination( 'corpus/ILight/ILight_corpus_seed', 'tmp/tmp4772') self.assertEqual(local_dest_folder, 'tmp/tmp4772/ILight_corpus_seed') @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.DownloadFile', side_effect=simple_DownloadFile) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.PrefixExists', side_effect=simple_PrefixExists) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.ListFilesWithPrefix', side_effect=simple_ListFilesWithPrefix) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.PrepareDownloadDestination', side_effect=simple_PrepareDownloadDestination) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.__init__', side_effect=simple__init__) def testDownloadDir(self, simple__init__, simple_PrepareDownloadDestination, simple_ListFilesWithPrefix, simple_PrefixExists, simple_DownloadFile): """Tests the DownloadDir function""" _gcs_api_utils = gcs_api_utils.GcsApiUtils('key/path', 'vts-fuzz') _gcs_api_utils.DownloadDir('valid_source_dir', 'local_destination/dest') num_DownloadFile_called = simple_DownloadFile.call_count self.assertEqual(num_DownloadFile_called, 4) local_dest_folder = simple_PrepareDownloadDestination.return_value @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.UploadFile', side_effect=simple_UploadFile) @mock.patch('os.path.exists', side_effect=simple_os_path_exists) @mock.patch('os.listdir', side_effect=simple_ListFilesWithPrefix) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.GcsApiUtils.__init__', side_effect=simple__init__) def testUploadDir(self, simple__init__, simple_ListFilesWithPrefix, simple_os_path_exists, simple_UploadFile): _gcs_api_utils = gcs_api_utils.GcsApiUtils('key/path', 'vts-fuzz') _gcs_api_utils.UploadDir('valid_source_dir', 'GCS_destination/dest') num_UploadFile_called = simple_UploadFile.call_count self.assertEqual(num_UploadFile_called, 4) @mock.patch( 'vts.utils.python.gcs.gcs_api_utils.google.auth.default', side_effect=auth_exceptions.DefaultCredentialsError('unit test')) def testCredentialsError(self, mock_default): """Tests authentication failure in __init__.""" _gcs_api_utils = gcs_api_utils.GcsApiUtils('key/path', 'vts-fuzz') self.assertFalse(_gcs_api_utils.Enabled) mock_default.assert_called() if __name__ == "__main__": unittest.main()