def test_invalid_info(self): build = BuildFactory.build() info = io.BytesIO('\n'.join(['%s=%s' % (k, v) for k, v in create_info(build).items()]).encode('utf-8')) with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Invalid INFO', str(cm.exception))
def test_post_conflict(self): user = UserFactory( roles=[Role.find("developer"), Role.find("package_admin")]) db.session.commit() architectures = [ Architecture.find("88f628x"), Architecture.find("cedarview") ] build = BuildFactory.build(architectures=architectures) with create_spk(build) as spk: self.assert201( self.client.post( url_for("api.packages"), headers=authorization_header(user), data=spk.read(), )) spk.seek(0) response = self.client.post( url_for("api.packages"), headers=authorization_header(user), data=spk.read(), ) self.assert409(response) self.assertIn( "Conflicting architectures: 88f628x, cedarview", response.data.decode(response.charset), )
def test_invalid_info(self): build = BuildFactory.build() info = io.BytesIO('\n'.join(['%s=%s' % (k, v) for k, v in create_info(build).items()]).encode('utf-8')) with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Invalid INFO', str(cm.exception))
def test_not_signed(self): build = BuildFactory.build(version__upgrade_wizard=True) with create_spk(build) as f: spk = SPK(f) with self.assertRaises(ValueError) as cm: spk.unsign() self.assertEqual('Not signed', str(cm.exception))
def test_invalid_info_package(self): build = BuildFactory.build( version__package__name="Invalid package name") with create_spk(build) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Invalid INFO package", str(cm.exception))
def test_info_blank_like(self): build = BuildFactory.build() info = io.BytesIO("\n".join([ '%s="%s"\n' % (k, v) for k, v in create_info(build).items() ]).encode("utf-8")) with create_spk(build, info=info) as f: SPK(f)
def test_not_signed(self): build = BuildFactory.build(version__upgrade_wizard=True) with create_spk(build) as f: spk = SPK(f) with self.assertRaises(ValueError) as cm: spk.unsign() self.assertEqual("Not signed", str(cm.exception))
def test_invalid_info_icon(self): build = BuildFactory.build() info = create_info(build) info['package_icon_120'] = 'package_icon_120' with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Invalid INFO icon: package_icon_120', str(cm.exception))
def test_wrong_info_encoding(self): build = BuildFactory.build() info = create_info(build) info['description'] = 'Description en français' with create_spk(build, info=info, info_encoding='latin-1') as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Wrong INFO encoding', str(cm.exception))
def test_wrong_conf_privilege_encoding(self): build = BuildFactory.build( version__conf_privilege=json.dumps({"déçu": {"run-as": "<run-as>"}}) ) with create_spk(build, conf_privilege_encoding="latin-1") as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Wrong conf/privilege encoding", str(cm.exception))
def test_wrong_conf_conflicts_encoding(self): build = BuildFactory.build( version__conf_conflicts=json.dumps({"déçu": {"dsm_min_ver": "5.0-4300"}}) ) with create_spk(build, conf_conflicts_encoding="latin-1") as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Wrong conf/PKG_CONX encoding", str(cm.exception))
def test_invalid_info_boolean_startable(self): build = BuildFactory.build() info = create_info(build) info['startable'] = 'Something' with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Invalid INFO boolean: startable', str(cm.exception))
def test_invalid_info_icon(self): build = BuildFactory.build() info = create_info(build) info['package_icon_120'] = 'package_icon_120' with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Invalid INFO icon: package_icon_120', str(cm.exception))
def test_post_conf_resource_invalid_json(self): build = BuildFactory.build(version__conf_resource='{"invalid": "json}') with create_spk(build) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual( "File conf/resource is not valid JSON", str(cm.exception), )
def test_checksum_mismatch(self): build = BuildFactory.build() info = create_info(build) info['checksum'] = 'checksum' with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Checksum mismatch', str(cm.exception))
def test_generic(self): build = BuildFactory.build(version__upgrade_wizard=True) f = create_spk(build, signature="signature") spk = SPK(f) spk.unsign() with tarfile.open(fileobj=f, mode="r:") as tar: self.assertNotIn("syno_signature.asc", tar.getnames()) f.close()
def test_invalid_spk(self): build = BuildFactory.build() with create_spk(build) as f: f.seek(50) invalid_spk = io.BytesIO(f.read()) with self.assertRaises(SPKParseError) as cm: SPK(invalid_spk) self.assertEqual("Invalid SPK", str(cm.exception))
def test_invalid_info_boolean_startable(self): build = BuildFactory.build() info = create_info(build) info["startable"] = "Something" with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Invalid INFO boolean: startable", str(cm.exception))
def test_empty_conf_folder(self): build = BuildFactory.build(version__conf_dependencies=None, version__conf_conflicts=None) info = create_info(build) info['support_conf_folder'] = 'yes' with create_spk(build, info=info, with_conf=True) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Empty conf folder', str(cm.exception))
def test_already_signed(self): build = BuildFactory.build(version__upgrade_wizard=True) with create_spk(build, signature='signature') as f: spk = SPK(f) spk._generate_signature = Mock(return_value='timestamped signature') with self.assertRaises(ValueError) as cm: spk.sign('timestamp_url', 'gnupghome') self.assertEqual('Already signed', str(cm.exception))
def test_generic(self): build = BuildFactory.build(version__upgrade_wizard=True) f = create_spk(build, signature='signature') spk = SPK(f) spk.unsign() with tarfile.open(fileobj=f, mode='r:') as tar: self.assertNotIn('syno_signature.asc', tar.getnames()) f.close()
def test_missing_info_package(self): build = BuildFactory.build() info = create_info(build) del info["package"] with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Missing INFO: package", str(cm.exception))
def test_empty_conf_folder(self): build = BuildFactory.build(version__conf_dependencies=None, version__conf_conflicts=None) info = create_info(build) info['support_conf_folder'] = 'yes' with create_spk(build, info=info, with_conf=True) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Empty conf folder', str(cm.exception))
def test_checksum_mismatch(self): build = BuildFactory.build() info = create_info(build) info["checksum"] = "checksum" with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Checksum mismatch", str(cm.exception))
def test_missing_info_package(self): build = BuildFactory.build() info = create_info(build) del info['package'] with create_spk(build, info=info) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Missing INFO: package', str(cm.exception))
def test_wrong_info_encoding(self): build = BuildFactory.build() info = create_info(build) info["description"] = "Description en français" with create_spk(build, info=info, info_encoding="latin-1") as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Wrong INFO encoding", str(cm.exception))
def test_missing_conf_folder(self): build = BuildFactory.build(version__conf_dependencies=None, version__conf_conflicts=None, version__conf_privilege=None, version__conf_resource=None) info = create_info(build) info['support_conf_folder'] = 'yes' with create_spk(build, info=info, with_conf=False) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Missing conf folder', str(cm.exception))
def test_already_signed(self): build = BuildFactory.build(version__upgrade_wizard=True) with create_spk(build, signature="signature") as f: spk = SPK(f) spk._generate_signature = Mock(return_value="timestamped signature") with self.assertRaises(ValueError) as cm: spk.sign("timestamp_url", "gnupghome") self.assertEqual("Already signed", str(cm.exception))
def test_wrong_syno_signature_encoding(self): build = BuildFactory.build() with create_spk( build, signature="Signature française", signature_encoding="latin-1" ) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Wrong syno_signature.asc encoding", str(cm.exception))
def test_invalid_spk(self): build = BuildFactory.build() with create_spk(build) as f: f.seek(50) invalid_spk = io.BytesIO(f.read()) with self.assertRaises(SPKParseError) as cm: SPK(invalid_spk) self.assertEqual('Invalid SPK', str(cm.exception))
def test_wrong_info_encoding(self): build = BuildFactory.build() info = create_info(build) info['description'] = 'Description en français' with create_spk(build, info=info, info_encoding='latin-1') as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Wrong INFO encoding', str(cm.exception))
def test_wrong_conf_resource_encoding(self): build = BuildFactory.build(version__conf_resource=json.dumps( {'déçu': { '<resource-id>': '<specification>' }})) with create_spk(build, conf_resource_encoding='latin-1') as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Wrong conf/resource encoding', str(cm.exception))
def test_wrong_conf_resource_encoding(self): build = BuildFactory.build(version__conf_resource=json.dumps( {"déçu": { "<resource-id>": "<specification>" }}, ensure_ascii=False)) with create_spk(build, conf_resource_encoding="latin-1") as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Wrong conf/resource encoding", str(cm.exception))
def test_post_new_package_not_author_not_maintainer_user(self): user = UserFactory(roles=[Role.find('developer')]) db.session.commit() with create_spk(BuildFactory.build()) as spk: response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert403(response) self.assertIn('Insufficient permissions to create new packages', response.data.decode(response.charset))
def test_wrong_conf_privilege_encoding(self): build = BuildFactory.build(version__conf_privilege=json.dumps( {'déçu': { 'run-as': '<run-as>' }})) with create_spk(build, conf_privilege_encoding='latin-1') as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Wrong conf/privilege encoding', str(cm.exception))
def test_wrong_conf_conflicts_encoding(self): build = BuildFactory.build(version__conf_conflicts=json.dumps( {'déçu': { 'dsm_min_ver': '5.0-4300' }})) with create_spk(build, conf_conflicts_encoding='latin-1') as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Wrong conf/PKG_CONX encoding', str(cm.exception))
def test_post_minimum(self): user = UserFactory(roles=[Role.find('developer'), Role.find('package_admin')]) db.session.commit() build = BuildFactory.build() with create_spk(build) as spk: self.assert201(self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read())) self.assertBuildInserted(Build.query.one(), build, user)
def test_post_signed(self): user = UserFactory(roles=[Role.find('developer'), Role.find('package_admin')]) db.session.commit() build = BuildFactory.build() with create_spk(build, signature='signature') as spk: response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert422(response) self.assertIn('Package contains a signature', response.data.decode(response.charset))
def test_post_unknown_firmware(self): user = UserFactory(roles=[Role.find('developer')]) db.session.commit() build = BuildFactory.build(firmware=Firmware(version='1.0', build=421)) with create_spk(build) as spk: response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert422(response) self.assertIn('Unknown firmware', response.data.decode(response.charset))
def test_post_unknown_architecture(self): user = UserFactory(roles=[Role.find('developer')]) db.session.commit() build = BuildFactory.build(architectures=[Architecture(code='newarch')]) with create_spk(build) as spk: response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert422(response) self.assertIn('Unknown architecture: newarch', response.data.decode(response.charset))
def test_post_existing_package_maintainer_user(self): user = UserFactory(roles=[Role.find('developer')]) package = PackageFactory(maintainers=[user]) db.session.commit() build = BuildFactory.build(version__package=package) db.session.expire(package) with create_spk(build) as spk: self.assert201(self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()))
def test_post_invalid_spk(self): user = UserFactory(roles=[Role.find('developer'), Role.find('package_admin')]) db.session.commit() build = BuildFactory.build() with create_spk(build) as spk: spk.seek(100) response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert422(response) self.assertIn('Invalid SPK', response.data.decode(response.charset))
def test_post_new_package_not_author_not_maintainer_user(self): user = UserFactory(roles=[Role.find('developer')]) db.session.commit() with create_spk(BuildFactory.build()) as spk: response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert403(response) self.assertIn('Insufficient permissions to create new packages', response.data.decode(response.charset))
def test_post_existing_package_maintainer_user(self): user = UserFactory(roles=[Role.find('developer')]) package = PackageFactory(maintainers=[user]) db.session.commit() build = BuildFactory.build(version__package=package) db.session.expire(package) with create_spk(build) as spk: self.assert201( self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()))
def test_post_unknown_firmware(self): user = UserFactory(roles=[Role.find('developer')]) db.session.commit() build = BuildFactory.build(firmware=Firmware(version='1.0', build=421)) with create_spk(build) as spk: response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert422(response) self.assertIn('Unknown firmware', response.data.decode(response.charset))
def test_post_wrong_version(self): user = UserFactory(roles=[Role.find('developer'), Role.find('package_admin')]) db.session.commit() build = BuildFactory.build() info = create_info(build) info['version'] = '1.2.3~4' with create_spk(build, info=info) as spk: response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert422(response) self.assertIn('Invalid version', response.data.decode(response.charset))
def test_post_wrong_description_language(self): user = UserFactory(roles=[Role.find('developer'), Role.find('package_admin')]) db.session.commit() build = BuildFactory.build() info = create_info(build) info['description_zzz'] = 'description_zzz' with create_spk(build, info=info) as spk: response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert422(response) self.assertIn('Unknown INFO description language', response.data.decode(response.charset))
def test_generic(self): build = BuildFactory.build(version__upgrade_wizard=True, architectures=[Architecture.query.all()[0], Architecture.query.all()[1]]) with create_spk(build, signature='signature') as f: spk = SPK(f) # info info_keys = ['arch', 'changelog', 'description', 'description_enu', 'displayname', 'displayname_enu', 'distributor', 'distributor_url', 'firmware', 'install_conflict_packages', 'install_dep_packages', 'install_dep_services', 'maintainer', 'maintainer_url', 'package', 'report_url', 'support_conf_folder', 'version'] self.assertEqual(set(info_keys), set(spk.info.keys())) self.assertEqual({Architecture.from_syno.get(a, a) for a in spk.info['arch'].split()}, {a.code for a in build.architectures}) self.assertEqual(build.version.changelog, spk.info['changelog']) self.assertEqual(build.version.descriptions['enu'].description, spk.info['description']) self.assertEqual(build.version.descriptions['enu'].description, spk.info['description_enu']) self.assertEqual(build.version.displaynames['enu'].displayname, spk.info['displayname']) self.assertEqual(build.version.displaynames['enu'].displayname, spk.info['displayname_enu']) self.assertEqual(build.version.distributor, spk.info['distributor']) self.assertEqual(build.version.distributor_url, spk.info['distributor_url']) self.assertEqual(build.firmware.firmware_string, spk.info['firmware']) self.assertEqual(build.version.conflicts, spk.info['install_conflict_packages']) self.assertEqual(build.version.dependencies, spk.info['install_dep_packages']) self.assertEqual(' '.join(s.code for s in build.version.service_dependencies), spk.info['install_dep_services']) self.assertEqual(build.version.maintainer, spk.info['maintainer']) self.assertEqual(build.version.maintainer_url, spk.info['maintainer_url']) self.assertEqual(build.version.package.name, spk.info['package']) self.assertEqual(build.version.report_url, spk.info['report_url']) self.assertEqual(build.version.conf_dependencies is not None or build.version.conf_conflicts is not None or \ build.version.conf_privilege is not None or build.version.conf_resource is not None, spk.info['support_conf_folder']) self.assertEqual(build.version.version_string, spk.info['version']) # icons self.assertEqual(set(build.version.icons.keys()), set(spk.icons.keys())) # wizards if not build.version.install_wizard: self.assertNotIn('install', spk.wizards) else: self.assertIn('install', spk.wizards) if not build.version.upgrade_wizard: self.assertNotIn('upgrade', spk.wizards) else: self.assertIn('upgrade', spk.wizards) # license self.assertEqual(build.version.license, spk.license) # signature self.assertEqual('signature', spk.signature)
def test_post_not_startable(self): user = UserFactory( roles=[Role.find('developer'), Role.find('package_admin')]) db.session.commit() build = BuildFactory.build(version__startable=False) with create_spk(build) as spk: self.assert201( self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read())) self.assertBuildInserted(Build.query.one(), build, user)
def test_empty_conf_folder(self): build = BuildFactory.build( version__conf_dependencies=None, version__conf_conflicts=None, version__conf_privilege=None, version__conf_resource=None, ) info = create_info(build) info["support_conf_folder"] = "yes" with create_spk(build, info=info, with_conf=True) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual("Empty conf folder", str(cm.exception))
def test_generic(self): build = BuildFactory.build(version__upgrade_wizard=True, architectures=[Architecture.query.all()[0], Architecture.query.all()[1]]) with create_spk(build, signature='signature') as f: spk = SPK(f) # info info_keys = ['arch', 'changelog', 'description', 'description_enu', 'displayname', 'displayname_enu', 'distributor', 'distributor_url', 'firmware', 'install_conflict_packages', 'install_dep_packages', 'install_dep_services', 'maintainer', 'maintainer_url', 'package', 'report_url', 'support_conf_folder', 'version'] self.assertEqual(set(info_keys), set(spk.info.keys())) self.assertEqual({Architecture.from_syno.get(a, a) for a in spk.info['arch'].split()}, {a.code for a in build.architectures}) self.assertEqual(build.version.changelog, spk.info['changelog']) self.assertEqual(build.version.descriptions['enu'].description, spk.info['description']) self.assertEqual(build.version.descriptions['enu'].description, spk.info['description_enu']) self.assertEqual(build.version.displaynames['enu'].displayname, spk.info['displayname']) self.assertEqual(build.version.displaynames['enu'].displayname, spk.info['displayname_enu']) self.assertEqual(build.version.distributor, spk.info['distributor']) self.assertEqual(build.version.distributor_url, spk.info['distributor_url']) self.assertEqual(build.firmware.firmware_string, spk.info['firmware']) self.assertEqual(build.version.conflicts, spk.info['install_conflict_packages']) self.assertEqual(build.version.dependencies, spk.info['install_dep_packages']) self.assertEqual(' '.join(s.code for s in build.version.service_dependencies), spk.info['install_dep_services']) self.assertEqual(build.version.maintainer, spk.info['maintainer']) self.assertEqual(build.version.maintainer_url, spk.info['maintainer_url']) self.assertEqual(build.version.package.name, spk.info['package']) self.assertEqual(build.version.report_url, spk.info['report_url']) self.assertEqual(build.version.conf_dependencies is not None or build.version.conf_conflicts is not None, spk.info['support_conf_folder']) self.assertEqual(build.version.version_string, spk.info['version']) # icons self.assertEqual(set(build.version.icons.keys()), set(spk.icons.keys())) # wizards if not build.version.install_wizard: self.assertNotIn('install', spk.wizards) else: self.assertIn('install', spk.wizards) if not build.version.upgrade_wizard: self.assertNotIn('upgrade', spk.wizards) else: self.assertIn('upgrade', spk.wizards) # license self.assertEqual(build.version.license, spk.license) # signature self.assertEqual('signature', spk.signature)
def test_post_conflict(self): user = UserFactory(roles=[Role.find('developer'), Role.find('package_admin')]) db.session.commit() architectures = [Architecture.find('88f628x'), Architecture.find('cedarview')] build = BuildFactory.build(architectures=architectures) with create_spk(build) as spk: self.assert201(self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read())) spk.seek(0) response = self.client.post(url_for('api.packages'), headers=authorization_header(user), data=spk.read()) self.assert409(response) self.assertIn('Conflicting architectures: 88f628x, cedarview', response.data.decode(response.charset))
def test_generic(self): build = BuildFactory.build(version__upgrade_wizard=True) f = create_spk(build) spk = SPK(f) with tarfile.open(fileobj=f, mode='r:') as tar: self.assertNotIn('syno_signature.asc', tar.getnames()) self.assertIsNone(spk.signature) spk._generate_signature = Mock(return_value='timestamped signature') spk.sign('timestamp_url', 'gnupghome') with tarfile.open(fileobj=f, mode='r:') as tar: self.assertIn('syno_signature.asc', tar.getnames()) self.assertEqual(tar.extractfile('syno_signature.asc').read(), b'timestamped signature') self.assertEqual(spk.signature, 'timestamped signature') f.close()
def test_missing_72px_icon(self): build = BuildFactory.build(version__add_icon=False) with create_spk(build) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Missing 72px icon', str(cm.exception))
def test_wrong_conf_conflicts_encoding(self): build = BuildFactory.build(version__conf_conflicts=json.dumps({'déçu': {'dsm_min_ver': '5.0-4300'}})) with create_spk(build, conf_conflicts_encoding='latin-1') as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Wrong conf/PKG_CONX encoding', str(cm.exception))
def test_info_blank_like(self): build = BuildFactory.build() info = io.BytesIO('\n'.join(['%s="%s"\n' % (k, v) for k, v in create_info(build).items()]).encode('utf-8')) with create_spk(build, info=info) as f: SPK(f)
def test_info_boolean_no(self): build = BuildFactory.build(version__startable=False) with create_spk(build) as f: self.assertFalse(SPK(f).info['startable'])
def test_no_info(self): build = BuildFactory.build() with create_spk(build, with_info=False) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Missing INFO file', str(cm.exception))
def test_no_package_tgz(self): build = BuildFactory.build() with create_spk(build, with_package=False) as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Missing package.tgz file', str(cm.exception))
def test_wrong_license_encoding(self): build = BuildFactory.build(version__license='License française') with create_spk(build, license_encoding='latin-1') as f: with self.assertRaises(SPKParseError) as cm: SPK(f) self.assertEqual('Wrong LICENSE encoding', str(cm.exception))