예제 #1
0
def test_test_inner_package_failtier():
    'Tests that the test_inner_package function fails at a failed tier'

    with patch_decorator(fail_tier=3):
        err = MockErrorHandler()

        submain.test_inner_package(err, 'foo', 'bar')

        assert err.failed()
예제 #2
0
def test_test_inner_package_failtier():
    'Tests that the test_inner_package function fails at a failed tier'

    with patch_decorator(fail_tier=3):
        err = MockErrorHandler()

        submain.test_inner_package(err, 'foo', 'bar')

        assert err.failed()
예제 #3
0
def test_test_inner_package():
    'Tests that the test_inner_package function works properly'

    with patch_decorator():
        err = MockErrorHandler()

        submain.test_inner_package(err, 'foo', 'bar')

        assert not err.failed()
예제 #4
0
def test_test_inner_package():
    'Tests that the test_inner_package function works properly'

    with patch_decorator():
        err = MockErrorHandler()

        submain.test_inner_package(err, 'foo', 'bar')

        assert not err.failed()
예제 #5
0
def test_test_inner_package():
    "Tests that the test_inner_package function works properly"

    with patch_decorator():
        err = MockErrorHandler()

        submain.test_inner_package(err, "foo", "bar")

        assert not err.failed()
예제 #6
0
def test_test_inner_package_determined_failtier():
    'Tests the test_inner_package function in determined mode while failing'

    with patch_decorator(fail_tier=3, determined=True) as decorator:
        err = MockErrorHandler(determined=True)

        submain.test_inner_package(err, 'foo', 'bar')

        assert err.failed()
        assert decorator.last_tier == 5
예제 #7
0
def test_test_inner_package_failtier():
    "Tests that the test_inner_package function fails at a failed tier"
    
    decorator = MockDecorator(3)
    submain.decorator = decorator
    err = MockErrorHandler(decorator)
    
    submain.test_inner_package(err, "foo", "bar")
    
    assert err.failed()
예제 #8
0
def test_test_inner_package_determined_failtier():
    'Tests the test_inner_package function in determined mode while failing'

    with patch_decorator(fail_tier=3, determined=True) as decorator:
        err = MockErrorHandler(determined=True)

        submain.test_inner_package(err, 'foo', 'bar')

        assert err.failed()
        assert decorator.last_tier == 5
예제 #9
0
def test_test_inner_package_determined():
    'Tests that the determined test_inner_package function works properly'

    with patch_decorator(determined=True) as decorator:
        err = MockErrorHandler(determined=True)

        submain.test_inner_package(err, 'foo', 'bar')

        assert not err.failed()
        assert decorator.last_tier == 5
예제 #10
0
def test_test_inner_package_determined():
    'Tests that the determined test_inner_package function works properly'

    with patch_decorator(determined=True) as decorator:
        err = MockErrorHandler(determined=True)

        submain.test_inner_package(err, 'foo', 'bar')

        assert not err.failed()
        assert decorator.last_tier == 5
예제 #11
0
def test_test_inner_package_determined():
    "Tests that the determined test_inner_package function works properly"
    
    decorator = MockDecorator(None, True)
    submain.decorator = decorator
    err = MockErrorHandler(decorator, True)
    
    submain.test_inner_package(err, "foo", "bar")
    
    assert not err.failed()
    assert decorator.last_tier == 5
예제 #12
0
def test_test_inner_package_failtier():
    "Tests the test_inner_package function in determined mode while failing"
    
    decorator = MockDecorator(3, True)
    submain.decorator = decorator
    err = MockErrorHandler(decorator, True)
    
    submain.test_inner_package(err, "foo", "bar")
    
    assert err.failed()
    assert decorator.last_tier == 5
예제 #13
0
def test_test_inner_package():
    "Tests that the test_inner_package function works properly"

    smd = submain.decorator
    decorator = MockDecorator()
    submain.decorator = decorator
    err = MockErrorHandler(decorator)

    submain.test_inner_package(err, "foo", "bar")

    assert not err.failed()
    submain.decorator = smd
예제 #14
0
def test_test_inner_package():
    "Tests that the test_inner_package function works properly"

    smd = submain.decorator
    decorator = MockDecorator()
    submain.decorator = decorator
    err = MockErrorHandler(decorator)

    submain.test_inner_package(err, "foo", "bar")

    assert not err.failed()
    submain.decorator = smd
예제 #15
0
def test_test_inner_package_failtier():
    "Tests that the test_inner_package function fails at a failed tier"

    smd = submain.decorator
    decorator = MockDecorator(3)
    submain.decorator = decorator
    err = MockErrorHandler(decorator)

    submain.test_inner_package(err, "foo", "bar")

    assert err.failed()
    submain.decorator = smd
