def test_local_agent_from_package(self, _): agent_name = utils.internal.generate_agent_name() agent_queue = '{0}-queue'.format(agent_name) blueprint_path = resources.get_resource( 'blueprints/agent-from-package/local-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = { 'resource_base': self.resource_base, 'source_url': self.source_url, 'requirements_file': self.requirements_file, 'name': agent_name, 'queue': agent_queue, 'file_server_port': self.fs.port, 'ssl_cert_path': self._rest_cert_path } env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) agent_dict = self.get_agent_dict(env) agent_ssl_cert.verify_remote_cert(agent_dict['agent_dir']) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name)
def test_install_new_agent(self): agent_name = utils.internal.generate_agent_name() blueprint_path = resources.get_resource( 'blueprints/install-new-agent/install-new-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = {'name': agent_name, 'ssl_cert_path': self._rest_cert_path} # Necessary to patch this method, because by default port 80 is used def get_script_url(agent_self): return urljoin(os.environ[constants.MANAGER_FILE_SERVER_URL_KEY], 'cloudify_agent', agent_self._script_filename) with self._manager_env(): env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) with patch( 'cloudify_agent.operations.' 'AgentFilesGenerator._get_script_url', get_script_url): env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) agent_dict = self.get_agent_dict(env, 'new_agent_host') agent_ssl_cert.verify_remote_cert(agent_dict['agent_dir']) new_agent_name = agent_dict['name'] self.assertNotEqual(new_agent_name, agent_name) self.assert_daemon_alive(name=new_agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name) self.wait_for_daemon_dead(name=new_agent_name)
def test_install_new_agent(self): agent_name = utils.internal.generate_agent_name() blueprint_path = resources.get_resource( 'blueprints/install-new-agent/install-new-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = {'name': agent_name, 'ssl_cert_path': self._rest_cert_path} # Necessary to patch this method, because by default port 80 is used def http_rest_host(): return os.environ[constants.MANAGER_FILE_SERVER_URL_KEY] # Necessary to patch, because by default https will be used def file_server_url(*args, **kwargs): return '{0}/resources'.format(http_rest_host()) with self._manager_env(): with patch('cloudify_agent.api.utils.get_manager_file_server_url', file_server_url): env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) with patch('cloudify_agent.operations._http_rest_host', http_rest_host): env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) agent_dict = self.get_agent_dict(env, 'new_agent_host') agent_ssl_cert.verify_remote_cert(agent_dict['agent_dir']) new_agent_name = agent_dict['name'] self.assertNotEqual(new_agent_name, agent_name) self.assert_daemon_alive(name=new_agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name) self.wait_for_daemon_dead(name=new_agent_name)
def create_plugin_tar(plugin_dir_name, target_directory): """ Create a tar file from the plugin. :param plugin_dir_name: the plugin directory name, relative to the resources package. :type plugin_dir_name: str :param target_directory: the directory to create the tar in :type target_directory: str :return: the name of the create tar, note that this is will just return the base name, not the full path to the tar. :rtype: str """ plugin_source_path = resources.get_resource(os.path.join( 'plugins', plugin_dir_name)) plugin_tar_file_name = '{0}.tar'.format(plugin_dir_name) target_tar_file_path = os.path.join(target_directory, plugin_tar_file_name) plugin_tar_file = tarfile.TarFile(target_tar_file_path, 'w') plugin_tar_file.add(plugin_source_path, plugin_dir_name) plugin_tar_file.close() return plugin_tar_file_name
def create_plugin_wagon(plugin_dir_name, target_directory, requirements=False, basedir=None): """ Create a wagon from a plugin. :param plugin_dir_name: the plugin directory name, relative to the resources package. :type plugin_dir_name: str :param target_directory: the directory to create the wagon in :type target_directory: str :param requirements: optional requirements for wagon :type requirements: str :return: path to created wagon` :rtype: str """ if basedir: plugin_source_path = os.path.join(basedir, plugin_dir_name) else: plugin_source_path = resources.get_resource(os.path.join( 'plugins', plugin_dir_name)) return wagon.create( plugin_source_path, requirement_files=requirements, archive_destination_dir=target_directory )
def test_local_agent_from_package_long_name(self, _): """Agent still works with a filepath longer than 128 bytes (package) Paths longer than 128 bytes break shebangs on linux. """ agent_name = 'agent-' + ''.join(uuid.uuid4().hex for i in range(4)) agent_queue = '{0}-queue'.format(agent_name) blueprint_path = resources.get_resource( 'blueprints/agent-from-package/local-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = { 'resource_base': self.resource_base, 'source_url': self.source_url, 'requirements_file': self.requirements_file, 'name': agent_name, 'queue': agent_queue, 'file_server_port': self.fs.port, 'ssl_cert_path': self._rest_cert_path } env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) agent_dict = self.get_agent_dict(env) agent_ssl_cert.verify_remote_cert(agent_dict['agent_dir']) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name)
def test_install_new_agent(self): agent_name = utils.internal.generate_agent_name() blueprint_path = resources.get_resource( 'blueprints/install-new-agent/install-new-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = { 'name': agent_name, 'package_url': agent_package.get_package_url() } with self._manager_env(): env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) node_instances = env.storage.get_node_instances() new_agent_host = [n for n in node_instances if n['name'] == 'new_agent_host'][0] new_agent_name = new_agent_host['runtime_properties'][ 'cloudify_agent']['name'] self.assertNotEqual(new_agent_name, agent_name) self.assert_daemon_alive(name=new_agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name) self.wait_for_daemon_dead(name=new_agent_name)
def test_local_agent_from_package(self, _): agent_name = utils.internal.generate_agent_name() agent_queue = '{0}-queue'.format(agent_name) blueprint_path = resources.get_resource( 'blueprints/agent-from-package/local-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = { 'resource_base': self.resource_base, 'source_url': self.source_url, 'requirements_file': self.requirements_file, 'name': agent_name, 'queue': agent_queue, 'file_server_port': self.fs.port } env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name)
def create_plugin_wagon(plugin_dir_name, target_directory, requirements=False, basedir=None): """ Create a wagon from a plugin. :param plugin_dir_name: the plugin directory name, relative to the resources package. :type plugin_dir_name: str :param target_directory: the directory to create the wagon in :type target_directory: str :param requirements: optional requirements for wagon :type requirements: str :return: path to created wagon` :rtype: str """ if basedir: plugin_source_path = os.path.join(basedir, plugin_dir_name) else: plugin_source_path = resources.get_resource( os.path.join('plugins', plugin_dir_name)) w = wagon.Wagon(plugin_source_path) return w.create(with_requirements=requirements, archive_destination_dir=target_directory)
def test_conf_env_variables(self): daemon = self.create_daemon() daemon.create() daemon.configure() self.installer.install( os.path.join(resources.get_resource('plugins'), 'mock-plugin')) daemon.register('mock-plugin') daemon.start() expected = { constants.MANAGER_IP_KEY: str(daemon.manager_ip), constants.MANAGER_REST_PORT_KEY: str(daemon.manager_port), constants.MANAGER_FILE_SERVER_URL_KEY: 'http://{0}:53229'.format(daemon.manager_ip), constants.MANAGER_FILE_SERVER_BLUEPRINTS_ROOT_URL_KEY: 'http://{0}:53229/blueprints'.format(daemon.manager_ip), constants.CELERY_BROKER_URL_KEY: daemon.broker_url, utils.internal.CLOUDIFY_DAEMON_STORAGE_DIRECTORY_KEY: utils.internal.get_storage_directory(), utils.internal.CLOUDIFY_DAEMON_NAME_KEY: daemon.name, utils.internal.CLOUDIFY_DAEMON_USER_KEY: daemon.user } def _check_env_var(var, expected_value): _value = self.celery.send_task( name='mock_plugin.tasks.get_env_variable', queue=daemon.queue, args=[var]).get(timeout=5) self.assertEqual(_value, expected_value) for key, value in expected.iteritems(): _check_env_var(key, value)
def test_local_agent_from_source_long_name(self, _): """Agent still works with a filepath longer than 128 bytes This test won't pass on windows because some files within the virtualenv exceed 256 bytes, and windows doesn't support paths that long. """ agent_name = 'agent-' + ''.join(uuid.uuid4().hex for i in range(4)) agent_queue = '{0}-queue'.format(agent_name) inputs = { 'source_url': self.source_url, 'requirements_file': self.requirements_file, 'name': agent_name, 'queue': agent_queue } blueprint_path = resources.get_resource( 'blueprints/agent-from-source/local-agent-blueprint.yaml') self.logger.info('Initiating local env') env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name)
def test_local_agent_from_package_long_name(self, _): """Agent still works with a filepath longer than 128 bytes Paths longer than 128 bytes break shebangs on linux. """ agent_name = 'agent-' + ''.join(uuid.uuid4().hex for i in range(4)) agent_queue = '{0}-queue'.format(agent_name) blueprint_path = resources.get_resource( 'blueprints/agent-from-package/local-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = { 'resource_base': self.resource_base, 'source_url': self.source_url, 'requirements_file': self.requirements_file, 'name': agent_name, 'queue': agent_queue, 'file_server_port': self.fs.port } env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name)
def create_plugin_tar(plugin_dir_name, target_directory): """ Create a tar file from the plugin. :param plugin_dir_name: the plugin directory name, relative to the resources package. :type plugin_dir_name: str :param target_directory: the directory to create the tar in :type target_directory: str :return: the name of the create tar, note that this is will just return the base name, not the full path to the tar. :rtype: str """ plugin_source_path = resources.get_resource( os.path.join('plugins', plugin_dir_name)) plugin_tar_file_name = '{0}.tar'.format(plugin_dir_name) target_tar_file_path = os.path.join(target_directory, plugin_tar_file_name) plugin_tar_file = tarfile.TarFile(target_tar_file_path, 'w') plugin_tar_file.add(plugin_source_path, plugin_dir_name) plugin_tar_file.close() return plugin_tar_file_name
def _test_local_agent_from_package(self, agent_name, *_): agent_queue = '{0}-queue'.format(agent_name) blueprint_path = resources.get_resource( 'blueprints/agent-from-package/local-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = { 'resource_base': self.resource_base, 'source_url': self.source_url, 'requirements_file': self.requirements_file, 'name': agent_name, 'queue': agent_queue, 'file_server_port': self.fs.port, 'ssl_cert_path': self._rest_cert_path } env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) agent_dict = self.get_agent_dict(env) agent_ssl_cert.verify_remote_cert(agent_dict['agent_dir']) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(agent_queue)
def test_install_new_agent(self): agent_name = utils.internal.generate_agent_name() blueprint_path = resources.get_resource( 'blueprints/install-new-agent/install-new-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = { 'name': agent_name, 'package_url': agent_package.get_package_url() } with self._manager_env(): env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) node_instances = env.storage.get_node_instances() new_agent_host = [ n for n in node_instances if n['name'] == 'new_agent_host' ][0] new_agent_name = new_agent_host['runtime_properties'][ 'cloudify_agent']['name'] self.assertNotEqual(new_agent_name, agent_name) self.assert_daemon_alive(name=new_agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name) self.wait_for_daemon_dead(name=new_agent_name)
def test_local_agent_from_source_long_name(self, _): """Agent still works with a filepath longer than 128 bytes (source) This test won't pass on windows because some files within the virtualenv exceed 256 bytes, and windows doesn't support paths that long. """ agent_name = 'agent-' + ''.join(uuid.uuid4().hex for i in range(4)) agent_queue = '{0}-queue'.format(agent_name) inputs = { 'source_url': self.source_url, 'requirements_file': self.requirements_file, 'name': agent_name, 'queue': agent_queue, 'ssl_cert_path': self._rest_cert_path } blueprint_path = resources.get_resource( 'blueprints/agent-from-source/local-agent-blueprint.yaml') self.logger.info('Initiating local env') env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) agent_dict = self.get_agent_dict(env) agent_ssl_cert.verify_remote_cert(agent_dict['agent_dir']) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name)
def _test_install_agent(blueprint, create_mock, config_mock, start_mock, *_): blueprint_path = get_resource( 'blueprints/install-agent/{0}'.format(blueprint)) env = local.init_env(blueprint_path) env.execute('install') create_mock.assert_has_any_calls() config_mock.assert_has_any_calls() start_mock.assert_has_any_calls()
def create_windows_installer(): runner = LocalCommandRunner() wheelhouse = get_resource('winpackage/source/wheels') pip_cmd = 'pip wheel --wheel-dir {wheel_dir} --requirement {req_file}'.\ format(wheel_dir=wheelhouse, req_file=config['requirements_file']) ctx.logger.info('Building wheels into: {0}'.format(wheelhouse)) runner.run(pip_cmd) pip_cmd = 'pip wheel --find-links {wheel_dir} --wheel-dir {wheel_dir} ' \ '{repo_url}'.format(wheel_dir=wheelhouse, repo_url=config['cloudify_agent_module']) runner.run(pip_cmd) iscc_cmd = 'C:\\Program Files (x86)\\Inno Setup 5\\iscc.exe {0}'\ .format(get_resource(os.path.join('winpackage', 'create.iss'))) os.environ['VERSION'] = '0' os.environ['iscc_output'] = os.getcwd() runner.run(iscc_cmd)
def create_windows_installer(config, logger): runner = LocalCommandRunner() wheelhouse = resources.get_resource('winpackage/source/wheels') pip_cmd = 'pip wheel --wheel-dir {wheel_dir} --requirement {req_file}'.\ format(wheel_dir=wheelhouse, req_file=config['requirements_file']) logger.info('Building wheels into: {0}'.format(wheelhouse)) runner.run(pip_cmd) pip_cmd = 'pip wheel --find-links {wheel_dir} --wheel-dir {wheel_dir} ' \ '{repo_url}'.format(wheel_dir=wheelhouse, repo_url=config['cloudify_agent_module']) runner.run(pip_cmd) iscc_cmd = 'C:\\Program Files (x86)\\Inno Setup 5\\iscc.exe {0}'\ .format(resources.get_resource( os.path.join('winpackage', 'create.iss'))) os.environ['VERSION'] = '0' os.environ['iscc_output'] = os.getcwd() runner.run(iscc_cmd)
def test_extract_package_to_dir(test_plugins, file_server): # create a plugin tar file and put it in the file server plugin_dir_name = 'mock-plugin-with-requirements' plugin_tar_name = test_utils.create_plugin_tar(plugin_dir_name, file_server.root_path) plugin_source_path = resources.get_resource( os.path.join('plugins', plugin_dir_name)) plugin_tar_url = '{0}/{1}'.format(file_server.url, plugin_tar_name) extracted_plugin_path = installer.extract_package_to_dir(plugin_tar_url) assert test_utils.are_dir_trees_equal(plugin_source_path, extracted_plugin_path)
def _test_install_agent(self, blueprint, create_mock, config_mock, start_mock, *_): blueprint_path = get_resource( 'blueprints/install-agent/{0}'.format(blueprint) ) env = local.init_env(blueprint_path) env.execute('install') create_mock.assert_has_any_calls() config_mock.assert_has_any_calls() start_mock.assert_has_any_calls()
def test_start_with_error(self): daemon = self.create_daemon() daemon.create() daemon.configure() self.installer.install( os.path.join(resources.get_resource('plugins'), 'mock-plugin-error')) daemon.register('mock-plugin-error') try: daemon.start() self.fail('Expected start operation to fail ' 'due to bad import') except exceptions.DaemonError as e: self.assertIn('cannot import name non_existent', str(e))
def test_register(self): daemon = self.create_daemon() daemon.create() daemon.configure() self.installer.install( os.path.join(resources.get_resource('plugins'), 'mock-plugin')) daemon.register('mock-plugin') daemon.start() self.assert_registered_tasks( daemon.name, additional_tasks=set(['mock_plugin.tasks.run', 'mock_plugin.tasks.get_env_variable']) )
def test_extract_package_to_dir(self): # create a plugin tar file and put it in the file server plugin_dir_name = 'mock-plugin-with-requirements' plugin_tar_name = test_utils.create_plugin_tar( plugin_dir_name, self.file_server_resource_base) plugin_source_path = resources.get_resource(os.path.join( 'plugins', plugin_dir_name)) plugin_tar_url = '{0}/{1}'.format(self.file_server_url, plugin_tar_name) extracted_plugin_path = installer.extract_package_to_dir( plugin_tar_url) self.assertTrue(test_utils.are_dir_trees_equal( plugin_source_path, extracted_plugin_path))
def test_install_new_agent(self, *_): agent_name = utils.internal.generate_agent_name() blueprint_path = resources.get_resource( 'blueprints/install-new-agent/install-new-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = { 'name': agent_name, 'ssl_cert_path': self._rest_cert_path } # Necessary to patch this method, because by default port 80 is used def http_rest_host(cloudify_agent): return os.environ[constants.MANAGER_FILE_SERVER_URL_KEY] # Necessary to patch, because by default https will be used def file_server_url(*args, **kwargs): return '{0}/resources'.format(http_rest_host({})) # Need to patch, to avoid broker_ssl_enabled being True @contextmanager def get_amqp_client(agent): yield get_client() with self._manager_env(): with patch('cloudify_agent.api.utils.get_manager_file_server_url', file_server_url): env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) with patch('cloudify_agent.operations._http_rest_host', http_rest_host): with patch('cloudify_agent.operations._get_amqp_client', get_amqp_client): env.execute('install', task_retries=0) agent_dict = self.get_agent_dict(env, 'new_agent_host') agent_ssl_cert.verify_remote_cert(agent_dict['agent_dir']) new_agent_name = agent_dict['name'] self.assertNotEqual(new_agent_name, agent_name) self.assert_daemon_alive(new_agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name) self.wait_for_daemon_dead(name=new_agent_name)
def test_install_new_agent(self, *_): agent_name = utils.internal.generate_agent_name() blueprint_path = resources.get_resource( 'blueprints/install-new-agent/install-new-agent-blueprint.yaml') self.logger.info('Initiating local env') inputs = {'name': agent_name, 'ssl_cert_path': self._rest_cert_path} with self._manager_env(): env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) agent_dict = self.get_agent_dict(env, 'new_agent_host') agent_ssl_cert.verify_remote_cert(agent_dict['agent_dir']) new_agent_name = agent_dict['name'] self.assertNotEqual(new_agent_name, agent_name) self.assert_daemon_alive(new_agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name) self.wait_for_daemon_dead(name=new_agent_name)
def test_extra_env_path(self): daemon = self.create_daemon() daemon.extra_env_path = utils.env_to_file( {'TEST_ENV_KEY': 'TEST_ENV_VALUE'}, posix=os.name == 'posix' ) daemon.create() daemon.configure() self.installer.install( os.path.join(resources.get_resource('plugins'), 'mock-plugin')) daemon.register('mock-plugin') daemon.start() # check the env file was properly sourced by querying the env # variable from the daemon process. this is done by a task value = self.celery.send_task( name='mock_plugin.tasks.get_env_variable', queue=daemon.queue, args=['TEST_ENV_KEY']).get(timeout=10) self.assertEqual(value, 'TEST_ENV_VALUE')
def _test_local_agent_from_package(agent_name, fs, ssl_cert, request, *_): agent_queue = '{0}-queue'.format(agent_name) blueprint_path = resources.get_resource( 'blueprints/agent-from-package/local-agent-blueprint.yaml') logger.info('Initiating local env') inputs = { 'resource_base': fs.root_path, 'source_url': get_source_uri(), 'requirements_file': get_requirements_uri(), 'name': agent_name, 'queue': agent_queue, 'file_server_port': fs.port, 'ssl_cert_path': ssl_cert.local_cert_path() } managers = [ ManagerItem({ 'networks': { 'default': '127.0.0.1' }, 'ca_cert_content': ssl_cert.DUMMY_CERT, 'hostname': 'cloudify' }) ] with patch('cloudify.endpoint.LocalEndpoint.get_managers', return_value=managers): env = local.init_env(name=request.node.name, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) agent_dict = get_agent_dict(env) ssl_cert.verify_remote_cert(agent_dict['agent_dir']) env.execute('uninstall', task_retries=1) wait_for_daemon_dead(agent_queue)
def test_3_2_backwards(self, _): agent_name = utils.internal.generate_agent_name() agent_queue = '{0}-queue'.format(agent_name) inputs = { 'source_url': self.source_url, 'requirements_file': self.requirements_file, 'name': agent_name, 'queue': agent_queue } blueprint_path = resources.get_resource( 'blueprints/3_2-agent-from-source/3_2-agent-from-source.yaml') self.logger.info('Initiating local env') env = local.init_env(name=self._testMethodName, blueprint_path=blueprint_path, inputs=inputs) env.execute('install', task_retries=0) self.assert_daemon_alive(name=agent_name) env.execute('uninstall', task_retries=1) self.wait_for_daemon_dead(name=agent_name)
def plugin_struct(plugin_name='mock-plugin'): return { 'source': os.path.join(resources.get_resource('plugins'), plugin_name), 'name': PLUGIN_NAME }
def test_extract_package_name(self): package_dir = os.path.join(resources.get_resource('plugins'), 'mock-plugin') self.assertEqual( 'mock-plugin', installer.extract_package_name(package_dir))
def test_extract_package_name(self): package_dir = os.path.join(resources.get_resource('plugins'), 'mock-plugin') self.assertEqual('mock-plugin', installer.extract_package_name(package_dir))