Пример #1
0
def test_is_compat():
    """Test that we know when we're running a compatibility test."""
    out = validate(path="tests/resources/junk.xpi", format=None, compat_test=False)
    assert not out.get_resource("is_compat_test")

    out = validate(path="tests/resources/junk.xpi", format=None, compat_test=True)
    assert out.get_resource("is_compat_test")
Пример #2
0
def test_app_versions_dict():
    """
    Test that `approved_applications` can be provided as a pre-parsed dict
    of versions.
    """
    with open('tests/resources/test_app_versions.json') as f:
        apps = json.load(f)
    validate(path='tests/resources/junk.xpi', approved_applications=apps)
    assert constants.APPROVED_APPLICATIONS['1']['name'] == 'Foo App'
Пример #3
0
def test_app_versions_dict():
    """
    Test that `approved_applications` can be provided as a pre-parsed dict
    of versions.
    """
    with open('tests/resources/test_app_versions.json') as f:
        apps = json.load(f)
    validate(path='tests/resources/junk.xpi', approved_applications=apps)
    assert constants.APPROVED_APPLICATIONS['1']['name'] == 'Foo App'
Пример #4
0
def test_is_compat():
    """Test that we know when we're running a compatibility test."""
    out = validate(path='tests/resources/junk.xpi', format=None,
                   compat_test=False)
    assert not out.get_resource('is_compat_test')

    out = validate(path='tests/resources/junk.xpi', format=None,
                   compat_test=True)
    assert out.get_resource('is_compat_test')
Пример #5
0
def test_app_versions_dict():
    """
    Test that `approved_applications` can be provided as a pre-parsed dict
    of versions.
    """
    with open("tests/resources/test_app_versions.json") as f:
        apps = json.load(f)
    validate(path="tests/resources/junk.xpi", approved_applications=apps)
    print constants.APPROVED_APPLICATIONS
    assert constants.APPROVED_APPLICATIONS["1"]["name"] == "Foo App"
Пример #6
0
def test_app_versions_dict():
    """
    Test that `approved_applications` can be provided as a pre-parsed dict
    of versions.
    """
    with open("tests/resources/test_app_versions.json") as f:
        apps = json.load(f)
    validate(path="tests/resources/junk.xpi", approved_applications=apps)
    print constants.APPROVED_APPLICATIONS
    assert constants.APPROVED_APPLICATIONS["1"]["name"] == "Foo App"
Пример #7
0
def test_mrkt_urls():
    """
    Tests that Marketplace URLs are correctly added to the MRKT_URLS constant.
    """
    # Keep a copy so we don't permanently overwrite.
    MRKT_URLS = constants.DEFAULT_WEBAPP_MRKT_URLS[:]

    validate(path="tests/resources/junk.xpi",
             market_urls=["foobar"])
    print constants.DEFAULT_WEBAPP_MRKT_URLS
    assert "foobar" in constants.DEFAULT_WEBAPP_MRKT_URLS

    # Clean up!
    constants.DEFAULT_WEBAPP_MRKT_URLS = MRKT_URLS
Пример #8
0
def test_validate_embedded_webextension_xpi():
    """Integration test for the expected notice message on 'embedded
    webextension' add-ons."""

    err_bundle = validate(
        path='tests/resources/validate/hybrid_extension.xpi', format=None)
    assert err_bundle.get_resource('has_embedded_webextension') is True

    result = validate(path='tests/resources/validate/hybrid_extension.xpi')
    data = json.loads(result)

    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 1
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'

    assert len(data['messages']) == 1
    assert data['messages'][0]['file'] == u'install.rdf'
    assert data['messages'][0]['message'] == (
        u'This add-on contains an embedded webextension')

    expected_embedded_webext_desc = (
        'The embedded webextension is in the folder "webextension"')
    expected_embedded_webext_doc_url = (
        'https://developer.mozilla.org/en-US/Add-ons/WebExtensions/'
        'Embedded_WebExtensions')

    messages = data['messages']
    assert expected_embedded_webext_desc in messages[0]['description']
    assert expected_embedded_webext_doc_url in messages[0]['description']

    assert data['message_tree']
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'name_value'
    assert data['metadata']['version'] == u'1.2.3.4'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'*****@*****.**'
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is True
def test_validate_embedded_webextension_xpi():
    """Integration test for the expected notice message on 'embedded
    webextension' add-ons."""

    err_bundle = validate(
        path='tests/resources/validate/hybrid_extension.xpi', format=None)
    assert err_bundle.get_resource('has_embedded_webextension') is True

    result = validate(path='tests/resources/validate/hybrid_extension.xpi')
    data = json.loads(result)

    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 1
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'

    assert len(data['messages']) == 1
    assert data['messages'][0]['file'] == u'install.rdf'
    assert data['messages'][0]['message'] == (
        u'This add-on contains an embedded webextension')

    expected_embedded_webext_desc = (
        'The embedded webextension is in the folder "webextension"')
    expected_embedded_webext_doc_url = (
        'https://developer.mozilla.org/en-US/Add-ons/WebExtensions/'
        'Embedded_WebExtensions')

    messages = data['messages']
    assert expected_embedded_webext_desc in messages[0]['description']
    assert expected_embedded_webext_doc_url in messages[0]['description']

    assert data['message_tree']
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'name_value'
    assert data['metadata']['version'] == u'1.2.3.4'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'*****@*****.**'
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is True
Пример #10
0
def _test_validate_jpm_multiprocess_compatible(compat_test):
    """Integration test for a multiprocess compatible jpm-style extension xpi,
    without mocks."""
    result = validate(path='tests/resources/validate/jpm_multiprocess.xpi',
                      compat_test=compat_test)
    data = json.loads(result)

    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert data['messages'] == []
    assert data['message_tree'] == {}
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'My Jetpack Addon'
    assert data['metadata']['version'] == u'0.0.3'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'@test-addon'
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is True
Пример #11
0
def test_validate_old_xpi_thunderbird_only():
    """Integration test for a thunderbird-only old-style extension xpi
    without mocks."""
    result = validate(
        path='tests/resources/validate/thunderbird_extension.xpi')
    data = json.loads(result)

    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert data['messages'] == []
    assert data['message_tree'] == {}
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'name_value'
    assert data['metadata']['version'] == u'1.2.3.4'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'*****@*****.**'
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is True
Пример #12
0
def _test_validate_jpm(compat_test):
    """Integration test for a basic jpm-style extension xpi, without mocks."""
    result = validate(path='tests/resources/validate/jpm.xpi',
                      compat_test=compat_test)
    data = json.loads(result)

    assert data['success'] is False
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 1
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert len(data['messages']) == 1
    assert data['messages'][0]['id'] == [
        u'submain', u'test_inner_package', u'not_multiprocess_compatible']
    assert data['message_tree']
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'My Jetpack Addon'
    assert data['metadata']['version'] == u'0.0.3'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'@test-addon'
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is True
Пример #13
0
def _test_validate_jpm_multiprocess_compatible(compat_test):
    """Integration test for a multiprocess compatible jpm-style extension xpi,
    without mocks."""
    result = validate(path='tests/resources/validate/jpm_multiprocess.xpi', compat_test=compat_test)
    data = json.loads(result)

    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert data['messages'] == []
    assert data['message_tree'] == {}
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'My Jetpack Addon'
    assert data['metadata']['version'] == u'0.0.3'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'@test-addon'
