Пример #1
0
class ChrisAppTests(unittest.TestCase):
    def setUp(self):
        # override abstract define_parameters method
        ChrisApp.define_parameters = define_parameters
        self.app = ChrisApp()

        # create test directory where test files are created
        self.test_dir = os.path.dirname(__file__) + '/test'
        if not os.path.exists(self.test_dir):
            os.makedirs(self.test_dir)

    def tearDown(self):
        shutil.rmtree(self.test_dir)

    def test_path(self):
        """
        Test whether static path method properly validates a path value (a string of
        existing paths separated by commas).
        """
        path = self.test_dir
        self.assertEqual(ChrisApp.path(path), path)
        path = self.test_dir + ' , ' + self.test_dir
        self.assertEqual(ChrisApp.path(path),
                         self.test_dir + ',' + self.test_dir)
        path = self.test_dir + ',non-existing-path'
        with self.assertRaises(ArgumentTypeError):
            ChrisApp.path(path)

    def test_add_argument(self):
        """
        Test whether add_argument method adds parameters to the app
        """
        self.app.add_argument('-d',
                              '--dir',
                              dest='dir',
                              type=str,
                              default='/',
                              optional=True,
                              help='look up directory',
                              ui_exposed=True)
        self.app.add_argument('--clouddir',
                              dest='clouddir',
                              type=ChrisApp.unextpath,
                              optional=False,
                              help='look up directory in cloud storage',
                              ui_exposed=True)
        self.app.add_argument('--flag',
                              '-f',
                              dest='flag',
                              type=bool,
                              default=False,
                              optional=True,
                              help='a boolean flag',
                              ui_exposed=True)
        # input and output dirs are predefined positional arguments so we moc them
        inputdir = "./"
        outputdir = "./"
        options = self.app.parse_args(
            [inputdir, outputdir, '--clouddir', 'PACS', '--flag'])
        self.assertEqual(options.dir, '/')
        self.assertTrue(options.flag)

    def test_validate_argument_options_raises_ValueError_for_unsupported_type(
            self):
        """
        Test whether validate_argument_options method raises ValueError for a parameter
        of an unsupported type.
        """
        with self.assertRaises(ValueError):
            kwargs = {
                'dest': 'dir',
                'type': 'strangetype',
                'optional': False,
                'help': 'look up directory'
            }
            self.app.validate_argument_options(**kwargs)

    def test_validate_argument_options_raises_ValueError_if_optional_and_path_type(
            self):
        """
        Test whether validate_argument_options method raises ValueError for an optional
        parameter of type 'path' or 'unextpath'.
        """
        kwargs = {
            'dest': 'dir',
            'type': ChrisApp.path,
            'optional': True,
            'default': '/',
            'help': 'look up directory'
        }
        with self.assertRaises(ValueError):
            self.app.validate_argument_options(**kwargs)
        kwargs['type'] = ChrisApp.unextpath
        with self.assertRaises(ValueError):
            self.app.validate_argument_options(**kwargs)

    def test_validate_argument_options_raises_ValueError_if_optional_and_default_is_None(
            self):
        """
        Test whether validate_argument_options method raises ValueError for an optional
        parameter with default set as None.
        """
        kwargs = {
            'dest': 'dir',
            'type': str,
            'optional': True,
            'default': None,
            'help': 'look up directory'
        }
        with self.assertRaises(ValueError):
            self.app.validate_argument_options(**kwargs)

    def test_validate_argument_options_raises_KeyError_if_optional_and_default_not_specified(
            self):
        """
        Test whether validate_argument_options method raises KeyError for an optional
        parameter with default not specified.
        """
        kwargs = {
            'dest': 'dir',
            'type': str,
            'optional': True,
            'help': 'look up directory'
        }
        with self.assertRaises(KeyError):
            self.app.validate_argument_options(**kwargs)

    def test_validate_argument_options_raises_KeyError_if_optional_descriptor_not_specified(
            self):
        """
        Test whether validate_argument_options method raises KeyError if optional
        descriptor is not specified.
        """
        kwargs = {'dest': 'dir', 'type': str, 'help': 'look up directory'}
        with self.assertRaises(KeyError):
            self.app.validate_argument_options(**kwargs)

    def test_validate_argument_options_raises_ValueError_if_not_ui_exposed_and_not_optional(
            self):
        """
        Test whether validate_argument_options method raises ValueError for a parameter
        that is not UI exposed and not optional.
        """
        kwargs = {
            'dest': 'dir',
            'type': str,
            'optional': False,
            'ui_exposed': False,
            'help': 'look up directory'
        }
        with self.assertRaises(ValueError):
            self.app.validate_argument_options(**kwargs)

    def test_get_json_representation(self):
        """
        Test whether get_json_representation method returns an appropriate json object
        """
        repres = self.app.get_json_representation()
        self.assertEqual(repres['type'], self.app.TYPE)
        self.assertTrue('parameters' in repres)
        self.assertTrue('icon' in repres)
        self.assertTrue('authors' in repres)
        self.assertTrue('title' in repres)
        self.assertTrue('category' in repres)
        self.assertTrue('description' in repres)
        self.assertTrue('license' in repres)
        self.assertTrue('version' in repres)
        self.assertTrue('documentation' in repres)
        self.assertTrue('selfpath' in repres)
        self.assertTrue('selfexec' in repres)
        self.assertTrue('execshell' in repres)
        self.assertTrue('max_number_of_workers' in repres)
        self.assertTrue('max_memory_limit' in repres)
        self.assertTrue('max_cpu_limit' in repres)
        self.assertTrue('min_memory_limit' in repres)
        self.assertTrue('min_cpu_limit' in repres)
        self.assertTrue('min_gpu_limit' in repres)
        self.assertTrue('max_gpu_limit' in repres)

    def test_save_json_representation(self):
        """
        Test whether save_json_representation method saves the json representation object
        to an appropriate json file
        """
        outputdir = self.test_dir
        self.app.save_json_representation(outputdir)
        file_path = os.path.join(outputdir,
                                 self.app.__class__.__name__ + '.json')
        success = os.path.isfile(file_path)
        self.assertTrue(success)
        if success:
            with open(file_path) as json_file:
                repres = json.load(json_file)
                self.assertEqual(repres, self.app.get_json_representation())

    def test_launch(self):
        """
        Test launch method
        """
        # input and output dirs are predefined positional arguments so we moc them
        inputdir = "./"
        outputdir = "./"
        success = False
        try:
            self.app.launch([inputdir, outputdir])
        except NotImplementedError:
            success = True
        self.assertTrue(success)

    def test_save_input_meta(self):
        """
        Test save_input_meta method
        """
        inputdir = "./"
        outputdir = self.test_dir
        self.app.options = self.app.parse_args([inputdir, outputdir])
        self.app.save_input_meta()
        success = os.path.isfile(os.path.join(outputdir, 'input.meta.json'))
        self.assertTrue(success)
        expected_input_meta_dict = {
            'json': False,
            'meta': False,
            'outputdir': outputdir,
            'saveinputmeta': False,
            'inputmeta': None,
            'inputdir': inputdir,
            'saveoutputmeta': False,
            'savejson': None,
            'man': False
        }
        if success:
            with open(os.path.join(outputdir, 'input.meta.json')) as meta_file:
                input_meta_dict = json.load(meta_file)
                self.assertEqual(input_meta_dict, expected_input_meta_dict)

    def test_save_output_meta(self):
        """
        Test save_output_meta method
        """
        inputdir = "./"
        outputdir = self.test_dir
        self.app.options = self.app.parse_args([inputdir, outputdir])
        self.app.save_output_meta()
        success = os.path.isfile(os.path.join(outputdir, 'output.meta.json'))
        self.assertTrue(success)
        if success:
            with open(os.path.join(outputdir,
                                   'output.meta.json')) as meta_file:
                output_meta_dict = json.load(meta_file)
                self.assertEqual(output_meta_dict, self.app.OUTPUT_META_DICT)

    def test_load_output_meta(self):
        """
        Test load_output_meta method
        """
        inputdir = self.test_dir
        outputdir = self.test_dir
        self.app.options = self.app.parse_args([inputdir, outputdir])
        self.app.save_output_meta()
        output_meta_dict = self.app.load_output_meta()
        self.assertEqual(output_meta_dict, self.app.OUTPUT_META_DICT)

    def test_enforce_attr_string(self):
        with self.assertRaisesRegex(ValueError, 'must be a string') as cm:

            class VersionIsFloat(ChrisApp):
                DESCRIPTION = 'should not work'
                TYPE = 'DS'
                TITLE = 'broken'
                LICENSE = 'MIT'
                SELFPATH = '/usr/local/bin'
                SELFEXEC = 'wow'
                EXECSHELL = 'python'
                AUTHORS = 'me'
                VERSION = 1.2  # wrong, should be a str

                def show_man_page(self):
                    print('man')

                def define_parameters(self):
                    pass

                def run(self, options):
                    print('run')

    def test_interrogate_setup(self):
        class NoseFakePlugin(ChrisApp):
            PACKAGE = 'nose'
            TYPE = 'FS'
            OUTPUT_META_DICT = {}

            def show_man_page(self):
                print('man')

            def define_parameters(self):
                pass

            def run(self, options):
                print('run')

        self.assertEqual(NoseFakePlugin.AUTHORS,
                         'Jason Pellerin <*****@*****.**>')
        self.assertEqual(NoseFakePlugin.TITLE, 'nose')
        self.assertEqual(NoseFakePlugin.DESCRIPTION,
                         'nose extends unittest to make testing easier')
        self.assertEqual(NoseFakePlugin.DOCUMENTATION,
                         'http://readthedocs.org/docs/nose/')
        self.assertEqual(NoseFakePlugin.VERSION, '1.3.7')
        self.assertTrue(
            os.path.isfile(
                os.path.join(NoseFakePlugin.SELFPATH,
                             NoseFakePlugin.SELFEXEC)))
        self.assertEqual(NoseFakePlugin.SELFEXEC, 'nosetests')
        self.assertEqual(NoseFakePlugin.EXECSHELL, sys.executable)
