#!/usr/share/ucs-test/runner python
## desc: Register and verify all UDM extension in one step
## tags: [udm-extensions,apptest]
## roles: [domaincontroller_master,domaincontroller_backup,domaincontroller_slave,memberserver]
## exposure: dangerous
## packages:
##   - univention-config
##   - univention-directory-manager-tools
##   - shell-univention-lib

from univention.testing.debian_package import DebianPackage
from univention.testing.utils import fail, wait_for_replication, verify_ldap_object
from univention.testing.udm_extensions import *
import bz2

def test_all():
	package_name = get_package_name()
	package_version = get_package_version()
#	extension_name = get_extension_name(extension_type)
#	extension_filename = get_extension_filename(extension_type, extension_name)
	extension_name = {}
	extension_buffer = {}
	extension_filename = {}
	for extension_type in VALID_EXTENSION_TYPES:
		extension_name[extension_type] = get_extension_name(extension_type)
		extension_buffer[extension_type] = get_extension_buffer(extension_type, extension_name[extension_type])
		extension_filename[extension_type] = get_extension_filename(extension_type, extension_name[extension_type])

	data = { 'package': package_name }
	data.update(extension_filename)
	joinscript_buffer = '''#!/bin/sh
VERSION=1
set -e
. /usr/share/univention-join/joinscripthelper.lib
joinscript_init
. /usr/share/univention-lib/ldap.sh
ucs_registerLDAPExtension "$@" --udm_hook /usr/share/%(package)s/%(hook)s --udm_syntax /usr/share/%(package)s/%(syntax)s --udm_module /usr/share/%(package)s/%(module)s
joinscript_save_current_version
exit 0
''' % data

	package = DebianPackage(name=package_name, version=package_version)
	try:
		# create package and install it
		package.create_join_script_from_buffer('66%s.inst' % package_name, joinscript_buffer)
		for extension_type in VALID_EXTENSION_TYPES:
			package.create_usr_share_file_from_buffer(extension_filename[extension_type], extension_buffer[extension_type])
		package.build()
		package.install()

		call_join_script('66%s.inst' % package_name)

		# wait until removed object has been handled by the listener
		wait_for_replication()

		for extension_type in VALID_EXTENSION_TYPES:
			dnlist = get_dn_of_extension_by_name(extension_type, extension_name[extension_type])
			if not dnlist:
				fail('Cannot find UDM %s extension with name %s in LDAP' % (extension_type, extension_name[extension_type]))
			verify_ldap_object(dnlist[0], {
				'cn': [extension_name[extension_type]],
				'univentionUDM%sFilename' % extension_type.capitalize(): [extension_filename[extension_type]],
				'univentionOwnedByPackage': [package_name],
				'univentionObjectType': ['settings/udm_%s' % extension_type],
				'univentionOwnedByPackageVersion': [package_version],
				'univentionUDM%sData' % extension_type.capitalize(): [bz2.compress(extension_buffer[extension_type])],
				})

	finally:
		print 'Removing UDM extension from LDAP'
		for extension_type in VALID_EXTENSION_TYPES:
			remove_extension_by_name(extension_type, extension_name[extension_type], fail_on_error=False)

		print 'Uninstalling binary package %r' % package_name
		package.uninstall()

		print 'Removing source package'
		package.remove()

if __name__ == '__main__':
	test_all()