Пример #14
0
def _test_validate_old_xpi_multiprocess_compatible(compat_test):
    """Integration test for a multiprocess compatible old-style extension xpi,
    without mocks."""
    result = validate(
        path='tests/resources/validate/extension_multiprocess.xpi', compat_test=compat_test)
    data = json.loads(result)

    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert data['messages'] == []
    assert data['message_tree'] == {}
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'name_value'
    assert data['metadata']['version'] == u'1.2.3.4'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'*****@*****.**'
Пример #15
0
def test_validate_old_xpi_with_jar_in_it():
    """Integration test for a basic old-style extension xpi that contains a
    .jar file, without mocks."""
    result = validate(path='tests/resources/validate/extension_with_jar.xpi')
    data = json.loads(result)

    assert data['success'] is False
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 1
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert len(data['messages']) == 1
    assert data['messages'][0]['id'] == [
        u'submain', u'test_inner_package', u'not_multiprocess_compatible']
    assert data['message_tree']
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'xpi name'
    assert data['metadata']['version'] == u'0.2'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'guid@xpi'
Пример #16
0
def test_validate_dictionnary_no_multiprocess_compatible_warning():
    """Integration test for a dictionnary xpi, without mocks."""
    result = validate(path='tests/resources/validate/dictionary.xpi')
    data = json.loads(result)
    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'dictionary'
    assert data['messages'] == []
    assert data['message_tree'] == {}
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'My Fake Dictionary'
    assert data['metadata']['version'] == u'1.0.0'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'my@dict'
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is False
Пример #17
0
def test_validate_jpm():
    """Integration test for a basic jpm-style extension xpi, without mocks."""
    result = validate(path='tests/resources/validate/jpm.xpi')
    data = json.loads(result)

    assert data['success'] is False
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 1
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert len(data['messages']) == 1
    assert data['messages'][0]['id'] == [
        u'submain', u'test_inner_package', u'not_multiprocess_compatible'
    ]
    assert data['message_tree']
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'My Jetpack Addon'
    assert data['metadata']['version'] == u'0.0.3'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'@test-addon'
Пример #18
0
def test_validate_old_xpi_thunderbird_only():
    """Integration test for a thunderbird-only old-style extension xpi
    without mocks."""
    result = validate(
        path='tests/resources/validate/thunderbird_extension.xpi')
    data = json.loads(result)

    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert data['messages'] == []
    assert data['message_tree'] == {}
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'name_value'
    assert data['metadata']['version'] == u'1.2.3.4'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'*****@*****.**'
Пример #19
0
def test_validate_old_xpi():
    """Integration test for a basic old-style extension xpi, without mocks."""
    result = validate(path='tests/resources/validate/extension.xpi')
    data = json.loads(result)

    assert data['success'] is False
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 1
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert len(data['messages']) == 1
    assert data['messages'][0]['id'] == [
        u'submain', u'test_inner_package', u'not_multiprocess_compatible'
    ]
    assert data['message_tree']
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'name_value'
    assert data['metadata']['version'] == u'1.2.3.4'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'*****@*****.**'
Пример #20
0
def test_validate_webextension():
    """Integration test for a basic webextension, without mocks.

    We're not supposed to use amo-validator for webextensions anymore now that
    we have addons-linter, but let's make sure that we don't completely
    blow up anyway."""
    result = validate(path='tests/resources/validate/webextension.xpi')
    data = json.loads(result)

    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert data['messages'] == []
    assert data['message_tree'] == {}
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is True
Пример #21
0
def test_validate_old_xpi_with_jar_in_it():
    """Integration test for a basic old-style extension xpi that contains a
    .jar file, without mocks."""
    result = validate(path='tests/resources/validate/extension_with_jar.xpi')
    data = json.loads(result)

    assert data['success'] is False
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 1
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert len(data['messages']) == 1
    assert data['messages'][0]['id'] == [
        u'submain', u'test_inner_package', u'not_multiprocess_compatible']
    assert data['message_tree']
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'xpi name'
    assert data['metadata']['version'] == u'0.2'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'guid@xpi'
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is True
Пример #22
0
def _test_validate_old_xpi_multiprocess_compatible(compat_test):
    """Integration test for a multiprocess compatible old-style extension xpi,
    without mocks."""
    result = validate(
        path='tests/resources/validate/extension_multiprocess.xpi',
        compat_test=compat_test)
    data = json.loads(result)

    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert data['messages'] == []
    assert data['message_tree'] == {}
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'name_value'
    assert data['metadata']['version'] == u'1.2.3.4'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'*****@*****.**'
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is True
Пример #23
0
def _validator(file_path):
    # TODO(Kumar) This is currently copied from Zamboni because
    # it's really hard to import from zamboni outside of itself.
    # TODO(Kumar) remove this when validator is fixed, see bug 620503
    from validator.testcases import scripting
    import validator.constants
    js = os.environ.get('SPIDERMONKEY_INSTALLATION', 'js')
    scripting.SPIDERMONKEY_INSTALLATION = js
    validator.constants.SPIDERMONKEY_INSTALLATION = js
    apps = os.path.join(os.path.dirname(__file__), 'apps.json')
    orig = sys.stderr
    sys.stderr = StringIO()
    try:
        result = validate(file_path, format='json',
                        # Test all tiers at once. This will make sure we see
                        # all error messages.
                        determined=True,
                        approved_applications=apps,
                        spidermonkey=js)
        sys.stdout.write(sys.stderr.getvalue())
        if 'Traceback' in sys.stderr.getvalue():
            # the validator catches and ignores certain errors in an attempt
            # to remain versatile.  There should not be any exceptions
            # while testing.
            raise RuntimeError(
                "An exception was raised during validation. Check stderr")
    finally:
        sys.stderr = orig
    return result
