예제 #1
0
    def setUp(self):
        super(TestRunAddonsLinter, self).setUp()

        valid_path = get_addon_file('valid_webextension.xpi')
        invalid_path = get_addon_file('invalid_webextension_invalid_id.xpi')

        self.valid_upload = FileUpload.objects.create(path=valid_path)
        self.invalid_upload = FileUpload.objects.create(path=invalid_path)
예제 #2
0
 def test_amo_validator_fail_error(self):
     result = tasks.validate_file_path(
         get_addon_file('invalid_firefox_addon_error.xpi'),
         hash_=None, listed=True)
     assert not result['success']
     assert result['errors']
     assert not result['warnings']
예제 #3
0
 def test_amo_validator_addons_linter_success(self):
     result = tasks.validate_file_path(
         get_addon_file('valid_webextension.xpi'),
         hash_=None, listed=True, is_webextension=True)
     assert result['success']
     assert not result['errors']
     assert not result['warnings']
예제 #4
0
 def test_amo_validator_addons_linter_error(self):
     # This test assumes that `amo-validator` doesn't correctly
     # validate a invalid id in manifest.json
     result = tasks.validate_file_path(
         get_addon_file('invalid_webextension_invalid_id.xpi'),
         hash_=None, listed=True, is_webextension=True)
     assert not result['success']
     assert result['errors']
     assert not result['warnings']
예제 #5
0
파일: test_utils_.py 프로젝트: diox/olympia
 def test_apps_disallow_thunderbird_and_seamonkey(self):
     zip_file = utils.SafeZip(get_addon_file(
         'valid_firefox_and_thunderbird_addon.xpi'))
     extracted = utils.RDFExtractor(zip_file).parse()
     apps = extracted['apps']
     assert len(apps) == 1
     assert apps[0].appdata == amo.FIREFOX
     assert apps[0].min.version == '38.0a1'
     assert apps[0].max.version == '43.0'
예제 #6
0
    def test_submit_legacy_extension_targets_older_firefox_stricly(self):
        file_ = get_addon_file('valid_firefox_addon_strict_compatibility.xpi')
        upload = FileUpload.objects.create(path=file_)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #7
0
    def test_submit_non_extension(self):
        file_ = get_addon_file('searchgeek-20090701.xml')
        upload = FileUpload.objects.create(path=file_)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #8
0
    def test_validation_finishes_if_containing_binary_content(self):
        file_ = get_addon_file('webextension_containing_binary_files.xpi')
        upload = FileUpload.objects.create(path=file_, user=self.user)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #9
0
    def test_does_not_revoke_safe_webextension(self):
        file_ = get_addon_file('valid_webextension.xpi')
        upload = FileUpload.objects.create(path=file_, user=self.user)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #10
0
    def test_submit_thunderbird_extension(self):
        file_ = get_addon_file('valid_firefox_and_thunderbird_addon.xpi')
        upload = FileUpload.objects.create(path=file_)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #11
0
    def test_submit_legacy_addon_restricted(self):
        file_ = get_addon_file('valid_firefox_addon.xpi')
        upload = FileUpload.objects.create(path=file_)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 1
        expected = ['validation', 'messages', 'legacy_extensions_restricted']
        assert upload.processed_validation['messages'][0]['id'] == expected
        assert not upload.valid
예제 #12
0
    def test_submit_legacy_extension_not_a_new_addon(self):
        file_ = get_addon_file('valid_firefox_addon.xpi')
        addon = addon_factory(version_kw={'version': '0.1'})
        upload = FileUpload.objects.create(path=file_, addon=addon)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #13
0
    def test_submit_legacy_upgrade(self):
        # Works because it's not targeting >= 57.
        file_ = get_addon_file('valid_firefox_addon.xpi')
        addon = addon_factory(version_kw={'version': '0.1'})
        upload = FileUpload.objects.create(path=file_, addon=addon)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #14
