Exemple #1
0
    def signal_test_case(self, params):
        try:
            data = handle_testcase(params)
            if "test_case_id" in data:
                # Replace invalid characters in test_case_id with '_'.
                data["test_case_id"] = self._replace_invalid_url_characters(
                    data["test_case_id"])

            # get the fixup from the pattern_dict
            res = self.signal_match.match(data,
                                          fixupdict=self.pattern.fixupdict())
        except (JobError, TestError) as exc:
            self.logger.error(str(exc))
            return True

        p_res = self.get_namespace_data(action='test',
                                        label=self.signal_director.test_uuid,
                                        key='results')
        if not p_res:
            p_res = OrderedDict()
            self.set_namespace_data(action='test',
                                    label=self.signal_director.test_uuid,
                                    key='results',
                                    value=p_res)

        # prevent losing data in the update
        # FIXME: support parameters and retries
        if res["test_case_id"] in p_res:
            raise JobError("Duplicate test_case_id in results: %s",
                           res["test_case_id"])
        # turn the result dict inside out to get the unique
        # test_case_id/testset_name as key and result as value
        res_data = {
            'definition': self.definition,
            'case': res["test_case_id"],
            'result': res["result"]
        }
        # check for measurements
        if 'measurement' in res:
            try:
                measurement = decimal.Decimal(res['measurement'])
            except decimal.InvalidOperation:
                raise TestError("Invalid measurement %s", res['measurement'])
            res_data['measurement'] = measurement
            if 'units' in res:
                res_data['units'] = res['units']

        if self.testset_name:
            res_data['set'] = self.testset_name
            self.report[res['test_case_id']] = {
                'set': self.testset_name,
                'result': res['result']
            }
        else:
            self.report[res['test_case_id']] = res['result']
        # Send the results back
        self.logger.results(res_data)  # pylint: disable=no-member
Exemple #2
0
    def check_patterns(self, event, test_connection):
        """
        Defines the base set of pattern responses.
        Stores the results of testcases inside the TestAction
        Call from subclasses before checking subclass-specific events.
        """
        ret_val = False
        if event == "exit":
            self.logger.info("ok: lava_test_shell seems to have completed")

        elif event == "eof":
            self.logger.warning("err: lava_test_shell connection dropped")
            self.errors = "lava_test_shell connection dropped"

        elif event == "timeout":
            # if target.is_booted():
            #    target.reset_boot()
            self.logger.warning("err: lava_test_shell has timed out")
            self.errors = "lava_test_shell has timed out"

        elif event == "signal":
            name, params = test_connection.match.groups()
            self.logger.debug("Received signal: <%s> %s" % (name, params))
            params = params.split()
            if name == "STARTRUN":
                self.signal_director.test_uuid = params[1]
                self.suite = params[0]
                self.logger.debug("Starting test suite: %s" % self.suite)
            #    self._handle_testrun(params)
            elif name == "TESTCASE":
                data = handle_testcase(params)
                res = self.match.match(data)  # FIXME: rename!
                self.logger.debug("res: %s data: %s" % (res, data))
                p_res = self.data["test"][self.signal_director.test_uuid].setdefault("results", OrderedDict())

                # prevent losing data in the update
                # FIXME: support parameters and retries
                if res["test_case_id"] in p_res:
                    raise JobError("Duplicate test_case_id in results: %s", res["test_case_id"])
                # turn the result dict inside out to get the unique test_case_id as key and result as value
                self.logger.results({"testsuite": self.suite, res["test_case_id"]: res["result"]})
                self.report.update({res["test_case_id"]: res["result"]})

            try:
                self.signal_director.signal(name, params)
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            # force output in case there was none but minimal content to increase speed.
            test_connection.sendline("#")
            ret_val = True

        elif event == "test_case":
            match = test_connection.match
            if match is pexpect.TIMEOUT:
                # if target.is_booted():
                #    target.reset_boot()
                self.logger.warning("err: lava_test_shell has timed out (test_case)")
            else:
                res = self.match.match(match.groupdict())  # FIXME: rename!
                self.logger.debug("outer_loop_result: %s" % res)
                # self.data["test"][self.signal_director.test_uuid].setdefault("results", {})
                # self.data["test"][self.signal_director.test_uuid]["results"].update({
                #     {res["test_case_id"]: res}
                # })
                ret_val = True

        return ret_val
