1*9c5db199SXin Li# Copyright 2022 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li 5*9c5db199SXin Liimport base64 6*9c5db199SXin Liimport unittest 7*9c5db199SXin Lifrom unittest import mock 8*9c5db199SXin Li 9*9c5db199SXin Lifrom autotest_lib.server.cros import chrome_sideloader 10*9c5db199SXin Li 11*9c5db199SXin Li 12*9c5db199SXin Liclass TestGetTastExpr(unittest.TestCase): 13*9c5db199SXin Li """Test GetTastExpr in ChromeSideloader library.""" 14*9c5db199SXin Li 15*9c5db199SXin Li class MockHost: 16*9c5db199SXin Li def path_exists(self, path): 17*9c5db199SXin Li return True 18*9c5db199SXin Li 19*9c5db199SXin Li def get_file(self, src, dst, delete_dest): 20*9c5db199SXin Li pass 21*9c5db199SXin Li 22*9c5db199SXin Li def testTastExpr(self): 23*9c5db199SXin Li tast_expr = "lacros.Basic" 24*9c5db199SXin Li args_dict = {'tast_expr': tast_expr} 25*9c5db199SXin Li self.assertEqual(chrome_sideloader.get_tast_expr(args_dict), tast_expr) 26*9c5db199SXin Li 27*9c5db199SXin Li def testEmptyArgsDict(self): 28*9c5db199SXin Li args_dict = {} 29*9c5db199SXin Li with self.assertRaises(Exception): 30*9c5db199SXin Li chrome_sideloader.get_tast_expr(args_dict) 31*9c5db199SXin Li 32*9c5db199SXin Li def testTastExprB64(self): 33*9c5db199SXin Li tast_expr = '''("group:mainline" && !informational)''' 34*9c5db199SXin Li tast_expr_b64 = _base64_encode_str(tast_expr) 35*9c5db199SXin Li args_dict = {'tast_expr_b64': tast_expr_b64} 36*9c5db199SXin Li self.assertEqual(chrome_sideloader.get_tast_expr(args_dict), tast_expr) 37*9c5db199SXin Li 38*9c5db199SXin Li def testTastExprB64Corrupted(self): 39*9c5db199SXin Li tast_expr = '''("group:mainline" && !informational)''' 40*9c5db199SXin Li tast_expr_b64 = _base64_encode_str(tast_expr) 41*9c5db199SXin Li # remove last character to corrupt the encoding 42*9c5db199SXin Li tast_expr_b64 = tast_expr_b64[:-1] 43*9c5db199SXin Li args_dict = {'tast_expr_b64': tast_expr_b64} 44*9c5db199SXin Li with self.assertRaises(Exception): 45*9c5db199SXin Li chrome_sideloader.get_tast_expr(args_dict) 46*9c5db199SXin Li 47*9c5db199SXin Li def testTastFileWithKey(self): 48*9c5db199SXin Li read_data = '{"default": "(\\"group:mainline\\" && !informational)"}' 49*9c5db199SXin Li file_mock = mock.mock_open(read_data=read_data) 50*9c5db199SXin Li args_dict = { 51*9c5db199SXin Li 'tast_expr_file': 'mocked_file', 52*9c5db199SXin Li 'tast_expr_key': 'default' 53*9c5db199SXin Li } 54*9c5db199SXin Li with mock.patch('builtins.open', file_mock),\ 55*9c5db199SXin Li mock.patch('os.stat'),\ 56*9c5db199SXin Li mock.patch('os.chmod'): 57*9c5db199SXin Li expr = chrome_sideloader.get_tast_expr_from_file( 58*9c5db199SXin Li TestGetTastExpr.MockHost(), args_dict, 'mock/path/') 59*9c5db199SXin Li self.assertEqual('("group:mainline" && !informational)', expr) 60*9c5db199SXin Li 61*9c5db199SXin Li 62*9c5db199SXin Lidef _base64_encode_str(s): 63*9c5db199SXin Li return base64.b64encode(s.encode('utf-8')).decode('ascii') 64*9c5db199SXin Li 65*9c5db199SXin Li 66*9c5db199SXin Liif __name__ == '__main__': 67*9c5db199SXin Li unittest.main() 68