• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef COMMON_UTILITIES_HPP
17 #define COMMON_UTILITIES_HPP
18 
19 #include <array>
20 #include <chrono>
21 #include <string_view>
22 
23 #ifdef __OHOS__
24 #include "hilog/log.h"
25 #endif
26 
27 #ifdef NDEBUG
28 #define DCHECK(cond) do { (void)sizeof(cond);} while (0)
29 #else
30 
31 #include <cassert>
32 
33 #define DCHECK(cond) assert((cond))
34 #endif
35 
36 #define FORCE_INLINE __attribute__((always_inline)) inline
37 
38 namespace OHOS::uitest {
39     using CStr = const char *;
40     constexpr size_t INDEX_ZERO = 0;
41     constexpr size_t INDEX_ONE = 1;
42     constexpr size_t INDEX_TWO = 2;
43     constexpr size_t INDEX_THREE = 3;
44     constexpr size_t INDEX_FOUR = 4;
45     constexpr int32_t ZERO = 0;
46     constexpr int32_t ONE = 1;
47     constexpr int32_t TWO = 2;
48     constexpr int32_t THREE = 3;
49     constexpr int32_t FOUR = 4;
50 
51     /**Get current time millisecond.*/
GetCurrentMillisecond()52     inline uint64_t GetCurrentMillisecond()
53     {
54         using namespace std::chrono;
55         return time_point_cast<milliseconds>(steady_clock::now()).time_since_epoch().count();
56     }
57 
58     /**Get current time microseconds.*/
GetCurrentMicroseconds()59     inline uint64_t GetCurrentMicroseconds()
60     {
61         using namespace std::chrono;
62         return time_point_cast<microseconds>(steady_clock::now()).time_since_epoch().count();
63     }
64 
65     // log tag length limit
66     constexpr uint8_t MAX_LOG_TAG_LEN = 64;
67 
68     /**Generates log-tag by fileName and lineNumber, must be 'constexpr' to ensure the efficiency of Logger.*/
GenLogTag(std::string_view fp,std::string_view func)69     constexpr std::array<char, MAX_LOG_TAG_LEN> GenLogTag(std::string_view fp, std::string_view func)
70     {
71         constexpr uint8_t MAX_CONTENT_LEN = MAX_LOG_TAG_LEN - 1;
72         std::array<char, MAX_LOG_TAG_LEN> chars = {0};
73         size_t pos = fp.find_last_of('/');
74         if (pos == std::string_view::npos) {
75             pos = 0;
76         }
77         uint8_t writeCursor = 0;
78         chars[writeCursor++] = '[';
79         for (size_t offSet = pos + 1; offSet < fp.length() && writeCursor < MAX_CONTENT_LEN; offSet++) {
80             chars[writeCursor++] = fp[offSet];
81         }
82         if (writeCursor < MAX_CONTENT_LEN) {
83             chars[writeCursor++] = ':';
84         }
85         if (writeCursor < MAX_CONTENT_LEN) {
86             chars[writeCursor++] = '(';
87         }
88         for (size_t offSet = 0; offSet < func.length() && writeCursor < MAX_CONTENT_LEN; offSet++) {
89             chars[writeCursor++] = func[offSet];
90         }
91         if (writeCursor < MAX_CONTENT_LEN) {
92             chars[writeCursor++] = ')';
93         }
94         if (writeCursor < MAX_CONTENT_LEN) {
95             chars[writeCursor++] = ']';
96         }
97         // record the actual tag-length in the end byte
98         chars[MAX_CONTENT_LEN] = writeCursor;
99         return chars;
100     }
101 
102     // log level
103     enum LogRank : uint8_t {
104         DEBUG = 3, INFO = 4, WARN = 5, ERROR = 6
105     };
106 
107 #ifdef __OHOS__
108 #ifndef LOG_TAG
109 #define LOG_TAG "UiTestKit"
110 #endif
111 // print pretty log with pretty format, auto-generate tag by fileName and functionName at compile time
112 #define LOG(LEVEL, FMT, VARS...) do { \
113     static constexpr auto tagChars= GenLogTag(__FILE__, __FUNCTION__); \
114     static constexpr int8_t tagLen = tagChars[MAX_LOG_TAG_LEN - 1];   \
115     if constexpr (tagLen > 0) { \
116         auto tag = std::string_view(tagChars.data(), tagLen); \
117         static constexpr LogType type = LogType::LOG_CORE; \
118         static constexpr uint32_t domain = 0xD003100;                \
119         HiLogPrint(type, static_cast<LogLevel>(LEVEL), domain, LOG_TAG, "%{public}s " FMT, tag.data(), ##VARS); \
120     } \
121 }while (0)
122 #else
123 // nop logger
124 #define LOG(LEVEL, FMT, VARS...) do {}while (0)
125 #endif
126 
127 // print debug log
128 #define LOG_D(FMT, VARS...) LOG(LogRank::DEBUG, FMT, ##VARS)
129 // print info log
130 #define LOG_I(FMT, VARS...) LOG(LogRank::INFO, FMT, ##VARS)
131 // print warning log
132 #define LOG_W(FMT, VARS...) LOG(LogRank::WARN, FMT, ##VARS)
133 // print error log
134 #define LOG_E(FMT, VARS...) LOG(LogRank::ERROR, FMT, ##VARS)
135 }
136 
137 #endif