Exemple #3
0
    def check_patterns(self, event, test_connection, check_char):  # pylint: disable=too-many-locals
        """
        Defines the base set of pattern responses.
        Stores the results of testcases inside the TestAction
        Call from subclasses before checking subclass-specific events.
        """
        ret_val = False
        if event == "exit":
            self.logger.info("ok: lava_test_shell seems to have completed")
            self.testset_name = None

        elif event == "eof":
            self.logger.warning("err: lava_test_shell connection dropped")
            self.errors = "lava_test_shell connection dropped"
            self.testset_name = None

        elif event == "timeout":
            self.logger.warning("err: lava_test_shell has timed out")
            self.errors = "lava_test_shell has timed out"
            self.testset_name = None

        elif event == "signal":
            name, params = test_connection.match.groups()
            self.logger.debug("Received signal: <%s> %s" % (name, params))
            params = params.split()
            if name == "STARTRUN":
                self.signal_director.test_uuid = params[1]
                self.definition = params[0]
                uuid = params[1]
                self.start = time.time()
                self.logger.debug("Starting test definition: %s" % self.definition)
                self.logger.info("Starting test lava.%s (%s)", self.definition, uuid)
                self.start = time.time()
                # set the pattern for this run from pattern_dict
                testdef_index = self.get_common_data('test-definition', 'testdef_index')
                uuid_list = self.get_common_data('repo-action', 'uuid-list')
                for key, value in testdef_index.items():
                    if self.definition == "%s_%s" % (key, value):
                        pattern = self.job.context['test'][uuid_list[key]]['testdef_pattern']['pattern']
                        fixup = self.job.context['test'][uuid_list[key]]['testdef_pattern']['fixupdict']
                        self.patterns.update({'test_case_result': re.compile(pattern, re.M)})
                        self.pattern.update(pattern, fixup)
                        self.logger.info("Enabling test definition pattern %r" % pattern)
                self.logger.results({
                    "definition": "lava",
                    "case": self.definition,
                    "uuid": uuid,
                    # The test is marked as failed and updated to "pass" when finished.
                    # If something goes wrong then it will stay to "fail".
                    "result": "fail"
                })
            elif name == "ENDRUN":
                self.definition = params[0]
                uuid = params[1]
                # remove the pattern for this run from pattern_dict
                self._reset_patterns()
                self.logger.info("Ending use of test pattern.")
                self.logger.info("Ending test lava.%s (%s), duration %.02f",
                                 self.definition, uuid,
                                 time.time() - self.start)
                self.logger.results({
                    "definition": "lava",
                    "case": self.definition,
                    "uuid": uuid,
                    "duration": "%.02f" % (time.time() - self.start),
                    "result": "pass"
                })
                self.start = None
            elif name == "TESTCASE":
                data = handle_testcase(params)
                # get the fixup from the pattern_dict
                res = self.signal_match.match(data, fixupdict=self.pattern.fixupdict())
                p_res = self.data["test"][
                    self.signal_director.test_uuid
                ].setdefault("results", OrderedDict())

                # prevent losing data in the update
                # FIXME: support parameters and retries
                if res["test_case_id"] in p_res:
                    raise JobError(
                        "Duplicate test_case_id in results: %s",
                        res["test_case_id"])
                # check for measurements
                calc = {}
                if 'measurement' in res:
                    calc['measurement'] = res['measurement']
                if 'measurement' in res and 'units' in res:
                    calc['units'] = res['units']
                # turn the result dict inside out to get the unique
                # test_case_id/testset_name as key and result as value
                if self.testset_name:
                    res_data = {
                        'definition': self.definition,
                        'case': res["test_case_id"],
                        'set': self.testset_name,
                        'result': res["result"]
                    }
                    res_data.update(calc)
                    self.logger.results(res_data)
                    self.report.update({
                        "set": self.testset_name,
                        "case": res["test_case_id"],
                        "result": res["result"]})
                else:
                    res_data = {
                        'definition': self.definition,
                        'case': res["test_case_id"],
                        'result': res["result"]}
                    res_data.update(calc)
                    self.logger.results(res_data)
                    self.report.update({
                        res["test_case_id"]: res["result"]
                    })
            elif name == "TESTSET":
                action = params.pop(0)
                if action == "START":
                    name = "testset_" + action.lower()
                    try:
                        self.testset_name = params[0]
                    except IndexError:
                        raise JobError("Test set declared without a name")
                    self.logger.info("Starting test_set %s", self.testset_name)
                elif action == "STOP":
                    self.logger.info("Closing test_set %s", self.testset_name)
                    self.testset_name = None
                    name = "testset_" + action.lower()

            try:
                self.signal_director.signal(name, params)
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            ret_val = True

        elif event == "test_case":
            match = test_connection.match
            if match is pexpect.TIMEOUT:
                self.logger.warning("err: lava_test_shell has timed out (test_case)")
            else:
                res = self.signal_match.match(match.groupdict())
                self.logger.debug("outer_loop_result: %s" % res)
                ret_val = True
        elif event == 'test_case_result':
            res = test_connection.match.groupdict()
            if res:
                # FIXME: make this a function
                # check for measurements
                calc = {}
                if 'measurement' in res:
                    calc['measurement'] = res['measurement']
                if 'measurement' in res and 'units' in res:
                    calc['units'] = res['units']
                res_data = {
                    'definition': self.definition,
                    'case': res["test_case_id"],
                    'result': res["result"]}
                res_data.update(calc)
                self.logger.results(res_data)
                self.report.update({
                    res["test_case_id"]: res["result"]
                })
            ret_val = True

        return ret_val
