def setUp(self):
        ccdb_path = get_ccdb_home_path()

        self.sqlite_connection_str = "sqlite:///" + os.path.join(
            ccdb_path, "sql", "ccdb.sqlite")
        self.mysql_connection_str = "mysql://[email protected]:3306/ccdb"

        #initialize but disable colorama
        ccdb.cmd.colorama.init(autoreset=True)
        ccdb.cmd.colorama.deinit()

        #create console context
        self.context = ConsoleContext()
        self.context.silent_exceptions = False
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.context.connection_string = self.sqlite_connection_str
        self.context.user_name = "python_tests"
        self.context.register_utilities()

        #save stdout
        self.output = StringIO()
        self.saved_stdout = sys.stdout
        sys.stdout = self.output

        #logger
        ch = logging.StreamHandler()
        ch.stream = self.output
        logger.addHandler(ch)
        logger.setLevel(logging.INFO)
Example #2
0
    def setUp(self):
        # We need only sqlite tests. We test that we work with all databases in the provider fixture
        self.sqlite_connection_str = helper.sqlite_test_connection_str

        # DON'T USE COLORAMA IN TESTS. PyCharm test runner FAILS BECAUSE OF IT
        # DON'T - ccdb.cmd.colorama.init(autoreset=True)
        # DON'T - ccdb.cmd.colorama.deinit()

        # create console context
        self.context = ConsoleContext()
        self.context.silent_exceptions = False
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.context.connection_string = self.sqlite_connection_str
        self.context.user_name = "python_user"
        self.context.register_utilities()
        self.context.provider.authentication.current_user_name = "test_user"

        # save stdout
        self.output = StringIO()
        self.saved_stdout = sys.stdout
        sys.stdout = self.output

        # logger
        ch = logging.StreamHandler()
        ch.stream = self.output
        logger.addHandler(ch)
        logger.setLevel(logging.INFO)

        self.context.provider.connect(self.context.connection_string)
        user = self.context.provider.get_current_user()
        # create some test logs w/ current user
        self.context.provider.create_log_record(
            user, ["1"], "create",
            "Created assignment '/testing_filter/start_parms:0:testing_filter:2013-01-17_19-02-27'",
            "Test Log")
Example #3
0
    def setUp(self):
        # We need only sqlite tests. We test that we work with all databases in the provider fixture
        self.sqlite_connection_str = helper.sqlite_test_connection_str

        # initialize but disable colorama
        #ccdb.cmd.colorama.init(autoreset=True)
        #ccdb.cmd.colorama.deinit()

        # create console context
        self.context = ConsoleContext()
        self.context.silent_exceptions = False
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.context.connection_string = self.sqlite_connection_str
        self.context.user_name = "python_tests"
        self.context.register_utilities()
        self.context.provider.authentication.current_user_name = "test_user"

        # logger
        ch = logging.StreamHandler()
        ch.stream = sys.stdout
        logger.addHandler(ch)
        logger.setLevel(logging.INFO)

        # create table
        try:
            self.context.process_command_line(
                "mktbl /test/channel_mc_efficiency -r 5 -c 1")
        except Exception as e:
            if "Such table already exists" in e.message:
                sys.stderr.write(
                    "mktbl /test/channel_mc_efficiency already exists")
            else:
                raise
    def __init__(self,ccdb_connect_str=None,run=0,variation="default",verbosity=None,ccdb_username=None):        
        if verbosity is None:
            self.VERBOSE = 1
        else:
            self.VERBOSE = verbosity
        if ccdb_username is None:
            # not going to save this for now
            ccdb_username = "******"

        # save defaults for copy command
        self.run = run
        self.variation = variation


        # force users to set the CCDB connection by hand
        # so that we don't accidentally hit the MySQL master too hard
        if ccdb_connect_str is None:
            raise RuntimeError("Need to set CCDB connection!")

        # we need to load the console CCDB interface if we want to use the CLI commands
        self.ccdb_connect_str = ccdb_connect_str
        self.console = ConsoleContext()        # main CLI class
        self.console.silent_exceptions = False                   
        self.console.theme = ccdb.cmd.themes.NoColorTheme()      
        self.console.connection_string = self.ccdb_connect_str
        self.console.user_name = ccdb_username
        self.console.register_utilities()      # initialization

        if self.VERBOSE>0:
            print "Created HDCCDBCopier object:"
            print "  CCDB: %s"%self.ccdb_connect_str
            print "  Source run = %d"%self.run
            print "  Source variation = %s"%self.variation
