blob: e7aa4cff8ee5f453443fe1b72319e40fdba7c435 [file] [log] [blame]
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "src/trace_processor/sqlite/sqlite_tokenizer.h"
#include <vector>
#include "perfetto/base/logging.h"
#include "src/trace_processor/sqlite/sql_source.h"
#include "test/gtest_and_gmock.h"
namespace perfetto {
namespace trace_processor {
namespace {
using Token = SqliteTokenizer::Token;
using Type = SqliteTokenType;
class SqliteTokenizerTest : public ::testing::Test {
protected:
std::vector<SqliteTokenizer::Token> Tokenize(const char* ptr) {
tokenizer_.Reset(SqlSource::FromTraceProcessorImplementation(ptr));
std::vector<SqliteTokenizer::Token> tokens;
for (auto t = tokenizer_.Next(); !t.str.empty(); t = tokenizer_.Next()) {
tokens.push_back(t);
}
return tokens;
}
SqliteTokenizer tokenizer_{SqlSource::FromTraceProcessorImplementation("")};
};
TEST_F(SqliteTokenizerTest, EmptyString) {
ASSERT_THAT(Tokenize(""), testing::IsEmpty());
}
TEST_F(SqliteTokenizerTest, OnlySpace) {
ASSERT_THAT(Tokenize(" "), testing::ElementsAre(Token{" ", Type::TK_SPACE}));
}
TEST_F(SqliteTokenizerTest, SpaceColon) {
ASSERT_THAT(Tokenize(" ;"), testing::ElementsAre(Token{" ", Type::TK_SPACE},
Token{";", Type::TK_SEMI}));
}
TEST_F(SqliteTokenizerTest, Select) {
ASSERT_THAT(
Tokenize("SELECT * FROM slice;"),
testing::ElementsAre(
Token{"SELECT", Type::TK_GENERIC_KEYWORD}, Token{" ", Type::TK_SPACE},
Token{"*", Type::TK_STAR}, Token{" ", Type::TK_SPACE},
Token{"FROM", Type::TK_GENERIC_KEYWORD}, Token{" ", Type::TK_SPACE},
Token{"slice", Type::TK_ID}, Token{";", Type::TK_SEMI}));
}
TEST_F(SqliteTokenizerTest, PastEndErrorToken) {
tokenizer_.Reset(SqlSource::FromTraceProcessorImplementation("S"));
ASSERT_EQ(tokenizer_.Next(), (Token{"S", Type::TK_ID}));
auto end_token = tokenizer_.Next();
ASSERT_EQ(end_token, (Token{"", Type::TK_ILLEGAL}));
ASSERT_EQ(tokenizer_.AsTraceback(end_token),
" Trace Processor Internal line 1 col 2\n"
" S\n"
" ^\n");
}
} // namespace
} // namespace trace_processor
} // namespace perfetto