#!/usr/bin/env python3 # Copyright (c) 2018 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import http import json import os import sys import unittest import unittest.mock import urllib.error ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, ROOT_DIR) import ninjalog_uploader class NinjalogUploaderTest(unittest.TestCase): def test_parse_gn_args(self): gn_args, explicit_keys = ninjalog_uploader.ParseGNArgs(json.dumps([])) self.assertEqual(gn_args, {}) self.assertEqual(explicit_keys, []) # Extract current configs from GN's output json. gn_args, explicit_keys = ninjalog_uploader.ParseGNArgs( json.dumps([ { 'current': { 'value': 'true', 'file': '//path/to/args.gn', }, 'default': { 'value': 'false' }, 'name': 'is_component_build' }, { 'default': { 'value': '"x64"' }, 'name': 'host_cpu' }, ])) self.assertEqual(gn_args, { 'is_component_build': 'true', 'host_cpu': 'x64', }) self.assertEqual(explicit_keys, ['is_component_build']) gn_args, explicit_keys = ninjalog_uploader.ParseGNArgs( json.dumps([ { 'current': { 'value': 'true', 'file': '//.gn', }, 'default': { 'value': 'false' }, 'name': 'is_component_build' }, { 'current': { 'value': 'false', 'file': '//path/to/args.gn', }, 'default': { 'value': 'false' }, 'name': 'use_remoteexec' }, ])) self.assertEqual(gn_args, { 'is_component_build': 'true', 'use_remoteexec': 'false' }) self.assertEqual(explicit_keys, ['use_remoteexec']) # Do not include sensitive information. with unittest.mock.patch('getpass.getuser', return_value='bob'): gn_args, explicit_keys = ninjalog_uploader.ParseGNArgs( json.dumps([ { 'current': { 'value': 'xyz', 'file': '//path/to/args.gn', }, 'default': { 'value': '' }, 'name': 'google_api_key' }, { 'current': { 'value': '/home/bob/bobo', 'file': '//path/to/args.gn', }, 'default': { 'value': '' }, 'name': 'path_with_homedir' }, ])) self.assertEqual( gn_args, { 'google_api_key': '', 'path_with_homedir': '/home/$USER/bobo', }) def test_get_ninjalog(self): # No args => default to cwd. self.assertEqual(ninjalog_uploader.GetNinjalog(['ninja']), './.ninja_log') # Specified by -C case. self.assertEqual( ninjalog_uploader.GetNinjalog(['ninja', '-C', 'out/Release']), 'out/Release/.ninja_log') self.assertEqual( ninjalog_uploader.GetNinjalog(['ninja', '-Cout/Release']), 'out/Release/.ninja_log') # Invalid -C flag case. self.assertEqual(ninjalog_uploader.GetNinjalog(['ninja', '-C']), './.ninja_log') # Multiple target directories => use the last directory. self.assertEqual( ninjalog_uploader.GetNinjalog( ['ninja', '-C', 'out/Release', '-C', 'out/Debug']), 'out/Debug/.ninja_log') def test_get_build_target_from_command_line(self): self.assertEqual( ninjalog_uploader.GetBuildTargetFromCommandLine( ['python3', 'ninja.py', 'chrome']), ['chrome']) self.assertEqual( ninjalog_uploader.GetBuildTargetFromCommandLine( ['python3', 'ninja.py']), []) self.assertEqual( ninjalog_uploader.GetBuildTargetFromCommandLine( ['python3', 'ninja.py', '-j', '1000', 'chrome']), ['chrome']) self.assertEqual( ninjalog_uploader.GetBuildTargetFromCommandLine( ['python3', 'ninja.py', 'chrome', '-j', '1000']), ['chrome']) self.assertEqual( ninjalog_uploader.GetBuildTargetFromCommandLine( ['python3', 'ninja.py', '-C', 'chrome']), []) self.assertEqual( ninjalog_uploader.GetBuildTargetFromCommandLine( ['python3', 'ninja.py', '-Cout/Release', 'chrome']), ['chrome']) self.assertEqual( ninjalog_uploader.GetBuildTargetFromCommandLine( ['python3', 'ninja.py', '-C', 'out/Release', 'chrome', 'all']), ['chrome', 'all']) @unittest.skipIf(sys.platform == 'win32', 'posix path test') def test_get_build_target_from_command_line_filter_posix(self): self.assertEqual( ninjalog_uploader.GetBuildTargetFromCommandLine([ 'python3', 'ninja.py', '-C', 'out/Release', 'chrome', 'all', '/path/to/foo', '-p' ]), ['chrome', 'all']) @unittest.skipUnless(sys.platform == 'win32', 'Windows path test') def test_get_build_target_from_command_line_filter_win(self): self.assertEqual( ninjalog_uploader.GetBuildTargetFromCommandLine([ 'python3', 'ninja.py', '-C', 'out/Release', 'chrome', 'all', 'C:\\path\\to\\foo', '-p' ]), ['chrome', 'all']) def test_get_j_flag(self): self.assertEqual(ninjalog_uploader.GetJflag(['ninja']), None) self.assertEqual(ninjalog_uploader.GetJflag(['ninja', '-j', '1000']), 1000) self.assertEqual(ninjalog_uploader.GetJflag(['ninja', '-j', '1000a']), None) self.assertEqual(ninjalog_uploader.GetJflag(['ninja', '-j', 'a']), None) self.assertEqual(ninjalog_uploader.GetJflag(['ninja', '-j1000']), 1000) self.assertEqual(ninjalog_uploader.GetJflag(['ninja', '-ja']), None) self.assertEqual(ninjalog_uploader.GetJflag(['ninja', '-j']), None) def test_get_gce_metadata(self): with unittest.mock.patch('urllib.request.urlopen') as urlopen_mock: urlopen_mock.side_effect = urllib.error.HTTPError( 'http://test/not-found', http.HTTPStatus.NOT_FOUND, 'not found', None, None) self.assertEqual(ninjalog_uploader.GetGCEMetadata(), {}) with unittest.mock.patch( 'ninjalog_uploader._getGCEInfo') as getGCEInfo_mock: getGCEInfo_mock.return_value = { "instance": { "machineType": "projects/12345/machineTypes/n2d-standard-128", }, "project": { "projectId": "cloudtop-test" } } self.assertEqual(ninjalog_uploader.GetGCEMetadata(), { 'gce_machine_type': 'n2d-standard-128', 'is_cloudtop': True, }) with unittest.mock.patch( 'ninjalog_uploader._getGCEInfo') as getGCEInfo_mock: getGCEInfo_mock.return_value = { "instance": { "machineType": "projects/12345/machineTypes/n2d-standard-128", }, "project": { "projectId": "gce-project" } } self.assertEqual(ninjalog_uploader.GetGCEMetadata(), { 'gce_machine_type': 'n2d-standard-128', }) if __name__ == '__main__': unittest.main()