176e6818aSopenharmony_ci#!/usr/bin/env python3
276e6818aSopenharmony_ci# coding=utf-8
376e6818aSopenharmony_ci
476e6818aSopenharmony_ci#
576e6818aSopenharmony_ci# Copyright (c) 2022 Huawei Device Co., Ltd.
676e6818aSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
776e6818aSopenharmony_ci# you may not use this file except in compliance with the License.
876e6818aSopenharmony_ci# You may obtain a copy of the License at
976e6818aSopenharmony_ci#
1076e6818aSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
1176e6818aSopenharmony_ci#
1276e6818aSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
1376e6818aSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
1476e6818aSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1576e6818aSopenharmony_ci# See the License for the specific language governing permissions and
1676e6818aSopenharmony_ci# limitations under the License.
1776e6818aSopenharmony_ci#
1876e6818aSopenharmony_ci
1976e6818aSopenharmony_ci
2076e6818aSopenharmony_cifrom datetime import datetime
2176e6818aSopenharmony_cifrom inspect import stack
2276e6818aSopenharmony_ciimport json
2376e6818aSopenharmony_ciimport os
2476e6818aSopenharmony_ciimport time
2576e6818aSopenharmony_cifrom xdevice import get_cst_time
2676e6818aSopenharmony_ci
2776e6818aSopenharmony_ci
2876e6818aSopenharmony_ciclass TS():
2976e6818aSopenharmony_ci    '''
3076e6818aSopenharmony_ci    performace test class
3176e6818aSopenharmony_ci    '''
3276e6818aSopenharmony_ci    inner_stack = stack()
3376e6818aSopenharmony_ci    total = 0
3476e6818aSopenharmony_ci    times = 0
3576e6818aSopenharmony_ci
3676e6818aSopenharmony_ci    @staticmethod
3776e6818aSopenharmony_ci    def start():
3876e6818aSopenharmony_ci        try:
3976e6818aSopenharmony_ci            TS.inner_stack.append(time.time())
4076e6818aSopenharmony_ci        except Exception:
4176e6818aSopenharmony_ci            from devicetest.log.logger import DeviceTestLog as log
4276e6818aSopenharmony_ci            log.error("start TS exception.", is_traceback=True)
4376e6818aSopenharmony_ci
4476e6818aSopenharmony_ci    @staticmethod
4576e6818aSopenharmony_ci    def average(prefix=''):
4676e6818aSopenharmony_ci        if TS.times == 0:
4776e6818aSopenharmony_ci            TS.times = 1
4876e6818aSopenharmony_ci        return ("%s ==> average: %.3f ms" % (prefix, TS.total / TS.times))
4976e6818aSopenharmony_ci
5076e6818aSopenharmony_ci    @staticmethod
5176e6818aSopenharmony_ci    def stop(prefix=''):
5276e6818aSopenharmony_ci        try:
5376e6818aSopenharmony_ci            if len(TS.inner_stack) > 0:
5476e6818aSopenharmony_ci                cur_time = (time.time() - TS.inner_stack.pop()) * 1000
5576e6818aSopenharmony_ci                TS.total += cur_time
5676e6818aSopenharmony_ci                TS.times += 1
5776e6818aSopenharmony_ci                return cur_time
5876e6818aSopenharmony_ci            return None
5976e6818aSopenharmony_ci        except Exception:
6076e6818aSopenharmony_ci            from devicetest.log.logger import DeviceTestLog as log
6176e6818aSopenharmony_ci            log.error("stop TS exception.", is_traceback=True)
6276e6818aSopenharmony_ci            return None
6376e6818aSopenharmony_ci
6476e6818aSopenharmony_ci
6576e6818aSopenharmony_ciclass TimeHandler:
6676e6818aSopenharmony_ci
6776e6818aSopenharmony_ci    @classmethod
6876e6818aSopenharmony_ci    def get_formated_datetime(cls, time_value=None):
6976e6818aSopenharmony_ci        """
7076e6818aSopenharmony_ci        get formated datetime that only contains year month day hour minute
7176e6818aSopenharmony_ci        and second information
7276e6818aSopenharmony_ci
7376e6818aSopenharmony_ci        Obtains the datetime object, which contains only the year, month,
7476e6818aSopenharmony_ci        day, hour, minute, and second information.
7576e6818aSopenharmony_ci        Args:
7676e6818aSopenharmony_ci            time_value: Time to be processed. If the time does not exist,
7776e6818aSopenharmony_ci                        the current time is used.
7876e6818aSopenharmony_ci        Returns:
7976e6818aSopenharmony_ci            Datetime object that has been processed. The object can be
8076e6818aSopenharmony_ci            converted to a character string, The value is in the format of
8176e6818aSopenharmony_ci            2011-12-15 16:08:35.
8276e6818aSopenharmony_ci        """
8376e6818aSopenharmony_ci        if time_value is None:
8476e6818aSopenharmony_ci            time_value = time.time()
8576e6818aSopenharmony_ci        return datetime(*(time.localtime(time_value)[:6]))
8676e6818aSopenharmony_ci
8776e6818aSopenharmony_ci    @classmethod
8876e6818aSopenharmony_ci    def get_formated_datetime_name(cls, time_val=None):
8976e6818aSopenharmony_ci        """
9076e6818aSopenharmony_ci        get formated datetime used to generate a file that only contains
9176e6818aSopenharmony_ci        year month day hour minute and second information
9276e6818aSopenharmony_ci
9376e6818aSopenharmony_ci        Obtains the current character string that contains only time
9476e6818aSopenharmony_ci        information and underscores.
9576e6818aSopenharmony_ci        Args:
9676e6818aSopenharmony_ci            time_val: Time to be processed. If the time does not exist,
9776e6818aSopenharmony_ci                        the current time is used.
9876e6818aSopenharmony_ci        Returns:
9976e6818aSopenharmony_ci            The value is a character string in the format of
10076e6818aSopenharmony_ci            2011_12_15_16_08_35
10176e6818aSopenharmony_ci        """
10276e6818aSopenharmony_ci        result_list = []
10376e6818aSopenharmony_ci        for _str in cls.get_formated_datetime(time_val).timetuple()[:6]:
10476e6818aSopenharmony_ci            result_list.append(str("%02d" % _str))
10576e6818aSopenharmony_ci        return "_".join(result_list)
10676e6818aSopenharmony_ci
10776e6818aSopenharmony_ci    @classmethod
10876e6818aSopenharmony_ci    def convert_formated_name(cls, convert_time,
10976e6818aSopenharmony_ci                              formate="%Y-%m-%d %H:%M:%S.%f"):
11076e6818aSopenharmony_ci        """
11176e6818aSopenharmony_ci        Args:
11276e6818aSopenharmony_ci            convert_time: Time value to be processed
11376e6818aSopenharmony_ci        Returns: 1460907045 Format
11476e6818aSopenharmony_ci        """
11576e6818aSopenharmony_ci        strpt_time = time.strptime(convert_time, formate)
11676e6818aSopenharmony_ci        return int(time.mktime(strpt_time))
11776e6818aSopenharmony_ci
11876e6818aSopenharmony_ci    @classmethod
11976e6818aSopenharmony_ci    def get_now_datetime(cls, time_format="%Y%m%d%H%M%S%f"):
12076e6818aSopenharmony_ci        """
12176e6818aSopenharmony_ci        Args:
12276e6818aSopenharmony_ci            time_format: Obtain the time format, for example,
12376e6818aSopenharmony_ci                        f="%Y-%m-%d %H:%M:%S.%f",
12476e6818aSopenharmony_ci            The time in 2017-04-25 11:26:33.293963 format is returned.
12576e6818aSopenharmony_ci        Returns: String
12676e6818aSopenharmony_ci        """
12776e6818aSopenharmony_ci        return get_cst_time().strftime(time_format)
12876e6818aSopenharmony_ci
12976e6818aSopenharmony_ci    @classmethod
13076e6818aSopenharmony_ci    def get_timeout_value(cls):
13176e6818aSopenharmony_ci        project_path = \
13276e6818aSopenharmony_ci            os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
13376e6818aSopenharmony_ci        config = os.path.join(project_path, "project.config")
13476e6818aSopenharmony_ci        with open(config, 'r', encoding='utf-8') as f_time:
13576e6818aSopenharmony_ci            conf = json.load(f_time)
13676e6818aSopenharmony_ci            get_case_time = conf.get("caseTimeOut", 60 * 60 * 1)
13776e6818aSopenharmony_ci            return get_case_time
13876e6818aSopenharmony_ci
13976e6818aSopenharmony_ci    @classmethod
14076e6818aSopenharmony_ci    def get_formated_time(cls, time_format='%Y-%m-%d %H:%M:%S'):
14176e6818aSopenharmony_ci        """
14276e6818aSopenharmony_ci        get current time, for example: 2020-08-04 15:48:04
14376e6818aSopenharmony_ci        :param time_format: time format
14476e6818aSopenharmony_ci        :return: current time
14576e6818aSopenharmony_ci        """
14676e6818aSopenharmony_ci        return get_cst_time().strftime(time_format)
14776e6818aSopenharmony_ci
14876e6818aSopenharmony_ci    @classmethod
14976e6818aSopenharmony_ci    def get_interval_timestamp(cls, start_format_time, end_format_time,
15076e6818aSopenharmony_ci                               time_format='%Y-%m-%d %H:%M:%S'):
15176e6818aSopenharmony_ci        try:
15276e6818aSopenharmony_ci            start_timestamp = datetime.strptime(
15376e6818aSopenharmony_ci                start_format_time, time_format).timestamp()
15476e6818aSopenharmony_ci            end_timestamp = datetime.strptime(
15576e6818aSopenharmony_ci                end_format_time, time_format).timestamp()
15676e6818aSopenharmony_ci            interval_timestamp = round(end_timestamp - start_timestamp, 3)
15776e6818aSopenharmony_ci            return interval_timestamp
15876e6818aSopenharmony_ci        except Exception:
15976e6818aSopenharmony_ci            return 0.00
16076e6818aSopenharmony_ci
16176e6818aSopenharmony_ci    @staticmethod
16276e6818aSopenharmony_ci    def get_current_epoch_time():
16376e6818aSopenharmony_ci        """Current epoch time in milliseconds.
16476e6818aSopenharmony_ci        Returns:
16576e6818aSopenharmony_ci            An integer representing the current epoch time in milliseconds.
16676e6818aSopenharmony_ci        """
16776e6818aSopenharmony_ci        return int(round(time.time() * 1000))
16876e6818aSopenharmony_ci
16976e6818aSopenharmony_ci    @staticmethod
17076e6818aSopenharmony_ci    def get_current_human_time():
17176e6818aSopenharmony_ci        """Returns the current time in human readable format.
17276e6818aSopenharmony_ci        Returns:
17376e6818aSopenharmony_ci            The current time stamp in Month-Day-Year Hour:Min:Sec format.
17476e6818aSopenharmony_ci        """
17576e6818aSopenharmony_ci        return time.strftime("%m-%d-%Y %H:%M:%S ")