Пример #24
0
def test_validate_webextension():
    """Integration test for a basic webextension, without mocks.

    We're not supposed to use amo-validator for webextensions anymore now that
    we have addons-linter, but let's make sure that we don't completely
    blow up anyway."""
    result = validate(path='tests/resources/validate/webextension.xpi')
    data = json.loads(result)

    assert data['success'] is False
    assert data['errors'] == 1
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert len(data['messages']) == 1
    assert data['messages'][0]['id'] == [
        u'submain', u'test_inner_package', u'webextension']
    assert data['messages'][0]['message'] == (
            'This tool only works with legacy add-ons. See '
            'https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions '
            'for more information about WebExtension APIs.')
    assert data['messages'][0]['tier'] == 1
    assert data['messages'][0]['type'] == 'error'
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['is_extension'] is True
Пример #25
0
def _validator(file_path, for_appversions=None, overrides=None):
    from validator.testcases import scripting
    import validator
    import validator.constants
    js = os.environ.get('SPIDERMONKEY_INSTALLATION', 'js')
    scripting.SPIDERMONKEY_INSTALLATION = js
    validator.constants.SPIDERMONKEY_INSTALLATION = js
    apps = os.path.join(os.path.dirname(validator.__file__),
                        'app_versions.json')
    if not os.path.exists(apps):
        raise EnvironmentError('Could not locate app_versions.json in git '
                               'repo for validator. Tried: %s' % apps)
    orig = sys.stderr
    sys.stderr = StringIO()
    try:
        result = validate(file_path, format='json',
                        # Test all tiers at once. This will make sure we see
                        # all error messages.
                        determined=True,
                        approved_applications=apps,
                        spidermonkey=js,
                        for_appversions=for_appversions,
                        timeout=60 * 3,  # seconds
                        overrides=overrides)
        sys.stdout.write(sys.stderr.getvalue())
        if 'Traceback' in sys.stderr.getvalue():
            # the validator catches and ignores certain errors in an attempt
            # to remain versatile.  There should not be any exceptions
            # while testing.
            raise RuntimeError(
                "An exception was raised during validation. Check stderr")
    finally:
        sys.stderr = orig
    return result
Пример #26
0
def validate_and_submit(addon, file_, channel, use_autograph=False):
    return validate(file_,
                    listed=(channel == amo.RELEASE_CHANNEL_LISTED),
                    subtask=submit_file.si(addon.pk,
                                           file_.pk,
                                           channel,
                                           use_autograph=use_autograph))
Пример #27
0
def test_validate_dictionnary_no_multiprocess_compatible_warning():
    """Integration test for a dictionnary xpi, without mocks."""
    result = validate(path='tests/resources/validate/dictionary.xpi')
    data = json.loads(result)
    assert data['success'] is True
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 0
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'dictionary'
    assert data['messages'] == []
    assert data['message_tree'] == {}
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'My Fake Dictionary'
    assert data['metadata']['version'] == u'1.0.0'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'my@dict'
    assert data['metadata'].get('strict_compatibility') is None
    assert data['metadata']['is_extension'] is False
Пример #28
0
def _validator(file_path, for_appversions=None, overrides=None):
    from validator.testcases import scripting
    import validator
    import validator.constants
    js = os.environ.get('SPIDERMONKEY_INSTALLATION', 'js')
    apps = os.path.join(os.path.dirname(validator.__file__),
                        'app_versions.json')
    if not os.path.exists(apps):
        raise EnvironmentError('Could not locate app_versions.json in git '
                               'repo for validator. Tried: %s' % apps)
    orig = sys.stderr
    sys.stderr = StringIO()
    try:
        result = validate(
            file_path,
            format='json',
            # Test all tiers at once. This will make
            # sure we see all error messages.
            determined=True,
            approved_applications=apps,
            spidermonkey=js,
            for_appversions=for_appversions,
            timeout=60 * 3,  # seconds
            overrides=overrides)
        sys.stdout.write(sys.stderr.getvalue())
        if 'Traceback' in sys.stderr.getvalue():
            # the validator catches and ignores certain errors in an attempt
            # to remain versatile.  There should not be any exceptions
            # while testing.
            raise RuntimeError(
                "An exception was raised during validation. Check stderr")
    finally:
        sys.stderr = orig
    return result
Пример #29
0
def run_validator(file_path, for_appversions=None, test_all_tiers=False, overrides=None):
    """A pre-configured wrapper around the addon validator.

    *file_path*
        Path to addon / extension file to validate.

    *for_appversions=None*
        An optional dict of application versions to validate this addon
        for. The key is an application GUID and its value is a list of
        versions.

    *test_all_tiers=False*
        When False (default) the validator will not continue if it
        encounters fatal errors.  When True, all tests in all tiers are run.
        See bug 615426 for discussion on this default.

    *overrides=None*
        Normally the validator gets info from install.rdf but there are a
        few things we need to override. See validator for supported overrides.
        Example: {'targetapp_maxVersion': {'<app guid>': '<version>'}}

    To validate the addon for compatibility with Firefox 5 and 6,
    you'd pass in::

        for_appversions={amo.FIREFOX.guid: ['5.0.*', '6.0.*']}

    Not all application versions will have a set of registered
    compatibility tests.
    """

    from validator.validate import validate

    # TODO(Kumar) remove this when validator is fixed, see bug 620503
    from validator.testcases import scripting

    scripting.SPIDERMONKEY_INSTALLATION = settings.SPIDERMONKEY
    import validator.constants

    validator.constants.SPIDERMONKEY_INSTALLATION = settings.SPIDERMONKEY

    apps = dump_apps.Command.JSON_PATH
    if not os.path.exists(apps):
        call_command("dump_apps")

    with statsd.timer("devhub.validator"):
        return validate(
            file_path,
            for_appversions=for_appversions,
            format="json",
            # When False, this flag says to stop testing after one
            # tier fails.
            determined=test_all_tiers,
            approved_applications=apps,
            spidermonkey=settings.SPIDERMONKEY,
            overrides=overrides,
            timeout=settings.VALIDATOR_TIMEOUT,
        )
Пример #30
0
def run_validator(file_path,
                  for_appversions=None,
                  test_all_tiers=False,
                  overrides=None):
    """A pre-configured wrapper around the addon validator.

    *file_path*
        Path to addon / extension file to validate.

    *for_appversions=None*
        An optional dict of application versions to validate this addon
        for. The key is an application GUID and its value is a list of
        versions.

    *test_all_tiers=False*
        When False (default) the validator will not continue if it
        encounters fatal errors.  When True, all tests in all tiers are run.
        See bug 615426 for discussion on this default.

    *overrides=None*
        Normally the validator gets info from install.rdf but there are a
        few things we need to override. See validator for supported overrides.
        Example: {'targetapp_maxVersion': {'<app guid>': '<version>'}}

    To validate the addon for compatibility with Firefox 5 and 6,
    you'd pass in::

        for_appversions={amo.FIREFOX.guid: ['5.0.*', '6.0.*']}

    Not all application versions will have a set of registered
    compatibility tests.
    """

    from validator.validate import validate

    # TODO(Kumar) remove this when validator is fixed, see bug 620503
    from validator.testcases import scripting
    scripting.SPIDERMONKEY_INSTALLATION = settings.SPIDERMONKEY
    import validator.constants
    validator.constants.SPIDERMONKEY_INSTALLATION = settings.SPIDERMONKEY

    apps = dump_apps.Command.JSON_PATH
    if not os.path.exists(apps):
        call_command('dump_apps')

    with statsd.timer('devhub.validator'):
        return validate(
            file_path,
            for_appversions=for_appversions,
            format='json',
            # When False, this flag says to stop testing after one
            # tier fails.
            determined=test_all_tiers,
            approved_applications=apps,
            spidermonkey=settings.SPIDERMONKEY,
            overrides=overrides,
            timeout=settings.VALIDATOR_TIMEOUT)
