diff options
Diffstat (limited to 'src/trace_processor/tables/py_tables_unittest.cc')
-rw-r--r-- | src/trace_processor/tables/py_tables_unittest.cc | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/src/trace_processor/tables/py_tables_unittest.cc b/src/trace_processor/tables/py_tables_unittest.cc index 71b5f3947..36facd63d 100644 --- a/src/trace_processor/tables/py_tables_unittest.cc +++ b/src/trace_processor/tables/py_tables_unittest.cc @@ -15,6 +15,7 @@ */ #include "src/trace_processor/db/column.h" +#include "src/trace_processor/db/column_storage.h" #include "src/trace_processor/tables/py_tables_unittest_py.h" #include "test/gtest_and_gmock.h" @@ -24,6 +25,7 @@ namespace trace_processor { namespace tables { TestEventTable::~TestEventTable() = default; +TestEventChildTable::~TestEventChildTable() = default; TestSliceTable::~TestSliceTable() = default; TestArgsTable::~TestArgsTable() = default; @@ -34,6 +36,7 @@ class PyTablesUnittest : public ::testing::Test { StringPool pool_; TestEventTable event_{&pool_}; + TestEventChildTable event_child_{&pool_, &event_}; TestSliceTable slice_{&pool_, &event_}; TestArgsTable args_{&pool_}; }; @@ -163,6 +166,150 @@ TEST_F(PyTablesUnittest, ParentAndChildInsert) { ASSERT_EQ(slice_.dur()[1], 20); } +TEST_F(PyTablesUnittest, Extend) { + event_.Insert(TestEventTable::Row(50, 0)); + event_.Insert(TestEventTable::Row(100, 1)); + event_.Insert(TestEventTable::Row(150, 2)); + + ColumnStorage<int64_t> dur; + dur.Append(512); + dur.Append(1024); + dur.Append(2048); + + auto slice_ext = TestSliceTable::ExtendParent(event_, std::move(dur)); + ASSERT_EQ(slice_ext->row_count(), 3u); + ASSERT_EQ( + slice_ext->columns()[TestSliceTable::ColumnIndex::ts].Get(0).AsLong(), + 50); + ASSERT_EQ( + slice_ext->columns()[TestSliceTable::ColumnIndex::dur].Get(0).AsLong(), + 512); + ASSERT_EQ( + slice_ext->columns()[TestSliceTable::ColumnIndex::ts].Get(1).AsLong(), + 100); + ASSERT_EQ( + slice_ext->columns()[TestSliceTable::ColumnIndex::dur].Get(1).AsLong(), + 1024); + ASSERT_EQ( + slice_ext->columns()[TestSliceTable::ColumnIndex::ts].Get(2).AsLong(), + 150); + ASSERT_EQ( + slice_ext->columns()[TestSliceTable::ColumnIndex::dur].Get(2).AsLong(), + 2048); +} + +TEST_F(PyTablesUnittest, SelectAndExtend) { + event_.Insert(TestEventTable::Row(50, 0)); + event_.Insert(TestEventTable::Row(100, 1)); + event_.Insert(TestEventTable::Row(150, 2)); + + std::vector<TestEventTable::RowNumber> rows; + rows.emplace_back(TestEventTable::RowNumber(1)); + ColumnStorage<int64_t> dur; + dur.Append(1024); + + auto slice_ext = TestSliceTable::SelectAndExtendParent( + event_, std::move(rows), std::move(dur)); + ASSERT_EQ(slice_ext->row_count(), 1u); + ASSERT_EQ( + slice_ext->columns()[TestSliceTable::ColumnIndex::ts].Get(0).AsLong(), + 100); + ASSERT_EQ( + slice_ext->columns()[TestSliceTable::ColumnIndex::dur].Get(0).AsLong(), + 1024); +} + +TEST_F(PyTablesUnittest, SetIdColumns) { + StringPool pool; + TestArgsTable table{&pool}; + + table.Insert(TestArgsTable::Row(0, 100)); + table.Insert(TestArgsTable::Row(0, 200)); + table.Insert(TestArgsTable::Row(2, 200)); + table.Insert(TestArgsTable::Row(3, 300)); + table.Insert(TestArgsTable::Row(4, 200)); + table.Insert(TestArgsTable::Row(4, 500)); + table.Insert(TestArgsTable::Row(4, 900)); + table.Insert(TestArgsTable::Row(4, 200)); + table.Insert(TestArgsTable::Row(8, 400)); + + 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.type().descending()}); + ASSERT_FALSE(res.GetColumnByName("arg_set_id")->IsSetId()); + } + + uint32_t arg_set_id_col_idx = + static_cast<uint32_t>(TestArgsTable::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.int_value().eq(200), 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 tables } // namespace trace_processor |