예제 #16
0
def test_test_inner_package_determined():
    "Tests that the determined test_inner_package function works properly"

    smd = submain.decorator
    decorator = MockDecorator(None, True)
    submain.decorator = decorator
    err = MockErrorHandler(decorator, True)

    submain.test_inner_package(err, "foo", "bar")

    assert not err.failed()
    assert decorator.last_tier == 5
    submain.decorator = smd
예제 #17
0
def test_test_inner_package_failtier():
    "Tests the test_inner_package function in determined mode while failing"

    smd = submain.decorator
    decorator = MockDecorator(3, True)
    submain.decorator = decorator
    err = MockErrorHandler(decorator, True)

    submain.test_inner_package(err, "foo", "bar")

    assert err.failed()
    assert decorator.last_tier == 5
    submain.decorator = smd
예제 #18
0
def _process_file(err,
                  xpi_package,
                  name,
                  file_data,
                  name_lower,
                  pollutable=False):
    """Process a single file's content tests."""

    extension = os.path.splitext(name_lower)[1]

    # If that item is a container file, unzip it and scan it.
    if extension == '.jar':
        # This is either a subpackage or a nested theme.
        is_subpackage = not err.get_resource('is_multipackage')
        # Unpack the package and load it up.
        package = StringIO(file_data)
        try:
            sub_xpi = XPIManager(package,
                                 mode='r',
                                 name=name,
                                 subpackage=is_subpackage)
        except BadZipfile:
            err.error(('testcases_content', 'test_packed_packages',
                       'jar_subpackage_corrupt'), 'Subpackage corrupt.',
                      'The subpackage appears to be corrupt, and could not '
                      'be opened.', name)
            return

        # Let the error bunder know we're in a sub-package.
        err.push_state(name)
        err.detected_type = (PACKAGE_SUBPACKAGE
                             if is_subpackage else PACKAGE_THEME)
        err.set_tier(1)
        supported_versions = (err.supported_versions.copy()
                              if err.supported_versions else
                              err.supported_versions)

        if is_subpackage:
            testendpoint_validator.test_inner_package(err, sub_xpi)
        else:
            testendpoint_validator.test_package(err, package, name)

        err.pop_state()
        err.set_tier(2)

        err.supported_versions = supported_versions

    elif extension == '.xpi':
        # It's not a subpackage, it's a nested extension. These are
        # found in multi-extension packages.

        # Unpack!
        package = StringIO(file_data)

        err.push_state(name_lower)
        err.set_tier(1)

        # There are no expected types for packages within a multi-
        # item package.
        testendpoint_validator.test_package(err, package, name)

        err.pop_state()
        err.set_tier(2)  # Reset to the current tier

    else:

        if not file_data:
            return

        # Convert the file data to unicode.
        file_data = unicodehelper.decode(file_data)

        if extension in ('.js', '.jsm'):
            testendpoint_js.test_js_file(err,
                                         name,
                                         file_data,
                                         pollutable=pollutable)
        elif extension == '.css':
            testendpoint_css.test_css_file(err, name, file_data)

        run_regex_tests(file_data, err, filename=name)
