def test_package_corrupt_again(test_inner_package): 'Tests the test_package function fails with a corrupt file' err = ErrorBundle() with open('tests/resources/corrupt.xpi') as pkg: submain.test_package(err, pkg, pkg.name) assert not test_inner_package.called assert err.failed()
def test_package_pass(test_inner_package): 'Tests the test_package function with simple data' err = ErrorBundle() with open('tests/resources/submain/install_rdf.xpi') as pkg: submain.test_package(err, pkg, pkg.name) assert not err.failed() assert err.get_resource('has_install_rdf') assert submain.test_inner_package.called
def test_package_extension_bad_expectation(test_inner_package): 'Tests the test_package function with an odd extension' err = ErrorBundle() with open('tests/resources/submain/install_rdf.jar') as pkg: submain.test_package(err, pkg, pkg.name, PACKAGE_SEARCHPROV) assert test_inner_package.called assert err.failed() assert err.errors[0]['id'] == ('main', 'test_package', 'unexpected_type')
def test_package_extension_expectation(test_inner_package): 'Tests the test_package function with an odd extension' err = ErrorBundle() with open('tests/resources/submain/install_rdf.jar') as pkg: submain.test_package(err, pkg, pkg.name, PACKAGE_ANY) assert submain.test_inner_package.called assert not err.failed() assert err.get_resource('has_install_rdf')
def test_subpackage_metadata_preserved(): """Tests that metadata is preserved for sub-packages.""" xpi1 = open("tests/resources/jetpack/jetpack-1.8-outdated.xpi") xpi2 = MockXPI( {"thing.xpi": "tests/resources/jetpack/jetpack-1.8-outdated.xpi"}) err1 = ErrorBundle() err1.detected_type = PACKAGE_EXTENSION err2 = ErrorBundle() err2.detected_type = PACKAGE_EXTENSION submain.test_package(err1, xpi1, "jetpack-1.8-outdated.xpi") content.test_packed_packages(err2, xpi2) assert "sub_packages" in err2.metadata eq_(err1.metadata, err2.metadata["sub_packages"].get("thing.xpi"))
def test_subpackage_metadata_preserved(): """Tests that metadata is preserved for sub-packages.""" xpi1 = open('tests/resources/jetpack/jetpack-1.16-outdated.xpi') xpi2 = MockXPI({ 'thing.xpi': 'tests/resources/jetpack/jetpack-1.16-outdated.xpi'}) err1 = ErrorBundle() err1.detected_type = PACKAGE_EXTENSION err2 = ErrorBundle() err2.detected_type = PACKAGE_EXTENSION submain.test_package(err1, xpi1, 'jetpack-1.16-outdated.xpi') content.test_packed_packages(err2, xpi2) assert 'sub_packages' in err2.metadata assert err1.metadata == err2.metadata['sub_packages'].get('thing.xpi')
def test_subpackage_metadata_preserved(): """Tests that metadata is preserved for sub-packages.""" xpi1 = open('tests/resources/jetpack/jetpack-1.16-outdated.xpi') xpi2 = MockXPI( {'thing.xpi': 'tests/resources/jetpack/jetpack-1.16-outdated.xpi'}) err1 = ErrorBundle() err1.detected_type = PACKAGE_EXTENSION err2 = ErrorBundle() err2.detected_type = PACKAGE_EXTENSION submain.test_package(err1, xpi1, 'jetpack-1.16-outdated.xpi') content.test_packed_packages(err2, xpi2) assert 'sub_packages' in err2.metadata assert err1.metadata == err2.metadata['sub_packages'].get('thing.xpi')
def test_subpackage_metadata_preserved(): """Tests that metadata is preserved for sub-packages.""" xpi1 = open("tests/resources/jetpack/jetpack-1.8-outdated.xpi") xpi2 = MockXPI({ "thing.xpi": "tests/resources/jetpack/jetpack-1.8-outdated.xpi"}) err1 = ErrorBundle() err1.detected_type = PACKAGE_EXTENSION err2 = ErrorBundle() err2.detected_type = PACKAGE_EXTENSION submain.test_package(err1, xpi1, "jetpack-1.8-outdated.xpi") content.test_packed_packages(err2, xpi2) assert "sub_packages" in err2.metadata eq_(err1.metadata, err2.metadata["sub_packages"] .get("thing.xpi"))
def test_package_corrupt(): "Tests the test_package function fails with a corrupt file" tip = submain.test_inner_package submain.test_inner_package = lambda x, z, for_appversions: "success" name = "tests/resources/corrupt.xpi" err = ErrorBundle() result = submain.test_package(err, name, name) submain.test_inner_package = tip err.print_summary(True) assert err.failed()
def test_package_extension_bad_expectation(): "Tests the test_package function with an odd extension" tip = submain.test_inner_package submain.test_inner_package = lambda x, z, for_appversions: "success" name = "tests/resources/submain/install_rdf.jar" err = ErrorBundle() result = submain.test_package(err, name, name, PACKAGE_SEARCHPROV) submain.test_inner_package = tip assert err.failed()
def test_package_corrupt(): "Tests the test_package function fails with a non-zip" tip = submain.test_inner_package submain.test_inner_package = lambda x, y, z: "success" name = "tests/resources/junk.xpi" err = ErrorBundle(None, True) result = submain.test_package(err, name, name) submain.test_inner_package = tip err.print_summary(True); assert err.failed()
def test_package_corrupt(): "Tests the test_package function fails with a corrupt file" tip = submain.test_inner_package submain.test_inner_package = lambda x, z, for_appversions: "success" name = "tests/resources/corrupt.xpi" err = ErrorBundle() result = submain.test_package(err, name, name) submain.test_inner_package = tip err.print_summary(True); assert err.failed()
def test_package_extension_expectation(): "Tests the test_package function with an odd extension" tip = submain.test_inner_package submain.test_inner_package = lambda x, y, z: "success" name = "tests/resources/submain/install_rdf.jar" err = ErrorBundle(None, True) result = submain.test_package(err, name, name, PACKAGE_ANY) submain.test_inner_package = tip assert not err.failed() assert err.get_resource("has_install_rdf") assert result == "success"
def test_package_pass(): "Tests the test_package function with simple data" tip = submain.test_inner_package submain.test_inner_package = lambda x, z, for_appversions: "success" name = "tests/resources/submain/install_rdf.xpi" pack = open(name) err = ErrorBundle() result = submain.test_package(err, pack, name) pack.close() submain.test_inner_package = tip assert not err.failed() assert err.get_resource("has_install_rdf") assert result == "success"
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
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
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
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)