0
 def test_apps(self):
     zip_file = utils.SafeZip(get_addon_file(
         'valid_firefox_and_thunderbird_addon.xpi'))
     extracted = utils.RDFExtractor(zip_file).parse()
     apps = sorted(extracted['apps'], key=attrgetter('id'))
     assert len(apps) == 2
     assert apps[0].appdata == amo.FIREFOX
     assert apps[0].min.version == '38.0a1'
     assert apps[0].max.version == '43.0'
     assert apps[1].appdata == amo.THUNDERBIRD
     assert apps[1].min.version == '42.0'
     assert apps[1].max.version == '45.0'
예제 #15
0
    def setUp(self):
        self.user = user_factory()

        s = '656b16a8ab71686fcfcd04d574bc28be9a1d8252141f54cfb5041709262b84f4'
        self.key = APIKey.objects.create(
            user=self.user,
            type=SYMMETRIC_JWT_TYPE,
            key='user:12345:678',
            secret=s)
        self.addon = addon_factory(users=[self.user],
                                   version_kw={'version': '0.1'},
                                   file_kw={'is_webextension': True})
        self.file = get_addon_file('webextension_containing_api_key.xpi')
예제 #16
0
    def test_submit_legacy_upgrade_targeting_star(self):
        # Should not error: extensions with a maxversion of '*' don't get the
        # error, the manifest parsing code will rewrite it as '56.*' instead.
        file_ = get_addon_file('valid_firefox_addon_targeting_star.xpi')
        addon = addon_factory(version_kw={'version': '0.1'})
        upload = FileUpload.objects.create(path=file_, addon=addon)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #17
0
    def test_validation_finishes_if_containing_invalid_filename(self):
        file_ = get_addon_file('invalid_webextension.xpi')
        upload = FileUpload.objects.create(path=file_, user=self.user)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        # https://github.com/mozilla/addons-server/issues/8208
        # causes this to be 2 (and invalid) instead of 0 (and valid).
        # The invalid filename error is caught and raised outside of this
        # validation task.
        assert upload.processed_validation['errors'] == 2
        assert not upload.valid
예제 #18
0
    def test_submit_dictionary_upgrade_targeting_firefox_57(self):
        # Should not error: non-extensions types are not affected by the
        # restriction, even if they target 57.
        file_ = get_addon_file('dictionary_targeting_57.xpi')
        addon = addon_factory(version_kw={'version': '0.1'},
                              type=amo.ADDON_DICT)
        upload = FileUpload.objects.create(path=file_, addon=addon)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #19
0
    def test_submit_legacy_extension_waffle_is_off(self):
        switch = Switch.objects.get(name='restrict-new-legacy-submissions')
        switch.active = False
        switch.save()

        file_ = get_addon_file('valid_firefox_addon.xpi')
        upload = FileUpload.objects.create(path=file_)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        assert upload.processed_validation['messages'] == []
        assert upload.valid
예제 #20
0
    def test_submit_legacy_extension_1st_version_in_that_channel_reverse(self):
        file_ = get_addon_file('valid_firefox_addon.xpi')
        addon = addon_factory(
            version_kw={'version': '0.1',
                        'channel': amo.RELEASE_CHANNEL_LISTED})
        upload = FileUpload.objects.create(path=file_, addon=addon)
        tasks.validate(upload, listed=False)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 1
        expected = ['validation', 'messages', 'legacy_addons_restricted']
        assert upload.processed_validation['messages'][0]['id'] == expected
        assert not upload.valid
예제 #21
0
    def test_validation_error_webextension(self, _mock):
        _mock.side_effect = Exception
        self.upload.update(path=get_addon_file('valid_webextension.xpi'))

        assert self.upload.validation is None

        tasks.validate(self.upload, listed=True)
        self.upload.reload()
        validation = self.upload.processed_validation
        assert validation
        assert validation['errors'] == 1
        assert validation['messages'][0]['id'] == [
            'validator', 'unexpected_exception']
        assert 'WebExtension' in validation['messages'][0]['message']
        assert not self.upload.valid