Пример #31
0
def test_validate():
    output = validate(path="tests/resources/packagelayout/theme.jar")
    j = json.loads(output)
    print j
    assert j["metadata"]["name"] == "name_value"

    output = validate(path="tests/resources/packagelayout/theme.jar",
                      format=None)
    assert isinstance(output, ErrorBundle)
    assert output.metadata["name"] == "name_value"
    assert output.get_resource("SPIDERMONKEY") == False

    output = validate(path="tests/resources/packagelayout/theme.jar",
                      spidermonkey="foospidermonkey",
                      format=None)
    assert output.get_resource("SPIDERMONKEY") == "foospidermonkey"
    assert output.determined
    assert output.get_resource("listed")

    output = validate(path="tests/resources/packagelayout/theme.jar",
                      determined=False,
                      format=None)
    assert not output.determined
    assert output.get_resource("listed")

    output = validate(path="tests/resources/packagelayout/theme.jar",
                      listed=False,
                      format=None)
    assert output.determined
    assert not output.get_resource("listed")

    output = validate(path="tests/resources/packagelayout/theme.jar",
                      overrides="foo",
                      format=None)
    assert output.overrides == "foo"
Пример #32
0
def _validator(file_path):

    from validator.validate import validate

    # TODO(Kumar) remove this when validator is fixed, see bug 620503
    from validator.testcases import scripting
    scripting.SPIDERMONKEY_INSTALLATION = settings.SPIDERMONKEY
    import validator.constants
    validator.constants.SPIDERMONKEY_INSTALLATION = settings.SPIDERMONKEY

    apps = dump_apps.Command.JSON_PATH
    if not os.path.exists(apps):
        call_command('dump_apps')

    return validate(file_path, format='json',
                    # This flag says to stop testing after one tier fails.
                    # bug 615426
                    determined=False,
                    approved_applications=apps,
                    spidermonkey=settings.SPIDERMONKEY)
Пример #33
0
def _validator(file_path, compatibility=None):
    # TODO(Kumar) This is currently copied from Zamboni because
    # it's really hard to import from zamboni outside of itself.
    # TODO(Kumar) remove this when validator is fixed, see bug 620503
    from validator.testcases import scripting
    import validator
    import validator.constants
    js = os.environ.get('SPIDERMONKEY_INSTALLATION', 'js')
    scripting.SPIDERMONKEY_INSTALLATION = js
    validator.constants.SPIDERMONKEY_INSTALLATION = js
    apps = os.path.join(os.path.dirname(validator.__file__),
                        'app_versions.json')
    if not os.path.exists(apps):
        raise EnvironmentError('Could not locate app_versions.json in git '
                               'repo for validator. Tried: %s' % apps)
    orig = sys.stderr
    sys.stderr = StringIO()
    try:
        result = validate(file_path, format='json',
                        # Test all tiers at once. This will make sure we see
                        # all error messages.
                        determined=True,
                        approved_applications=apps,
                        spidermonkey=js,
                        # Commented out because we want to let the tests
                        # choose whether to run or not. This step is
                        # unnecessary.
                        #for_appversions=compatibility,
                        overrides={"targetapp_maxVersion": compatibility or {}})
        sys.stdout.write(sys.stderr.getvalue())
        if 'Traceback' in sys.stderr.getvalue():
            # the validator catches and ignores certain errors in an attempt
            # to remain versatile.  There should not be any exceptions
            # while testing.
            raise RuntimeError(
                "An exception was raised during validation. Check stderr")
    finally:
        sys.stderr = orig
    return result
def _validator(file_path, for_appversions=None, overrides=None):
    # TODO(Kumar) This is currently copied from Zamboni because
    # it's really hard to import from zamboni outside of itself.
    # TODO(Kumar) remove this when validator is fixed, see bug 620503
    from validator.testcases import scripting
    import validator
    import validator.constants

    js = os.environ.get("SPIDERMONKEY_INSTALLATION", "js")
    scripting.SPIDERMONKEY_INSTALLATION = js
    validator.constants.SPIDERMONKEY_INSTALLATION = js
    apps = os.path.join(os.path.dirname(validator.__file__), "app_versions.json")
    if not os.path.exists(apps):
        raise EnvironmentError("Could not locate app_versions.json in git " "repo for validator. Tried: %s" % apps)
    orig = sys.stderr
    sys.stderr = StringIO()
    try:
        result = validate(
            file_path,
            format="json",
            # Test all tiers at once. This will make sure we see
            # all error messages.
            determined=True,
            approved_applications=apps,
            spidermonkey=js,
            for_appversions=for_appversions,
            timeout=60 * 3,  # seconds
            overrides=overrides,
        )
        sys.stdout.write(sys.stderr.getvalue())
        if "Traceback" in sys.stderr.getvalue():
            # the validator catches and ignores certain errors in an attempt
            # to remain versatile.  There should not be any exceptions
            # while testing.
            raise RuntimeError("An exception was raised during validation. Check stderr")
    finally:
        sys.stderr = orig
    return result
Пример #35
0
def _test_validate_old_xpi(compat_test):
    """Integration test for a basic old-style extension xpi, without mocks."""
    result = validate(path='tests/resources/validate/extension.xpi',
                      compat_test=compat_test)
    data = json.loads(result)

    assert data['success'] is False
    assert data['errors'] == 0
    assert data['notices'] == 0
    assert data['warnings'] == 1
    assert data['compatibility_summary']
    assert data['compatibility_summary']['errors'] == 0
    assert data['compatibility_summary']['notices'] == 0
    assert data['compatibility_summary']['warnings'] == 0
    assert data['detected_type'] == 'extension'
    assert len(data['messages']) == 1
    assert data['messages'][0]['id'] == [
        u'submain', u'test_inner_package', u'not_multiprocess_compatible']
    assert data['message_tree']
    assert data['signing_summary']['high'] == 0
    assert data['signing_summary']['medium'] == 0
    assert data['signing_summary']['low'] == 0
    assert data['signing_summary']['trivial'] == 0
    assert data['metadata']
    assert data['metadata']['name'] == u'name_value'
    assert data['metadata']['version'] == u'1.2.3.4'
    assert data['metadata']['listed'] is True
    assert data['metadata']['id'] == u'*****@*****.**'
    assert data['metadata']['strict_compatibility'] is True
    assert data['metadata']['applications']
    assert data['metadata']['applications']['firefox'] == {
        'min': '3.6', 'max': '3.6.*'
    }
    assert data['metadata']['applications']['mozilla'] == {
        'min': '1.0', 'max': '1.8+'
    }
    assert data['metadata']['is_extension'] is True
