Bug 1240120 - Move external-media-tests to subdirectory to generate correct packaging; r?maja_zf, r?whimboo draft
authorSyd Polk <spolk@mozilla.com>
Thu, 21 Jan 2016 23:00:59 -0600
changeset 324159 87ed8fc8b101dda56fc0e3b250aafd4fab267b95
parent 322694 b67316254602a63bf4e568198a5c7d3288a9db27
child 324387 bee9a9709e6d30bdf0d75eb36ed8f11528bfd3b6
push id9860
push userspolk@mozilla.com
push dateFri, 22 Jan 2016 05:17:37 +0000
reviewersmaja_zf, whimboo
bugs1240120
milestone46.0a1
Bug 1240120 - Move external-media-tests to subdirectory to generate correct packaging; r?maja_zf, r?whimboo
dom/media/test/external-media-tests/MANIFEST.in
dom/media/test/external-media-tests/README.md
dom/media/test/external-media-tests/harness/__init__.py
dom/media/test/external-media-tests/harness/runtests.py
dom/media/test/external-media-tests/harness/testcase.py
dom/media/test/external-media-tests/media_tests/__init__.py
dom/media/test/external-media-tests/media_tests/manifest.ini
dom/media/test/external-media-tests/media_tests/playback/eme.ini
dom/media/test/external-media-tests/media_tests/playback/limiting_bandwidth.ini
dom/media/test/external-media-tests/media_tests/playback/manifest.ini
dom/media/test/external-media-tests/media_tests/playback/netflix_limiting_bandwidth.ini
dom/media/test/external-media-tests/media_tests/playback/test_eme_playback.py
dom/media/test/external-media-tests/media_tests/playback/test_full_playback.py
dom/media/test/external-media-tests/media_tests/playback/test_playback_limiting_bandwidth.py
dom/media/test/external-media-tests/media_tests/playback/test_ultra_low_bandwidth.py
dom/media/test/external-media-tests/media_tests/playback/test_video_playback.py
dom/media/test/external-media-tests/media_tests/playback/youtube/manifest.ini
dom/media/test/external-media-tests/media_tests/playback/youtube/test_basic_playback.py
dom/media/test/external-media-tests/media_tests/playback/youtube/test_prefs.py
dom/media/test/external-media-tests/media_tests/resources/mozilla.html
dom/media/test/external-media-tests/media_tests/test_example.py
dom/media/test/external-media-tests/media_tests/urls/default.ini
dom/media/test/external-media-tests/media_tests/urls/netflix/default.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/archive/crash_videos.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/archive/other_videos.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/archive/video_data.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/archive/youtube.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/long1-720.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/long2-720.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/long3-crashes-720.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/long4-crashes-900.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/massive-6000.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/medium1-60.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/medium2-60.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/medium3-120.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/short0-10.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/short1-15.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/short2-15.ini
dom/media/test/external-media-tests/media_tests/urls/youtube/short3-crashes-15.ini
dom/media/test/external-media-tests/media_tests/utils.py
dom/media/test/external-media-tests/media_utils/__init__.py
dom/media/test/external-media-tests/media_utils/video_puppeteer.py
dom/media/test/external-media-tests/media_utils/youtube_puppeteer.py
dom/media/test/external-media-tests/requirements.txt
dom/media/test/external-media-tests/setup.py
dom/media/test/external/MANIFEST.in
dom/media/test/external/README.md
dom/media/test/external/external_media_harness/__init__.py
dom/media/test/external/external_media_harness/runtests.py
dom/media/test/external/external_media_harness/testcase.py
dom/media/test/external/external_media_tests/__init__.py
dom/media/test/external/external_media_tests/manifest.ini
dom/media/test/external/external_media_tests/media_utils/__init__.py
dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py
dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py
dom/media/test/external/external_media_tests/playback/eme.ini
dom/media/test/external/external_media_tests/playback/limiting_bandwidth.ini
dom/media/test/external/external_media_tests/playback/manifest.ini
dom/media/test/external/external_media_tests/playback/netflix_limiting_bandwidth.ini
dom/media/test/external/external_media_tests/playback/test_eme_playback.py
dom/media/test/external/external_media_tests/playback/test_full_playback.py
dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py
dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py
dom/media/test/external/external_media_tests/playback/test_video_playback.py
dom/media/test/external/external_media_tests/playback/youtube/manifest.ini
dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py
dom/media/test/external/external_media_tests/playback/youtube/test_prefs.py
dom/media/test/external/external_media_tests/resources/mozilla.html
dom/media/test/external/external_media_tests/test_example.py
dom/media/test/external/external_media_tests/urls/default.ini
dom/media/test/external/external_media_tests/urls/netflix/default.ini
dom/media/test/external/external_media_tests/urls/youtube/archive/crash_videos.ini
dom/media/test/external/external_media_tests/urls/youtube/archive/other_videos.ini
dom/media/test/external/external_media_tests/urls/youtube/archive/video_data.ini
dom/media/test/external/external_media_tests/urls/youtube/archive/youtube.ini
dom/media/test/external/external_media_tests/urls/youtube/long1-720.ini
dom/media/test/external/external_media_tests/urls/youtube/long2-720.ini
dom/media/test/external/external_media_tests/urls/youtube/long3-crashes-720.ini
dom/media/test/external/external_media_tests/urls/youtube/long4-crashes-900.ini
dom/media/test/external/external_media_tests/urls/youtube/massive-6000.ini
dom/media/test/external/external_media_tests/urls/youtube/medium1-60.ini
dom/media/test/external/external_media_tests/urls/youtube/medium2-60.ini
dom/media/test/external/external_media_tests/urls/youtube/medium3-120.ini
dom/media/test/external/external_media_tests/urls/youtube/short0-10.ini
dom/media/test/external/external_media_tests/urls/youtube/short1-15.ini
dom/media/test/external/external_media_tests/urls/youtube/short2-15.ini
dom/media/test/external/external_media_tests/urls/youtube/short3-crashes-15.ini
dom/media/test/external/external_media_tests/utils.py
dom/media/test/external/requirements.txt
dom/media/test/external/setup.py
python/mozbuild/mozbuild/action/test_archive.py
rename from dom/media/test/external-media-tests/MANIFEST.in
rename to dom/media/test/external/MANIFEST.in
--- a/dom/media/test/external-media-tests/MANIFEST.in
+++ b/dom/media/test/external/MANIFEST.in
@@ -1,7 +1,5 @@
 exclude MANIFEST.in