Example #5
0
    def setUp(self):
        ccdb_path = get_ccdb_home_path()

        self.sqlite_connection_str = "sqlite:///" + os.path.join(ccdb_path, "sql", "ccdb.sqlite")
        self.mysql_connection_str = "mysql://[email protected]:3306/ccdb"

        # initialize but disable colorama
        ccdb.cmd.colorama.init(autoreset=True)
        ccdb.cmd.colorama.deinit()

        # create console context
        self.context = ConsoleContext()
        self.context.silent_exceptions = False
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.context.connection_string = self.sqlite_connection_str
        self.context.user_name = "python_tests"
        self.context.register_utilities()

        # save stdout
        self.output = StringIO()
        self.saved_stdout = sys.stdout
        sys.stdout = self.output

        # logger
        ch = logging.StreamHandler()
        ch.stream = self.output
        logger.addHandler(ch)
        logger.setLevel(logging.INFO)
Example #6
0
def InitCCDB():
    #create connection string:
    ccdb_path = get_ccdb_home_path()
    #sqlite_connection_str = os.getenv(CCDB_CONNECTION, "sqlite:///" + os.path.join(ccdb_path, "sql", "ccdb.sqlite"))
    if os.environ['CCDB_CONNECTION']:
        sqlite_connection_str = os.environ['CCDB_CONNECTION']
    else:
        sqlite_connection_str = "test"
    #print "using CCDB connection = " + sqlite_connection_str

    #create console context
    context = ConsoleContext()  # this is the main class
    context.silent_exceptions = False  # now all exception is raised and you can try-except them
    context.theme = ccdb.cmd.themes.NoColorTheme()  # disable colored output
    context.connection_string = sqlite_connection_str  # set connection string
    #context.user_name = os.getenv(CCDB_USER, "gluex")  # your username
    if 'CCDB_USER' in os.environ and os.environ['CCDB_USER'] is not None:
        context.user_name = os.environ['CCDB_USER']
    else:
        context.user_name = "gluex"
    context.register_utilities(
    )  # Initialization. Register all commands (ls, rm, mktbl etc...)

    return context
Example #7
0
def InitCCDB():
    # create connection string:
    ccdb_path = get_ccdb_home_path()
    # sqlite_connection_str = os.getenv(CCDB_CONNECTION, "sqlite:///" + os.path.join(ccdb_path, "sql", "ccdb.sqlite"))
    if os.environ["CCDB_CONNECTION"]:
        sqlite_connection_str = os.environ["CCDB_CONNECTION"]
    else:
        sqlite_connection_str = "test"
    # print "using CCDB connection = " + sqlite_connection_str

    # create console context
    context = ConsoleContext()  # this is the main class
    context.silent_exceptions = False  # now all exception is raised and you can try-except them
    context.theme = ccdb.cmd.themes.NoColorTheme()  # disable colored output
    context.connection_string = sqlite_connection_str  # set connection string
    # context.user_name = os.getenv(CCDB_USER, "gluex")  # your username
    if "CCDB_USER" in os.environ and os.environ["CCDB_USER"] is not None:
        context.user_name = os.environ["CCDB_USER"]
    else:
        context.user_name = "gluex"
    context.register_utilities()  # Initialization. Register all commands (ls, rm, mktbl etc...)

    return context