Пример #36
0
import sys
from validator.validate import validate

print validate(sys.argv[1], format="json")
Пример #37
0
def test_app_versions():
    "Tests that the validate function properly loads app_versions.json"
    validate(path="tests/resources/junk.xpi",
             approved_applications="tests/resources/test_app_versions.json")
    print constants.APPROVED_APPLICATIONS
    assert constants.APPROVED_APPLICATIONS["1"]["name"] == "Foo App"
Пример #38
0
 def run(self, path, **kwargs):
     self.output = validate(path=path, **kwargs)
Пример #39
0
def test_validate_language_pack():
    result = validate(path='tests/resources/validate/langpack.xpi')
    data = json.loads(result)
    assert data['metadata']['is_extension'] is False
Пример #40
0
def validate_and_submit(addon, file_, listed=None,
                        disallow_preliminary_review=False):
    return validate(
        file_, listed=listed, subtask=submit_file.si(
            addon.pk, file_.pk,
            disallow_preliminary_review=disallow_preliminary_review))
Пример #41
0
def test_app_versions():
    "Tests that the validate function properly loads app_versions.json"
    validate(path="tests/resources/junk.xpi",
             approved_applications="tests/resources/test_app_versions.json")
    print constants.APPROVED_APPLICATIONS
    assert constants.APPROVED_APPLICATIONS["1"]["name"] == "Foo App"
Пример #42
0
def test_app_versions():
    'Tests that the validate function properly loads app_versions.json'
    validate(path='tests/resources/junk.xpi',
             approved_applications='tests/resources/test_app_versions.json')
    assert constants.APPROVED_APPLICATIONS['1']['name'] == 'Foo App'
Пример #43
0
def test_validate_search():
    result = validate(path='tests/resources/validate/search.xml')
    data = json.loads(result)
    assert data['metadata']['is_extension'] is False
Пример #44
0
def run_validator(path, for_appversions=None, test_all_tiers=False,
                  overrides=None, compat=False, listed=True):
    """A pre-configured wrapper around the addon validator.

    *file_path*
        Path to addon / extension file to validate.

    *for_appversions=None*
        An optional dict of application versions to validate this addon
        for. The key is an application GUID and its value is a list of
        versions.

    *test_all_tiers=False*
        When False (default) the validator will not continue if it
        encounters fatal errors.  When True, all tests in all tiers are run.
        See bug 615426 for discussion on this default.

    *overrides=None*
        Normally the validator gets info from install.rdf but there are a
        few things we need to override. See validator for supported overrides.
        Example: {'targetapp_maxVersion': {'<app guid>': '<version>'}}

    *compat=False*
        Set this to `True` when performing a bulk validation. This allows the
        validator to ignore certain tests that should not be run during bulk
        validation (see bug 735841).

    *listed=True*
        If the addon is unlisted, treat it as if it was a self hosted one
        (don't fail on the presence of an updateURL).

    To validate the addon for compatibility with Firefox 5 and 6,
    you'd pass in::

        for_appversions={amo.FIREFOX.guid: ['5.0.*', '6.0.*']}

    Not all application versions will have a set of registered
    compatibility tests.
    """
    if not settings.VALIDATE_ADDONS:
        # This should only ever be set on development instances.
        # Don't run the validator, just return a skeleton passing result set.
        results = deepcopy(amo.VALIDATOR_SKELETON_RESULTS)
        results['metadata']['listed'] = listed
        return json.dumps(results)

    from validator.validate import validate

    apps = dump_apps.Command.JSON_PATH
    if not os.path.exists(apps):
        call_command('dump_apps')

    with NamedTemporaryFile(suffix='_' + os.path.basename(path)) as temp:
        if path and not os.path.exists(path) and storage.exists(path):
            # This file doesn't exist locally. Write it to our
            # currently-open temp file and switch to that path.
            copyfileobj(storage.open(path), temp.file)
            path = temp.name

        with statsd.timer('devhub.validator'):
            json_result = validate(
                path,
                for_appversions=for_appversions,
                format='json',
                # When False, this flag says to stop testing after one
                # tier fails.
                determined=test_all_tiers,
                approved_applications=apps,
                spidermonkey=settings.SPIDERMONKEY,
                overrides=overrides,
                compat_test=compat,
                listed=listed
            )

        track_validation_stats(json_result)

        return json_result
Пример #45
0
def test_webapp():
    """Test that webapps can be validated traditionally."""
    out = validate(path="tests/resources/testwebapp.webapp",
                   expectation=PACKAGE_WEBAPP)
    j = json.loads(out)
    assert j["success"], "Expected not to fail"
Пример #46
0
def run_validator(path,
                  for_appversions=None,
                  test_all_tiers=False,
                  overrides=None,
                  compat=False,
                  listed=True):
    """A pre-configured wrapper around the addon validator.

    *file_path*
        Path to addon / extension file to validate.

    *for_appversions=None*
        An optional dict of application versions to validate this addon
        for. The key is an application GUID and its value is a list of
        versions.

    *test_all_tiers=False*
        When False (default) the validator will not continue if it
        encounters fatal errors.  When True, all tests in all tiers are run.
        See bug 615426 for discussion on this default.

    *overrides=None*
        Normally the validator gets info from the manifest but there are a
        few things we need to override. See validator for supported overrides.
        Example: {'targetapp_maxVersion': {'<app guid>': '<version>'}}

    *compat=False*
        Set this to `True` when performing a bulk validation. This allows the
        validator to ignore certain tests that should not be run during bulk
        validation (see bug 735841).

    *listed=True*
        If the addon is unlisted, treat it as if it was a self hosted one
        (don't fail on the presence of an updateURL).

    To validate the addon for compatibility with Firefox 5 and 6,
    you'd pass in::

        for_appversions={amo.FIREFOX.guid: ['5.0.*', '6.0.*']}

    Not all application versions will have a set of registered
    compatibility tests.
    """
    from validator.validate import validate

    apps = dump_apps.Command.get_json_path()

    if not os.path.exists(apps):
        call_command('dump_apps')

    suffix = '_' + os.path.basename(path)

    with NamedTemporaryFile(suffix=suffix, dir=settings.TMP_PATH) as temp:
        if path and not os.path.exists(path) and storage.exists(path):
            # This file doesn't exist locally. Write it to our
            # currently-open temp file and switch to that path.
            shutil.copyfileobj(storage.open(path), temp.file)
            path = temp.name

        with statsd.timer('devhub.validator'):
            json_result = validate(
                path,
                for_appversions=for_appversions,
                format='json',
                # When False, this flag says to stop testing after one
                # tier fails.
                determined=test_all_tiers,
                approved_applications=apps,
                overrides=overrides,
                compat_test=compat,
                listed=listed)

        track_validation_stats(json_result)

        return json_result