Пример #2
0
class ChrisAppTests(unittest.TestCase):
    def setUp(self):
        # override abstract define_parameters method
        ChrisApp.define_parameters = define_parameters
        self.app = ChrisApp()

        # create test directory where test files are created
        self.test_dir = os.path.dirname(__file__) + '/test'
        if not os.path.exists(self.test_dir):
            os.makedirs(self.test_dir)

    def tearDown(self):
        shutil.rmtree(self.test_dir)

    def test_path(self):
        """
        Test whether static path method properly validates a path value (a string of
        existing paths separated by commas).
        """
        path = self.test_dir
        self.assertEqual(ChrisApp.path(path), path)
        path = self.test_dir + ' , ' + self.test_dir
        self.assertEqual(ChrisApp.path(path),
                         self.test_dir + ',' + self.test_dir)
        path = self.test_dir + ',non-existing-path'
        with self.assertRaises(ArgumentTypeError):
            ChrisApp.path(path)

    def test_add_argument(self):
        """
        Test whether add_argument method adds parameteres to the app
        """
        self.app.add_argument('-d',
                              '--dir',
                              dest='dir',
                              type=str,
                              default='/',
                              optional=True,
                              help='look up directory',
                              ui_exposed=True)
        self.app.add_argument('--clouddir',
                              dest='clouddir',
                              type=ChrisApp.unextpath,
                              optional=False,
                              help='look up directory in cloud storage',
                              ui_exposed=True)
        self.app.add_argument('--flag',
                              '-f',
                              dest='flag',
                              type=bool,
                              default=False,
                              optional=True,
                              help='a boolean flag',
                              ui_exposed=True)
        # input and output dirs are predefined positional arguments so we moc them
        inputdir = "./"
        outputdir = "./"
        options = self.app.parse_args(
            [inputdir, outputdir, '--clouddir', 'PACS', '--flag'])
        self.assertEqual(options.dir, '/')
        self.assertTrue(options.flag)

    def test_add_argument_raises_ValueError_for_unsupported_type(self):
        """
        Test whether add_argument method raises ValueError for a parameter of an
        unsupported type.
        """
        with self.assertRaises(ValueError):
            self.app.add_argument('--dir',
                                  dest='dir',
                                  type='strangetype',
                                  default='/',
                                  optional=True,
                                  help='look up directory')

    def test_add_argument_raises_ValueError_if_optional_and_path_type(self):
        """
        Test whether add_argument method raises ValueError for an optional parameter
        of type 'path' or 'unextpath'.
        """
        with self.assertRaises(ValueError):
            self.app.add_argument('--dir',
                                  dest='dir',
                                  type=ChrisApp.path,
                                  optional=True,
                                  default='/',
                                  help='look up directory')
        with self.assertRaises(ValueError):
            self.app.add_argument('--dir',
                                  dest='dir',
                                  type=ChrisApp.unextpath,
                                  optional=True,
                                  default='/',
                                  help='look up directory')

    def test_add_argument_raises_ValueError_if_optional_and_default_is_None(
            self):
        """
        Test whether add_argument method raises ValueError for an optional parameter
        with default set as None.
        """
        with self.assertRaises(ValueError):
            self.app.add_argument('--dir',
                                  dest='dir',
                                  type=str,
                                  default=None,
                                  optional=True,
                                  help='look up directory')

    def test_add_argument_raises_KeyError_if_optional_and_default_not_specified(
            self):
        """
        Test whether add_argument method raises KeyError for an optional parameter
        with default not specified.
        """
        with self.assertRaises(KeyError):
            self.app.add_argument('--dir',
                                  dest='dir',
                                  type=str,
                                  optional=True,
                                  help='look up directory')

    def test_add_argument_raises_KeyError_if_optional_descriptor_not_specified(
            self):
        """
        Test whether add_argument method raises KeyError if optional descriptor is
        not specified.
        """
        with self.assertRaises(KeyError):
            self.app.add_argument('--dir',
                                  dest='dir',
                                  type=str,
                                  help='look up directory')

    def test_add_argument_raises_ValueError_if_not_ui_exposed_and_not_optional(
            self):
        """
        Test whether add_argument method raises ValueError for a parameter that is not
        UI exposed and not optional.
        """
        with self.assertRaises(ValueError):
            self.app.add_argument('--dir',
                                  dest='dir',
                                  type=str,
                                  optional=False,
                                  help='look up directory',
                                  ui_exposed=False)

    def test_get_json_representation(self):
        """
        Test whether get_json_representation method returns an appropriate json object
        """
        repres = self.app.get_json_representation()
        self.assertEqual(repres['type'], self.app.TYPE)
        self.assertTrue('parameters' in repres)
        self.assertTrue('icon' in repres)
        self.assertTrue('authors' in repres)
        self.assertTrue('title' in repres)
        self.assertTrue('category' in repres)
        self.assertTrue('description' in repres)
        self.assertTrue('license' in repres)
        self.assertTrue('version' in repres)
        self.assertTrue('documentation' in repres)
        self.assertTrue('selfpath' in repres)
        self.assertTrue('selfexec' in repres)
        self.assertTrue('execshell' in repres)
        self.assertTrue('max_number_of_workers' in repres)
        self.assertTrue('max_memory_limit' in repres)
        self.assertTrue('max_cpu_limit' in repres)
        self.assertTrue('min_memory_limit' in repres)
        self.assertTrue('min_cpu_limit' in repres)
        self.assertTrue('min_gpu_limit' in repres)
        self.assertTrue('max_gpu_limit' in repres)

    def test_save_json_representation(self):
        """
        Test whether save_json_representation method saves the json representation object
        to an appropriate json file
        """
        outputdir = self.test_dir
        self.app.save_json_representation(outputdir)
        file_path = os.path.join(outputdir,
                                 self.app.__class__.__name__ + '.json')
        success = os.path.isfile(file_path)
        self.assertTrue(success)
        if success:
            with open(file_path) as json_file:
                repres = json.load(json_file)
                self.assertEqual(repres, self.app.get_json_representation())

    def test_launch(self):
        """
        Test launch method
        """
        # input and output dirs are predefined positional arguments so we moc them
        inputdir = "./"
        outputdir = "./"
        success = False
        try:
            self.app.launch([inputdir, outputdir])
        except NotImplementedError:
            success = True
        self.assertTrue(success)

    def test_save_input_meta(self):
        """
        Test save_input_meta method
        """
        inputdir = "./"
        outputdir = self.test_dir
        self.app.options = self.app.parse_args([inputdir, outputdir])
        self.app.save_input_meta()
        success = os.path.isfile(os.path.join(outputdir, 'input.meta.json'))
        self.assertTrue(success)
        expected_input_meta_dict = {
            'json': False,
            'meta': False,
            'outputdir': outputdir,
            'saveinputmeta': False,
            'inputmeta': None,
            'inputdir': inputdir,
            'saveoutputmeta': False,
            'savejson': None,
            'verbosity': '0',
            'version': False,
            'man': False
        }
        if success:
            with open(os.path.join(outputdir, 'input.meta.json')) as meta_file:
                input_meta_dict = json.load(meta_file)
                self.assertEqual(input_meta_dict, expected_input_meta_dict)

    def test_save_output_meta(self):
        """
        Test save_output_meta method
        """
        inputdir = "./"
        outputdir = self.test_dir
        self.app.options = self.app.parse_args([inputdir, outputdir])
        self.app.save_output_meta()
        success = os.path.isfile(os.path.join(outputdir, 'output.meta.json'))
        self.assertTrue(success)
        if success:
            with open(os.path.join(outputdir,
                                   'output.meta.json')) as meta_file:
                output_meta_dict = json.load(meta_file)
                self.assertEqual(output_meta_dict, self.app.OUTPUT_META_DICT)

    def test_load_output_meta(self):
        """
        Test load_output_meta method
        """
        inputdir = self.test_dir
        outputdir = self.test_dir
        self.app.options = self.app.parse_args([inputdir, outputdir])
        self.app.save_output_meta()
        output_meta_dict = self.app.load_output_meta()
        self.assertEqual(output_meta_dict, self.app.OUTPUT_META_DICT)
