/* * 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 #include #include #include "perfetto/base/status.h" #include "perfetto/trace_processor/basic_types.h" #include "test/gtest_and_gmock.h" namespace perfetto::trace_processor::sql_argument { namespace { void ParseArgsSuccessfully(const std::string& args, std::vector expected) { std::vector 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 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 perfetto::trace_processor::sql_argument