Пример #47
0
def validate_and_submit(addon, file_, listed=None):
    return validate(file_, listed=listed,
                    subtask=submit_file.si(addon.pk, file_.pk))
Пример #48
0
def validate_and_submit(addon, file_, listed):
    channel = (amo.RELEASE_CHANNEL_LISTED if listed else
               amo.RELEASE_CHANNEL_UNLISTED)
    return validate(
        file_, listed=listed,
        subtask=submit_file.si(addon.pk, file_.pk, channel))
Пример #49
0
def main():
    "Main function. Handles delegation to other functions."

    expectations = {"any": PACKAGE_ANY,
                    "extension": PACKAGE_EXTENSION,
                    "theme": PACKAGE_THEME,
                    "dictionary": PACKAGE_DICTIONARY,
                    "languagepack": PACKAGE_LANGPACK,
                    "search": PACKAGE_SEARCHPROV,
                    "multi": PACKAGE_MULTI}

    # Parse the arguments that
    parser = argparse.ArgumentParser(
        description="Run tests on a Mozilla-type addon.")

    parser.add_argument("package",
                        help="The path of the package you're testing")
    parser.add_argument("-t",
                        "--type",
                        default="any",
                        choices=expectations.keys(),
                        help="Type of addon you assume you're testing",
                        required=False)
    parser.add_argument("-o",
                        "--output",
                        default="text",
                        choices=("text", "json"),
                        help="The output format that you expect",
                        required=False)
    parser.add_argument("-v",
                        "--verbose",
                        action="store_const",
                        const=True,
                        help="""If the output format supports it, makes
                        the analysis summary include extra info.""")
    parser.add_argument("--boring",
                        action="store_const",
                        const=True,
                        help="""Activating this flag will remove color
                        support from the terminal.""")
    parser.add_argument("--determined",
                        action="store_const",
                        const=True,
                        help="""This flag will continue running tests in
                        successive tests even if a lower tier fails.""")
    parser.add_argument("--selfhosted",
                        action="store_const",
                        const=True,
                        help="""Indicates that the addon will not be
                        hosted on addons.mozilla.org. This allows the
                        <em:updateURL> element to be set.""")
    parser.add_argument("--approved_applications",
                        default="validator/app_versions.json",
                        help="""A JSON file containing acceptable applications
                        and their versions""")
    parser.add_argument("--target-maxversion",
                        help="""JSON string to override the package's
                        targetapp_maxVersion for validation. The JSON object
                        should be a dict of versions keyed by application
                        GUID. For example, setting a package's max Firefox
                        version to 5.*:
                        {"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "5.*"}
                        """)
    parser.add_argument("--target-minversion",
                        help="""JSON string to override the package's
                        targetapp_minVersion for validation. The JSON object
                        should be a dict of versions keyed by application
                        GUID. For example, setting a package's min Firefox
                        version to 5.*:
                        {"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "5.*"}
                        """)
    parser.add_argument("--for-appversions",
                        help="""JSON string to run validation tests for
                        compatibility with a specific app/version. The JSON
                        object should be a dict of version lists keyed by
                        application GUID. For example, running Firefox 6.*
                        compatibility tests:
                        {"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": ["6.*"]}
                        """)

    args = parser.parse_args()

    # We want to make sure that the output is expected. Parse out the expected
    # type for the add-on and pass it in for validation.
    if args.type not in expectations:
        # Fail if the user provided invalid input.
        print "Given expectation (%s) not valid. See --help for details" % \
                args.type
        sys.exit(1)

    overrides = {}
    if args.target_minversion:
       overrides['targetapp_minVersion'] = json.loads(args.target_minversion)
    if args.target_maxversion:
       overrides['targetapp_maxVersion'] = json.loads(args.target_maxversion)

    for_appversions = None
    if args.for_appversions:
        for_appversions = json.loads(args.for_appversions)

    expectation = expectations[args.type]
    error_bundle = validate(args.package,
                            format=None,
                            approved_applications=args.approved_applications,
                            determined=args.determined,
                            listed=not args.selfhosted,
                            overrides=overrides,
                            for_appversions=for_appversions)

    # Print the output of the tests based on the requested format.
    if args.output == "text":
        print error_bundle.print_summary(verbose=args.verbose,
                                         no_color=args.boring).encode("utf-8")
    elif args.output == "json":
        sys.stdout.write(error_bundle.render_json())

    if error_bundle.failed():
        sys.exit(1)
    else:
        sys.exit(0)
Пример #50
0
 def run(self, path, **kwargs):
     self.output = validate(path=path, **kwargs)
Пример #51
0
def main():
    'Main function. Handles delegation to other functions.'

    logging.basicConfig()

    type_choices = {
        'any': constants.PACKAGE_ANY,
        'extension': constants.PACKAGE_EXTENSION,
        'theme': constants.PACKAGE_THEME,
        'dictionary': constants.PACKAGE_DICTIONARY,
        'languagepack': constants.PACKAGE_LANGPACK,
        'search': constants.PACKAGE_SEARCHPROV,
        'multi': constants.PACKAGE_MULTI
    }

    # Parse the arguments that
    parser = argparse.ArgumentParser(
        description='Run tests on a Mozilla-type addon.')

    parser.add_argument('package',
                        help="The path of the package you're testing")
    parser.add_argument('-t',
                        '--type',
                        default='any',
                        choices=type_choices.keys(),
                        help="Type of addon you assume you're testing",
                        required=False)
    parser.add_argument('-o',
                        '--output',
                        default='text',
                        choices=('text', 'json'),
                        help='The output format that you expect',
                        required=False)
    parser.add_argument('-v',
                        '--verbose',
                        action='store_const',
                        const=True,
                        help="""If the output format supports it, makes
                        the analysis summary include extra info.""")
    parser.add_argument('--boring',
                        action='store_const',
                        const=True,
                        help="""Activating this flag will remove color
                        support from the terminal.""")
    parser.add_argument('--determined',
                        action='store_const',
                        const=True,
                        help="""This flag will continue running tests in
                        successive tests even if a lower tier fails.""")
    parser.add_argument('--selfhosted',
                        action='store_const',
                        const=True,
                        help="""Indicates that the addon will not be
                        hosted on addons.mozilla.org. This allows the
                        <em:updateURL> element to be set.""")
    parser.add_argument('--approved_applications',
                        help="""A JSON file containing acceptable applications
                        and their versions""",
                        required=False)
    parser.add_argument('--target-maxversion',
                        help="""JSON string to override the package's
                        targetapp_maxVersion for validation. The JSON object
                        should be a dict of versions keyed by application
                        GUID. For example, setting a package's max Firefox
                        version to 5.*:
                        {"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "5.*"}
                        """)
    parser.add_argument('--target-minversion',
                        help="""JSON string to override the package's
                        targetapp_minVersion for validation. The JSON object
                        should be a dict of versions keyed by application
                        GUID. For example, setting a package's min Firefox
                        version to 5.*:
                        {"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "5.*"}
                        """)
    parser.add_argument('--for-appversions',
                        help="""JSON string to run validation tests for
                        compatibility with a specific app/version. The JSON
                        object should be a dict of version lists keyed by
                        application GUID. For example, running Firefox 6.*
                        compatibility tests:
                        {"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": ["6.*"]}
                        """)
    parser.add_argument('--timeout',
                        help='The amount of time before validation is '
                        'terminated with a timeout exception.',
                        default='60')

    args = parser.parse_args()

    # We want to make sure that the output is expected. Parse out the expected
    # type for the add-on and pass it in for validation.
    if args.type not in type_choices:
        # Fail if the user provided invalid input.
        print 'Given expectation (%s) not valid. See --help for details' % \
                args.type
        sys.exit(1)

    overrides = {}
    if args.target_minversion:
        overrides['targetapp_minVersion'] = json.loads(args.target_minversion)
    if args.target_maxversion:
        overrides['targetapp_maxVersion'] = json.loads(args.target_maxversion)

    for_appversions = None
    if args.for_appversions:
        for_appversions = json.loads(args.for_appversions)

    try:
        timeout = int(args.timeout)
    except ValueError:
        print 'Invalid timeout. Integer expected.'
        sys.exit(1)

    expectation = type_choices[args.type]
    error_bundle = validate(args.package,
                            format=None,
                            approved_applications=args.approved_applications,
                            determined=args.determined,
                            listed=not args.selfhosted,
                            overrides=overrides,
                            for_appversions=for_appversions,
                            expectation=expectation,
                            timeout=timeout)

    # Print the output of the tests based on the requested format.
    if args.output == 'text':
        print error_bundle.print_summary(verbose=args.verbose,
                                         no_color=args.boring).encode('utf-8')
    elif args.output == 'json':
        sys.stdout.write(error_bundle.render_json())

    if error_bundle.failed():
        sys.exit(1)
    else:
        sys.exit(0)