class ConsoleContextTests(unittest.TestCase):
    """
    Tests of ccdb.ConsoleContext and all utilities
    """
    def setUp(self):
        ccdb_path = get_ccdb_home_path()

        self.sqlite_connection_str = "sqlite:///" + os.path.join(
            ccdb_path, "sql", "ccdb.sqlite")
        self.mysql_connection_str = "mysql://[email protected]:3306/ccdb"

        #initialize but disable colorama
        ccdb.cmd.colorama.init(autoreset=True)
        ccdb.cmd.colorama.deinit()

        #create console context
        self.context = ConsoleContext()
        self.context.silent_exceptions = False
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.context.connection_string = self.sqlite_connection_str
        self.context.user_name = "python_tests"
        self.context.register_utilities()

        #save stdout
        self.output = StringIO()
        self.saved_stdout = sys.stdout
        sys.stdout = self.output

        #logger
        ch = logging.StreamHandler()
        ch.stream = self.output
        logger.addHandler(ch)
        logger.setLevel(logging.INFO)

    def tearDown(self):
        #restore stdout
        sys.stdout = self.saved_stdout

    def test_context(self):
        """Test utils are loaded"""
        self.assertTrue(len(self.context.utils) > 0)

    def test_cat(self):
        """cat. General help"""
        self.context.process_command_line("cat /test/test_vars/test_table")
        self.assertIn("2.3", self.output.getvalue())

    def test_cd(self):
        """cd. General test"""
        self.context.process_command_line("cd test")

    def test_help(self):
        """help. Help command test"""
        self.context.process_command_line("help")
        self.assertIn("ls", self.output.getvalue())

    def test_howto(self):
        """howto. General test"""
        self.context.process_command_line("howto")

    def test_dump(self):
        """dump. General and output tests"""
        self.context.theme = ccdb.cmd.themes.ColoredTheme()
        self.context.process_command_line("dump /test/test_vars/test_table")
        text = self.output.getvalue()
        self.assertNotIn("[", text, "Check that dump disabled color output")

        #cleanup
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.output.truncate(0)

    def test_info(self):
        """info. General test"""
        self.context.process_command_line("info /test/test_vars/test_table")
        out_str = self.output.getvalue()
        self.assertIn("test_table", out_str)
        self.assertIn("Test type", out_str)
        self.assertIn("z", out_str)

    def test_ls(self):
        """ls. General test"""
        self.context.process_command_line("ls")
        self.assertIn("test", self.output.getvalue())

    def test_ls_table(self):
        """ls. General test"""
        self.context.process_command_line("ls /test/test_vars/test_table")
        self.assertIn("test", self.output.getvalue())

    def test_mk_rm_dir(self):
        """mkdir, rm. Create directory and delete it"""
        self.context.process_command_line(
            "mkdir /test/auto_testing_dir #Comment for the dir\n something at new line"
        )
        # TODO check test table internals are right
        self.context.process_command_line(
            "rm --force -d /test/auto_testing_dir")

    def test_mktbl_from_file(self):
        """mkdir infer table structure from file"""
        tests_dir = os.path.dirname(os.path.realpath(__file__))
        test_file = os.path.join(tests_dir, "test_table.txt")
        self.context.process_command_line("mktbl -f " + test_file)
        out_str = self.output.getvalue()
        self.assertIn("mktbl <name> -r 2 X Y Z #<comments>", out_str)

        #Now lets check more complex example, where we set table name and comment
        self.output.truncate(0)
        self.context.process_command_line("mktbl /test/haha -f " + test_file +
                                          " #harasho")
        out_str = str(self.output.getvalue())
        self.assertIn("mktbl /test/haha -r 2 X Y Z #harasho", out_str)

    def test_mk_rm_table(self):
        """mktbl, rm. Create table and delete it"""
        self.context.process_command_line(
            "mktbl /test/auto_testing_table -r 2 x y z #This is comment for my table"
        )
        #TODO check test table internals are right
        self.context.process_command_line(
            "rm --force /test/auto_testing_table")

    def test_mk_rm_variation(self):
        """mkvar, rm. Create variation and delete it"""
        self.context.process_command_line(
            "mkvar auto_testing_variation -p test #hahaha")
        #TODO check test table internals are right
        self.context.process_command_line(
            "rm --force -v auto_testing_variation")

    def test_add_rm_assignment(self):
        """add, rm. Add constants and remove them"""
        tests_dir = os.path.dirname(os.path.realpath(__file__))
        test_file = os.path.join(tests_dir, "test_table.txt")
        print(test_file)
        self.context.process_command_line("add /test/test_vars/test_table " +
                                          test_file)
        self.output.truncate(0)
        self.context.process_command_line("vers /test/test_vars/test_table")
        text = str(self.output.getvalue())
        line = text.split("\n")[1]
        id = int(shlex.split(line)[0])
        self.context.process_command_line("rm -f -a {0}".format(id))

    def test_pwd(self):
        """pwd. General test"""
        self.context.process_command_line("pwd")
        self.assertIn("/", self.output.getvalue())

    def test_rm(self):
        """rm. General test... But rm is tested in other tests"""
        pass

    def test_run(self):
        """run. Test if 0 is default run"""
        self.context.process_command_line("run")
        self.assertIn("0", self.output.getvalue())

    def test_run_change(self):
        """run. Test run is changed"""
        self.context.process_command_line("run 1")
        self.output.truncate(0)
        self.context.process_command_line("run")
        self.assertIn("1", self.output.getvalue())

    def test_var(self):
        """var. Test if 'default' variation is default"""
        #default run is 0
        self.context.process_command_line("var")
        self.assertIn("default", self.output.getvalue())

    def test_var_change(self):
        """var. Test variation change"""
        self.context.process_command_line("var test_var")
        self.output.truncate(0)
        self.context.process_command_line("var")
        self.assertIn("test_var", self.output.getvalue())

    def test_vers(self):
        """vers. General usage test"""
        self.context.process_command_line("vers /test/test_vars/test_table")
        result = self.output.getvalue()

        # REGRESSION test: for v. 1.02, doesn't show data if context default run is not in run-range
        self.assertIn("500-3000", result,
                      "Because test_table has data for 500-3000 run-range")

    def test_vers_variation_run(self):
        """vers. Test if vers limits variation and run range if -v and -r flags are given"""
        self.context.process_command_line(
            "vers /test/test_vars/test_table -v default -r 0")
        result = self.output.getvalue()

        self.assertNotIn("subtest", result)
        self.assertNotIn("500-3000",
                         result)  # There is test data for 500-3000 run-range

    def test_vers_bad_params(self):
        """vers. Test vers bad parameters"""

        #wrong directory
        self.assertRaises(DirectoryNotFound, self.context.process_command_line,
                          "vers /some/wrong/dir/table")
        self.assertRaises(TypeTableNotFound, self.context.process_command_line,
                          "vers /test/test_vars/wrong_table")

    def test_skip_sqlite_logging(self):
        """
        check that for sqlite connection user name is skipped
        """

        self.context.process_command_line(
            "ls")  # run command that requires connection make it to connect
        self.assertEqual('anonymous', self.context.user_name)

    def test_log(self):
        """
        log. general test
        """
        self.context.process_command_line("log")