Пример #3
0
class ChrisAppTests(unittest.TestCase):
    def setUp(self):
        # override abstract define_parameters method
        ChrisApp.define_parameters = define_parameters
        self.app = ChrisApp()

        # create test directory where test files are created
        self.test_dir = os.path.dirname(__file__) + '/test'
        if not os.path.exists(self.test_dir):
            os.makedirs(self.test_dir)

    def tearDown(self):
        shutil.rmtree(self.test_dir)

    def test_add_argument(self):
        """
        Test whether add_argument method adds parameteres to the app
        """
        self.app.add_argument('--dir',
                              dest='dir',
                              type=str,
                              default='./',
                              optional=True,
                              help='look up directory')
        self.app.add_argument('--flag',
                              dest='flag',
                              type=bool,
                              default=False,
                              optional=True,
                              help='a boolean flag')
        # input and output dirs are predefined positional arguments so we moc them
        inputdir = "./"
        outputdir = "./"
        options = self.app.parse_args([inputdir, outputdir, '--flag'])
        self.assertEqual(options.dir, './')
        self.assertTrue(options.flag)

    def test_get_json_representation(self):
        """
        Test whether get_json_representation method returns an appropriate json object
        """
        repres = self.app.get_json_representation()
        self.assertEqual(repres['type'], self.app.TYPE)
        self.assertTrue('parameters' in repres)
        self.assertTrue('authors' in repres)
        self.assertTrue('title' in repres)
        self.assertTrue('category' in repres)
        self.assertTrue('description' in repres)
        self.assertTrue('license' in repres)
        self.assertTrue('version' in repres)
        self.assertTrue('documentation' in repres)

    def test_save_json_representation(self):
        """
        Test whether save_json_representation method saves the json representatio object
        to an appropriate json file
        """
        outputdir = self.test_dir
        self.app.save_json_representation(outputdir)
        file_path = os.path.join(outputdir,
                                 self.app.__class__.__name__ + '.json')
        success = os.path.isfile(file_path)
        self.assertTrue(success)
        if success:
            with open(file_path) as json_file:
                repres = json.load(json_file)
                self.assertEqual(repres, self.app.get_json_representation())

    def test_launch(self):
        """
        Test launch method
        """
        # input and output dirs are predefined positional arguments so we moc them
        inputdir = "./"
        outputdir = "./"
        success = False
        try:
            self.app.launch([inputdir, outputdir])
        except NotImplementedError:
            success = True
        self.assertTrue(success)

    def test_save_input_meta(self):
        """
        Test save_input_meta method
        """
        inputdir = "./"
        outputdir = self.test_dir
        self.app.options = self.app.parse_args([inputdir, outputdir])
        self.app.save_input_meta()
        success = os.path.isfile(os.path.join(outputdir, 'input.meta.json'))
        self.assertTrue(success)
        expected_input_meta_dict = {
            'json': False,
            'outputdir': outputdir,
            'saveinputmeta': False,
            'inputmeta': None,
            'inputdir': inputdir,
            'saveoutputmeta': False,
            'savejson': None
        }
        if success:
            with open(os.path.join(outputdir, 'input.meta.json')) as meta_file:
                input_meta_dict = json.load(meta_file)
                self.assertEqual(input_meta_dict, expected_input_meta_dict)

    def test_save_output_meta(self):
        """
        Test save_output_meta method
        """
        inputdir = "./"
        outputdir = self.test_dir
        self.app.options = self.app.parse_args([inputdir, outputdir])
        self.app.save_output_meta()
        success = os.path.isfile(os.path.join(outputdir, 'output.meta.json'))
        self.assertTrue(success)
        if success:
            with open(os.path.join(outputdir,
                                   'output.meta.json')) as meta_file:
                output_meta_dict = json.load(meta_file)
                self.assertEqual(output_meta_dict, self.app.OUTPUT_META_DICT)

    def test_load_output_meta(self):
        """
        Test load_output_meta method
        """
        inputdir = self.test_dir
        outputdir = self.test_dir
        self.app.options = self.app.parse_args([inputdir, outputdir])
        self.app.save_output_meta()
        output_meta_dict = self.app.load_output_meta()
        self.assertEqual(output_meta_dict, self.app.OUTPUT_META_DICT)