Exemple #4
0
    def check_patterns(self, event, test_connection):
        """
        Defines the base set of pattern responses.
        Stores the results of testcases inside the TestAction
        Call from subclasses before checking subclass-specific events.
        """
        ret_val = False
        if event == "exit":
            self.logger.info("ok: lava_test_shell seems to have completed")

        elif event == "eof":
            self.logger.warning("err: lava_test_shell connection dropped")
            self.errors = "lava_test_shell connection dropped"

        elif event == "timeout":
            # if target.is_booted():
            #    target.reset_boot()
            self.logger.warning("err: lava_test_shell has timed out")
            self.errors = "lava_test_shell has timed out"

        elif event == "signal":
            name, params = test_connection.match.groups()
            self.logger.debug("Received signal: <%s> %s" % (name, params))
            params = params.split()
            if name == "STARTRUN":
                self.signal_director.test_uuid = params[1]
                self.suite = params[0]
                self.logger.debug("Starting test suite: %s" % self.suite)
            #    self._handle_testrun(params)
            elif name == "TESTCASE":
                data = handle_testcase(params)
                res = self.match.match(data)  # FIXME: rename!
                self.logger.debug("res: %s data: %s" % (res, data))
                p_res = self.data["test"][
                    self.signal_director.test_uuid].setdefault(
                        "results", OrderedDict())

                # prevent losing data in the update
                # FIXME: support parameters and retries
                if res["test_case_id"] in p_res:
                    raise JobError("Duplicate test_case_id in results: %s",
                                   res["test_case_id"])
                # turn the result dict inside out to get the unique test_case_id as key and result as value
                self.logger.results({
                    'testsuite': self.suite,
                    res["test_case_id"]: res["result"]
                })
                self.report.update({res["test_case_id"]: res["result"]})

            try:
                self.signal_director.signal(name, params)
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            # force output in case there was none but minimal content to increase speed.
            test_connection.sendline("#")
            ret_val = True

        elif event == "test_case":
            match = test_connection.match
            if match is pexpect.TIMEOUT:
                # if target.is_booted():
                #    target.reset_boot()
                self.logger.warning(
                    "err: lava_test_shell has timed out (test_case)")
            else:
                res = self.match.match(match.groupdict())  # FIXME: rename!
                self.logger.debug("outer_loop_result: %s" % res)
                # self.data["test"][self.signal_director.test_uuid].setdefault("results", {})
                # self.data["test"][self.signal_director.test_uuid]["results"].update({
                #     {res["test_case_id"]: res}
                # })
                ret_val = True

        return ret_val