Example #9
0
class ConsoleContextTests(unittest.TestCase):
    """
    Tests of ccdb.ConsoleContext and all utilities
    """
    def setUp(self):
        # We need only sqlite tests. We test that we work with all databases in the provider fixture
        self.sqlite_connection_str = helper.sqlite_test_connection_str

        # DON'T USE COLORAMA IN TESTS. PyCharm test runner FAILS BECAUSE OF IT
        # DON'T - ccdb.cmd.colorama.init(autoreset=True)
        # DON'T - ccdb.cmd.colorama.deinit()

        # create console context
        self.context = ConsoleContext()
        self.context.silent_exceptions = False
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.context.connection_string = self.sqlite_connection_str
        self.context.user_name = "python_user"
        self.context.register_utilities()
        self.context.provider.authentication.current_user_name = "test_user"

        # save stdout
        self.output = StringIO()
        self.saved_stdout = sys.stdout
        sys.stdout = self.output

        # logger
        ch = logging.StreamHandler()
        ch.stream = self.output
        logger.addHandler(ch)
        logger.setLevel(logging.INFO)

        self.context.provider.connect(self.context.connection_string)
        user = self.context.provider.get_current_user()
        # create some test logs w/ current user
        self.context.provider.create_log_record(
            user, ["1"], "create",
            "Created assignment '/testing_filter/start_parms:0:testing_filter:2013-01-17_19-02-27'",
            "Test Log")

    def tearDown(self):
        # restore stdout
        sys.stdout = self.saved_stdout

    def test_context(self):
        """Test utils are loaded"""
        self.assertTrue(len(self.context.utils) > 0)

    def test_cat(self):
        """cat. General help"""
        self.context.process_command_line("cat /test/test_vars/test_table")
        self.assertIn("2.3", self.output.getvalue())

    def test_variation_backup(self):
        """Test Backup of """

        self.context.process_command_line(
            "cat /test/test_vars/test_table:100:test")
        self.assertIn("2.2", self.output.getvalue())

    def test_cd(self):
        """cd. General test"""
        self.context.process_command_line("cd test")

    def test_help(self):
        """help. Help command test"""
        self.context.process_command_line("help")
        self.assertIn("ls", self.output.getvalue())

    def test_howto(self):
        """howto. General test"""
        self.context.process_command_line("howto")

    def test_dump(self):
        """dump. General and output tests"""
        self.context.theme = ccdb.cmd.themes.ColoredTheme()
        self.context.process_command_line("dump /test/test_vars/test_table")
        text = self.output.getvalue()
        self.assertNotIn("[", text, "Check that dump disabled color output")

        # cleanup
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.output.truncate(0)

    def test_info(self):
        """info. General test"""
        self.context.process_command_line("info /test/test_vars/test_table")
        out_str = self.output.getvalue()
        self.assertIn("test_table", out_str)
        self.assertIn("Test type", out_str)
        self.assertIn("z", out_str)

    def test_ls(self):
        """ls. General test"""
        self.context.process_command_line("ls")
        self.assertIn("test", self.output.getvalue())

    def test_ls_table(self):
        """ls. General test"""
        self.context.process_command_line("ls /test/test_vars/test_table")
        self.assertIn("test", self.output.getvalue())

    def test_mk_rm_dir(self):
        """mkdir, rm. Create directory and delete it"""
        self.context.process_command_line(
            "mkdir /test/auto_testing_dir #Comment for the dir\n something at new line"
        )
        # TODO check test table internals are right
        self.context.process_command_line(
            "rm --force -d /test/auto_testing_dir")

    def test_mktbl_from_file(self):
        """mkdir infer table structure from file"""
        tests_dir = os.path.dirname(os.path.realpath(__file__))
        test_file = os.path.join(tests_dir, "test_table.txt")
        self.context.process_command_line("mktbl -f " + test_file)
        out_str = self.output.getvalue()
        self.assertIn("mktbl <name> -r 2 X Y Z #<comments>", out_str)

        # now lets check more complex example, where we set table name and comment
        self.output.truncate(0)
        self.context.process_command_line("mktbl /test/haha -f " + test_file +
                                          " #harasho")
        out_str = str(self.output.getvalue())
        self.assertIn("mktbl /test/haha -r 2 X Y Z #harasho", out_str)

    def test_mk_rm_table(self):
        """mktbl, rm. Create table and delete it"""
        self.context.process_command_line(
            "mktbl /test/auto_testing_table -r 2 x y z #This is comment for my table"
        )
        # TODO check test table internals are right
        self.context.process_command_line(
            "rm --force /test/auto_testing_table")

    def test_mk_rm_variation(self):
        """mkvar, rm. Create variation and delete it"""
        self.context.process_command_line(
            "mkvar auto_testing_variation -p test #hahaha")
        self.context.process(
            ["mkvar", "auto_testing_variation2", "-p", "test"],
            0)  # Regression test for GitHub #3
        # TODO check test table internals are right
        self.context.process_command_line(
            "rm --force -v auto_testing_variation")
        self.context.process_command_line(
            "rm --force -v auto_testing_variation2")

    def test_add_rm_assignment(self):
        """add, rm. Add constants and remove them"""
        tests_dir = os.path.dirname(os.path.realpath(__file__))
        test_file = os.path.join(tests_dir, "test_table.txt")
        print(test_file)

        # self.context.process_command_line("ls")
        # print(self.context.provider.get_current_user().name)
        self.context.process_command_line("add /test/test_vars/test_table " +
                                          test_file)
        self.output.truncate(0)
        self.context.process_command_line("vers /test/test_vars/test_table")
        text = str(self.output.getvalue())
        line = text.split("\n")[1]
        assignment_id = int(shlex.split(line)[0])
        self.context.process_command_line("rm -f -a {0}".format(assignment_id))

    def test_pwd(self):
        """pwd. General test"""
        self.context.process_command_line("pwd")
        self.assertIn("/", self.output.getvalue())

    def test_run(self):
        """run. Test if 0 is default run"""
        self.context.process_command_line("run")
        self.assertIn("0", self.output.getvalue())

    def test_run_change(self):
        """run. Test run is changed"""
        self.context.process_command_line("run 1")
        self.output.truncate(0)
        self.context.process_command_line("run")
        self.assertIn("1", self.output.getvalue())

    def test_var(self):
        """var. Test if 'default' variation is default"""
        # default run is 0
        self.context.process_command_line("var")
        self.assertIn("default", self.output.getvalue())

    def test_var_change(self):
        """var. Test variation change"""
        self.context.process_command_line("var test_var")
        self.output.truncate(0)
        self.context.process_command_line("var")
        self.assertIn("test_var", self.output.getvalue())

    def test_vers(self):
        """vers. General usage test"""
        self.context.process_command_line("vers /test/test_vars/test_table")
        result = self.output.getvalue()

        # REGRESSION test: for v. 1.02, doesn't show data if context default run is not in run-range
        self.assertIn("500-3000", result,
                      "Because test_table has data for 500-3000 run-range")

    def test_vers_variation_run(self):
        """vers. Test if vers limits variation and run range if -v and -r flags are given"""
        self.context.process_command_line(
            "vers /test/test_vars/test_table -v default -r 0")
        result = self.output.getvalue()

        self.assertNotIn("subtest", result)
        self.assertNotIn("500-3000",
                         result)  # There is test data for 500-3000 run-range

    def test_vers_bad_params(self):
        """vers. Test vers bad parameters"""

        # wrong directory
        self.assertRaises(DirectoryNotFound, self.context.process_command_line,
                          "vers /some/wrong/dir/table")
        self.assertRaises(TypeTableNotFound, self.context.process_command_line,
                          "vers /test/test_vars/wrong_table")

    def test_skip_sqlite_logging(self):
        """
        check that for sqlite connection user name is skipped
        """

        self.context.process_command_line(
            "ls")  # run command that requires connection make it to connect
        self.assertEqual('test_user', self.context.user_name)

    def test_log(self):
        """
        log. general test
        """
        self.context.process_command_line("log")

    def test_user_create(self):
        username = "******"
        self.context.process_command_line("user --create {0}".format(username))
        self.assertIn(username, self.output.getvalue())
        self.context.provider.delete_user(username)

    def test_user_list(self):
        self.context.process_command_line("user --list")
        # there are only two users in the test database
        self.assertIn('anonymous', self.output.getvalue())
        self.assertIn('test_user', self.output.getvalue())

    def test_user_create_bad_name(self):
        self.assertRaises(ValueError, self.context.process_command_line,
                          "user --create h***")

    def test_list_current_user(self):
        self.context.process_command_line("user")
        self.assertIn('test_user', self.output.getvalue())

    def test_filter_logs_by_username(self):

        self.context.process_command_line("log -u test_user")
        # we should see this in the logs
        self.assertIn("test_user", self.output.getvalue())

    def test_filter_logs_by_table(self):

        self.context.process_command_line("log -t test")
        # we should see this in the logs
        self.assertIn("test", self.output.getvalue())

    def test_filter_logs_by_variation(self):

        self.context.process_command_line("log -v default")
        # we should see this in the logs
        self.assertIn("default", self.output.getvalue())

    def test_filter_logs_by_all(self):

        self.context.process_command_line(
            "log -u test_user -v default -t test")

        # we should see these in the logs
        self.assertIn("default", self.output.getvalue())
        self.assertIn("test_user", self.output.getvalue())
        self.assertIn("test", self.output.getvalue())