예제 #22
0
    def test_submit_legacy_upgrade_targeting_firefox_57(self):
        # Should error since it's a legacy extension targeting 57.
        file_ = get_addon_file('valid_firefox_addon_targeting_57.xpi')
        addon = addon_factory(version_kw={'version': '0.1'})
        upload = FileUpload.objects.create(path=file_, addon=addon)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 1
        assert len(upload.processed_validation['messages']) == 1
        assert upload.processed_validation['messages'][0]['type'] == 'error'
        assert upload.processed_validation['messages'][0]['id'] == [
            'validation', 'messages', 'legacy_addons_max_version']
        assert not upload.valid
예제 #23
0
    def test_validation_error(self, _mock):
        _mock.side_effect = Exception

        self.upload.update(path=get_addon_file('desktop.xpi'))

        assert self.upload.validation is None

        tasks.validate(self.upload)
        self.upload.reload()
        validation = self.upload.processed_validation
        assert validation
        assert validation['errors'] == 1
        assert validation['messages'][0]['id'] == ['validator',
                                                   'unexpected_exception']
        assert not self.upload.valid
예제 #24
0
    def test_submit_webextension_upgrade_targeting_firefox_57(self):
        # Should not error: it's targeting 57 but it's a webextension.
        file_ = get_addon_file('valid_webextension_targeting_57.xpi')
        addon = addon_factory(version_kw={'version': '0.1'},
                              file_kw={'is_webextension': True})
        upload = FileUpload.objects.create(path=file_, addon=addon)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 0
        messages = upload.processed_validation['messages']
        assert len(messages) == 1
        assert messages[0]['message'] == ('"strict_max_version" '
                                          'not required.')
        assert upload.valid
예제 #25
0
    def test_run_linter_use_temporary_file(self):
        TemporaryFile = tempfile.TemporaryFile

        with mock.patch('olympia.devhub.tasks.tempfile.TemporaryFile') as tmpf:
            tmpf.side_effect = lambda *a, **kw: TemporaryFile(*a, **kw)

            # This is a relatively small add-on (1.2M) but we are using
            # a temporary file for all our linter output.
            result = json.loads(tasks.run_addons_linter(
                get_addon_file('typo-gecko.xpi')
            ))

            assert tmpf.call_count == 2
            assert result['success']
            assert result['warnings'] == 11
            assert not result['errors']
예제 #26
0
    def test_webextension_upgrade_is_annotated(self):
        assert all(f.is_webextension is False
                   for f in self.addon.current_version.all_files)

        file_ = get_addon_file('valid_webextension.xpi')
        upload = FileUpload.objects.create(path=file_, addon=self.addon)

        tasks.validate(upload, listed=True)

        upload.refresh_from_db()
        assert upload.processed_validation['is_upgrade_to_webextension']

        expected = ['validation', 'messages', 'webext_upgrade']
        assert upload.processed_validation['messages'][0]['id'] == expected
        assert upload.processed_validation['warnings'] == 1
        assert upload.valid
예제 #27
0
    def test_submit_legacy_upgrade_targeting_57_strict_compatibility(self):
        # Should error just like if it didn't have strict compatibility, that
        # does not matter: it's a legacy extension, it should not target 57.
        file_ = get_addon_file(
            'valid_firefox_addon_targeting_57_strict_compatibility.xpi')
        addon = addon_factory(version_kw={'version': '0.1'})
        upload = FileUpload.objects.create(path=file_, addon=addon)
        tasks.validate(upload, listed=True)

        upload.refresh_from_db()

        assert upload.processed_validation['errors'] == 1
        assert len(upload.processed_validation['messages']) == 1
        assert upload.processed_validation['messages'][0]['type'] == 'error'
        assert upload.processed_validation['messages'][0]['id'] == [
            'validation', 'messages', 'legacy_addons_max_version']
        assert not upload.valid
