Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / common / extensions / docs / server2 / availability_finder_test.py
1 #!/usr/bin/env python
2 # Copyright 2013 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5 import os
6 import sys
7 import unittest
8
9 import api_schema_graph
10 from availability_finder import AvailabilityFinder, AvailabilityInfo
11 from branch_utility import BranchUtility, ChannelInfo
12 from compiled_file_system import CompiledFileSystem
13 from fake_host_file_system_provider import FakeHostFileSystemProvider
14 from fake_url_fetcher import FakeUrlFetcher
15 from host_file_system_iterator import HostFileSystemIterator
16 from mock_function import MockFunction
17 from object_store_creator import ObjectStoreCreator
18 from test_data.canned_data import (CANNED_API_FILE_SYSTEM_DATA, CANNED_BRANCHES)
19 from test_data.object_level_availability.tabs import TABS_SCHEMA_BRANCHES
20 from test_util import Server2Path
21
22
23 TABS_UNMODIFIED_VERSIONS = (16, 20, 23, 24)
24
25 class AvailabilityFinderTest(unittest.TestCase):
26
27   def setUp(self):
28     self._branch_utility = BranchUtility(
29         os.path.join('branch_utility', 'first.json'),
30         os.path.join('branch_utility', 'second.json'),
31         FakeUrlFetcher(Server2Path('test_data')),
32         ObjectStoreCreator.ForTest())
33     api_fs_creator = FakeHostFileSystemProvider(CANNED_API_FILE_SYSTEM_DATA)
34     self._node_fs_creator = FakeHostFileSystemProvider(TABS_SCHEMA_BRANCHES)
35
36     def create_availability_finder(host_fs_creator):
37       test_object_store = ObjectStoreCreator.ForTest()
38       return AvailabilityFinder(
39           self._branch_utility,
40           CompiledFileSystem.Factory(test_object_store),
41           HostFileSystemIterator(host_fs_creator,
42                                  self._branch_utility),
43           host_fs_creator.GetTrunk(),
44           test_object_store)
45
46     self._avail_finder = create_availability_finder(api_fs_creator)
47     self._node_avail_finder = create_availability_finder(self._node_fs_creator)
48
49     # Imitate the actual SVN file system by incrementing the stats for paths
50     # where an API schema has changed.
51     last_stat = type('last_stat', (object,), {'val': 0})
52
53     def stat_paths(file_system, channel_info):
54       if channel_info.version not in TABS_UNMODIFIED_VERSIONS:
55         last_stat.val += 1
56       # HACK: |file_system| is a MockFileSystem backed by a TestFileSystem.
57       # Increment the TestFileSystem stat count.
58       file_system._file_system.IncrementStat(by=last_stat.val)
59       # Continue looping. The iterator will stop after 'trunk' automatically.
60       return True
61
62     # Use the HostFileSystemIterator created above to change global stat values
63     # for the TestFileSystems that it creates.
64     self._node_avail_finder._file_system_iterator.Ascending(
65         # The earliest version represented with the tabs' test data is 13.
66         self._branch_utility.GetStableChannelInfo(13),
67         stat_paths)
68
69   def testGraphOptimization(self):
70     # Keep track of how many times the APISchemaGraph constructor is called.
71     original_constructor = api_schema_graph.APISchemaGraph
72     mock_constructor = MockFunction(original_constructor)
73     api_schema_graph.APISchemaGraph = mock_constructor
74
75     try:
76       # The test data includes an extra branch where the API does not exist.
77       num_versions = len(TABS_SCHEMA_BRANCHES) - 1
78       # We expect an APISchemaGraph to be created only when an API schema file
79       # has different stat data from the previous version's schema file.
80       num_graphs_created = num_versions - len(TABS_UNMODIFIED_VERSIONS)
81
82       # Run the logic for object-level availability for an API.
83       self._node_avail_finder.GetApiNodeAvailability('tabs')
84
85       self.assertTrue(*api_schema_graph.APISchemaGraph.CheckAndReset(
86           num_graphs_created))
87     finally:
88       # Ensure that the APISchemaGraph constructor is reset to be the original
89       # constructor.
90       api_schema_graph.APISchemaGraph = original_constructor
91
92   def testGetApiAvailability(self):
93     # Key: Using 'channel' (i.e. 'beta') to represent an availability listing
94     # for an API in a _features.json file, and using |channel| (i.e. |dev|) to
95     # represent the development channel, or phase of development, where an API's
96     # availability is being checked.
97
98     # Testing APIs with predetermined availability.
99     self.assertEqual(
100         AvailabilityInfo(ChannelInfo('trunk', 'trunk', 'trunk')),
101         self._avail_finder.GetApiAvailability('jsonTrunkAPI'))
102     self.assertEqual(
103         AvailabilityInfo(ChannelInfo('dev', CANNED_BRANCHES[28], 28)),
104         self._avail_finder.GetApiAvailability('jsonDevAPI'))
105     self.assertEqual(
106         AvailabilityInfo(ChannelInfo('beta', CANNED_BRANCHES[27], 27)),
107         self._avail_finder.GetApiAvailability('jsonBetaAPI'))
108     self.assertEqual(
109         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[20], 20)),
110         self._avail_finder.GetApiAvailability('jsonStableAPI'))
111
112     # Testing a whitelisted API.
113     self.assertEquals(
114         AvailabilityInfo(ChannelInfo('beta', CANNED_BRANCHES[27], 27)),
115         self._avail_finder.GetApiAvailability('declarativeWebRequest'))
116
117     # Testing APIs found only by checking file system existence.
118     self.assertEquals(
119         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[23], 23)),
120         self._avail_finder.GetApiAvailability('windows'))
121     self.assertEquals(
122         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[18], 18)),
123         self._avail_finder.GetApiAvailability('tabs'))
124     self.assertEquals(
125         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[18], 18)),
126         self._avail_finder.GetApiAvailability('input.ime'))
127
128     # Testing API channel existence for _api_features.json.
129     # Listed as 'dev' on |beta|, 'dev' on |dev|.
130     self.assertEquals(
131         AvailabilityInfo(ChannelInfo('dev', CANNED_BRANCHES[28], 28)),
132         self._avail_finder.GetApiAvailability('systemInfo.stuff'))
133     # Listed as 'stable' on |beta|.
134     self.assertEquals(
135         AvailabilityInfo(
136         ChannelInfo('beta', CANNED_BRANCHES[27], 27),
137         scheduled=28),
138         self._avail_finder.GetApiAvailability('systemInfo.cpu'))
139
140     # Testing API channel existence for _manifest_features.json.
141     # Listed as 'trunk' on all channels.
142     self.assertEquals(
143         AvailabilityInfo(ChannelInfo('trunk', 'trunk', 'trunk')),
144         self._avail_finder.GetApiAvailability('sync'))
145     # No records of API until |trunk|.
146     self.assertEquals(
147         AvailabilityInfo(ChannelInfo('trunk', 'trunk', 'trunk')),
148         self._avail_finder.GetApiAvailability('history'))
149     # Listed as 'dev' on |dev|.
150     self.assertEquals(
151         AvailabilityInfo(ChannelInfo('dev', CANNED_BRANCHES[28], 28)),
152         self._avail_finder.GetApiAvailability('storage'))
153     # Stable in _manifest_features and into pre-18 versions.
154     self.assertEquals(
155         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[8], 8)),
156         self._avail_finder.GetApiAvailability('pageAction'))
157
158     # Testing API channel existence for _permission_features.json.
159     # Listed as 'beta' on |trunk|.
160     self.assertEquals(
161         AvailabilityInfo(ChannelInfo('trunk', 'trunk', 'trunk')),
162         self._avail_finder.GetApiAvailability('falseBetaAPI'))
163     # Listed as 'trunk' on |trunk|.
164     self.assertEquals(
165         AvailabilityInfo(ChannelInfo('trunk', 'trunk', 'trunk')),
166         self._avail_finder.GetApiAvailability('trunkAPI'))
167     # Listed as 'trunk' on all development channels.
168     self.assertEquals(
169         AvailabilityInfo(ChannelInfo('trunk', 'trunk', 'trunk')),
170         self._avail_finder.GetApiAvailability('declarativeContent'))
171     # Listed as 'dev' on all development channels.
172     self.assertEquals(
173         AvailabilityInfo(ChannelInfo('dev', CANNED_BRANCHES[28], 28)),
174         self._avail_finder.GetApiAvailability('bluetooth'))
175     # Listed as 'dev' on |dev|.
176     self.assertEquals(
177         AvailabilityInfo(ChannelInfo('dev', CANNED_BRANCHES[28], 28)),
178         self._avail_finder.GetApiAvailability('cookies'))
179     # Treated as 'stable' APIs.
180     self.assertEquals(
181         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[24], 24)),
182         self._avail_finder.GetApiAvailability('alarms'))
183     self.assertEquals(
184         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[21], 21)),
185         self._avail_finder.GetApiAvailability('bookmarks'))
186
187     # Testing older API existence using extension_api.json.
188     self.assertEquals(
189         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[6], 6)),
190         self._avail_finder.GetApiAvailability('menus'))
191     self.assertEquals(
192         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[5], 5)),
193         self._avail_finder.GetApiAvailability('idle'))
194
195     # Switches between _features.json files across branches.
196     # Listed as 'trunk' on all channels, in _api, _permission, or _manifest.
197     self.assertEquals(
198         AvailabilityInfo(ChannelInfo('trunk', 'trunk', 'trunk')),
199         self._avail_finder.GetApiAvailability('contextMenus'))
200     # Moves between _permission and _manifest as file system is traversed.
201     self.assertEquals(
202         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[23], 23)),
203         self._avail_finder.GetApiAvailability('systemInfo.display'))
204     self.assertEquals(
205         AvailabilityInfo(ChannelInfo('stable', CANNED_BRANCHES[17], 17)),
206         self._avail_finder.GetApiAvailability('webRequest'))
207
208     # Mid-upgrade cases:
209     # Listed as 'dev' on |beta| and 'beta' on |dev|.
210     self.assertEquals(
211         AvailabilityInfo(ChannelInfo('dev', CANNED_BRANCHES[28], 28)),
212         self._avail_finder.GetApiAvailability('notifications'))
213     # Listed as 'beta' on |stable|, 'dev' on |beta| ... until |stable| on trunk.
214     self.assertEquals(
215         AvailabilityInfo(ChannelInfo('trunk', 'trunk', 'trunk')),
216         self._avail_finder.GetApiAvailability('events'))
217
218   def testGetApiNodeAvailability(self):
219     # Allow the LookupResult constructions below to take just one line.
220     lookup_result = api_schema_graph.LookupResult
221     availability_graph = self._node_avail_finder.GetApiNodeAvailability('tabs')
222
223     self.assertEquals(
224         lookup_result(True, self._branch_utility.GetChannelInfo('trunk')),
225         availability_graph.Lookup('tabs', 'properties',
226                                   'fakeTabsProperty3'))
227     self.assertEquals(
228         lookup_result(True, self._branch_utility.GetChannelInfo('dev')),
229         availability_graph.Lookup('tabs', 'events', 'onActivated',
230                                   'parameters', 'activeInfo', 'properties',
231                                   'windowId'))
232     self.assertEquals(
233         lookup_result(True, self._branch_utility.GetChannelInfo('dev')),
234         availability_graph.Lookup('tabs', 'events', 'onUpdated', 'parameters',
235                                   'tab'))
236     self.assertEquals(
237         lookup_result(True, self._branch_utility.GetChannelInfo('beta')),
238         availability_graph.Lookup('tabs', 'events','onActivated'))
239     self.assertEquals(
240         lookup_result(True, self._branch_utility.GetChannelInfo('beta')),
241         availability_graph.Lookup('tabs', 'functions', 'get', 'parameters',
242                                   'tabId'))
243     self.assertEquals(
244         lookup_result(True, self._branch_utility.GetChannelInfo('stable')),
245         availability_graph.Lookup('tabs', 'types', 'InjectDetails',
246                                   'properties', 'code'))
247     self.assertEquals(
248         lookup_result(True, self._branch_utility.GetChannelInfo('stable')),
249         availability_graph.Lookup('tabs', 'types', 'InjectDetails',
250                                   'properties', 'file'))
251     self.assertEquals(
252         lookup_result(True, self._branch_utility.GetStableChannelInfo(25)),
253         availability_graph.Lookup('tabs', 'types', 'InjectDetails'))
254
255     # Nothing new in version 24 or 23.
256
257     self.assertEquals(
258         lookup_result(True, self._branch_utility.GetStableChannelInfo(22)),
259         availability_graph.Lookup('tabs', 'types', 'Tab', 'properties',
260                                   'windowId'))
261     self.assertEquals(
262         lookup_result(True, self._branch_utility.GetStableChannelInfo(21)),
263         availability_graph.Lookup('tabs', 'types', 'Tab', 'properties',
264                                   'selected'))
265
266     # Nothing new in version 20.
267
268     self.assertEquals(
269         lookup_result(True, self._branch_utility.GetStableChannelInfo(19)),
270         availability_graph.Lookup('tabs', 'functions', 'getCurrent'))
271     self.assertEquals(
272         lookup_result(True, self._branch_utility.GetStableChannelInfo(18)),
273         availability_graph.Lookup('tabs', 'types', 'Tab', 'properties',
274                                   'index'))
275     self.assertEquals(
276         lookup_result(True, self._branch_utility.GetStableChannelInfo(17)),
277         availability_graph.Lookup('tabs', 'events', 'onUpdated', 'parameters',
278                                   'changeInfo'))
279
280     # Nothing new in version 16.
281
282     self.assertEquals(
283         lookup_result(True, self._branch_utility.GetStableChannelInfo(15)),
284         availability_graph.Lookup('tabs', 'properties',
285                                   'fakeTabsProperty2'))
286
287     # Everything else is available at the API's release, version 14 here.
288     self.assertEquals(
289         lookup_result(True, self._branch_utility.GetStableChannelInfo(14)),
290         availability_graph.Lookup('tabs', 'types', 'Tab'))
291     self.assertEquals(
292         lookup_result(True, self._branch_utility.GetStableChannelInfo(14)),
293         availability_graph.Lookup('tabs', 'types', 'Tab',
294                                   'properties', 'url'))
295     self.assertEquals(
296         lookup_result(True, self._branch_utility.GetStableChannelInfo(14)),
297         availability_graph.Lookup('tabs', 'properties',
298                                   'fakeTabsProperty1'))
299     self.assertEquals(
300         lookup_result(True, self._branch_utility.GetStableChannelInfo(14)),
301         availability_graph.Lookup('tabs', 'functions', 'get', 'parameters',
302                                   'callback'))
303     self.assertEquals(
304         lookup_result(True, self._branch_utility.GetStableChannelInfo(14)),
305         availability_graph.Lookup('tabs', 'events', 'onUpdated'))
306
307     # Test things that aren't available.
308     self.assertEqual(lookup_result(False, None),
309                      availability_graph.Lookup('tabs', 'types',
310                                                'UpdateInfo'))
311     self.assertEqual(lookup_result(False, None),
312                      availability_graph.Lookup('tabs', 'functions', 'get',
313                                                'parameters', 'callback',
314                                                'parameters', 'tab', 'id'))
315     self.assertEqual(lookup_result(False, None),
316                      availability_graph.Lookup('functions'))
317     self.assertEqual(lookup_result(False, None),
318                      availability_graph.Lookup('events', 'onActivated',
319                                                'parameters', 'activeInfo',
320                                                'tabId'))
321
322
323 if __name__ == '__main__':
324   unittest.main()