Example #10
0
class AddThenDumpFileTests(unittest.TestCase):
    """
    Tests of ccdb.ConsoleContext and all utilities
    """
    def setUp(self):
        # We need only sqlite tests. We test that we work with all databases in the provider fixture
        self.sqlite_connection_str = helper.sqlite_test_connection_str

        # initialize but disable colorama
        #ccdb.cmd.colorama.init(autoreset=True)
        #ccdb.cmd.colorama.deinit()

        # create console context
        self.context = ConsoleContext()
        self.context.silent_exceptions = False
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.context.connection_string = self.sqlite_connection_str
        self.context.user_name = "python_tests"
        self.context.register_utilities()
        self.context.provider.authentication.current_user_name = "test_user"

        # logger
        ch = logging.StreamHandler()
        ch.stream = sys.stdout
        logger.addHandler(ch)
        logger.setLevel(logging.INFO)

        # create table
        try:
            self.context.process_command_line(
                "mktbl /test/channel_mc_efficiency -r 5 -c 1")
        except Exception as e:
            if "Such table already exists" in e.message:
                sys.stderr.write(
                    "mktbl /test/channel_mc_efficiency already exists")
            else:
                raise

    def tearDown(self):
        with helper.captured_output() as (out, err):
            self.context.process_command_line(
                "vers /test/channel_mc_efficiency")
        text = str(out.getvalue())
        line = text.split("\n")[1]
        assignment_id = int(shlex.split(line)[0])
        self.context.process_command_line("rm -f -a {0}".format(assignment_id))
        self.context.process_command_line(
            "rm -f -t /test/channel_mc_efficiency")

    def test_same_content(self):
        pass
        """When adding, then dumping a file its content should match"""
        self.test_data_path = os.path.join(helper.ccdb_test_path,
                                           'channel_mc_efficiency.list')

        self.context.process_command_line("add /test/channel_mc_efficiency " +
                                          self.test_data_path)

        with helper.captured_output() as (out, err):
            self.context.process_command_line(
                "dump /test/channel_mc_efficiency")

        # This can go inside or outside the `with` block
        dumped_str = str(out.getvalue().strip())

        dumped_lines = [line.strip() for line in dumped_str.split('\n')]

        # read the original file
        with open(self.test_data_path, 'r') as content_file:
            original_lines = [line.strip() for line in content_file]
            #original_str = content_file.read()

        self.assertEqual(dumped_lines, original_lines)