Пример #52
0
def main():
    'Main function. Handles delegation to other functions.'

    logging.basicConfig()

    type_choices = {'any': constants.PACKAGE_ANY,
                    'extension': constants.PACKAGE_EXTENSION,
                    'theme': constants.PACKAGE_THEME,
                    'dictionary': constants.PACKAGE_DICTIONARY,
                    'languagepack': constants.PACKAGE_LANGPACK,
                    'search': constants.PACKAGE_SEARCHPROV,
                    'multi': constants.PACKAGE_MULTI}

    # Parse the arguments that
    parser = argparse.ArgumentParser(
        description='Run tests on a Mozilla-type addon.')

    parser.add_argument('package',
                        help="The path of the package you're testing")
    parser.add_argument('-t',
                        '--type',
                        default='any',
                        choices=type_choices.keys(),
                        help="Type of addon you assume you're testing",
                        required=False)
    parser.add_argument('-o',
                        '--output',
                        default='text',
                        choices=('text', 'json'),
                        help='The output format that you expect',
                        required=False)
    parser.add_argument('-v',
                        '--verbose',
                        action='store_const',
                        const=True,
                        help="""If the output format supports it, makes
                        the analysis summary include extra info.""")
    parser.add_argument('--boring',
                        action='store_const',
                        const=True,
                        help="""Activating this flag will remove color
                        support from the terminal.""")
    parser.add_argument('--determined',
                        action='store_const',
                        const=True,
                        help="""This flag will continue running tests in
                        successive tests even if a lower tier fails.""")
    parser.add_argument('--selfhosted',
                        action='store_const',
                        const=True,
                        help="""Indicates that the addon will not be
                        hosted on addons.mozilla.org. This allows the
                        <em:updateURL> element to be set.""")
    parser.add_argument('--approved_applications',
                        help="""A JSON file containing acceptable applications
                        and their versions""",
                        required=False)
    parser.add_argument('--target-maxversion',
                        help="""JSON string to override the package's
                        targetapp_maxVersion for validation. The JSON object
                        should be a dict of versions keyed by application
                        GUID. For example, setting a package's max Firefox
                        version to 5.*:
                        {"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "5.*"}
                        """)
    parser.add_argument('--target-minversion',
                        help="""JSON string to override the package's
                        targetapp_minVersion for validation. The JSON object
                        should be a dict of versions keyed by application
                        GUID. For example, setting a package's min Firefox
                        version to 5.*:
                        {"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "5.*"}
                        """)
    parser.add_argument('--for-appversions',
                        help="""JSON string to run validation tests for
                        compatibility with a specific app/version. The JSON
                        object should be a dict of version lists keyed by
                        application GUID. For example, running Firefox 6.*
                        compatibility tests:
                        {"{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": ["6.*"]}
                        """)
    parser.add_argument('--timeout',
                        help='The amount of time before validation is '
                             'terminated with a timeout exception.',
                        default='60')

    args = parser.parse_args()

    # We want to make sure that the output is expected. Parse out the expected
    # type for the add-on and pass it in for validation.
    if args.type not in type_choices:
        # Fail if the user provided invalid input.
        print 'Given expectation (%s) not valid. See --help for details' % \
                args.type
        sys.exit(1)

    overrides = {}
    if args.target_minversion:
        overrides['targetapp_minVersion'] = json.loads(args.target_minversion)
    if args.target_maxversion:
        overrides['targetapp_maxVersion'] = json.loads(args.target_maxversion)

    for_appversions = None
    if args.for_appversions:
        for_appversions = json.loads(args.for_appversions)

    try:
        timeout = int(args.timeout)
    except ValueError:
        print 'Invalid timeout. Integer expected.'
        sys.exit(1)

    expectation = type_choices[args.type]
    error_bundle = validate(args.package,
                            format=None,
                            approved_applications=args.approved_applications,
                            determined=args.determined,
                            listed=not args.selfhosted,
                            overrides=overrides,
                            for_appversions=for_appversions,
                            expectation=expectation,
                            timeout=timeout)

    # Print the output of the tests based on the requested format.
    if args.output == 'text':
        print error_bundle.print_summary(verbose=args.verbose,
                                         no_color=args.boring).encode('utf-8')
    elif args.output == 'json':
        sys.stdout.write(error_bundle.render_json())

    if error_bundle.failed():
        sys.exit(1)
    else:
        sys.exit(0)
Пример #53
0
def validate_and_submit(addon, file_, listed=None):
    return validate(file_, listed=listed,
                    subtask=submit_file.si(addon.pk, file_.pk))
Пример #54
0
def test_validate_theme():
    result = validate(path='tests/resources/validate/theme.xpi')
    data = json.loads(result)
    assert data['metadata']['is_extension'] is False
