aboutsummaryrefslogtreecommitdiff
path: root/src/trace_processor/tables/py_tables_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/trace_processor/tables/py_tables_unittest.cc')
-rw-r--r--src/trace_processor/tables/py_tables_unittest.cc147
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