1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
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 #include <hwext/gtest-ext.h>
17 #include <hwext/gtest-tag.h>
18
19 #include "span_join.h"
20 #include "trace_streamer_selector.h"
21
22 using namespace testing::ext;
23 namespace SysTuning {
24 namespace TraceStreamer {
25 class SpanJoinTest : public ::testing::Test {
26 public:
SetUp()27 void SetUp() {}
TearDown()28 void TearDown()
29 {
30 if (stmt_ != nullptr) {
31 sqlite3_finalize(stmt_);
32 }
33 }
34
35 public:
Prepare(const std::string &sql)36 void Prepare(const std::string &sql)
37 {
38 int32_t size = static_cast<int32_t>(sql.size());
39 sqlite3_prepare_v2(stream_.traceDataCache_->db_, sql.c_str(), size, &stmt_, nullptr);
40 }
41
Step(const std::string &sql)42 void Step(const std::string &sql)
43 {
44 Prepare(sql);
45 sqlite3_step(stmt_);
46 sqlite3_finalize(stmt_);
47 stmt_ = nullptr;
48 }
49
Next(const std::vector<int64_t> column)50 void Next(const std::vector<int64_t> column)
51 {
52 sqlite3_step(stmt_);
53 for (size_t i = 0; i < column.size(); ++i) {
54 sqlite3_column_int64(stmt_, static_cast<int32_t>(i));
55 }
56 }
57 sqlite3_stmt *stmt_;
58 TraceStreamerSelector stream_ = {};
59 };
60 /**
61 * @tc.name: SpanjoinTwoTable
62 * @tc.desc: SpanjoinTwoTable with ts,dur,and partitioned cpu
63 * @tc.type: FUNC
64 */
HWTEST_F(SpanJoinTest, SpanjoinTwoTable, TestSize.Level1)65 HWTEST_F(SpanJoinTest, SpanjoinTwoTable, TestSize.Level1)
66 {
67 TS_LOGI("test30-1");
68 Step("CREATE TABLE FirstTable(ts UNSIGNED INT PRIMARY KEY, dur UNSIGNED INT, cpu UNSIGNED INT);");
69 Step("CREATE TABLE SecondTable(ts UNSIGNED INT PRIMARY KEY, dur UNSIGNED INT, cpu UNSIGNED INT);");
70 Step(
71 "CREATE VIRTUAL TABLE SpanjoinTable using span_join(FirstTable partitioned cpu, SecondTable partitioned cpu);");
72 Step("INSERT INTO FirstTable VALUES(100, 10, 5);");
73 Step("INSERT INTO FirstTable VALUES(110, 50, 5);");
74 Step("INSERT INTO FirstTable VALUES(120, 100, 2);");
75 Step("INSERT INTO FirstTable VALUES(160, 10, 5);");
76 Step("INSERT INTO SecondTable VALUES(100, 5, 5);");
77 Step("INSERT INTO SecondTable VALUES(105, 100, 5);");
78 Step("INSERT INTO SecondTable VALUES(110, 50, 2);");
79 Step("INSERT INTO SecondTable VALUES(160, 100, 2);");
80 Prepare("SELECT * FROM SpanjoinTable");
81 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_ROW);
82 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 120);
83 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 40);
84 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 2);
85 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_ROW);
86 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 160);
87 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 60);
88 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 2);
89 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_ROW);
90 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 100);
91 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 5);
92 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 5);
93 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_ROW);
94 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 105);
95 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 5);
96 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 5);
97 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_ROW);
98 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 110);
99 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 50);
100 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 5);
101 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_ROW);
102 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 160);
103 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 10);
104 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 5);
105 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_DONE);
106 }
107 /**
108 * @tc.name: SpanjoinTwoTableWithoutPartitioned
109 * @tc.desc: SpanjoinTwoTable with ts,dur,and without partitioned cpu
110 * @tc.type: FUNC
111 */
HWTEST_F(SpanJoinTest, SpanjoinTwoTableWithoutPartitioned, TestSize.Level2)112 HWTEST_F(SpanJoinTest, SpanjoinTwoTableWithoutPartitioned, TestSize.Level2)
113 {
114 TS_LOGI("test30-2");
115 Step("CREATE TABLE FirstTable(ts UNSIGNED INT PRIMARY KEY, dur UNSIGNED INT);");
116 Step("CREATE TABLE SecondTable(ts UNSIGNED INT PRIMARY KEY, dur UNSIGNED INT);");
117 Step(
118 "CREATE VIRTUAL TABLE SpanjoinTable using span_join(FirstTable partitioned cpu, SecondTable partitioned cpu);");
119 Step("INSERT INTO FirstTable VALUES(100, 10);");
120 Step("INSERT INTO FirstTable VALUES(110, 50);");
121 Step("INSERT INTO FirstTable VALUES(120, 100);");
122 Step("INSERT INTO FirstTable VALUES(160, 10);");
123 Step("INSERT INTO SecondTable VALUES(100, 5);");
124 Step("INSERT INTO SecondTable VALUES(105, 100);");
125 Step("INSERT INTO SecondTable VALUES(110, 50);");
126 Step("INSERT INTO SecondTable VALUES(160, 100);");
127 Prepare("SELECT * FROM SpanjoinTable");
128 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_DONE);
129 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
130 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
131 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
132 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_DONE);
133 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
134 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
135 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
136 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_DONE);
137 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
138 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
139 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
140 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_DONE);
141 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
142 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
143 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
144 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_DONE);
145 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
146 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
147 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
148 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_DONE);
149 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
150 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
151 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
152 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_DONE);
153 }
154 /**
155 * @tc.name: SpanjoinTwoTableWithoutTs
156 * @tc.desc: SpanjoinTwoTableWithoutTs with dur, partitioned cpu and without ts
157 * @tc.type: FUNC
158 */
HWTEST_F(SpanJoinTest, SpanjoinTwoTableWithoutTs, TestSize.Level3)159 HWTEST_F(SpanJoinTest, SpanjoinTwoTableWithoutTs, TestSize.Level3)
160 {
161 TS_LOGI("test30-3");
162 Step("CREATE TABLE FirstTable(dur UNSIGNED INT, cpu UNSIGNED INT);");
163 Step("CREATE TABLE SecondTable(dur UNSIGNED INT, cpu UNSIGNED INT);");
164 Step(
165 "CREATE VIRTUAL TABLE SpanjoinTable using span_join(FirstTable partitioned cpu, SecondTable partitioned cpu);");
166 Step("INSERT INTO FirstTable VALUES(10, 5);");
167 Step("INSERT INTO FirstTable VALUES(50, 5);");
168 Step("INSERT INTO FirstTable VALUES(100, 2);");
169 Step("INSERT INTO FirstTable VALUES(10, 5);");
170 Step("INSERT INTO SecondTable VALUES(5, 5);");
171 Step("INSERT INTO SecondTable VALUES(100, 5);");
172 Step("INSERT INTO SecondTable VALUES(50, 2);");
173 Step("INSERT INTO SecondTable VALUES(100, 2);");
174 Prepare("SELECT * FROM SpanjoinTable");
175 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
176 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
177 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
178 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
179 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
180 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
181 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
182 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
183 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
184 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
185 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
186 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
187 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
188 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
189 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
190 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
191 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
192 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
193 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
194 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
195 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
196 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
197 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
198 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
199 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
200 }
201 /**
202 * @tc.name: SpanjoinTwoTableWithoutDur
203 * @tc.desc: SpanjoinTwoTableWithoutTs with ts, partitioned cpu and without dur
204 * @tc.type: FUNC
205 */
HWTEST_F(SpanJoinTest, SpanjoinTwoTableWithoutDur, TestSize.Level4)206 HWTEST_F(SpanJoinTest, SpanjoinTwoTableWithoutDur, TestSize.Level4)
207 {
208 TS_LOGI("test30-4");
209 Step("CREATE TABLE FirstTable(ts UNSIGNED INT PRIMARY KEY, cpu UNSIGNED INT);");
210 Step("CREATE TABLE SecondTable(ts UNSIGNED INT PRIMARY KEY, cpu UNSIGNED INT);");
211 Step(
212 "CREATE VIRTUAL TABLE SpanjoinTable using span_join(FirstTable partitioned cpu, SecondTable partitioned cpu);");
213 Step("INSERT INTO FirstTable VALUES(100, 5);");
214 Step("INSERT INTO FirstTable VALUES(110, 5);");
215 Step("INSERT INTO FirstTable VALUES(120, 2);");
216 Step("INSERT INTO FirstTable VALUES(160, 5);");
217 Step("INSERT INTO SecondTable VALUES(100, 5);");
218 Step("INSERT INTO SecondTable VALUES(105, 5);");
219 Step("INSERT INTO SecondTable VALUES(110, 2);");
220 Step("INSERT INTO SecondTable VALUES(160, 2);");
221 Prepare("SELECT * FROM SpanjoinTable");
222 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
223 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
224 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
225 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
226 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
227 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
228 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
229 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
230 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
231 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
232 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
233 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
234 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
235 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
236 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
237 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
238 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
239 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
240 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
241 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
242 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
243 EXPECT_EQ(sqlite3_column_int64(stmt_, 0), 0);
244 EXPECT_EQ(sqlite3_column_int64(stmt_, 1), 0);
245 EXPECT_EQ(sqlite3_column_int64(stmt_, 2), 0);
246 EXPECT_EQ(sqlite3_step(stmt_), SQLITE_MISUSE);
247 }
248 } // namespace TraceStreamer
249 } // namespace SysTuning
250