Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / page / test_expectations.py
1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 import fnmatch
6
7 OS_MODIFIERS = ['win', 'xp', 'vista', 'win7',
8                 'mac', 'leopard', 'snowleopard', 'lion', 'mountainlion',
9                 'mavericks', 'yosemite', 'linux', 'chromeos', 'android']
10 GPU_MODIFIERS = ['amd', 'arm', 'broadcom', 'hisilicon', 'intel', 'imagination',
11                  'nvidia', 'qualcomm', 'vivante']
12 CONFIG_MODIFIERS = ['debug', 'release']
13
14 class Expectation(object):
15   def __init__(self, expectation, pattern, conditions=None, bug=None):
16     self.expectation = expectation.lower()
17     self.name_pattern = pattern
18     self.url_pattern = pattern
19     self.bug = bug
20
21     self.os_conditions = []
22     self.gpu_conditions = []
23     self.config_conditions = []
24     self.device_id_conditions = []
25
26     # Make sure that non-absolute paths are searchable
27     if not '://' in self.url_pattern:
28       self.url_pattern = '*/' + self.url_pattern
29
30     if conditions:
31       for c in conditions:
32         if isinstance(c, tuple):
33           c0 = c[0].lower()
34           if c0 in GPU_MODIFIERS:
35             self.device_id_conditions.append((c0, c[1]))
36           else:
37             raise ValueError('Unknown expectation condition: "%s"' % c0)
38         else:
39           condition = c.lower()
40           if condition in OS_MODIFIERS:
41             self.os_conditions.append(condition)
42           elif condition in GPU_MODIFIERS:
43             self.gpu_conditions.append(condition)
44           elif condition in CONFIG_MODIFIERS:
45             self.config_conditions.append(condition)
46           else:
47             raise ValueError('Unknown expectation condition: "%s"' % condition)
48
49 class TestExpectations(object):
50   """A class which defines the expectations for a page set test execution"""
51
52   def __init__(self):
53     self.expectations = []
54     self.SetExpectations()
55
56   def SetExpectations(self):
57     """Called on creation. Override to set up custom expectations."""
58     pass
59
60   def Fail(self, url_pattern, conditions=None, bug=None):
61     self._Expect('fail', url_pattern, conditions, bug)
62
63   def Skip(self, url_pattern, conditions=None, bug=None):
64     self._Expect('skip', url_pattern, conditions, bug)
65
66   def _Expect(self, expectation, url_pattern, conditions=None, bug=None):
67     self.expectations.append(Expectation(expectation, url_pattern, conditions,
68       bug))
69
70   def GetExpectationForPage(self, browser, page):
71     platform = browser.platform
72     gpu_info = None
73
74     for e in self.expectations:
75       matches_url = fnmatch.fnmatch(page.url, e.url_pattern)
76       matches_name = page.name and fnmatch.fnmatch(page.name, e.name_pattern)
77       if matches_url or matches_name:
78         if gpu_info == None and browser.supports_system_info:
79           gpu_info = browser.GetSystemInfo().gpu
80         if self._ModifiersApply(platform, gpu_info, e):
81           return e.expectation
82     return 'pass'
83
84   def _GetGpuVendorString(self, gpu_info):
85     if gpu_info:
86       primary_gpu = gpu_info.devices[0]
87       if primary_gpu:
88         vendor_string = primary_gpu.vendor_string.lower()
89         vendor_id = primary_gpu.vendor_id
90         if vendor_string:
91           return vendor_string.split(' ')[0]
92         elif vendor_id == 0x10DE:
93           return 'nvidia'
94         elif vendor_id == 0x1002:
95           return 'amd'
96         elif vendor_id == 0x8086:
97           return 'intel'
98
99     return 'unknown_gpu'
100
101   def _GetGpuDeviceId(self, gpu_info):
102     if gpu_info:
103       primary_gpu = gpu_info.devices[0]
104       if primary_gpu:
105         return primary_gpu.device_id or primary_gpu.device_string
106
107     return 0
108
109   def _ModifiersApply(self, platform, gpu_info, expectation):
110     """Determines if the conditions for an expectation apply to this system."""
111     os_matches = (not expectation.os_conditions or
112         platform.GetOSName() in expectation.os_conditions or
113         platform.GetOSVersionName() in expectation.os_conditions)
114
115     gpu_vendor = self._GetGpuVendorString(gpu_info)
116     gpu_device_id = self._GetGpuDeviceId(gpu_info)
117
118     gpu_matches = ((not expectation.gpu_conditions and
119         not expectation.device_id_conditions) or
120         gpu_vendor in expectation.gpu_conditions or
121         (gpu_vendor, gpu_device_id) in expectation.device_id_conditions)
122
123     return os_matches and gpu_matches