Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(404)

Unified Diff: telemetry/telemetry/story/expectations.py

Issue 2843403005: [Telemetry] Add Expectation module that enables disabling benchmarks/stories (Closed)
Patch Set: [Telemetry] Have benchmarks have story expectations. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: telemetry/telemetry/story/expectations.py
diff --git a/telemetry/telemetry/story/expectations.py b/telemetry/telemetry/story/expectations.py
new file mode 100644
index 0000000000000000000000000000000000000000..e1923e2ca2f2c338413011d24f300898dae105ff
--- /dev/null
+++ b/telemetry/telemetry/story/expectations.py
@@ -0,0 +1,89 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+class TestConditions(object):
perezju 2017/05/02 09:19:52 Throwing out for consideration a half-baked idea (
rnephew (Reviews Here) 2017/05/10 19:45:13 I really like this idea. Done.
+ MAC = 'mac'
+ WIN = 'win'
+ LINUX = 'linux'
+ ANDROID = 'android'
+ MOBILE = 'mobile'
+ DESKTOP = 'desktop'
+ ALL = 'all'
+ NO_BATTOR = 'no_battor'
+
+ _DESKTOP_PLATFORMS = ['mac', 'win', 'linux']
+ _MOBILE_PLATFORMS = ['android']
+
+ @classmethod
+ def IsDesktop(cls, platform):
+ return platform in cls._DESKTOP_PLATFORMS
+
+ @classmethod
+ def IsMobile(cls, platform):
+ return platform in cls._MOBILE_PLATFORMS
+
+
+class StoryExpectations(object):
+ def __init__(self):
+ self._expectations = {'disabled_platforms': []}
perezju 2017/05/02 09:19:52 I know it's unlikely that we'll have a story named
rnephew (Reviews Here) 2017/05/10 19:45:13 Done.
+ self._frozen = False
+ self.SetExpectations()
+ self._Freeze()
+
+ def SetExpectations(self):
+ """ Sets the Expectations for test disabling
+
+ Override in subclasses to disable tests."""
+ pass
+
+ def _Freeze(self):
+ self._frozen = True
+
+ def DisableBenchmark(self, platforms, reason):
+ assert not self._frozen, ('Cannot disable benchmark on a frozen '
+ 'StoryExpectation object.')
+ self._expectations['disabled_platforms'].append((platforms, reason))
+
+ @staticmethod
+ def _CommonPlatformChecks(platforms, state):
+ current_platform = state.platform.GetOSName()
+ if TestConditions.ALL in platforms:
+ return True
+ if (TestConditions.NO_BATTOR in platforms and
+ not state.platform.HasBattOrConnected()):
+ return True
+ if current_platform in platforms:
+ return True
+ if (TestConditions.DESKTOP in platforms and
+ TestConditions.IsDesktop(current_platform)):
+ return True
+ if (TestConditions.MOBILE in platforms and
+ TestConditions.IsMobile(current_platform)):
+ return True
+
+ return False
+
+ def IsBenchmarkDisabled(self, state):
+ reason_for = None
+ for platforms, reason in self._expectations.get('disabled_platforms'):
+ if self._CommonPlatformChecks(platforms, state):
+ reason_for = reason
+ break
+ return reason_for is not None, reason_for
+
+ def DisableStory(self, story, platforms, reason=''):
nednguyen 2017/05/02 00:04:01 s/platforms/conditions/g we should also assert all
perezju 2017/05/02 09:19:52 Let's not provide a default for "reason", it shoul
nednguyen 2017/05/09 16:44:24 In addition, I think we should even assert that re
rnephew (Reviews Here) 2017/05/10 19:45:13 Done.
rnephew (Reviews Here) 2017/05/10 19:45:13 Done.
+ assert not self._frozen, ('Cannot disable stories on a frozen '
+ 'StoryExpectation object.')
+ if not self._expectations.get(str(story)):
+ self._expectations[str(story)] = []
nednguyen 2017/05/02 00:04:02 I don't think we should key by str(story). These 3
perezju 2017/05/02 09:19:52 Related, we should probably do an overall cleanup
nednguyen 2017/05/02 16:44:42 +1. I discussed with Ashley offline. We should do
nednguyen 2017/05/09 16:44:24 Discuss offline. We can move forward with this & d
rnephew (Reviews Here) 2017/05/10 19:45:13 1 is done, is there a way to do 2 as a linter warn
nednguyen 2017/05/10 20:01:38 It's not easy to add linter warning, and I doubt t
rnephew (Reviews Here) 2017/05/11 15:05:58 Thats what I feared (it not being easy and/or reli
+ self._expectations[str(story)].append((platforms, reason))
+
+ def IsStoryDisabled(self, story, state):
+ reason_for = None
+ for platforms, reason in self._expectations.get(str(story), []):
+ if self._CommonPlatformChecks(platforms, state):
+ reason_for = reason
+ break
+ return reason_for is not None, reason_for
perezju 2017/05/02 09:19:52 when logging, I would also like to know the condit
rnephew (Reviews Here) 2017/05/10 19:45:13 Its returning a tuple of (is_disabled, reason)
perezju 2017/05/11 10:10:41 Yes, but the _condition_ is missing.
rnephew (Reviews Here) 2017/05/11 15:05:58 The reason (be it a bug or a text description) sho
perezju 2017/05/11 15:26:53 I've seen enough cases of "@disabled('win', crbug.
rnephew (Reviews Here) 2017/05/11 15:42:49 I see your point, and I think there are two possib
perezju 2017/05/11 16:14:28 No strong opinions on the implementation, but I wo
rnephew (Reviews Here) 2017/05/11 17:14:11 Done.

Powered by Google App Engine
This is Rietveld 408576698