Index: chrome/test/functional/media/media_test_utils.py |
diff --git a/chrome/test/functional/media/media_test_utils.py b/chrome/test/functional/media/media_test_utils.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b784756f7a031b2fd546190d1e58845f42b58ed0 |
--- /dev/null |
+++ b/chrome/test/functional/media/media_test_utils.py |
@@ -0,0 +1,78 @@ |
+#!/usr/bin/env python |
+# Copyright (c) 2012 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. |
+import functools |
Ami GONE FROM CHROMIUM
2012/01/25 17:58:48
missing newline
DaleCurtis
2012/01/25 23:59:25
Done.
|
+ |
+ |
+def FindMediaFiles(matrix, criteria=None, **kwargs): |
+ """Given a loosely structured test matrix, finds media matching criteria. |
Ami GONE FROM CHROMIUM
2012/01/25 17:58:48
This whole thing seems like crazy overkill to me.
DaleCurtis
2012/01/25 23:59:25
You should have seen the generic version :) In an
Ami GONE FROM CHROMIUM
2012/01/26 00:07:23
WDYT about keeping this matrix business in your ba
|
+ |
+ The only requirements for the test matrix structure are a top level element |
+ and a 'files' list element under it containing dicts with at least a 'file' |
+ tag, indicating the file name, in them. For example: |
+ |
+ { |
+ "<test name>": { |
+ <...any tags...> |
+ |
+ 'files': [ |
+ {'file': '<filename>', <...any tags...>} |
+ ] |
+ } |
+ } |
+ |
+ Any kind of metadata can be added in the any tags sections. All fields can be |
+ filtered on using the criteria mechanism. For example, to match only files |
+ with the name 'test.mp4' you would write: |
+ |
+ FindMediaFiles(<matrix>, file='test.mp4') |
+ |
+ If you wanted to ensure that a metadata named 'duration' was < 5.0 you can use |
+ the criteria system: |
+ |
+ FindMediaFiles(<matrix>, criteria={'duration': lambda v: v < 5.0}) |
+ |
+ Arguments: |
+ matrix: Dictionary object as described above. |
+ criteria: Dictionary of tags to boolean functions. Each file entry in the |
+ matrix will be required to have the specified tags and pass the associated |
+ function. The function will be called with the value associated with the |
+ tag. |
+ **kwargs: Generally a simple equality check is all that is required to find |
+ the required tags. So by simply specifying the key and value here, you |
+ can avoid typing out a full criteria entry. Entries here will override |
+ those in |criteria|. |
+ """ |
+ results = [] |
+ |
+ # Automatically covert each kwarg into a simple equality check. |
+ criteria = criteria or {} |
+ for arg in kwargs: |
+ criteria[arg] = functools.partial(lambda x, y: x == y, kwargs[arg]) |
+ |
+ for entry in matrix: |
+ # Make a shallow copy so we don't destroy the main data structure. |
+ test = matrix[entry].copy() |
+ |
+ # Insert the entry name into the dictionary so it can be filtered on. |
+ test.setdefault('name', entry) |
+ |
+ # Remove the files key from the top level test structure. |
+ for f in test.pop('files'): |
+ # Setup default values for files. |
+ f.setdefault('audio', True) |
+ f.setdefault('video', True) |
+ |
+ # Copy in the top level tags from test into the file dictionary. |
+ f.update(test) |
+ |
+ # Ensure that all the file tags pass all the criteria. |
+ success = True |
+ for tag, fn in criteria.iteritems(): |
+ success = success and tag in f and fn(f[tag]) |
+ |
+ if success: |
+ results.append(f['file']) |
+ |
+ return results |