blob: 6f370ca25a778e8002e1fc43e152aeab7ea36242 [file] [log] [blame]
/*
* Copyright (C) 2020 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/db/table.h"
#include "src/trace_processor/db/typed_column.h"
#include "src/trace_processor/tables/macros.h"
#include "test/gtest_and_gmock.h"
namespace perfetto {
namespace trace_processor {
namespace {
#define PERFETTO_TP_TEST_EVENT_TABLE_DEF(NAME, PARENT, C) \
NAME(TestEventTable, "event") \
PARENT(PERFETTO_TP_ROOT_TABLE_PARENT_DEF, C) \
C(int64_t, ts, Column::Flag::kSorted) \
C(int64_t, dur) \
C(uint32_t, arg_set_id, Column::Flag::kSorted | Column::Flag::kSetId)
PERFETTO_TP_TABLE(PERFETTO_TP_TEST_EVENT_TABLE_DEF);
TestEventTable::~TestEventTable() = default;
TEST(TableTest, SetIdColumns) {
StringPool pool;
TestEventTable table{&pool, nullptr};
table.Insert(TestEventTable::Row(0, 0, 0));
table.Insert(TestEventTable::Row(1, 0, 0));
table.Insert(TestEventTable::Row(2, 0, 2));
table.Insert(TestEventTable::Row(3, 0, 3));
table.Insert(TestEventTable::Row(4, 0, 4));
table.Insert(TestEventTable::Row(5, 0, 4));
table.Insert(TestEventTable::Row(6, 0, 4));
table.Insert(TestEventTable::Row(7, 0, 4));
table.Insert(TestEventTable::Row(8, 0, 8));
ASSERT_EQ(table.row_count(), 9u);
ASSERT_TRUE(table.arg_set_id().IsSetId());
// Verify that not-present ids are not returned.
{
static constexpr uint32_t kFilterArgSetId = 1;
auto res = table.Filter({table.arg_set_id().eq(kFilterArgSetId)});
ASSERT_EQ(res.row_count(), 0u);
}
{
static constexpr uint32_t kFilterArgSetId = 9;
auto res = table.Filter({table.arg_set_id().eq(kFilterArgSetId)});
ASSERT_EQ(res.row_count(), 0u);
}
// Verify that kSetId flag is correctly removed after filtering/sorting.
{
static constexpr uint32_t kFilterArgSetId = 3;
auto res = table.Filter({table.arg_set_id().eq(kFilterArgSetId)});
ASSERT_EQ(res.row_count(), 1u);
ASSERT_FALSE(res.GetColumnByName("arg_set_id")->IsSetId());
}
{
auto res = table.Sort({table.dur().descending()});
ASSERT_FALSE(res.GetColumnByName("arg_set_id")->IsSetId());
}
uint32_t arg_set_id_col_idx =
static_cast<uint32_t>(TestEventTable::ColumnIndex::arg_set_id);
// Verify that filtering equality for real arg set ids works as expected.
{
static constexpr uint32_t kFilterArgSetId = 4;
auto res = table.Filter({table.arg_set_id().eq(kFilterArgSetId)});
ASSERT_EQ(res.row_count(), 4u);
for (auto it = res.IterateRows(); it; it.Next()) {
uint32_t arg_set_id =
static_cast<uint32_t>(it.Get(arg_set_id_col_idx).AsLong());
ASSERT_EQ(arg_set_id, kFilterArgSetId);
}
}
{
static constexpr uint32_t kFilterArgSetId = 0;
auto res = table.Filter({table.arg_set_id().eq(kFilterArgSetId)});
ASSERT_EQ(res.row_count(), 2u);
for (auto it = res.IterateRows(); it; it.Next()) {
uint32_t arg_set_id =
static_cast<uint32_t>(it.Get(arg_set_id_col_idx).AsLong());
ASSERT_EQ(arg_set_id, kFilterArgSetId);
}
}
{
static constexpr uint32_t kFilterArgSetId = 8;
auto res = table.Filter({table.arg_set_id().eq(kFilterArgSetId)});
ASSERT_EQ(res.row_count(), 1u);
for (auto it = res.IterateRows(); it; it.Next()) {
uint32_t arg_set_id =
static_cast<uint32_t>(it.Get(arg_set_id_col_idx).AsLong());
ASSERT_EQ(arg_set_id, kFilterArgSetId);
}
}
// Verify that filtering equality for arg set ids after filtering another
// column works.
{
static constexpr uint32_t kFilterArgSetId = 4;
auto res = table.Filter(
{table.ts().ge(6), table.arg_set_id().eq(kFilterArgSetId)});
ASSERT_EQ(res.row_count(), 2u);
for (auto it = res.IterateRows(); it; it.Next()) {
uint32_t arg_set_id =
static_cast<uint32_t>(it.Get(arg_set_id_col_idx).AsLong());
ASSERT_EQ(arg_set_id, kFilterArgSetId);
}
}
}
} // namespace
} // namespace trace_processor
} // namespace perfetto