blob: be67050a498d90c4682975f71906723fb5f92cc1 [file] [edit]
/*
* Copyright (C) 2026 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/perfetto_sql/analysis/program.h"
#include "test/gtest_and_gmock.h"
namespace perfetto::perfetto_sql::analysis {
namespace {
TEST(ProgramTest, OwnsNamesAndResolvesReferences) {
Program program = [] {
ProgramBuilder builder;
ModuleId producer = builder.AddModule("producer", "producer.sql");
ModuleId consumer = builder.AddModule("consumer", "consumer.sql");
builder.AddSymbol(producer, "input_table", SymbolKind::kTable);
SymbolId view =
builder.AddSymbol(consumer, "output_view", SymbolKind::kView);
builder.AddDeclaredInclude(consumer, "producer");
builder.AddReference(view, "input_table", ReferenceKind::kRelation);
builder.AddReference(view, "external_fn", ReferenceKind::kFunction);
return builder.Build();
}();
ASSERT_THAT(program.modules(), testing::SizeIs(2));
ASSERT_THAT(program.symbols(), testing::SizeIs(2));
EXPECT_EQ(program.module(ModuleId{1}).name, "consumer");
EXPECT_EQ(program.symbol(SymbolId{0}).name, "input_table");
const Symbol& view = program.symbol(SymbolId{1});
ASSERT_THAT(view.references, testing::SizeIs(1));
EXPECT_EQ(view.references.front().symbol_id, SymbolId{0});
EXPECT_EQ(view.references.front().kind, ReferenceKind::kRelation);
ASSERT_THAT(view.unresolved_references, testing::SizeIs(1));
EXPECT_EQ(view.unresolved_references.front().name, "external_fn");
EXPECT_EQ(program.FindSymbol("output_view"), SymbolId{1});
}
TEST(ProgramTest, IgnoresReferencesWithinAModule) {
ProgramBuilder builder;
ModuleId module = builder.AddModule("module", "module.sql");
builder.AddSymbol(module, "table", SymbolKind::kTable);
SymbolId view = builder.AddSymbol(module, "view", SymbolKind::kView);
builder.AddReference(view, "table", ReferenceKind::kRelation);
Program program = builder.Build();
EXPECT_TRUE(program.symbol(view).references.empty());
EXPECT_TRUE(program.symbol(view).unresolved_references.empty());
}
} // namespace
} // namespace perfetto::perfetto_sql::analysis