-include requirements.txt
-include setup.py
-recursive-include firefox_media_tests *
-recursive-include media_utils *
+recursive-include external_media_harness *
+recursive-include external_media_tests *
 
 
rename from dom/media/test/external-media-tests/README.md
rename to dom/media/test/external/README.md
--- a/dom/media/test/external-media-tests/README.md
+++ b/dom/media/test/external/README.md
@@ -1,69 +1,69 @@
-firefox-media-tests
+external-media-tests
 ===================
 
 [Marionette Python tests][marionette-python-tests] for media playback in Mozilla Firefox. MediaTestCase uses [Firefox Puppeteer][ff-puppeteer-docs] library.
 
 Setup
 -----
 
-The instructions below assume you have a copy of the project in `some/path/firefox-media-tests` and they refer to this path as `$PROJECT_HOME`.
+Normally, you get this source by cloning a firefox repo such as mozilla-central. The path to these tests would be in <mozilla-central>/dom/media/test/external, and these instuctions refer to this path as '$PROJECT_HOME'.
 
 * Create a virtualenv called `foo`.
 
    ```sh
    $ virtualenv foo
    $ source foo/bin/activate #or `foo\Scripts\activate` on Windows
    ```
 
-* Install `firefox-media-tests` in development mode. (To get an environment that is closer to what is actually used in Mozilla's automation jobs, run `pip install -r requirements.txt` first.)
+* Install `external-media-tests` in development mode. (To get an environment that is closer to what is actually used in Mozilla's automation jobs, run `pip install -r requirements.txt` first.)
 
    ```sh
    $ python setup.py develop
    ```
 
-Now `firefox-media-tests` should be a recognized command. Try `firefox-media-tests --help` to see if it works.
+Now `external-media-tests` should be a recognized command. Try `external-media-tests --help` to see if it works.
 
 
 Running the Tests
 -----------------
 
 In the examples below, `$FF_PATH` is a path to a recent Firefox binary.
 
-This runs all the tests listed in `$PROJECT_HOME/firefox_media_tests/manifest.ini`:
+This runs all the tests listed in `$PROJECT_HOME/external_media_tests/manifest.ini`:
 
    ```sh
-   $ firefox-media-tests --binary $FF_PATH
+   $ external-media-tests --binary $FF_PATH
    ```
 
 You can also run all the tests at a particular path:
 
    ```sh
-   $ firefox-media-tests --binary $FF_PATH some/path/foo
+   $ external-media-tests --binary $FF_PATH some/path/foo
    ```
 
 Or you can run the tests that are listed in a manifest file of your choice.
 
    ```sh
-   $ firefox-media-tests --binary $FF_PATH some/other/path/manifest.ini
+   $ external-media-tests --binary $FF_PATH some/other/path/manifest.ini
    ```
 
-By default, the urls listed in `firefox_media_tests/urls/default.ini` are used for the tests, but you can also supply your own ini file of urls:
+By default, the urls listed in `external_media_tests/urls/default.ini` are used for the tests, but you can also supply your own ini file of urls:
 
    ```sh
-   $ firefox-media-tests --binary $FF_PATH --urls some/other/path/my_urls.ini
+   $ external-media-tests --binary $FF_PATH --urls some/other/path/my_urls.ini
    ```
 
 ### Running EME tests
 
 In order to run EME tests, you must use a Firefox profile that has a signed plugin-container.exe and voucher.bin. With Netflix, this will be created when you log in and save the credentials. You must also use a custom .ini file for urls to the provider's content and indicate which test to run, like above. Ex:
 
    ```sh
-   $ firefox-media-tests --binary $FF_PATH some/path/tests.ini --profile custom_profile --urls some/path/provider-urls.ini
+   $ external-media-tests --binary $FF_PATH some/path/tests.ini --profile custom_profile --urls some/path/provider-urls.ini
    ```
 
 
 ### Running tests in a way that provides information about a crash
 
 What if Firefox crashes during a test run? You want to know why! To report useful crash data, the test runner needs access to a "minidump_stackwalk" binary and a "symbols.zip" file.
 
 1. Download a `minidump_stackwalk` binary for your platform (save it whereever). Get it from http://hg.mozilla.org/build/tools/file/tip/breakpad/.
@@ -79,34 +79,34 @@ 3. Create an environment variable called
    $ export MINIDUMP_STACKWALK=path/to/minidump_stackwalk
    ```
 
 4. Download the `crashreporter-symbols.zip` file for the Firefox build you are testing and extract it. Example: ftp://ftp.mozilla.org/pub/firefox/tinderbox-builds/mozilla-aurora-win32/1427442016/firefox-38.0a2.en-US.win32.crashreporter-symbols.zip
 
 5. Run the tests with a `--symbols-path` flag
 
   ```sh
-   $ firefox-media-tests --binary $FF_PATH --symbols-path path/to/example/firefox-38.0a2.en-US.win32.crashreporter-symbols
+   $ external-media-tests --binary $FF_PATH --symbols-path path/to/example/firefox-38.0a2.en-US.win32.crashreporter-symbols
   ```
 
 To check whether the above setup is working for you, trigger a (silly) Firefox crash while the tests are running. One way to do this is with the [crashme add-on](https://github.com/luser/crashme) -- you can add it to Firefox even while the tests are running. Another way on Linux and Mac OS systems:
 
 1. Find the process id (PID) of the Firefox process being used by the tests.
 
   ```sh
    $ ps x | grep 'Firefox'
   ```
 
 2. Kill the Firefox process with SIGABRT.
   ```sh
   # 1234 is an example of a PID
    $ kill -6 1234
   ```
 
-Somewhere in the output produced by `firefox-media-tests`, you should see something like:
+Somewhere in the output produced by `external-media-tests`, you should see something like:
 
 ```
 0:12.68 CRASH: MainThread pid:1234. Test:test_basic_playback.py TestVideoPlayback.test_playback_starts.
 Minidump anaylsed:False.
 Signature:[@ XUL + 0x2a65900]
 Crash dump filename:
 /var/folders/5k/xmn_fndx0qs2jcpcwhzl86wm0000gn/T/tmpB4Bolj.mozrunner/minidumps/DA3BB025-8302-4F96-8DF3-A97E424C877A.dmp
 Operating system: Mac OS X
@@ -132,21 +132,21 @@ 5. Tell marionette where browsermobproxy
 --browsermob-script <browsermob>/bin/browsermob-proxy --browsermob-port 999 --profile <your saved profile>
 </code></pre>
 
 On Windows, use browsermob-proxy.bat.
 
 You can then call browsermob to shape the network. You can find an example in firefox_media_tests/playback/test_playback_limiting_bandwidth.py. Another example can be found at https://dxr.mozilla.org/mozilla-central/source/testing/marionette/client/marionette/tests/unit/test_browsermobproxy.py.
 
 ### A warning about video URLs
-The ini files in `firefox_media_tests/urls` may contain URLs pulled from Firefox crash or bug data. Automated tests don't care about video content, but you might: visit these at your own risk and be aware that they may be NSFW. We do not intend to ever moderate or filter these URLs.
+The ini files in `external_media_tests/urls` may contain URLs pulled from Firefox crash or bug data. Automated tests don't care about video content, but you might: visit these at your own risk and be aware that they may be NSFW. We do not intend to ever moderate or filter these URLs.
 
 Writing a test
 --------------
-Write your test in a new or existing `test_*.py` file under `$PROJECT_HOME/firefox_media_tests`. Add it to the appropriate `manifest.ini` file(s) as well. Look in `media_utils` for useful video-playback functions.
+Write your test in a new or existing `test_*.py` file under `$PROJECT_HOME/external_media_tests`. Add it to the appropriate `manifest.ini` file(s) as well. Look in `media_utils` for useful video-playback functions.
 
 * [Marionette docs][marionette-docs]
   - [Marionette Command Line Options](https://developer.mozilla.org/en-US/docs/Mozilla/Command_Line_Options)
 * [Firefox Puppeteer docs][ff-puppeteer-docs]
 
 License
 -------
 This software is licensed under the [Mozilla Public License v. 2.0](http://mozilla.org/MPL/2.0/).
rename from dom/media/test/external-media-tests/harness/__init__.py
rename to dom/media/test/external/external_media_harness/__init__.py
rename from dom/media/test/external-media-tests/harness/runtests.py
rename to dom/media/test/external/external_media_harness/runtests.py
--- a/dom/media/test/external-media-tests/harness/runtests.py
+++ b/dom/media/test/external/external_media_harness/runtests.py
@@ -6,41 +6,41 @@ from manifestparser import read_ini
 import os
 import sys
 
 from marionette import BaseMarionetteTestRunner, BaseMarionetteArguments
 from marionette.runner import BrowserMobProxyArguments
 from marionette.runtests import MarionetteHarness, cli as mn_cli
 import mozlog
 
-import media_tests
+import external_media_tests
 from testcase import MediaTestCase
-from media_utils.video_puppeteer import debug_script
+from external_media_tests.media_utils.video_puppeteer import debug_script
 
 
 class MediaTestArgumentsBase(object):
     name = 'Firefox Media Tests'
     args = [
         [['--urls'], {
             'help': 'ini file of urls to make available to all tests',
-            'default': os.path.join(media_tests.urls, 'default.ini'),
+            'default': os.path.join(external_media_tests.urls, 'default.ini'),
         }],
     ]
 
     def verify_usage_handler(self, args):
         if args.urls:
            if not os.path.isfile(args.urls):
                raise ValueError('--urls must provide a path to an ini file')
            else:
                path = os.path.abspath(args.urls)
                args.video_urls = MediaTestArgumentsBase.get_urls(path)
 
     def parse_args_handler(self, args):
         if not args.tests:
-           args.tests = [media_tests.manifest]
+           args.tests = [external_media_tests.manifest]
 
 
     @staticmethod
     def get_urls(manifest):
         with open(manifest, 'r'):
             return [line[0] for line in read_ini(manifest)]
 
 
@@ -50,17 +50,17 @@ class MediaTestArguments(BaseMarionetteA
         self.register_argument_container(MediaTestArgumentsBase())
         self.register_argument_container(BrowserMobProxyArguments())
 
 
 class MediaTestRunner(BaseMarionetteTestRunner):
     def __init__(self, **kwargs):
         BaseMarionetteTestRunner.__init__(self, **kwargs)
         if not self.server_root:
-            self.server_root = media_tests.resources
+            self.server_root = external_media_tests.resources
         # pick up prefs from marionette_driver.geckoinstance.DesktopInstance
         self.app = 'fxdesktop'
         self.test_handlers = [MediaTestCase]
 
         # Used in HTML report (--log-html)
         def gather_media_debug(test, status):
             rv = {}
             marionette = test._marionette_weakref()
@@ -82,18 +82,18 @@ class MediaTestRunner(BaseMarionetteTest
                                    exc_info=True)
             return rv
 
         self.result_callbacks.append(gather_media_debug)
 
 
 class FirefoxMediaHarness(MarionetteHarness):
     def __init__(self,
-                 runner_class=MediaTestRunner,
-                 parser_class=MediaTestArguments):
+             runner_class=MediaTestRunner,
+             parser_class=MediaTestArguments):
         # workaround until next marionette-client release - Bug 1227918
         try:
             MarionetteHarness.__init__(self, runner_class, parser_class)
         except Exception:
             logger = mozlog.commandline.setup_logging('Media-test harness', {})
             logger.error('Failure setting up harness', exc_info=True)
             raise
 
rename from dom/media/test/external-media-tests/harness/testcase.py
rename to dom/media/test/external/external_media_harness/testcase.py
--- a/dom/media/test/external-media-tests/harness/testcase.py
+++ b/dom/media/test/external/external_media_harness/testcase.py
@@ -5,18 +5,18 @@
 import os
 
 from marionette import BrowserMobProxyTestCaseMixin
 from marionette_driver import Wait
 from marionette_driver.errors import TimeoutException
 from marionette.marionette_test import SkipTest
 
 from firefox_puppeteer.testcases import FirefoxTestCase
-from media_tests.utils import (timestamp_now, verbose_until)
-from media_utils.video_puppeteer import (playback_done, playback_started,
+from external_media_tests.utils import (timestamp_now, verbose_until)
+from external_media_tests.media_utils.video_puppeteer import (playback_done, playback_started,
                                          VideoException, VideoPuppeteer as VP)
 
 
 class MediaTestCase(FirefoxTestCase):
 
     def __init__(self, *args, **kwargs):
         self.video_urls = kwargs.pop('video_urls', False)
         FirefoxTestCase.__init__(self, *args, **kwargs)
rename from dom/media/test/external-media-tests/media_tests/__init__.py
rename to dom/media/test/external/external_media_tests/__init__.py
rename from dom/media/test/external-media-tests/media_tests/manifest.ini
rename to dom/media/test/external/external_media_tests/manifest.ini
rename from dom/media/test/external-media-tests/media_utils/__init__.py
rename to dom/media/test/external/external_media_tests/media_utils/__init__.py
rename from dom/media/test/external-media-tests/media_utils/video_puppeteer.py
rename to dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py
--- a/dom/media/test/external-media-tests/media_utils/video_puppeteer.py
+++ b/dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from time import clock, sleep
 
 from marionette_driver import By, expected, Wait
 
-from media_tests.utils import verbose_until
+from external_media_tests.utils import verbose_until
 
 
 # Adapted from
 # https://github.com/gavinsharp/aboutmedia/blob/master/chrome/content/aboutmedia.xhtml
 debug_script = """
 var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
     .getInterface(Components.interfaces.nsIWebNavigation)
     .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
rename from dom/media/test/external-media-tests/media_utils/youtube_puppeteer.py
rename to dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py
--- a/dom/media/test/external-media-tests/media_utils/youtube_puppeteer.py
+++ b/dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py
@@ -4,17 +4,17 @@
 
 from time import sleep
 import re
 from json import loads
 
 from marionette_driver import By, expected, Wait
 from marionette_driver.errors import TimeoutException, NoSuchElementException
 from video_puppeteer import VideoPuppeteer, VideoException
-from media_tests.utils import verbose_until
+from external_media_tests.utils import verbose_until
 
 
 class YouTubePuppeteer(VideoPuppeteer):
     """
     Wrapper around a YouTube #movie_player element
 
     Partial reference: https://developers.google.com/youtube/js_api_reference
     """
rename from dom/media/test/external-media-tests/media_tests/playback/eme.ini
rename to dom/media/test/external/external_media_tests/playback/eme.ini
rename from dom/media/test/external-media-tests/media_tests/playback/limiting_bandwidth.ini
rename to dom/media/test/external/external_media_tests/playback/limiting_bandwidth.ini
rename from dom/media/test/external-media-tests/media_tests/playback/manifest.ini
rename to dom/media/test/external/external_media_tests/playback/manifest.ini
rename from dom/media/test/external-media-tests/media_tests/playback/netflix_limiting_bandwidth.ini
rename to dom/media/test/external/external_media_tests/playback/netflix_limiting_bandwidth.ini
rename from dom/media/test/external-media-tests/media_tests/playback/test_eme_playback.py
rename to dom/media/test/external/external_media_tests/playback/test_eme_playback.py
--- a/dom/media/test/external-media-tests/media_tests/playback/test_eme_playback.py
+++ b/dom/media/test/external/external_media_tests/playback/test_eme_playback.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import re
 
-from harness.testcase import MediaTestCase, VideoPlaybackTestsMixin
+from external_media_harness.testcase import MediaTestCase, VideoPlaybackTestsMixin
 
 
 class TestEMEPlayback(MediaTestCase, VideoPlaybackTestsMixin):
 
     def setUp(self):
         super(TestEMEPlayback, self).setUp()
         self.set_eme_prefs()
         assert(self.check_eme_prefs())
rename from dom/media/test/external-media-tests/media_tests/playback/test_full_playback.py
rename to dom/media/test/external/external_media_tests/playback/test_full_playback.py
--- a/dom/media/test/external-media-tests/media_tests/playback/test_full_playback.py
+++ b/dom/media/test/external/external_media_tests/playback/test_full_playback.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 
-from harness.testcase import MediaTestCase
-from media_utils.video_puppeteer import VideoPuppeteer
+from external_media_harness.testcase import MediaTestCase
+from external_media_tests.media_utils.video_puppeteer import VideoPuppeteer
 
 
 class TestFullPlayback(MediaTestCase):
     """ Test MSE playback in HTML5 video element.
 
     These tests should pass on any site where a single video element plays
     upon loading and is uninterrupted (by ads, for example). This will play
     the full videos, so it could take a while depending on the videos playing.
rename from dom/media/test/external-media-tests/media_tests/playback/test_playback_limiting_bandwidth.py
rename to dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py
--- a/dom/media/test/external-media-tests/media_tests/playback/test_playback_limiting_bandwidth.py
+++ b/dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from marionette import BrowserMobProxyTestCaseMixin
 
-from harness.testcase import NetworkBandwidthTestCase
+from external_media_harness.testcase import NetworkBandwidthTestCase
 
 
 class TestPlaybackLimitingBandwidth(NetworkBandwidthTestCase,
                                     BrowserMobProxyTestCaseMixin):
 
     def test_playback_limiting_bandwidth_250(self):
         self.proxy.limits({'downstream_kbps': 250})
         self.run_videos()
rename from dom/media/test/external-media-tests/media_tests/playback/test_ultra_low_bandwidth.py
rename to dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py
--- a/dom/media/test/external-media-tests/media_tests/playback/test_ultra_low_bandwidth.py
+++ b/dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from marionette import BrowserMobProxyTestCaseMixin
 
-from harness.testcase import NetworkBandwidthTestCase
+from external_media_harness.testcase import NetworkBandwidthTestCase
 
 
 class TestUltraLowBandwidth(NetworkBandwidthTestCase,
                                     BrowserMobProxyTestCaseMixin):
 
     def test_playback_limiting_bandwidth_160(self):
         self.proxy.limits({'downstream_kbps': 160})
         self.run_videos()
rename from dom/media/test/external-media-tests/media_tests/playback/test_video_playback.py
rename to dom/media/test/external/external_media_tests/playback/test_video_playback.py
--- a/dom/media/test/external-media-tests/media_tests/playback/test_video_playback.py
+++ b/dom/media/test/external/external_media_tests/playback/test_video_playback.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from harness.testcase import (
+from external_media_harness.testcase import (
     MediaTestCase,
     VideoPlaybackTestsMixin
 )
 
 
 class TestVideoPlayback(MediaTestCase, VideoPlaybackTestsMixin):
 
     # Tests are actually implemented in VideoPlaybackTestsMixin.
rename from dom/media/test/external-media-tests/media_tests/playback/youtube/manifest.ini
rename to dom/media/test/external/external_media_tests/playback/youtube/manifest.ini
rename from dom/media/test/external-media-tests/media_tests/playback/youtube/test_basic_playback.py
rename to dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py
--- a/dom/media/test/external-media-tests/media_tests/playback/youtube/test_basic_playback.py
+++ b/dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py
@@ -1,19 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from marionette_driver import Wait
 from marionette_driver.errors import TimeoutException
 
-from media_tests.utils import verbose_until
-from harness.testcase import MediaTestCase
-from media_utils.video_puppeteer import VideoException
-from media_utils.youtube_puppeteer import (YouTubePuppeteer, playback_done,
+from external_media_tests.utils import verbose_until
+from external_media_harness.testcase import MediaTestCase
+from external_media_tests.media_utils.video_puppeteer import VideoException
+from external_media_tests.media_utils.youtube_puppeteer import (YouTubePuppeteer, playback_done,
                                            wait_for_almost_done)
 
 
 class TestBasicYouTubePlayback(MediaTestCase):
     def test_mse_is_enabled_by_default(self):
         with self.marionette.using_context('content'):
             youtube = YouTubePuppeteer(self.marionette, self.video_urls[0],
                                        timeout=60)
rename from dom/media/test/external-media-tests/media_tests/playback/youtube/test_prefs.py
rename to dom/media/test/external/external_media_tests/playback/youtube/test_prefs.py
--- a/dom/media/test/external-media-tests/media_tests/playback/youtube/test_prefs.py
+++ b/dom/media/test/external/external_media_tests/playback/youtube/test_prefs.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from harness.testcase import MediaTestCase
+from external_media_harness.testcase import MediaTestCase
 from marionette_driver import Wait
 
-from media_tests.utils import verbose_until
-from media_utils.youtube_puppeteer import YouTubePuppeteer
+from external_media_tests.utils import verbose_until
+from external_media_tests.media_utils.youtube_puppeteer import YouTubePuppeteer
 
 
 class TestMediaSourcePrefs(MediaTestCase):
     def setUp(self):
         MediaTestCase.setUp(self)
         self.test_urls = self.video_urls[:2]
         self.max_timeout = 60
 
rename from dom/media/test/external-media-tests/media_tests/resources/mozilla.html
rename to dom/media/test/external/external_media_tests/resources/mozilla.html
rename from dom/media/test/external-media-tests/media_tests/test_example.py
rename to dom/media/test/external/external_media_tests/test_example.py
--- a/dom/media/test/external-media-tests/media_tests/test_example.py
+++ b/dom/media/test/external/external_media_tests/test_example.py
@@ -1,9 +1,9 @@
-from harness.testcase import MediaTestCase
+from external_media_harness.testcase import MediaTestCase
 
 
 class TestSomethingElse(MediaTestCase):
     def setUp(self):
         MediaTestCase.setUp(self)
         self.test_urls = [
             'mozilla.html',
             ]
rename from dom/media/test/external-media-tests/media_tests/urls/default.ini
rename to dom/media/test/external/external_media_tests/urls/default.ini
rename from dom/media/test/external-media-tests/media_tests/urls/netflix/default.ini
rename to dom/media/test/external/external_media_tests/urls/netflix/default.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/archive/crash_videos.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/archive/crash_videos.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/archive/other_videos.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/archive/other_videos.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/archive/video_data.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/archive/video_data.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/archive/youtube.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/archive/youtube.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/long1-720.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/long1-720.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/long2-720.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/long2-720.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/long3-crashes-720.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/long3-crashes-720.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/long4-crashes-900.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/long4-crashes-900.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/massive-6000.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/massive-6000.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/medium1-60.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/medium1-60.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/medium2-60.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/medium2-60.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/medium3-120.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/medium3-120.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/short0-10.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/short0-10.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/short1-15.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/short1-15.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/short2-15.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/short2-15.ini
rename from dom/media/test/external-media-tests/media_tests/urls/youtube/short3-crashes-15.ini
rename to dom/media/test/external/external_media_tests/urls/youtube/short3-crashes-15.ini
rename from dom/media/test/external-media-tests/media_tests/utils.py
rename to dom/media/test/external/external_media_tests/utils.py
rename from dom/media/test/external-media-tests/requirements.txt
rename to dom/media/test/external/requirements.txt
rename from dom/media/test/external-media-tests/setup.py
rename to dom/media/test/external/setup.py
--- a/dom/media/test/external-media-tests/setup.py
+++ b/dom/media/test/external/setup.py
@@ -1,42 +1,42 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from setuptools import setup, find_packages
 
-PACKAGE_VERSION = '0.4'
+PACKAGE_VERSION = '1.0'
 
 deps = [
     'marionette-client == 2.0.0',
     'marionette-driver == 1.1.1',
     'mozlog == 3.0',
     'manifestparser == 1.1',
     'firefox-puppeteer >= 3.1.0, <4.0.0',
 ]
 
-setup(name='firefox-media-tests',
+setup(name='external-media-tests',
       version=PACKAGE_VERSION,
       description=('A collection of Mozilla Firefox media playback tests run '
                    'with Marionette'),
       classifiers=[
           'Environment :: Console',
           'Intended Audience :: Developers',
           'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)',
           'Natural Language :: English',
           'Operating System :: OS Independent',
           'Programming Language :: Python',
           'Topic :: Software Development :: Libraries :: Python Modules',
       ],
       keywords='mozilla',
       author='Mozilla Automation and Tools Team',
       author_email='tools@lists.mozilla.org',
-      url='https://github.com/mjzffr/firefox-media-tests',
+      url='https://hg.mozilla.org/mozilla-central/dom/media/test/external/',
       license='MPL 2.0',
       packages=find_packages(),
       zip_safe=False,
       install_requires=deps,
       include_package_data=True,
       entry_points="""
         [console_scripts]
-        firefox-media-tests = harness:cli
+        external-media-tests = external_media_harness:cli
     """)
--- a/python/mozbuild/mozbuild/action/test_archive.py
+++ b/python/mozbuild/mozbuild/action/test_archive.py
@@ -54,18 +54,19 @@ ARCHIVE_FILES = {
         },
         {
             'source': buildconfig.topsrcdir,
             'base': 'testing',
             'pattern': 'firefox-ui/**',
         },
         {
             'source': buildconfig.topsrcdir,
-            'base': 'dom/media/test',
-            'pattern': 'external-media-tests/**',
+            'base': 'dom/media/test/external',
+            'pattern': '**',
+            'dest': 'external-media-tests',
         },
         {
             'source': buildconfig.topsrcdir,
             'base': 'js/src',
             'pattern': 'jit-test/**',
             'dest': 'jit-test',
         },
         {