blob: 2aea6536c74a23753e7009c1b8f5195ca50a8377 [file] [log] [blame]
Jon Salz98255932012-08-18 14:48:02 +08001#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
Mike Frysingerae409522014-02-01 03:16:11 -05007"""Unittests for pre-upload.py."""
8
Mike Frysinger09d6a3d2013-10-08 22:21:03 -04009from __future__ import print_function
10
Jon Salz98255932012-08-18 14:48:02 +080011import mox
David Jamesc3b68b32013-04-03 09:17:03 -070012import os
13import sys
Jon Salz98255932012-08-18 14:48:02 +080014
15# pylint: disable=W0212
Mike Frysinger65d93c12014-02-01 02:59:46 -050016# We access private members of the pre_upload module all over the place.
17
18# If repo imports us, the __name__ will be __builtin__, and the wrapper will
19# be in $CHROMEOS_CHECKOUT/.repo/repo/main.py, so we need to go two directories
20# up. The same logic also happens to work if we're executed directly.
21if __name__ in ('__builtin__', '__main__'):
David Jamesc3b68b32013-04-03 09:17:03 -070022 sys.path.insert(0, os.path.join(os.path.dirname(sys.argv[0]), '..', '..'))
Jon Salz98255932012-08-18 14:48:02 +080023
Mike Frysinger65d93c12014-02-01 02:59:46 -050024from chromite.lib import cros_test_lib
25
26
Jon Salz98255932012-08-18 14:48:02 +080027pre_upload = __import__('pre-upload')
28
29
Mike Frysinger65d93c12014-02-01 02:59:46 -050030class TryUTF8DecodeTest(cros_test_lib.TestCase):
Mike Frysingerae409522014-02-01 03:16:11 -050031 """Verify we sanely handle unicode content."""
32
Jon Salz98255932012-08-18 14:48:02 +080033 def runTest(self):
34 self.assertEquals(u'', pre_upload._try_utf8_decode(''))
35 self.assertEquals(u'abc', pre_upload._try_utf8_decode('abc'))
36 self.assertEquals(u'你好布萊恩', pre_upload._try_utf8_decode('你好布萊恩'))
37 # Invalid UTF-8
38 self.assertEquals('\x80', pre_upload._try_utf8_decode('\x80'))
39
40
Mike Frysinger65d93c12014-02-01 02:59:46 -050041class CheckNoLongLinesTest(cros_test_lib.MoxTestCase):
Mike Frysingerae409522014-02-01 03:16:11 -050042 """Tests for _check_no_long_lines."""
43
Jon Salz98255932012-08-18 14:48:02 +080044 def setUp(self):
Mike Frysinger65d93c12014-02-01 02:59:46 -050045 self.mox.StubOutWithMock(pre_upload, '_filter_files')
46 self.mox.StubOutWithMock(pre_upload, '_get_affected_files')
47 self.mox.StubOutWithMock(pre_upload, '_get_file_diff')
Jon Salz98255932012-08-18 14:48:02 +080048 pre_upload._get_affected_files(mox.IgnoreArg()).AndReturn(['x.py'])
49 pre_upload._filter_files(
50 ['x.py'], mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(['x.py'])
51
Jon Salz98255932012-08-18 14:48:02 +080052 def runTest(self):
53 pre_upload._get_file_diff(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(
54 [(1, u"x" * 80), # OK
55 (2, "\x80" * 80), # OK
56 (3, u"x" * 81), # Too long
57 (4, "\x80" * 81), # Too long
58 (5, u"See http://" + (u"x" * 80)), # OK (URL)
59 (6, u"See https://" + (u"x" * 80)), # OK (URL)
60 (7, u"# define " + (u"x" * 80)), # OK (compiler directive)
61 (8, u"#define" + (u"x" * 74)), # Too long
62 ])
Mike Frysinger65d93c12014-02-01 02:59:46 -050063 self.mox.ReplayAll()
Jon Salz98255932012-08-18 14:48:02 +080064 failure = pre_upload._check_no_long_lines('PROJECT', 'COMMIT')
65 self.assertTrue(failure)
66 self.assertEquals('Found lines longer than 80 characters (first 5 shown):',
67 failure.msg)
68 self.assertEquals(['x.py, line %d, 81 chars' % line
69 for line in [3, 4, 8]],
70 failure.items)
71
Mike Frysingerae409522014-02-01 03:16:11 -050072
Mike Frysinger65d93c12014-02-01 02:59:46 -050073class CheckKernelConfig(cros_test_lib.MoxTestCase):
Mike Frysingerae409522014-02-01 03:16:11 -050074 """Tests for _kernel_configcheck."""
75
Olof Johanssona96810f2012-09-04 16:20:03 -070076 def runTest(self):
Olof Johanssona96810f2012-09-04 16:20:03 -070077 # Mixed changes, should fail
Mike Frysinger65d93c12014-02-01 02:59:46 -050078 self.mox.StubOutWithMock(pre_upload, '_get_affected_files')
Olof Johanssona96810f2012-09-04 16:20:03 -070079 pre_upload._get_affected_files(mox.IgnoreArg()).AndReturn(
80 ['/kernel/files/chromeos/config/base.config',
81 '/kernel/files/arch/arm/mach-exynos/mach-exynos5-dt.c'
82 ])
Mike Frysinger65d93c12014-02-01 02:59:46 -050083 self.mox.ReplayAll()
Olof Johanssona96810f2012-09-04 16:20:03 -070084 failure = pre_upload._kernel_configcheck('PROJECT', 'COMMIT')
85 self.assertTrue(failure)
86
87 # Code-only changes, should pass
Mike Frysinger65d93c12014-02-01 02:59:46 -050088 self.mox.UnsetStubs()
89 self.mox.StubOutWithMock(pre_upload, '_get_affected_files')
Olof Johanssona96810f2012-09-04 16:20:03 -070090 pre_upload._get_affected_files(mox.IgnoreArg()).AndReturn(
91 ['/kernel/files/Makefile',
92 '/kernel/files/arch/arm/mach-exynos/mach-exynos5-dt.c'
93 ])
Mike Frysinger65d93c12014-02-01 02:59:46 -050094 self.mox.ReplayAll()
Olof Johanssona96810f2012-09-04 16:20:03 -070095 failure = pre_upload._kernel_configcheck('PROJECT', 'COMMIT')
96 self.assertFalse(failure)
97
98 # Config-only changes, should pass
Mike Frysinger65d93c12014-02-01 02:59:46 -050099 self.mox.UnsetStubs()
100 self.mox.StubOutWithMock(pre_upload, '_get_affected_files')
Olof Johanssona96810f2012-09-04 16:20:03 -0700101 pre_upload._get_affected_files(mox.IgnoreArg()).AndReturn(
102 ['/kernel/files/chromeos/config/base.config',
103 ])
Mike Frysinger65d93c12014-02-01 02:59:46 -0500104 self.mox.ReplayAll()
Olof Johanssona96810f2012-09-04 16:20:03 -0700105 failure = pre_upload._kernel_configcheck('PROJECT', 'COMMIT')
106 self.assertFalse(failure)
107
Jon Salz98255932012-08-18 14:48:02 +0800108
109if __name__ == '__main__':
Mike Frysinger65d93c12014-02-01 02:59:46 -0500110 cros_test_lib.main()