blob: 9f15859ad31bb14fc34bc6b708c00305a1bfcb8b [file] [log] [blame]
/*
* Copyright (C) 2021 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/util/sql_argument.h"
#include "test/gtest_and_gmock.h"
namespace perfetto {
namespace trace_processor {
namespace sql_argument {
namespace {
void ParseArgsSuccessfully(const std::string& args,
std::vector<ArgumentDefinition> expected) {
std::vector<ArgumentDefinition> actual;
base::Status status = ParseArgumentDefinitions(args, actual);
ASSERT_TRUE(status.ok()) << status.c_message();
ASSERT_EQ(expected, actual);
}
void ParseArgsWithFailure(const std::string& args) {
std::vector<ArgumentDefinition> actual;
ASSERT_FALSE(ParseArgumentDefinitions(args, actual).ok());
}
TEST(SqlArgumentTest, IsValidName) {
ASSERT_TRUE(IsValidName("foo"));
ASSERT_TRUE(IsValidName("bar"));
ASSERT_TRUE(IsValidName("foo_bar"));
ASSERT_TRUE(IsValidName("foo1234"));
ASSERT_TRUE(IsValidName("1234Foo"));
ASSERT_FALSE(IsValidName("foo-bar"));
ASSERT_FALSE(IsValidName("foo#123"));
}
TEST(SqlArgumentTest, ParseType) {
ASSERT_EQ(ParseType("PROTO"), Type::kProto);
ASSERT_EQ(ParseType("BOOL"), Type::kBool);
ASSERT_EQ(ParseType("UNKNOWN"), std::nullopt);
ASSERT_EQ(ParseType("UINT"), Type::kUint);
}
TEST(SqlArgumentTest, TypeToFriendlyString) {
ASSERT_STREQ(TypeToHumanFriendlyString(Type::kProto), "PROTO");
ASSERT_STREQ(TypeToHumanFriendlyString(Type::kBool), "BOOL");
ASSERT_STREQ(TypeToHumanFriendlyString(Type::kUint), "UINT");
}
TEST(SqlArgumentTest, TypeToSqlValueType) {
ASSERT_EQ(TypeToSqlValueType(Type::kProto), SqlValue::Type::kBytes);
ASSERT_EQ(TypeToSqlValueType(Type::kBool), SqlValue::Type::kLong);
ASSERT_EQ(TypeToSqlValueType(Type::kUint), SqlValue::Type::kLong);
}
TEST(SqlArgumentTest, ParseArguments) {
ParseArgsSuccessfully("", {});
ParseArgsSuccessfully("foo UINT", {ArgumentDefinition("$foo", Type::kUint)});
ParseArgsSuccessfully("foo UINT, bar LONG, baz PROTO",
{ArgumentDefinition("$foo", Type::kUint),
ArgumentDefinition("$bar", Type::kLong),
ArgumentDefinition("$baz", Type::kProto)});
ParseArgsSuccessfully("\nfoo UINT,\n bar LONG, baz PROTO\n",
{ArgumentDefinition("$foo", Type::kUint),
ArgumentDefinition("$bar", Type::kLong),
ArgumentDefinition("$baz", Type::kProto)});
ParseArgsSuccessfully("foo123 UINT",
{ArgumentDefinition("$foo123", Type::kUint)});
ParseArgsWithFailure("foo");
ParseArgsWithFailure("foo bar UINT, baz UINT");
ParseArgsWithFailure("foo UINT32");
ParseArgsWithFailure("foo#bar UINT");
ParseArgsWithFailure("foo-bar UINT");
}
} // namespace
} // namespace sql_argument
} // namespace trace_processor
} // namespace perfetto