예제 #19
0
def test_packed_packages(err, package_contents=None, xpi_package=None):
    "Tests XPI and JAR files for naughty content."
    
    processed_files = 0

    hash_whitelist = [x[:-1] for x in
                      open(os.path.join(os.path.dirname(__file__),
                                        'whitelist_hashes.txt')).readlines()]
    
    # Iterate each item in the package.
    for name, data in package_contents.items():
        
        if name.startswith("__MACOSX") or \
           name.startswith(".DS_Store"):
            continue
        
        if name.split("/")[-1].startswith("._"):
            err.notice(("testcases_content",
                        "test_packed_packages",
                        "macintosh_junk"),
                       "Garbage file found.",
                       ["""A junk file has been detected. It may cause
                        problems with proper operation of the add-on down the
                        road.""",
                        "It is recommended that you delete the file"],
                       name)
        
        try:
            file_data = xpi_package.read(name)
        except KeyError: # pragma: no cover
            _read_error(err, name)

        # Skip over whitelisted hashes
        hash = hashlib.sha1(file_data).hexdigest()
        if hash in hash_whitelist:
            continue

        processed = False
        # If that item is a container file, unzip it and scan it.
        if data["extension"] == "jar":
            # This is either a subpackage or a nested theme.
            
            # Whether this is a subpackage or a nested theme is
            # determined by whether it is in the root folder or not.
            # Subpackages are always found in a directory such as
            # /chrome or /content.
            is_subpackage = name.count("/") > 0
            
            # Unpack the package and load it up.
            package = StringIO(file_data)
            sub_xpi = XPIManager(package, name, is_subpackage)
            if not sub_xpi.zf:
                err.error(("testcases_content",
                           "test_packed_packages",
                           "jar_subpackage_corrupt"),
                          "Subpackage corrupt.",
                          """The subpackage could not be opened due to
                          issues with corruption. Ensure that the file
                          is valid.""",
                          name)
                continue
            
            temp_contents = sub_xpi.get_file_data()
            
            # Let the error bunder know we're in a sub-package.
            err.push_state(data["name_lower"])
            err.set_type(PACKAGE_SUBPACKAGE) # Subpackage
            testendpoint_validator.test_inner_package(err,
                                                      temp_contents,
                                                      sub_xpi)
            err.tier = 2
            package.close()
            err.pop_state()
            
        elif data["extension"] == "xpi":
            # It's not a subpackage, it's a nested extension. These are
            # found in multi-extension packages.
            
            # Unpack!
            package = StringIO(file_data)
            
            err.push_state(data["name_lower"])
            

            # There are no expected types for packages within a multi-
            # item package.
            testendpoint_validator.test_package(err, package, name)
            err.tier = 2 # Reset to the current tier
            
            package.close()
            err.pop_state()
            
        elif data["extension"] in ("xul", "xml", "html", "xhtml"):
            
            parser = testendpoint_markup.MarkupParser(err)
            parser.process(name,
                           charsethelper.decode(file_data),
                           data["extension"])
            
            processed = True
                
            
        elif data["extension"] in ("css", "js", "jsm"):
            
            if not file_data:
                continue
            file_data = charsethelper.decode(file_data)
            
            if data["extension"] == "css":
                testendpoint_css.test_css_file(err,
                                               name,
                                               file_data)
            elif data["extension"] in ("js", "jsm"):
                testendpoint_js.test_js_file(err,
                                             name,
                                             file_data)
        # This is tested in test_langpack.py
        if err.detected_type == PACKAGE_LANGPACK and not processed:
            
            testendpoint_langpack.test_unsafe_html(err,
                                                   name,
                                                   file_data)
        
        # This aids in creating unit tests.
        processed_files += 1
            
    return processed_files
예제 #20
0
def _process_file(err, xpi_package, name, file_data, name_lower,
                  pollutable=False):
    """Process a single file's content tests."""

    # If that item is a container file, unzip it and scan it.
    if name_lower.endswith(".jar"):
        # This is either a subpackage or a nested theme.
        is_subpackage = not err.get_resource("is_multipackage")
        # Unpack the package and load it up.
        package = StringIO(file_data)
        try:
            sub_xpi = XPIManager(package, mode="r", name=name,
                                 subpackage=is_subpackage)
        except Exception:
            err.error(("testcases_content",
                       "test_packed_packages",
                       "jar_subpackage_corrupt"),
                      "Subpackage corrupt.",
                      "The subpackage could not be opened due to issues "
                      "with corruption. Ensure that the file is valid.",
                      name)
            return None

        # Let the error bunder know we're in a sub-package.
        err.push_state(name)
        err.detected_type = (PACKAGE_SUBPACKAGE if is_subpackage else
                             PACKAGE_THEME)
        err.set_tier(1)
        supported_versions = (err.supported_versions.copy() if
                              err.supported_versions else
                              err.supported_versions)

        if is_subpackage:
            testendpoint_validator.test_inner_package(err, sub_xpi)
        else:
            testendpoint_validator.test_package(err, package, name)

        err.pop_state()
        err.set_tier(2)

        err.supported_versions = supported_versions

    elif name_lower.endswith(".xpi"):
        # It's not a subpackage, it's a nested extension. These are
        # found in multi-extension packages.

        # Unpack!
        package = StringIO(file_data)

        err.push_state(name_lower)
        err.set_tier(1)

        # There are no expected types for packages within a multi-
        # item package.
        testendpoint_validator.test_package(err, package, name)

        err.pop_state()
        err.set_tier(2)  # Reset to the current tier

    elif name_lower.endswith((".css", ".js", ".jsm")):

        if not file_data:
            return None

        # Convert the file data to unicode
        file_data = unicodehelper.decode(file_data)
        is_js = False

        if name_lower.endswith(".css"):
            testendpoint_css.test_css_file(err, name, file_data)

        elif name_lower.endswith((".js", ".jsm")):
            is_js = True
            testendpoint_js.test_js_file(err, name, file_data,
                                         pollutable=pollutable)

        run_regex_tests(file_data, err, name, is_js=is_js)

        return True

    return False
