jsonchecker_unittest.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. # Copyright (C) 2010 Apple Inc. All rights reserved.
  2. #
  3. # Redistribution and use in source and binary forms, with or without
  4. # modification, are permitted provided that the following conditions
  5. # are met:
  6. # 1. Redistributions of source code must retain the above copyright
  7. # notice, this list of conditions and the following disclaimer.
  8. # 2. Redistributions in binary form must reproduce the above copyright
  9. # notice, this list of conditions and the following disclaimer in the
  10. # documentation and/or other materials provided with the distribution.
  11. #
  12. # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
  13. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  14. # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  15. # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
  16. # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  17. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  18. # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  19. # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  20. # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  21. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  22. """Unit test for jsonchecker.py."""
  23. import unittest2 as unittest
  24. import jsonchecker
  25. class MockErrorHandler(object):
  26. def __init__(self, handle_style_error):
  27. self.turned_off_filtering = False
  28. self._handle_style_error = handle_style_error
  29. def turn_off_line_filtering(self):
  30. self.turned_off_filtering = True
  31. def __call__(self, line_number, category, confidence, message):
  32. self._handle_style_error(self, line_number, category, confidence, message)
  33. return True
  34. class JSONCheckerTest(unittest.TestCase):
  35. """Tests JSONChecker class."""
  36. def test_line_number_from_json_exception(self):
  37. tests = (
  38. (0, 'No JSON object could be decoded'),
  39. (2, 'Expecting property name: line 2 column 1 (char 2)'),
  40. (3, 'Expecting object: line 3 column 1 (char 15)'),
  41. (9, 'Expecting property name: line 9 column 21 (char 478)'),
  42. )
  43. for expected_line, message in tests:
  44. self.assertEqual(expected_line, jsonchecker.JSONChecker.line_number_from_json_exception(ValueError(message)))
  45. def assert_no_error(self, json_data):
  46. def handle_style_error(mock_error_handler, line_number, category, confidence, message):
  47. self.fail('Unexpected error: %d %s %d %s' % (line_number, category, confidence, message))
  48. error_handler = MockErrorHandler(handle_style_error)
  49. checker = jsonchecker.JSONChecker('foo.json', error_handler)
  50. checker.check(json_data.split('\n'))
  51. self.assertTrue(error_handler.turned_off_filtering)
  52. def assert_error(self, expected_line_number, expected_category, json_data):
  53. def handle_style_error(mock_error_handler, line_number, category, confidence, message):
  54. mock_error_handler.had_error = True
  55. self.assertEqual(expected_line_number, line_number)
  56. self.assertEqual(expected_category, category)
  57. self.assertIn(category, jsonchecker.JSONChecker.categories)
  58. error_handler = MockErrorHandler(handle_style_error)
  59. error_handler.had_error = False
  60. checker = jsonchecker.JSONChecker('foo.json', error_handler)
  61. checker.check(json_data.split('\n'))
  62. self.assertTrue(error_handler.had_error)
  63. self.assertTrue(error_handler.turned_off_filtering)
  64. def mock_handle_style_error(self):
  65. pass
  66. def test_conflict_marker(self):
  67. self.assert_error(0, 'json/syntax', '<<<<<<< HEAD\n{\n}\n')
  68. def test_single_quote(self):
  69. self.assert_error(2, 'json/syntax', "{\n'slaves': []\n}\n")
  70. def test_init(self):
  71. error_handler = MockErrorHandler(self.mock_handle_style_error)
  72. checker = jsonchecker.JSONChecker('foo.json', error_handler)
  73. self.assertEqual(checker._handle_style_error, error_handler)
  74. def test_no_error(self):
  75. self.assert_no_error("""{
  76. "slaves": [ { "name": "test-slave", "platform": "*" },
  77. { "name": "apple-xserve-4", "platform": "mac-snowleopard" }
  78. ],
  79. "builders": [ { "name": "SnowLeopard Intel Release (Build)", "type": "Build", "builddir": "snowleopard-intel-release",
  80. "platform": "mac-snowleopard", "configuration": "release", "architectures": ["x86_64"],
  81. "slavenames": ["apple-xserve-4"]
  82. }
  83. ],
  84. "schedulers": [ { "type": "PlatformSpecificScheduler", "platform": "mac-snowleopard", "branch": "trunk", "treeStableTimer": 45.0,
  85. "builderNames": ["SnowLeopard Intel Release (Build)", "SnowLeopard Intel Debug (Build)"]
  86. }
  87. ]
  88. }
  89. """)