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