class HDCCDBCopierCLI:
    def __init__(self,ccdb_connect_str=None,run=0,variation="default",verbosity=None,ccdb_username=None):        
        if verbosity is None:
            self.VERBOSE = 1
        else:
            self.VERBOSE = verbosity
        if ccdb_username is None:
            # not going to save this for now
            ccdb_username = "******"

        # save defaults for copy command
        self.run = run
        self.variation = variation


        # force users to set the CCDB connection by hand
        # so that we don't accidentally hit the MySQL master too hard
        if ccdb_connect_str is None:
            raise RuntimeError("Need to set CCDB connection!")

        # we need to load the console CCDB interface if we want to use the CLI commands
        self.ccdb_connect_str = ccdb_connect_str
        self.console = ConsoleContext()        # main CLI class
        self.console.silent_exceptions = False                   
        self.console.theme = ccdb.cmd.themes.NoColorTheme()      
        self.console.connection_string = self.ccdb_connect_str
        self.console.user_name = ccdb_username
        self.console.register_utilities()      # initialization

        if self.VERBOSE>0:
            print "Created HDCCDBCopier object:"
            print "  CCDB: %s"%self.ccdb_connect_str
            print "  Source run = %d"%self.run
            print "  Source variation = %s"%self.variation


    def CopyTable(self,tablename,dest_minrun=0,dest_maxrun=None,dest_variation="default",dest_comment=None,src_run=None,src_variation=None):
        """
        Copy table from one run/variation to another using low-level API
        This is the default (and preferred method)
        """
       # set destination defaults
        if dest_comment is None:
            dest_comment =""
        if dest_maxrun is None:
            dest_maxrun = dest_minrun
        # allow overriding source defaults
        if src_run is None:
            src_run = self.run
        if src_variation is None:
            src_variation = self.variation

        if self.VERBOSE>0:
            print "copying %s:%d:%s -> %s:%d:%s"%(tablename,src_run,src_variation,tablename,dest_minrun,dest_variation)

        # get the source table
        fconst = NamedTemporaryFile(delete=False)
        tmpfile_name = fconst.name
        self.console.process_command_line("dump %s:%d:%s > %s"%(tablename,src_run,src_variation,fconst.name))
        fconst.flush()
        fconst.close()

        # copy it to the destination
        self.console.process_command_line("add %s -v %s -r %d-%d %s"%(tablename,dest_variation,dest_minrun,dest_maxrun,tmpfile_name))

        # cleanup
        os.system("rm %s"%(tmpfile_name))