예제 #21
0
def _process_file(err, xpi_package, name, file_data, name_lower,
                  pollutable=False):
    """Process a single file's content tests."""

    # If that item is a container file, unzip it and scan it.
    if name_lower.endswith('.jar'):
        # This is either a subpackage or a nested theme.
        is_subpackage = not err.get_resource('is_multipackage')
        # Unpack the package and load it up.
        package = StringIO(file_data)
        try:
            sub_xpi = XPIManager(package, mode='r', name=name,
                                 subpackage=is_subpackage)
        except BadZipfile:
            err.error(('testcases_content',
                       'test_packed_packages',
                       'jar_subpackage_corrupt'),
                      'Subpackage corrupt.',
                      'The subpackage appears to be corrupt, and could not '
                      'be opened.',
                      name)
            return None

        # Let the error bunder know we're in a sub-package.
        err.push_state(name)
        err.detected_type = (PACKAGE_SUBPACKAGE if is_subpackage else
                             PACKAGE_THEME)
        err.set_tier(1)
        supported_versions = (err.supported_versions.copy() if
                              err.supported_versions else
                              err.supported_versions)

        if is_subpackage:
            testendpoint_validator.test_inner_package(err, sub_xpi)
        else:
            testendpoint_validator.test_package(err, package, name)

        err.pop_state()
        err.set_tier(2)

        err.supported_versions = supported_versions

    elif name_lower.endswith('.xpi'):
        # It's not a subpackage, it's a nested extension. These are
        # found in multi-extension packages.

        # Unpack!
        package = StringIO(file_data)

        err.push_state(name_lower)
        err.set_tier(1)

        # There are no expected types for packages within a multi-
        # item package.
        testendpoint_validator.test_package(err, package, name)

        err.pop_state()
        err.set_tier(2)  # Reset to the current tier

    elif name_lower.endswith(('.css', '.js', '.jsm')):

        if not file_data:
            return None

        # Convert the file data to unicode
        file_data = unicodehelper.decode(file_data)
        is_js = name_lower.endswith(('.js', '.jsm'))

        if name_lower.endswith('.css'):
            testendpoint_css.test_css_file(err, name, file_data)

        elif is_js:
            testendpoint_js.test_js_file(err, name, file_data,
                                         pollutable=pollutable)

        run_regex_tests(file_data, err, name, is_js=is_js)

        return True

    else:
        if file_data:
            file_data = unicodehelper.decode(file_data)
            run_regex_tests(file_data, err, name, explicit=True)

    return False
예제 #22
0
def _process_file(err,
                  xpi_package,
                  name,
                  file_data,
                  name_lower,
                  pollutable=False):
    """Process a single file's content tests."""

    # If that item is a container file, unzip it and scan it.
    if name_lower.endswith(".jar"):
        # This is either a subpackage or a nested theme.
        is_subpackage = not err.get_resource("is_multipackage")
        # Unpack the package and load it up.
        package = StringIO(file_data)
        try:
            sub_xpi = XPIManager(package,
                                 mode="r",
                                 name=name,
                                 subpackage=is_subpackage)
        except Exception:
            err.error(("testcases_content", "test_packed_packages",
                       "jar_subpackage_corrupt"), "Subpackage corrupt.",
                      "The subpackage could not be opened due to issues "
                      "with corruption. Ensure that the file is valid.", name)
            return None

        # Let the error bunder know we're in a sub-package.
        err.push_state(name)
        err.detected_type = (PACKAGE_SUBPACKAGE
                             if is_subpackage else PACKAGE_THEME)
        err.set_tier(1)
        supported_versions = (err.supported_versions.copy()
                              if err.supported_versions else
                              err.supported_versions)

        if is_subpackage:
            testendpoint_validator.test_inner_package(err, sub_xpi)
        else:
            testendpoint_validator.test_package(err, package, name)

        err.pop_state()
        err.set_tier(2)

        err.supported_versions = supported_versions

    elif name_lower.endswith(".xpi"):
        # It's not a subpackage, it's a nested extension. These are
        # found in multi-extension packages.

        # Unpack!
        package = StringIO(file_data)

        err.push_state(name_lower)
        err.set_tier(1)

        # There are no expected types for packages within a multi-
        # item package.
        testendpoint_validator.test_package(err, package, name)

        err.pop_state()
        err.set_tier(2)  # Reset to the current tier

    elif name_lower.endswith((".css", ".js", ".jsm")):

        if not file_data:
            return None

        # Convert the file data to unicode
        file_data = unicodehelper.decode(file_data)
        is_js = False

        if name_lower.endswith(".css"):
            testendpoint_css.test_css_file(err, name, file_data)

        elif name_lower.endswith((".js", ".jsm")):
            is_js = True
            testendpoint_js.test_js_file(err,
                                         name,
                                         file_data,
                                         pollutable=pollutable)

        run_regex_tests(file_data, err, name, is_js=is_js)

        return True

    return False