1 /*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "src/trace_processor/sqlite/sqlite_tokenizer.h"
18 #include <vector>
19
20 #include "perfetto/base/logging.h"
21 #include "src/trace_processor/sqlite/sql_source.h"
22 #include "test/gtest_and_gmock.h"
23
24 namespace perfetto {
25 namespace trace_processor {
26 namespace {
27
28 using Token = SqliteTokenizer::Token;
29 using Type = SqliteTokenType;
30
31 class SqliteTokenizerTest : public ::testing::Test {
32 protected:
Tokenize(const char * ptr)33 std::vector<SqliteTokenizer::Token> Tokenize(const char* ptr) {
34 tokenizer_.Reset(SqlSource::FromTraceProcessorImplementation(ptr));
35 std::vector<SqliteTokenizer::Token> tokens;
36 for (auto t = tokenizer_.Next(); !t.str.empty(); t = tokenizer_.Next()) {
37 tokens.push_back(t);
38 }
39 return tokens;
40 }
41
42 SqliteTokenizer tokenizer_{SqlSource::FromTraceProcessorImplementation("")};
43 };
44
TEST_F(SqliteTokenizerTest,EmptyString)45 TEST_F(SqliteTokenizerTest, EmptyString) {
46 ASSERT_THAT(Tokenize(""), testing::IsEmpty());
47 }
48
TEST_F(SqliteTokenizerTest,OnlySpace)49 TEST_F(SqliteTokenizerTest, OnlySpace) {
50 ASSERT_THAT(Tokenize(" "), testing::ElementsAre(Token{" ", Type::TK_SPACE}));
51 }
52
TEST_F(SqliteTokenizerTest,SpaceColon)53 TEST_F(SqliteTokenizerTest, SpaceColon) {
54 ASSERT_THAT(Tokenize(" ;"), testing::ElementsAre(Token{" ", Type::TK_SPACE},
55 Token{";", Type::TK_SEMI}));
56 }
57
TEST_F(SqliteTokenizerTest,Select)58 TEST_F(SqliteTokenizerTest, Select) {
59 ASSERT_THAT(
60 Tokenize("SELECT * FROM slice;"),
61 testing::ElementsAre(
62 Token{"SELECT", Type::TK_GENERIC_KEYWORD}, Token{" ", Type::TK_SPACE},
63 Token{"*", Type::TK_STAR}, Token{" ", Type::TK_SPACE},
64 Token{"FROM", Type::TK_GENERIC_KEYWORD}, Token{" ", Type::TK_SPACE},
65 Token{"slice", Type::TK_ID}, Token{";", Type::TK_SEMI}));
66 }
67
TEST_F(SqliteTokenizerTest,PastEndErrorToken)68 TEST_F(SqliteTokenizerTest, PastEndErrorToken) {
69 tokenizer_.Reset(SqlSource::FromTraceProcessorImplementation("S"));
70 ASSERT_EQ(tokenizer_.Next(), (Token{"S", Type::TK_ID}));
71
72 auto end_token = tokenizer_.Next();
73 ASSERT_EQ(end_token, (Token{"", Type::TK_ILLEGAL}));
74 ASSERT_EQ(tokenizer_.AsTraceback(end_token),
75 " Trace Processor Internal line 1 col 2\n"
76 " S\n"
77 " ^\n");
78 }
79
80 } // namespace
81 } // namespace trace_processor
82 } // namespace perfetto
83