예제 #28
0
    def test_webextension_webext_to_webext_not_annotated(self):
        previous_file = self.addon.current_version.all_files[-1]
        previous_file.is_webextension = True
        previous_file.save()

        file_ = get_addon_file('valid_webextension.xpi')
        upload = FileUpload.objects.create(path=file_, addon=self.addon)

        tasks.validate(upload, listed=True)
        upload.refresh_from_db()

        validation = upload.processed_validation

        assert 'is_upgrade_to_webextension' not in validation
        expected = ['validation', 'messages', 'webext_upgrade']
        assert not any(msg['id'] == expected for msg in validation['messages'])
        assert validation['warnings'] == 0
        assert upload.valid
예제 #29
0
    def test_new_webextension_is_not_annotated(self):
        """https://github.com/mozilla/addons-server/issues/3679"""
        previous_file = self.addon.current_version.all_files[-1]
        previous_file.is_webextension = True
        previous_file.status = amo.STATUS_AWAITING_REVIEW
        previous_file.save()

        file_ = get_addon_file('valid_webextension.xpi')
        upload = FileUpload.objects.create(path=file_, addon=self.addon)

        tasks.validate(upload, listed=True)

        upload.refresh_from_db()
        validation = upload.processed_validation

        assert 'is_upgrade_to_webextension' not in validation
        expected = ['validation', 'messages', 'webext_upgrade']
        assert not any(msg['id'] == expected for msg in validation['messages'])
        assert validation['warnings'] == 0
        assert upload.valid
예제 #30
0
 def test_raises_error_for_invalid_webextension_xpi(self):
     with pytest.raises(zipfile.BadZipFile):
         utils.SafeZip(get_addon_file('invalid_webextension.xpi'))
예제 #31
0
 def setUp(self):
     super(TestValidator, self).setUp()
     self.upload = FileUpload.objects.create(
         path=get_addon_file('desktop.xpi'))
     assert not self.upload.valid
예제 #32
0
 def test_amo_validator_success(self):
     result = tasks.validate_file_path(
         get_addon_file('valid_firefox_addon.xpi'), hash_=None, listed=True)
     assert result['success']
     assert not result['errors']
     assert not result['warnings']
예제 #33
0
 def setUp(self):
     super(TestValidator, self).setUp()
     self.upload = FileUpload.objects.create(
         path=get_addon_file('desktop.xpi'))
     assert not self.upload.valid
예제 #34
0
    def setUp(self):
        super(TestRunAddonsLinter, self).setUp()

        self.valid_path = get_addon_file('valid_webextension.xpi')
        self.invalid_path = get_addon_file(
            'invalid_webextension_invalid_id.xpi')
예제 #35
0
    def setUp(self):
        super().setUp()

        self.valid_path = get_addon_file('valid_webextension.xpi')
        self.invalid_path = get_addon_file(
            'invalid_webextension_invalid_id.xpi')
예제 #36
0
 def test_raises_error_for_invalid_webextension_xpi(self):
     with pytest.raises(forms.ValidationError):
         utils.SafeZip(get_addon_file('invalid_webextension.xpi'))
예제 #37
0
 def test_file_not_passed_all_validations(self):
     file_ = get_addon_file('valid_webextension.xpi')
     upload = self.get_upload(
         abspath=file_, addon=self.addon, version='1.0')
     tasks.submit_file(self.addon.pk, upload.pk, amo.RELEASE_CHANNEL_LISTED)
     assert not self.create_version_for_upload.called
예제 #38
0
 def test_raises_validation_error_when_uncompressed_size_is_too_large(self):
     with override_settings(MAX_ZIP_UNCOMPRESSED_SIZE=1000):
         with pytest.raises(utils.InvalidZipFile):
             # total uncompressed size of this xpi is 126kb
             utils.SafeZip(get_addon_file('mozilla_static_theme.zip'))
예제 #39
0
 def test_raises_validation_error_when_uncompressed_size_is_too_large(self):
     with override_settings(MAX_ZIP_UNCOMPRESSED_SIZE=1000):
         with pytest.raises(forms.ValidationError):
             # total uncompressed size of this xpi is: 2269 bytes
             utils.SafeZip(
                 get_addon_file('valid_firefox_and_thunderbird_addon.xpi'))