• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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