Exemple #5
0
    def check_patterns(self, event, test_connection, check_char):  # pylint: disable=too-many-locals
        """
        Defines the base set of pattern responses.
        Stores the results of testcases inside the TestAction
        Call from subclasses before checking subclass-specific events.
        """
        ret_val = False
        if event == "exit":
            self.logger.info("ok: lava_test_shell seems to have completed")
            self.testset_name = None

        elif event == "eof":
            self.logger.warning("err: lava_test_shell connection dropped")
            self.errors = "lava_test_shell connection dropped"
            self.testset_name = None

        elif event == "timeout":
            self.logger.warning("err: lava_test_shell has timed out")
            self.errors = "lava_test_shell has timed out"
            self.testset_name = None

        elif event == "signal":
            name, params = test_connection.match.groups()
            self.logger.debug("Received signal: <%s> %s" % (name, params))
            params = params.split()
            if name == "STARTRUN":
                self.signal_director.test_uuid = params[1]
                self.definition = params[0]
                uuid = params[1]
                self.start = time.time()
                self.logger.info("Starting test lava.%s (%s)", self.definition, uuid)
                # set the pattern for this run from pattern_dict
                testdef_index = self.get_common_data('test-definition', 'testdef_index')
                uuid_list = self.get_common_data('repo-action', 'uuid-list')
                for key, value in testdef_index.items():
                    if self.definition == "%s_%s" % (key, value):
                        pattern = self.job.context['test'][uuid_list[key]]['testdef_pattern']['pattern']
                        fixup = self.job.context['test'][uuid_list[key]]['testdef_pattern']['fixupdict']
                        self.patterns.update({'test_case_result': re.compile(pattern, re.M)})
                        self.pattern.update(pattern, fixup)
                        self.logger.info("Enabling test definition pattern %r" % pattern)
                self.logger.results({
                    "definition": "lava",
                    "case": self.definition,
                    "uuid": uuid,
                    # The test is marked as failed and updated to "pass" when finished.
                    # If something goes wrong then it will stay to "fail".
                    "result": "fail"
                })
            elif name == "ENDRUN":
                self.definition = params[0]
                uuid = params[1]
                # remove the pattern for this run from pattern_dict
                self._reset_patterns()
                # catch error in ENDRUN being handled without STARTRUN
                if not self.start:
                    self.start = time.time()
                self.logger.info("Ending use of test pattern.")
                self.logger.info("Ending test lava.%s (%s), duration %.02f",
                                 self.definition, uuid,
                                 time.time() - self.start)
                self.logger.results({
                    "definition": "lava",
                    "case": self.definition,
                    "uuid": uuid,
                    "duration": "%.02f" % (time.time() - self.start),
                    "result": "pass"
                })
                self.start = None
            elif name == "TESTCASE":
                try:
                    data = handle_testcase(params)
                    # get the fixup from the pattern_dict
                    res = self.signal_match.match(data, fixupdict=self.pattern.fixupdict())
                except (JobError, TestError) as exc:
                    self.logger.error(str(exc))
                    return True

                p_res = self.data["test"][
                    self.signal_director.test_uuid
                ].setdefault("results", OrderedDict())

                # prevent losing data in the update
                # FIXME: support parameters and retries
                if res["test_case_id"] in p_res:
                    raise JobError(
                        "Duplicate test_case_id in results: %s",
                        res["test_case_id"])
                # turn the result dict inside out to get the unique
                # test_case_id/testset_name as key and result as value
                res_data = {
                    'definition': self.definition,
                    'case': res["test_case_id"],
                    'result': res["result"]
                }
                # check for measurements
                if 'measurement' in res:
                    res_data['measurement'] = res['measurement']
                    if 'units' in res:
                        res_data['units'] = res['units']

                if self.testset_name:
                    res_data['set'] = self.testset_name
                    self.report[res['test_case_id']] = {
                        'set': self.testset_name,
                        'result': res['result']
                    }
                else:
                    self.report[res['test_case_id']] = res['result']
                # Send the results back
                self.logger.results(res_data)

            elif name == "TESTSET":
                action = params.pop(0)
                if action == "START":
                    name = "testset_" + action.lower()
                    try:
                        self.testset_name = params[0]
                    except IndexError:
                        raise JobError("Test set declared without a name")
                    self.logger.info("Starting test_set %s", self.testset_name)
                elif action == "STOP":
                    self.logger.info("Closing test_set %s", self.testset_name)
                    self.testset_name = None
                    name = "testset_" + action.lower()

            try:
                self.signal_director.signal(name, params)
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            ret_val = True

        elif event == "test_case":
            match = test_connection.match
            if match is pexpect.TIMEOUT:
                self.logger.warning("err: lava_test_shell has timed out (test_case)")
            else:
                res = self.signal_match.match(match.groupdict())
                self.logger.debug("outer_loop_result: %s" % res)
                ret_val = True

        elif event == 'test_case_result':
            res = test_connection.match.groupdict()
            if res:
                res_data = {
                    'definition': self.definition,
                    'case': res["test_case_id"],
                    'result': res["result"]
                }
                # check for measurements
                if 'measurement' in res:
                    res_data['measurement'] = res['measurement']
                    if 'units' in res:
                        res_data['units'] = res['units']

                self.logger.results(res_data)
                self.report[res["test_case_id"]] = res["result"]
            ret_val = True

        return ret_val