#!/usr/bin/env vpython3 # Copyright 2020 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. #pylint: disable=protected-access import os import re import sys import tempfile from typing import Any import unittest import six if six.PY2: import mock else: import unittest.mock as mock from pyfakefs import fake_filesystem_unittest from skia_gold_common import output_managerless_skia_gold_session as omsgs from skia_gold_common import skia_gold_properties from skia_gold_common import unittest_utils createSkiaGoldArgs = unittest_utils.createSkiaGoldArgs def assertArgWith(test: unittest.TestCase, arg_list: list, arg: Any, value: Any) -> None: i = arg_list.index(arg) test.assertEqual(arg_list[i + 1], value) class GpuSkiaGoldSessionDiffTest(fake_filesystem_unittest.TestCase): def setUp(self) -> None: self.setUpPyfakefs() self._working_dir = tempfile.mkdtemp() self._json_keys = tempfile.NamedTemporaryFile(delete=False).name @mock.patch.object(omsgs.OutputManagerlessSkiaGoldSession, '_RunCmdForRcAndOutput') def test_commandCommonArgs(self, cmd_mock: mock.MagicMock) -> None: cmd_mock.return_value = (None, None) args = createSkiaGoldArgs(git_revision='a', local_pixel_tests=False) sgp = skia_gold_properties.SkiaGoldProperties(args) session = omsgs.OutputManagerlessSkiaGoldSession(self._working_dir, sgp, self._json_keys, 'corpus', instance='instance') session.Diff('name', 'png_file', None) call_args = cmd_mock.call_args[0][0] self.assertIn('diff', call_args) assertArgWith(self, call_args, '--corpus', 'corpus') # TODO(skbug.com/10610): Remove the -public once we go back to using the # non-public instance, or add a second test for testing that the correct # instance is chosen if we decide to support both depending on what the # user is authenticated for. assertArgWith(self, call_args, '--instance', 'instance-public') assertArgWith(self, call_args, '--input', 'png_file') assertArgWith(self, call_args, '--test', 'name') # TODO(skbug.com/10611): Re-add this assert and remove the check for the # absence of the directory once we switch back to using the proper working # directory. # assertArgWith(self, call_args, '--work-dir', self._working_dir) self.assertNotIn(self._working_dir, call_args) i = call_args.index('--out-dir') # The output directory should not be a subdirectory of the working # directory. self.assertNotIn(self._working_dir, call_args[i + 1]) @mock.patch.object(omsgs.OutputManagerlessSkiaGoldSession, '_StoreDiffLinks') @mock.patch.object(omsgs.OutputManagerlessSkiaGoldSession, '_RunCmdForRcAndOutput') def test_explicitLocalPngDirectory(self, cmd_mock: mock.MagicMock, _) -> None: cmd_mock.return_value = (0, '') if sys.platform == 'win32': local_png_dir = 'c:\\tmp\\foo' else: local_png_dir = '/tmp/foo' args = createSkiaGoldArgs(git_revision='a', skia_gold_local_png_write_directory=local_png_dir) sgp = skia_gold_properties.SkiaGoldProperties(args) session = omsgs.OutputManagerlessSkiaGoldSession(self._working_dir, sgp, self._json_keys, '', '') _, _ = session.Diff('name', '', None) self.assertEqual(cmd_mock.call_count, 1) if six.PY3: call_args = cmd_mock.call_args.args[0] else: call_args = cmd_mock.call_args[0][0] self.assertIn('--out-dir', call_args) output_dir = call_args[call_args.index('--out-dir') + 1] # Directory should be a subdirectory of the directory we gave and be made # up of the image name and a timestamp. parent_dir, sub_dir = output_dir.rsplit(os.sep, 1) self.assertEqual(parent_dir, local_png_dir) sub_dir = os.path.normpath(sub_dir) self.assertIsNotNone(re.match(r'^name_\d+$', sub_dir)) class OutputManagerlessSkiaGoldSessionStoreDiffLinksTest( fake_filesystem_unittest.TestCase): def setUp(self) -> None: self.setUpPyfakefs() self._working_dir = tempfile.mkdtemp() self._json_keys = tempfile.NamedTemporaryFile(delete=False).name def test_outputManagerNotNeeded(self) -> None: args = createSkiaGoldArgs(git_revision='a', local_pixel_tests=True) sgp = skia_gold_properties.SkiaGoldProperties(args) session = omsgs.OutputManagerlessSkiaGoldSession(self._working_dir, sgp, self._json_keys, '', '') input_filepath = os.path.join(self._working_dir, 'input-inputhash.png') with open(input_filepath, 'w') as f: f.write('') closest_filepath = os.path.join(self._working_dir, 'closest-closesthash.png') with open(closest_filepath, 'w') as f: f.write('') diff_filepath = os.path.join(self._working_dir, 'diff.png') with open(diff_filepath, 'w') as f: f.write('') session._StoreDiffLinks('foo', None, self._working_dir) self.assertEqual(session.GetGivenImageLink('foo'), 'file://' + input_filepath) self.assertEqual(session.GetClosestImageLink('foo'), 'file://' + closest_filepath) self.assertEqual(session.GetDiffImageLink('foo'), 'file://' + diff_filepath) if __name__ == '__main__': unittest.main(verbosity=2)