Merge "trace_processor: fix string is not null typo"
diff --git a/src/trace_processor/db/column.h b/src/trace_processor/db/column.h
index 518ac6a..410aac5 100644
--- a/src/trace_processor/db/column.h
+++ b/src/trace_processor/db/column.h
@@ -496,7 +496,7 @@
     } else if (op == FilterOp::kIsNotNull) {
       PERFETTO_DCHECK(value.is_null());
       row_map().FilterInto(rm, [this](uint32_t row) {
-        return GetStringPoolStringAtIdx(row).data() == nullptr;
+        return GetStringPoolStringAtIdx(row).data() != nullptr;
       });
       return;
     }
diff --git a/src/trace_processor/tables/macros_unittest.cc b/src/trace_processor/tables/macros_unittest.cc
index 3abc6ec..7ac0ecf 100644
--- a/src/trace_processor/tables/macros_unittest.cc
+++ b/src/trace_processor/tables/macros_unittest.cc
@@ -44,98 +44,118 @@
   C(StringPool::Id, end_state)
 PERFETTO_TP_TABLE(PERFETTO_TP_TEST_CPU_SLICE_TABLE_DEF);
 
-TEST(TableMacrosUnittest, Name) {
-  StringPool pool;
-  TestEventTable event(&pool, nullptr);
-  TestSliceTable slice(&pool, &event);
-  TestCpuSliceTable cpu_slice(&pool, &slice);
+class TableMacrosUnittest : public ::testing::Test {
+ protected:
+  StringPool pool_;
 
-  ASSERT_EQ(event.table_name(), "event");
-  ASSERT_EQ(slice.table_name(), "slice");
-  ASSERT_EQ(cpu_slice.table_name(), "cpu_slice");
+  TestEventTable event_{&pool_, nullptr};
+  TestSliceTable slice_{&pool_, &event_};
+  TestCpuSliceTable cpu_slice_{&pool_, &slice_};
+};
+
+TEST_F(TableMacrosUnittest, Name) {
+  ASSERT_EQ(event_.table_name(), "event");
+  ASSERT_EQ(slice_.table_name(), "slice");
+  ASSERT_EQ(cpu_slice_.table_name(), "cpu_slice");
 }
 
-TEST(TableMacrosUnittest, InsertParent) {
-  StringPool pool;
-  TestEventTable event(&pool, nullptr);
-  TestSliceTable slice(&pool, &event);
-
-  uint32_t id = event.Insert(TestEventTable::Row(100, 0));
+TEST_F(TableMacrosUnittest, InsertParent) {
+  uint32_t id = event_.Insert(TestEventTable::Row(100, 0));
   ASSERT_EQ(id, 0u);
-  ASSERT_EQ(event.type().GetString(0), "event");
-  ASSERT_EQ(event.ts()[0], 100);
-  ASSERT_EQ(event.arg_set_id()[0], 0);
+  ASSERT_EQ(event_.type().GetString(0), "event");
+  ASSERT_EQ(event_.ts()[0], 100);
+  ASSERT_EQ(event_.arg_set_id()[0], 0);
 
-  id = slice.Insert(TestSliceTable::Row(200, 123, 10, 0));
+  id = slice_.Insert(TestSliceTable::Row(200, 123, 10, 0));
   ASSERT_EQ(id, 1u);
 
-  ASSERT_EQ(event.type().GetString(1), "slice");
-  ASSERT_EQ(event.ts()[1], 200);
-  ASSERT_EQ(event.arg_set_id()[1], 123);
-  ASSERT_EQ(slice.type().GetString(0), "slice");
-  ASSERT_EQ(slice.ts()[0], 200);
-  ASSERT_EQ(slice.arg_set_id()[0], 123);
-  ASSERT_EQ(slice.dur()[0], 10);
-  ASSERT_EQ(slice.depth()[0], 0);
+  ASSERT_EQ(event_.type().GetString(1), "slice");
+  ASSERT_EQ(event_.ts()[1], 200);
+  ASSERT_EQ(event_.arg_set_id()[1], 123);
+  ASSERT_EQ(slice_.type().GetString(0), "slice");
+  ASSERT_EQ(slice_.ts()[0], 200);
+  ASSERT_EQ(slice_.arg_set_id()[0], 123);
+  ASSERT_EQ(slice_.dur()[0], 10);
+  ASSERT_EQ(slice_.depth()[0], 0);
 
-  id = slice.Insert(TestSliceTable::Row(210, 456, base::nullopt, 0));
+  id = slice_.Insert(TestSliceTable::Row(210, 456, base::nullopt, 0));
   ASSERT_EQ(id, 2u);
 
-  ASSERT_EQ(event.type().GetString(2), "slice");
-  ASSERT_EQ(event.ts()[2], 210);
-  ASSERT_EQ(event.arg_set_id()[2], 456);
-  ASSERT_EQ(slice.type().GetString(1), "slice");
-  ASSERT_EQ(slice.ts()[1], 210);
-  ASSERT_EQ(slice.arg_set_id()[1], 456);
-  ASSERT_EQ(slice.dur()[1], base::nullopt);
-  ASSERT_EQ(slice.depth()[1], 0);
+  ASSERT_EQ(event_.type().GetString(2), "slice");
+  ASSERT_EQ(event_.ts()[2], 210);
+  ASSERT_EQ(event_.arg_set_id()[2], 456);
+  ASSERT_EQ(slice_.type().GetString(1), "slice");
+  ASSERT_EQ(slice_.ts()[1], 210);
+  ASSERT_EQ(slice_.arg_set_id()[1], 456);
+  ASSERT_EQ(slice_.dur()[1], base::nullopt);
+  ASSERT_EQ(slice_.depth()[1], 0);
 }
 
-TEST(TableMacrosUnittest, InsertChild) {
-  StringPool pool;
-  TestEventTable event(&pool, nullptr);
-  TestSliceTable slice(&pool, &event);
-  TestCpuSliceTable cpu_slice(&pool, &slice);
+TEST_F(TableMacrosUnittest, InsertChild) {
+  event_.Insert(TestEventTable::Row(100, 0));
+  slice_.Insert(TestSliceTable::Row(200, 123, 10, 0));
 
-  event.Insert(TestEventTable::Row(100, 0));
-  slice.Insert(TestSliceTable::Row(200, 123, 10, 0));
-
-  auto reason = pool.InternString("R");
-  uint32_t id =
-      cpu_slice.Insert(TestCpuSliceTable::Row(205, 456, 5, 1, 4, 1024, reason));
+  auto reason = pool_.InternString("R");
+  uint32_t id = cpu_slice_.Insert(
+      TestCpuSliceTable::Row(205, 456, 5, 1, 4, 1024, reason));
   ASSERT_EQ(id, 2u);
-  ASSERT_EQ(event.type().GetString(2), "cpu_slice");
-  ASSERT_EQ(event.ts()[2], 205);
-  ASSERT_EQ(event.arg_set_id()[2], 456);
+  ASSERT_EQ(event_.type().GetString(2), "cpu_slice");
+  ASSERT_EQ(event_.ts()[2], 205);
+  ASSERT_EQ(event_.arg_set_id()[2], 456);
 
-  ASSERT_EQ(slice.type().GetString(1), "cpu_slice");
-  ASSERT_EQ(slice.ts()[1], 205);
-  ASSERT_EQ(slice.arg_set_id()[1], 456);
-  ASSERT_EQ(slice.dur()[1], 5);
-  ASSERT_EQ(slice.depth()[1], 1);
+  ASSERT_EQ(slice_.type().GetString(1), "cpu_slice");
+  ASSERT_EQ(slice_.ts()[1], 205);
+  ASSERT_EQ(slice_.arg_set_id()[1], 456);
+  ASSERT_EQ(slice_.dur()[1], 5);
+  ASSERT_EQ(slice_.depth()[1], 1);
 
-  ASSERT_EQ(cpu_slice.type().GetString(0), "cpu_slice");
-  ASSERT_EQ(cpu_slice.ts()[0], 205);
-  ASSERT_EQ(cpu_slice.arg_set_id()[0], 456);
-  ASSERT_EQ(cpu_slice.dur()[0], 5);
-  ASSERT_EQ(cpu_slice.depth()[0], 1);
-  ASSERT_EQ(cpu_slice.cpu()[0], 4);
-  ASSERT_EQ(cpu_slice.priority()[0], 1024);
-  ASSERT_EQ(cpu_slice.end_state()[0], reason);
-  ASSERT_EQ(cpu_slice.end_state().GetString(0), "R");
+  ASSERT_EQ(cpu_slice_.type().GetString(0), "cpu_slice");
+  ASSERT_EQ(cpu_slice_.ts()[0], 205);
+  ASSERT_EQ(cpu_slice_.arg_set_id()[0], 456);
+  ASSERT_EQ(cpu_slice_.dur()[0], 5);
+  ASSERT_EQ(cpu_slice_.depth()[0], 1);
+  ASSERT_EQ(cpu_slice_.cpu()[0], 4);
+  ASSERT_EQ(cpu_slice_.priority()[0], 1024);
+  ASSERT_EQ(cpu_slice_.end_state()[0], reason);
+  ASSERT_EQ(cpu_slice_.end_state().GetString(0), "R");
 }
 
-TEST(TableMacrosUnittest, Sort) {
-  StringPool pool;
-  TestEventTable event(&pool, nullptr);
+TEST_F(TableMacrosUnittest, StringIsNotNull) {
+  TestCpuSliceTable::Row row;
+  row.end_state = pool_.InternString("R");
+  cpu_slice_.Insert(row);
+  cpu_slice_.Insert({});
 
-  ASSERT_TRUE(event.ts().IsSorted());
+  Table out = cpu_slice_.Filter({cpu_slice_.end_state().is_not_null()});
+  const auto& end_state = out.GetColumn(*out.FindColumnIdxByName("end_state"));
 
-  event.Insert(TestEventTable::Row(0 /* ts */, 100 /* arg_set_id */));
-  event.Insert(TestEventTable::Row(1 /* ts */, 1 /* arg_set_id */));
-  event.Insert(TestEventTable::Row(2 /* ts */, 3 /* arg_set_id */));
+  ASSERT_EQ(out.size(), 1u);
 
-  Table out = event.Sort({event.arg_set_id().ascending()});
+  ASSERT_STREQ(end_state.Get(0).string_value, "R");
+}
+
+TEST_F(TableMacrosUnittest, StringIsNull) {
+  TestCpuSliceTable::Row row;
+  row.end_state = pool_.InternString("R");
+  cpu_slice_.Insert(row);
+  cpu_slice_.Insert({});
+
+  Table out = cpu_slice_.Filter({cpu_slice_.end_state().is_null()});
+  const auto& end_state = out.GetColumn(*out.FindColumnIdxByName("end_state"));
+
+  ASSERT_EQ(out.size(), 1u);
+
+  ASSERT_EQ(end_state.Get(0).type, SqlValue::kNull);
+}
+
+TEST_F(TableMacrosUnittest, Sort) {
+  ASSERT_TRUE(event_.ts().IsSorted());
+
+  event_.Insert(TestEventTable::Row(0 /* ts */, 100 /* arg_set_id */));
+  event_.Insert(TestEventTable::Row(1 /* ts */, 1 /* arg_set_id */));
+  event_.Insert(TestEventTable::Row(2 /* ts */, 3 /* arg_set_id */));
+
+  Table out = event_.Sort({event_.arg_set_id().ascending()});
   const auto& ts = out.GetColumn(*out.FindColumnIdxByName("ts"));
   const auto& arg_set_id =
       out.GetColumn(*out.FindColumnIdxByName("arg_set_id"));