Пример #55
0
def run_validator(file_path,
                  for_appversions=None,
                  test_all_tiers=False,
                  overrides=None,
                  compat=False):
    """A pre-configured wrapper around the addon validator.

    *file_path*
        Path to addon / extension file to validate.

    *for_appversions=None*
        An optional dict of application versions to validate this addon
        for. The key is an application GUID and its value is a list of
        versions.

    *test_all_tiers=False*
        When False (default) the validator will not continue if it
        encounters fatal errors.  When True, all tests in all tiers are run.
        See bug 615426 for discussion on this default.

    *overrides=None*
        Normally the validator gets info from install.rdf but there are a
        few things we need to override. See validator for supported overrides.
        Example: {'targetapp_maxVersion': {'<app guid>': '<version>'}}

    *compat=False*
        Set this to `True` when performing a bulk validation. This allows the
        validator to ignore certain tests that should not be run during bulk
        validation (see bug 735841).

    To validate the addon for compatibility with Firefox 5 and 6,
    you'd pass in::

        for_appversions={amo.FIREFOX.guid: ['5.0.*', '6.0.*']}

    Not all application versions will have a set of registered
    compatibility tests.
    """

    from validator.validate import validate

    apps = dump_apps.Command.JSON_PATH
    if not os.path.exists(apps):
        call_command('dump_apps')

    path = file_path
    if path and not os.path.exists(path) and storage.exists(path):
        path = tempfile.mktemp(suffix='_' + os.path.basename(file_path))
        with open(path, 'wb') as f:
            copyfileobj(storage.open(file_path), f)
        temp = True
    else:
        temp = False
    try:
        with statsd.timer('devhub.validator'):
            return validate(
                path,
                for_appversions=for_appversions,
                format='json',
                # When False, this flag says to stop testing after
                # one tier fails.
                determined=test_all_tiers,
                approved_applications=apps,
                spidermonkey=settings.SPIDERMONKEY,
                overrides=overrides,
                timeout=settings.VALIDATOR_TIMEOUT,
                compat_test=compat)
    finally:
        if temp:
            os.remove(path)
Пример #56
0
def validate_and_submit(addon, file_, channel):
    return validate(
        file_, listed=(channel == amo.RELEASE_CHANNEL_LISTED),
        subtask=submit_file.si(addon.pk, file_.pk, channel))
Пример #57
0
def run_validator(file_path, for_appversions=None, test_all_tiers=False,
                  overrides=None, compat=False, listed=True):
    """A pre-configured wrapper around the addon validator.

    *file_path*
        Path to addon / extension file to validate.

    *for_appversions=None*
        An optional dict of application versions to validate this addon
        for. The key is an application GUID and its value is a list of
        versions.

    *test_all_tiers=False*
        When False (default) the validator will not continue if it
        encounters fatal errors.  When True, all tests in all tiers are run.
        See bug 615426 for discussion on this default.

    *overrides=None*
        Normally the validator gets info from install.rdf but there are a
        few things we need to override. See validator for supported overrides.
        Example: {'targetapp_maxVersion': {'<app guid>': '<version>'}}

    *compat=False*
        Set this to `True` when performing a bulk validation. This allows the
        validator to ignore certain tests that should not be run during bulk
        validation (see bug 735841).

    *listed=True*
        If the addon is unlisted, treat it as if it was a self hosted one
        (don't fail on the presence of an updateURL).

    To validate the addon for compatibility with Firefox 5 and 6,
    you'd pass in::

        for_appversions={amo.FIREFOX.guid: ['5.0.*', '6.0.*']}

    Not all application versions will have a set of registered
    compatibility tests.
    """

    from validator.validate import validate

    apps = dump_apps.Command.JSON_PATH
    if not os.path.exists(apps):
        call_command('dump_apps')

    path = file_path
    if path and not os.path.exists(path) and storage.exists(path):
        path = tempfile.mktemp(suffix='_' + os.path.basename(file_path))
        with open(path, 'wb') as f:
            copyfileobj(storage.open(file_path), f)
        temp = True
    else:
        temp = False
    try:
        with statsd.timer('devhub.validator'):
            return validate(path,
                            for_appversions=for_appversions,
                            format='json',
                            # When False, this flag says to stop testing after
                            # one tier fails.
                            determined=test_all_tiers,
                            approved_applications=apps,
                            spidermonkey=settings.SPIDERMONKEY,
                            overrides=overrides,
                            timeout=settings.VALIDATOR_TIMEOUT,
                            compat_test=compat,
                            listed=listed)
    finally:
        if temp:
            os.remove(path)
Пример #58
0
def run_validator(path,
                  for_appversions=None,
                  test_all_tiers=False,
                  overrides=None,
                  compat=False,
                  listed=True):
    """A pre-configured wrapper around the addon validator.

    *file_path*
        Path to addon / extension file to validate.

    *for_appversions=None*
        An optional dict of application versions to validate this addon
        for. The key is an application GUID and its value is a list of
        versions.

    *test_all_tiers=False*
        When False (default) the validator will not continue if it
        encounters fatal errors.  When True, all tests in all tiers are run.
        See bug 615426 for discussion on this default.

    *overrides=None*
        Normally the validator gets info from install.rdf but there are a
        few things we need to override. See validator for supported overrides.
        Example: {'targetapp_maxVersion': {'<app guid>': '<version>'}}

    *compat=False*
        Set this to `True` when performing a bulk validation. This allows the
        validator to ignore certain tests that should not be run during bulk
        validation (see bug 735841).

    *listed=True*
        If the addon is unlisted, treat it as if it was a self hosted one
        (don't fail on the presence of an updateURL).

    To validate the addon for compatibility with Firefox 5 and 6,
    you'd pass in::

        for_appversions={amo.FIREFOX.guid: ['5.0.*', '6.0.*']}

    Not all application versions will have a set of registered
    compatibility tests.
    """
    if not settings.VALIDATE_ADDONS:
        # This should only ever be set on development instances.
        # Don't run the validator, just return a skeleton passing result set.
        results = deepcopy(amo.VALIDATOR_SKELETON_RESULTS)
        results['metadata']['listed'] = listed
        return json.dumps(results)

    from validator.validate import validate

    apps = dump_apps.Command.JSON_PATH
    if not os.path.exists(apps):
        call_command('dump_apps')

    with NamedTemporaryFile(suffix='_' + os.path.basename(path)) as temp:
        if path and not os.path.exists(path) and storage.exists(path):
            # This file doesn't exist locally. Write it to our
            # currently-open temp file and switch to that path.
            copyfileobj(storage.open(path), temp.file)
            path = temp.name

        with statsd.timer('devhub.validator'):
            return validate(
                path,
                for_appversions=for_appversions,
                format='json',
                # When False, this flag says to stop testing after
                # one tier fails.
                determined=test_all_tiers,
                approved_applications=apps,
                spidermonkey=settings.SPIDERMONKEY,
                overrides=overrides,
                compat_test=compat,
                listed=listed)