| Index: chrome/common/extensions/docs/server2/api_data_source_test.py
|
| diff --git a/chrome/common/extensions/docs/server2/api_data_source_test.py b/chrome/common/extensions/docs/server2/api_data_source_test.py
|
| index 6e3b82ac0b40685df9af774536484c1eac50fa13..1dfc6eb7d2622b8120c148f877d763b901bbd8f3 100755
|
| --- a/chrome/common/extensions/docs/server2/api_data_source_test.py
|
| +++ b/chrome/common/extensions/docs/server2/api_data_source_test.py
|
| @@ -12,36 +12,45 @@ from api_data_source import (_JSCModel,
|
| _FormatValue,
|
| _GetEventByNameFromEvents)
|
| from api_schema_graph import APISchemaGraph
|
| -from availability_finder import AvailabilityInfo
|
| -from branch_utility import ChannelInfo
|
| +from availability_finder import AvailabilityFinder, AvailabilityInfo
|
| +from branch_utility import BranchUtility, ChannelInfo
|
| +from compiled_file_system import CompiledFileSystem
|
| from extensions_paths import CHROME_EXTENSIONS
|
| from fake_host_file_system_provider import FakeHostFileSystemProvider
|
| +from fake_url_fetcher import FakeUrlFetcher
|
| from features_bundle import FeaturesBundle
|
| from file_system import FileNotFoundError
|
| from future import Future
|
| +from host_file_system_iterator import HostFileSystemIterator
|
| from object_store_creator import ObjectStoreCreator
|
| from server_instance import ServerInstance
|
| -from test_data.canned_data import (CANNED_API_FILE_SYSTEM_DATA, CANNED_BRANCHES)
|
| from test_data.api_data_source.canned_trunk_fs import CANNED_TRUNK_FS_DATA
|
| +from test_data.canned_data import (CANNED_API_FILE_SYSTEM_DATA, CANNED_BRANCHES)
|
| +from test_data.object_level_availability.tabs import TABS_SCHEMA_BRANCHES
|
| from test_file_system import TestFileSystem
|
| from test_util import Server2Path
|
| from third_party.json_schema_compiler.memoize import memoize
|
|
|
|
|
| -def _MakeLink(href, text):
|
| - return '<a href="%s">%s</a>' % (href, text)
|
| +class _FakeTemplateCache(object):
|
|
|
| + def GetFromFile(self, key):
|
| + return Future(value='handlebar %s' % key)
|
|
|
| -def _GetType(dict_, name):
|
| - for type_ in dict_['types']:
|
| - if type_['name'] == name:
|
| - return type_
|
|
|
| +class _FakeAvailabilityFinder(object):
|
| + def __init__(self, fake_availability):
|
| + self._fake_availability = fake_availability
|
|
|
| -class _FakeTemplateCache(object):
|
| + def GetAPIAvailability(self, api_name):
|
| + return self._fake_availability
|
|
|
| - def GetFromFile(self, key):
|
| - return Future(value='handlebar %s' % key)
|
| + def GetAPINodeAvailability(self, api_name):
|
| + '''The tests that use this fake class don't
|
| + use the node availability, so just return a
|
| + dummy graph.
|
| + '''
|
| + return APISchemaGraph(_graph={'dummy': 'graph'})
|
|
|
|
|
| class _FakeFeaturesBundle(object):
|
| @@ -72,7 +81,6 @@ class _FakeAvailabilityFinder(object):
|
|
|
|
|
| class APIDataSourceTest(unittest.TestCase):
|
| -
|
| def setUp(self):
|
| self._base_path = Server2Path('test_data', 'test_json')
|
|
|
| @@ -88,17 +96,6 @@ class APIDataSourceTest(unittest.TestCase):
|
| 'extensions')
|
| self._fake_availability = AvailabilityInfo(ChannelInfo('stable', '396', 5))
|
|
|
| - # Used for testGetAPIAvailability() so that valid-ish data is processed.
|
| - server_instance = ServerInstance.ForTest(
|
| - file_system_provider=FakeHostFileSystemProvider(
|
| - CANNED_API_FILE_SYSTEM_DATA))
|
| - self._avail_api_models = server_instance.platform_bundle.GetAPIModels(
|
| - 'extensions')
|
| - self._avail_json_cache = server_instance.compiled_fs_factory.ForJson(
|
| - server_instance.host_file_system_provider.GetTrunk())
|
| - self._avail_finder = server_instance.platform_bundle.GetAvailabilityFinder(
|
| - 'extensions')
|
| -
|
| def _ReadLocalFile(self, filename):
|
| with open(os.path.join(self._base_path, filename), 'r') as f:
|
| return f.read()
|
| @@ -106,6 +103,35 @@ class APIDataSourceTest(unittest.TestCase):
|
| def _LoadJSON(self, filename):
|
| return json.loads(self._ReadLocalFile(filename))
|
|
|
| + def _FakeLoadAddRulesSchema(self):
|
| + events = self._LoadJSON('add_rules_def_test.json')
|
| + return Future(value=_GetEventByNameFromEvents(events))
|
| +
|
| + def testFormatValue(self):
|
| + self.assertEquals('1,234,567', _FormatValue(1234567))
|
| + self.assertEquals('67', _FormatValue(67))
|
| + self.assertEquals('234,567', _FormatValue(234567))
|
| +
|
| + def testGetEventByNameFromEvents(self):
|
| + events = {}
|
| + # Missing 'types' completely.
|
| + self.assertRaises(AssertionError, _GetEventByNameFromEvents, events)
|
| +
|
| + events['types'] = []
|
| + # No type 'Event' defined.
|
| + self.assertRaises(AssertionError, _GetEventByNameFromEvents, events)
|
| +
|
| + events['types'].append({ 'name': 'Event',
|
| + 'functions': []})
|
| + add_rules = { "name": "addRules" }
|
| + events['types'][0]['functions'].append(add_rules)
|
| + self.assertEqual(add_rules,
|
| + _GetEventByNameFromEvents(events)['addRules'])
|
| +
|
| + events['types'][0]['functions'].append(add_rules)
|
| + # Duplicates are an error.
|
| + self.assertRaises(AssertionError, _GetEventByNameFromEvents, events)
|
| +
|
| def testCreateId(self):
|
| fake_avail_finder = _FakeAvailabilityFinder(self._fake_availability)
|
| dict_ = _JSCModel(self._api_models.GetModel('tester').Get(),
|
| @@ -132,32 +158,30 @@ class APIDataSourceTest(unittest.TestCase):
|
| None).ToDict()
|
| self.assertEquals(expected_json, dict_)
|
|
|
| - def testFormatValue(self):
|
| - self.assertEquals('1,234,567', _FormatValue(1234567))
|
| - self.assertEquals('67', _FormatValue(67))
|
| - self.assertEquals('234,567', _FormatValue(234567))
|
| + def testAddRules(self):
|
| + fake_avail_finder = _FakeAvailabilityFinder(self._fake_availability)
|
| + dict_ = _JSCModel(self._api_models.GetModel('add_rules_tester').Get(),
|
| + fake_avail_finder,
|
| + #self._fake_availability,
|
| + self._json_cache,
|
| + _FakeTemplateCache(),
|
| + self._features_bundle,
|
| + self._FakeLoadAddRulesSchema()).ToDict()
|
|
|
| - def testGetAPIAvailability(self):
|
| - api_availabilities = {
|
| - 'bluetooth': 28,
|
| - 'contextMenus': 'trunk',
|
| - 'jsonStableAPI': 20,
|
| - 'idle': 5,
|
| - 'input.ime': 18,
|
| - 'signedInDevices': 'trunk',
|
| - 'systemInfo.stuff': 28,
|
| - 'tabs': 18
|
| - }
|
| - for api_name, availability in api_availabilities.iteritems():
|
| - model_dict = _JSCModel(
|
| - self._avail_api_models.GetModel(api_name).Get(),
|
| - self._avail_finder,
|
| - self._avail_json_cache,
|
| - _FakeTemplateCache(),
|
| - _FakeFeaturesBundle(),
|
| - None).ToDict()
|
| - self.assertEquals(availability,
|
| - model_dict['introList'][1]['content'][0]['version'])
|
| + # Check that the first event has the addRulesFunction defined.
|
| + self.assertEquals('add_rules_tester', dict_['name'])
|
| + self.assertEquals('rules', dict_['events'][0]['name'])
|
| + self.assertEquals('notable_name_to_check_for',
|
| + dict_['events'][0]['byName']['addRules'][
|
| + 'parameters'][0]['name'])
|
| +
|
| + # Check that the second event has addListener defined.
|
| + self.assertEquals('noRules', dict_['events'][1]['name'])
|
| + self.assertEquals('add_rules_tester', dict_['name'])
|
| + self.assertEquals('noRules', dict_['events'][1]['name'])
|
| + self.assertEquals('callback',
|
| + dict_['events'][0]['byName']['addListener'][
|
| + 'parameters'][0]['name'])
|
|
|
| def testGetIntroList(self):
|
| fake_avail_finder = _FakeAvailabilityFinder(self._fake_availability)
|
| @@ -228,53 +252,111 @@ class APIDataSourceTest(unittest.TestCase):
|
| }
|
| self.assertEquals(model._GetIntroTableList(), expected_list)
|
|
|
| - def testGetEventByNameFromEvents(self):
|
| - events = {}
|
| - # Missing 'types' completely.
|
| - self.assertRaises(AssertionError, _GetEventByNameFromEvents, events)
|
|
|
| - events['types'] = []
|
| - # No type 'Event' defined.
|
| - self.assertRaises(AssertionError, _GetEventByNameFromEvents, events)
|
| +class APIDataSourceWithoutNodeAvailabilityTest(unittest.TestCase):
|
| + def setUp(self):
|
| + server_instance = ServerInstance.ForTest(
|
| + file_system_provider=FakeHostFileSystemProvider(
|
| + CANNED_API_FILE_SYSTEM_DATA))
|
| + self._api_models = server_instance.platform_bundle.GetAPIModels(
|
| + 'extensions')
|
| + self._json_cache = server_instance.compiled_fs_factory.ForJson(
|
| + server_instance.host_file_system_provider.GetTrunk())
|
| + self._avail_finder = server_instance.platform_bundle.GetAvailabilityFinder(
|
| + 'extensions')
|
|
|
| - events['types'].append({ 'name': 'Event',
|
| - 'functions': []})
|
| - add_rules = { "name": "addRules" }
|
| - events['types'][0]['functions'].append(add_rules)
|
| - self.assertEqual(add_rules,
|
| - _GetEventByNameFromEvents(events)['addRules'])
|
|
|
| - events['types'][0]['functions'].append(add_rules)
|
| - # Duplicates are an error.
|
| - self.assertRaises(AssertionError, _GetEventByNameFromEvents, events)
|
| + def testGetAPIAvailability(self):
|
| + api_availabilities = {
|
| + 'bluetooth': 28,
|
| + 'contextMenus': 'trunk',
|
| + 'jsonStableAPI': 20,
|
| + 'idle': 5,
|
| + 'input.ime': 18,
|
| + 'tabs': 18
|
| + }
|
| + for api_name, availability in api_availabilities.iteritems():
|
| + model_dict = _JSCModel(
|
| + self._api_models.GetModel(api_name).Get(),
|
| + self._avail_finder,
|
| + self._json_cache,
|
| + _FakeTemplateCache(),
|
| + _FakeFeaturesBundle(),
|
| + None).ToDict()
|
| + self.assertEquals(availability,
|
| + model_dict['introList'][1]['content'][0]['version'])
|
|
|
| - def _FakeLoadAddRulesSchema(self):
|
| - events = self._LoadJSON('add_rules_def_test.json')
|
| - return Future(value=_GetEventByNameFromEvents(events))
|
|
|
| - def testAddRules(self):
|
| - fake_avail_finder = _FakeAvailabilityFinder(self._fake_availability)
|
| - dict_ = _JSCModel(self._api_models.GetModel('add_rules_tester').Get(),
|
| - fake_avail_finder,
|
| - self._json_cache,
|
| - _FakeTemplateCache(),
|
| - self._features_bundle,
|
| - self._FakeLoadAddRulesSchema()).ToDict()
|
| +class APIDataSourceWithNodeAvailabilityTest(unittest.TestCase):
|
| + def setUp(self):
|
| + tabs_unmodified_versions = (16, 20, 23, 24)
|
| + self._branch_utility = BranchUtility(
|
| + os.path.join('branch_utility', 'first.json'),
|
| + os.path.join('branch_utility', 'second.json'),
|
| + FakeUrlFetcher(Server2Path('test_data')),
|
| + ObjectStoreCreator.ForTest())
|
| + self._node_fs_creator = FakeHostFileSystemProvider(TABS_SCHEMA_BRANCHES)
|
| + self._node_fs_iterator = HostFileSystemIterator(self._node_fs_creator,
|
| + self._branch_utility)
|
| + test_object_store = ObjectStoreCreator.ForTest()
|
| + self._avail_finder = AvailabilityFinder(
|
| + self._branch_utility,
|
| + CompiledFileSystem.Factory(test_object_store),
|
| + self._node_fs_iterator,
|
| + self._node_fs_creator.GetTrunk(),
|
| + test_object_store,
|
| + 'extensions')
|
|
|
| - # Check that the first event has the addRulesFunction defined.
|
| - self.assertEquals('add_rules_tester', dict_['name'])
|
| - self.assertEquals('rules', dict_['events'][0]['name'])
|
| - self.assertEquals('notable_name_to_check_for',
|
| - dict_['events'][0]['byName']['addRules'][
|
| - 'parameters'][0]['name'])
|
| + server_instance = ServerInstance.ForTest(
|
| + file_system_provider=FakeHostFileSystemProvider(
|
| + TABS_SCHEMA_BRANCHES))
|
| + self._api_models = server_instance.platform_bundle.GetAPIModels(
|
| + 'extensions')
|
| + self._json_cache = server_instance.compiled_fs_factory.ForJson(
|
| + server_instance.host_file_system_provider.GetTrunk())
|
| +
|
| + # Imitate the actual SVN file system by incrementing the stats for paths
|
| + # where an API schema has changed.
|
| + last_stat = type('last_stat', (object,), {'val': 0})
|
| +
|
| + def stat_paths(file_system, channel_info):
|
| + if channel_info.version not in tabs_unmodified_versions:
|
| + last_stat.val += 1
|
| + # HACK: |file_system| is a MockFileSystem backed by a TestFileSystem.
|
| + # Increment the TestFileSystem stat count.
|
| + file_system._file_system.IncrementStat(by=last_stat.val)
|
| + # Continue looping. The iterator will stop after 'trunk' automatically.
|
| + return True
|
| +
|
| + # Use the HostFileSystemIterator created above to change global stat values
|
| + # for the TestFileSystems that it creates.
|
| + self._node_fs_iterator.Ascending(
|
| + # The earliest version represented with the tabs' test data is 13.
|
| + self._branch_utility.GetStableChannelInfo(13),
|
| + stat_paths)
|
| +
|
| + def testGetAPINodeAvailability(self):
|
| + def assertEquals(node, actual):
|
| + node_availabilities = {
|
| + 'tabs.get': None,
|
| + 'tabs.getCurrent': 19
|
| + }
|
| + self.assertEquals(node_availabilities[node], actual)
|
| +
|
| + model_dict = _JSCModel(
|
| + self._api_models.GetModel('tabs').Get(),
|
| + self._avail_finder,
|
| + self._json_cache,
|
| + _FakeTemplateCache(),
|
| + _FakeFeaturesBundle(),
|
| + None).ToDict()
|
| +
|
| + # Test nodes that have the same availability as their parent.
|
| + assertEquals('tabs.get', model_dict['functions'][1]['availability'])
|
| + # Test nodes with varying availabilities.
|
| + assertEquals('tabs.getCurrent',
|
| + model_dict['functions'][0]['availability']['version'])
|
|
|
| - # Check that the second event has addListener defined.
|
| - self.assertEquals('noRules', dict_['events'][1]['name'])
|
| - self.assertEquals('add_rules_tester', dict_['name'])
|
| - self.assertEquals('noRules', dict_['events'][1]['name'])
|
| - self.assertEquals('callback',
|
| - dict_['events'][0]['byName']['addListener'][
|
| - 'parameters'][0]['name'])
|
|
|
| if __name__ == '__main__':
|
| unittest.main()
|
|
|