Example #12
0
class ConsoleContextTests(unittest.TestCase):
    """
    Tests of ccdb.ConsoleContext and all utilities
    """

    def setUp(self):
        ccdb_path = get_ccdb_home_path()

        self.sqlite_connection_str = "sqlite:///" + os.path.join(ccdb_path, "sql", "ccdb.sqlite")
        self.mysql_connection_str = "mysql://[email protected]:3306/ccdb"

        # initialize but disable colorama
        ccdb.cmd.colorama.init(autoreset=True)
        ccdb.cmd.colorama.deinit()

        # create console context
        self.context = ConsoleContext()
        self.context.silent_exceptions = False
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.context.connection_string = self.sqlite_connection_str
        self.context.user_name = "python_tests"
        self.context.register_utilities()

        # save stdout
        self.output = StringIO()
        self.saved_stdout = sys.stdout
        sys.stdout = self.output

        # logger
        ch = logging.StreamHandler()
        ch.stream = self.output
        logger.addHandler(ch)
        logger.setLevel(logging.INFO)

    def tearDown(self):
        # restore stdout
        sys.stdout = self.saved_stdout

    def test_context(self):
        """Test utils are loaded"""
        self.assertTrue(len(self.context.utils) > 0)

    def test_cat(self):
        """cat. General help"""
        self.context.process_command_line("cat /test/test_vars/test_table")
        self.assertIn("2.3", self.output.getvalue())

    def test_cd(self):
        """cd. General test"""
        self.context.process_command_line("cd test")

    def test_help(self):
        """help. Help command test"""
        self.context.process_command_line("help")
        self.assertIn("ls", self.output.getvalue())

    def test_howto(self):
        """howto. General test"""
        self.context.process_command_line("howto")

    def test_dump(self):
        """dump. General and output tests"""
        self.context.theme = ccdb.cmd.themes.ColoredTheme()
        self.context.process_command_line("dump /test/test_vars/test_table")
        text = self.output.getvalue()
        self.assertNotIn("[", text, "Check that dump disabled color output")

        # cleanup
        self.context.theme = ccdb.cmd.themes.NoColorTheme()
        self.output.truncate(0)

    def test_info(self):
        """info. General test"""
        self.context.process_command_line("info /test/test_vars/test_table")
        out_str = self.output.getvalue()
        self.assertIn("test_table", out_str)
        self.assertIn("Test type", out_str)
        self.assertIn("z", out_str)

    def test_ls(self):
        """ls. General test"""
        self.context.process_command_line("ls")
        self.assertIn("test", self.output.getvalue())

    def test_ls_table(self):
        """ls. General test"""
        self.context.process_command_line("ls /test/test_vars/test_table")
        self.assertIn("test", self.output.getvalue())

    def test_mk_rm_dir(self):
        """mkdir, rm. Create directory and delete it"""
        self.context.process_command_line("mkdir /test/auto_testing_dir #Comment for the dir\n something at new line")
        # TODO check test table internals are right
        self.context.process_command_line("rm --force -d /test/auto_testing_dir")

    def test_mktbl_from_file(self):
        """mkdir infer table structure from file"""
        tests_dir = os.path.dirname(os.path.realpath(__file__))
        test_file = os.path.join(tests_dir, "test_table.txt")
        self.context.process_command_line("mktbl -f " + test_file)
        out_str = self.output.getvalue()
        self.assertIn("mktbl <name> -r 2 X Y Z #<comments>", out_str)

        # Now lets check more complex example, where we set table name and comment
        self.output.truncate(0)
        self.context.process_command_line("mktbl /test/haha -f " + test_file + " #harasho")
        out_str = str(self.output.getvalue())
        self.assertIn("mktbl /test/haha -r 2 X Y Z #harasho", out_str)

    def test_mk_rm_table(self):
        """mktbl, rm. Create table and delete it"""
        self.context.process_command_line("mktbl /test/auto_testing_table -r 2 x y z #This is comment for my table")
        # TODO check test table internals are right
        self.context.process_command_line("rm --force /test/auto_testing_table")

    def test_mk_rm_variation(self):
        """mkvar, rm. Create variation and delete it"""
        self.context.process_command_line("mkvar auto_testing_variation -p test #hahaha")
        # TODO check test table internals are right
        self.context.process_command_line("rm --force -v auto_testing_variation")

    def test_add_rm_assignment(self):
        """add, rm. Add constants and remove them"""
        tests_dir = os.path.dirname(os.path.realpath(__file__))
        test_file = os.path.join(tests_dir, "test_table.txt")
        print(test_file)
        self.context.process_command_line("add /test/test_vars/test_table " + test_file)
        self.output.truncate(0)
        self.context.process_command_line("vers /test/test_vars/test_table")
        text = str(self.output.getvalue())
        line = text.split("\n")[1]
        id = int(shlex.split(line)[0])
        self.context.process_command_line("rm -f -a {0}".format(id))

    def test_pwd(self):
        """pwd. General test"""
        self.context.process_command_line("pwd")
        self.assertIn("/", self.output.getvalue())

    def test_rm(self):
        """rm. General test... But rm is tested in other tests"""
        pass

    def test_run(self):
        """run. Test if 0 is default run"""
        self.context.process_command_line("run")
        self.assertIn("0", self.output.getvalue())

    def test_run_change(self):
        """run. Test run is changed"""
        self.context.process_command_line("run 1")
        self.output.truncate(0)
        self.context.process_command_line("run")
        self.assertIn("1", self.output.getvalue())

    def test_var(self):
        """var. Test if 'default' variation is default"""
        # default run is 0
        self.context.process_command_line("var")
        self.assertIn("default", self.output.getvalue())

    def test_var_change(self):
        """var. Test variation change"""
        self.context.process_command_line("var test_var")
        self.output.truncate(0)
        self.context.process_command_line("var")
        self.assertIn("test_var", self.output.getvalue())

    def test_vers(self):
        """vers. General usage test"""
        self.context.process_command_line("vers /test/test_vars/test_table")
        result = self.output.getvalue()

        # REGRESSION test: for v. 1.02, doesn't show data if context default run is not in run-range
        self.assertIn("500-3000", result, "Because test_table has data for 500-3000 run-range")

    def test_vers_variation_run(self):
        """vers. Test if vers limits variation and run range if -v and -r flags are given"""
        self.context.process_command_line("vers /test/test_vars/test_table -v default -r 0")
        result = self.output.getvalue()

        self.assertNotIn("subtest", result)
        self.assertNotIn("500-3000", result)  # There is test data for 500-3000 run-range

    def test_vers_bad_params(self):
        """vers. Test vers bad parameters"""

        # wrong directory
        self.assertRaises(DirectoryNotFound, self.context.process_command_line, "vers /some/wrong/dir/table")
        self.assertRaises(TypeTableNotFound, self.context.process_command_line, "vers /test/test_vars/wrong_table")

    def test_skip_sqlite_logging(self):
        """
        check that for sqlite connection user name is skipped
        """

        self.context.process_command_line("ls")  # run command that requires connection make it to connect
        self.assertEqual("anonymous", self.context.user_name)

    def test_log(self):
        """
        log. general test
        """
        self.context.process_command_line("log")