tp: add importers build file and create common target

Change-Id: I4e036b8abcf72cff019d9d2a4f530b09453bc3e2
diff --git a/Android.bp b/Android.bp
index d985dfd..68c2708 100644
--- a/Android.bp
+++ b/Android.bp
@@ -6457,6 +6457,31 @@
   ],
 }
 
+// GN: //src/trace_processor/importers:common
+filegroup {
+  name: "perfetto_src_trace_processor_importers_common",
+  srcs: [
+    "src/trace_processor/importers/common/args_tracker.cc",
+    "src/trace_processor/importers/common/clock_tracker.cc",
+    "src/trace_processor/importers/common/event_tracker.cc",
+    "src/trace_processor/importers/common/global_args_tracker.cc",
+    "src/trace_processor/importers/common/process_tracker.cc",
+    "src/trace_processor/importers/common/slice_tracker.cc",
+    "src/trace_processor/importers/common/track_tracker.cc",
+  ],
+}
+
+// GN: //src/trace_processor/importers:unittests
+filegroup {
+  name: "perfetto_src_trace_processor_importers_unittests",
+  srcs: [
+    "src/trace_processor/importers/common/clock_tracker_unittest.cc",
+    "src/trace_processor/importers/common/event_tracker_unittest.cc",
+    "src/trace_processor/importers/common/process_tracker_unittest.cc",
+    "src/trace_processor/importers/common/slice_tracker_unittest.cc",
+  ],
+}
+
 // GN: //src/trace_processor:lib
 filegroup {
   name: "perfetto_src_trace_processor_lib",
@@ -6557,13 +6582,6 @@
   srcs: [
     "src/trace_processor/default_modules.cc",
     "src/trace_processor/forwarding_trace_parser.cc",
-    "src/trace_processor/importers/common/args_tracker.cc",
-    "src/trace_processor/importers/common/clock_tracker.cc",
-    "src/trace_processor/importers/common/event_tracker.cc",
-    "src/trace_processor/importers/common/global_args_tracker.cc",
-    "src/trace_processor/importers/common/process_tracker.cc",
-    "src/trace_processor/importers/common/slice_tracker.cc",
-    "src/trace_processor/importers/common/track_tracker.cc",
     "src/trace_processor/importers/ftrace/ftrace_module.cc",
     "src/trace_processor/importers/gzip/gzip_utils.cc",
     "src/trace_processor/importers/json/json_utils.cc",
@@ -6644,10 +6662,7 @@
   srcs: [
     "src/trace_processor/dynamic/experimental_counter_dur_generator_unittest.cc",
     "src/trace_processor/forwarding_trace_parser_unittest.cc",
-    "src/trace_processor/importers/common/clock_tracker_unittest.cc",
-    "src/trace_processor/importers/common/event_tracker_unittest.cc",
-    "src/trace_processor/importers/common/process_tracker_unittest.cc",
-    "src/trace_processor/importers/common/slice_tracker_unittest.cc",
+    "src/trace_processor/importers/ftrace/sched_event_tracker_unittest.cc",
     "src/trace_processor/importers/fuchsia/fuchsia_trace_utils_unittest.cc",
     "src/trace_processor/importers/proto/args_table_utils_unittest.cc",
     "src/trace_processor/importers/proto/heap_graph_tracker_unittest.cc",
@@ -7555,6 +7570,8 @@
     ":perfetto_src_trace_processor_db_unittests",
     ":perfetto_src_trace_processor_export_json",
     ":perfetto_src_trace_processor_ftrace_descriptors",
+    ":perfetto_src_trace_processor_importers_common",
+    ":perfetto_src_trace_processor_importers_unittests",
     ":perfetto_src_trace_processor_lib",
     ":perfetto_src_trace_processor_metrics_lib",
     ":perfetto_src_trace_processor_metrics_unittests",
@@ -7806,6 +7823,7 @@
     ":perfetto_src_trace_processor_db_lib",
     ":perfetto_src_trace_processor_export_json",
     ":perfetto_src_trace_processor_ftrace_descriptors",
+    ":perfetto_src_trace_processor_importers_common",
     ":perfetto_src_trace_processor_lib",
     ":perfetto_src_trace_processor_metrics_lib",
     ":perfetto_src_trace_processor_sqlite_sqlite",
@@ -7922,6 +7940,7 @@
     ":perfetto_src_trace_processor_db_lib",
     ":perfetto_src_trace_processor_export_json",
     ":perfetto_src_trace_processor_ftrace_descriptors",
+    ":perfetto_src_trace_processor_importers_common",
     ":perfetto_src_trace_processor_lib",
     ":perfetto_src_trace_processor_metrics_lib",
     ":perfetto_src_trace_processor_sqlite_sqlite",
diff --git a/BUILD b/BUILD
index 5080adb..e0d45cc 100644
--- a/BUILD
+++ b/BUILD
@@ -713,6 +713,27 @@
     ],
 )
 
+# GN target: //src/trace_processor/importers:common
+filegroup(
+    name = "src_trace_processor_importers_common",
+    srcs = [
+        "src/trace_processor/importers/common/args_tracker.cc",
+        "src/trace_processor/importers/common/args_tracker.h",
+        "src/trace_processor/importers/common/clock_tracker.cc",
+        "src/trace_processor/importers/common/clock_tracker.h",
+        "src/trace_processor/importers/common/event_tracker.cc",
+        "src/trace_processor/importers/common/event_tracker.h",
+        "src/trace_processor/importers/common/global_args_tracker.cc",
+        "src/trace_processor/importers/common/global_args_tracker.h",
+        "src/trace_processor/importers/common/process_tracker.cc",
+        "src/trace_processor/importers/common/process_tracker.h",
+        "src/trace_processor/importers/common/slice_tracker.cc",
+        "src/trace_processor/importers/common/slice_tracker.h",
+        "src/trace_processor/importers/common/track_tracker.cc",
+        "src/trace_processor/importers/common/track_tracker.h",
+    ],
+)
+
 genrule(
     name = "src_trace_processor_metrics_gen_merged_sql_metrics",
     srcs = [
@@ -987,20 +1008,6 @@
         "src/trace_processor/default_modules.h",
         "src/trace_processor/forwarding_trace_parser.cc",
         "src/trace_processor/forwarding_trace_parser.h",
-        "src/trace_processor/importers/common/args_tracker.cc",
-        "src/trace_processor/importers/common/args_tracker.h",
-        "src/trace_processor/importers/common/clock_tracker.cc",
-        "src/trace_processor/importers/common/clock_tracker.h",
-        "src/trace_processor/importers/common/event_tracker.cc",
-        "src/trace_processor/importers/common/event_tracker.h",
-        "src/trace_processor/importers/common/global_args_tracker.cc",
-        "src/trace_processor/importers/common/global_args_tracker.h",
-        "src/trace_processor/importers/common/process_tracker.cc",
-        "src/trace_processor/importers/common/process_tracker.h",
-        "src/trace_processor/importers/common/slice_tracker.cc",
-        "src/trace_processor/importers/common/slice_tracker.h",
-        "src/trace_processor/importers/common/track_tracker.cc",
-        "src/trace_processor/importers/common/track_tracker.h",
         "src/trace_processor/importers/ftrace/ftrace_module.cc",
         "src/trace_processor/importers/ftrace/ftrace_module.h",
         "src/trace_processor/importers/fuchsia/fuchsia_record.h",
@@ -2825,6 +2832,7 @@
         ":src_trace_processor_db_lib",
         ":src_trace_processor_export_json",
         ":src_trace_processor_ftrace_descriptors",
+        ":src_trace_processor_importers_common",
         ":src_trace_processor_lib",
         ":src_trace_processor_metrics_lib",
         ":src_trace_processor_sqlite_sqlite",
@@ -2914,6 +2922,7 @@
         ":src_trace_processor_db_lib",
         ":src_trace_processor_export_json",
         ":src_trace_processor_ftrace_descriptors",
+        ":src_trace_processor_importers_common",
         ":src_trace_processor_lib",
         ":src_trace_processor_metrics_lib",
         ":src_trace_processor_rpc_httpd",
@@ -3081,6 +3090,7 @@
         ":src_trace_processor_db_lib",
         ":src_trace_processor_export_json",
         ":src_trace_processor_ftrace_descriptors",
+        ":src_trace_processor_importers_common",
         ":src_trace_processor_lib",
         ":src_trace_processor_metrics_lib",
         ":src_trace_processor_sqlite_sqlite",
diff --git a/src/trace_processor/BUILD.gn b/src/trace_processor/BUILD.gn
index 1bbf36a..10a4a4f 100644
--- a/src/trace_processor/BUILD.gn
+++ b/src/trace_processor/BUILD.gn
@@ -65,20 +65,6 @@
     "default_modules.h",
     "forwarding_trace_parser.cc",
     "forwarding_trace_parser.h",
-    "importers/common/args_tracker.cc",
-    "importers/common/args_tracker.h",
-    "importers/common/clock_tracker.cc",
-    "importers/common/clock_tracker.h",
-    "importers/common/event_tracker.cc",
-    "importers/common/event_tracker.h",
-    "importers/common/global_args_tracker.cc",
-    "importers/common/global_args_tracker.h",
-    "importers/common/process_tracker.cc",
-    "importers/common/process_tracker.h",
-    "importers/common/slice_tracker.cc",
-    "importers/common/slice_tracker.h",
-    "importers/common/track_tracker.cc",
-    "importers/common/track_tracker.h",
     "importers/ftrace/ftrace_module.cc",
     "importers/ftrace/ftrace_module.h",
     "importers/fuchsia/fuchsia_record.h",
@@ -137,6 +123,7 @@
     "../base",
     "../protozero",
     "containers",
+    "importers:common",
     "storage",
     "tables",
     "types",
@@ -249,6 +236,7 @@
     "../../protos/perfetto/trace/gpu:zero",
     "../../protos/perfetto/trace/interned_data:zero",
     "../protozero",
+    "importers:common",
     "storage",
     "types",
   ]
@@ -301,6 +289,7 @@
       "../base",
       "analysis",
       "db:lib",
+      "importers:common",
       "metrics:lib",
       "sqlite",
       "storage",
@@ -344,10 +333,7 @@
   testonly = true
   sources = [
     "forwarding_trace_parser_unittest.cc",
-    "importers/common/clock_tracker_unittest.cc",
-    "importers/common/event_tracker_unittest.cc",
-    "importers/common/process_tracker_unittest.cc",
-    "importers/common/slice_tracker_unittest.cc",
+    "importers/ftrace/sched_event_tracker_unittest.cc",
     "importers/fuchsia/fuchsia_trace_utils_unittest.cc",
     "importers/proto/args_table_utils_unittest.cc",
     "importers/proto/heap_graph_tracker_unittest.cc",
@@ -370,7 +356,6 @@
     "../../protos/perfetto/trace/ftrace:zero",
     "../../protos/perfetto/trace/gpu:zero",
     "../../protos/perfetto/trace/interned_data:zero",
-    "../../protos/perfetto/trace/profiling:zero",
     "../../protos/perfetto/trace/ps:zero",
     "../../protos/perfetto/trace/sys_stats:zero",
     "../../protos/perfetto/trace/track_event:zero",
@@ -379,6 +364,8 @@
     "../protozero:testing_messages_zero",
     "containers:unittests",
     "db:unittests",
+    "importers:common",
+    "importers:unittests",
     "storage",
     "tables:unittests",
     "types",
diff --git a/src/trace_processor/importers/BUILD.gn b/src/trace_processor/importers/BUILD.gn
new file mode 100644
index 0000000..d3d8482
--- /dev/null
+++ b/src/trace_processor/importers/BUILD.gn
@@ -0,0 +1,61 @@
+# 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.
+
+import("../../../gn/perfetto.gni")
+
+source_set("common") {
+  sources = [
+    "common/args_tracker.cc",
+    "common/args_tracker.h",
+    "common/clock_tracker.cc",
+    "common/clock_tracker.h",
+    "common/event_tracker.cc",
+    "common/event_tracker.h",
+    "common/global_args_tracker.cc",
+    "common/global_args_tracker.h",
+    "common/process_tracker.cc",
+    "common/process_tracker.h",
+    "common/slice_tracker.cc",
+    "common/slice_tracker.h",
+    "common/track_tracker.cc",
+    "common/track_tracker.h",
+  ]
+  deps = [
+    "../../../gn:default_deps",
+    "../../../protos/perfetto/trace:zero",
+    "../../../protos/perfetto/trace/profiling:zero",
+    "../../base",
+    "../storage",
+    "../types",
+  ]
+}
+
+source_set("unittests") {
+  sources = [
+    "common/clock_tracker_unittest.cc",
+    "common/event_tracker_unittest.cc",
+    "common/process_tracker_unittest.cc",
+    "common/slice_tracker_unittest.cc",
+  ]
+  testonly = true
+  deps = [
+    ":common",
+    "../../../gn:default_deps",
+    "../../../gn:gtest_and_gmock",
+    "../../../protos/perfetto/trace:zero",
+    "../../base",
+    "../storage",
+    "../types",
+  ]
+}
diff --git a/src/trace_processor/importers/common/args_tracker.cc b/src/trace_processor/importers/common/args_tracker.cc
index a93c12a..c7a5b97 100644
--- a/src/trace_processor/importers/common/args_tracker.cc
+++ b/src/trace_processor/importers/common/args_tracker.cc
@@ -96,5 +96,9 @@
 
 ArgsTracker::BoundInserter::~BoundInserter() {}
 
+ArgsTracker::BoundInserter::BoundInserter(BoundInserter&&) = default;
+ArgsTracker::BoundInserter& ArgsTracker::BoundInserter::operator=(
+    BoundInserter&&) = default;
+
 }  // namespace trace_processor
 }  // namespace perfetto
diff --git a/src/trace_processor/importers/common/args_tracker.h b/src/trace_processor/importers/common/args_tracker.h
index 327efed..ebcc8f9 100644
--- a/src/trace_processor/importers/common/args_tracker.h
+++ b/src/trace_processor/importers/common/args_tracker.h
@@ -38,6 +38,12 @@
    public:
     virtual ~BoundInserter();
 
+    BoundInserter(BoundInserter&&);
+    BoundInserter& operator=(BoundInserter&&);
+
+    BoundInserter(const BoundInserter&) = delete;
+    BoundInserter& operator=(const BoundInserter&) = delete;
+
     // Adds an arg with the same key and flat_key.
     BoundInserter& AddArg(
         StringId key,
diff --git a/src/trace_processor/importers/common/event_tracker_unittest.cc b/src/trace_processor/importers/common/event_tracker_unittest.cc
index 081b40f..66fc899 100644
--- a/src/trace_processor/importers/common/event_tracker_unittest.cc
+++ b/src/trace_processor/importers/common/event_tracker_unittest.cc
@@ -20,7 +20,6 @@
 #include "src/trace_processor/importers/common/args_tracker.h"
 #include "src/trace_processor/importers/common/process_tracker.h"
 #include "src/trace_processor/importers/common/track_tracker.h"
-#include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
 #include "test/gtest_and_gmock.h"
 
 namespace perfetto {
@@ -40,78 +39,12 @@
     context.process_tracker.reset(new ProcessTracker(&context));
     context.event_tracker.reset(new EventTracker(&context));
     context.track_tracker.reset(new TrackTracker(&context));
-    sched_tracker = SchedEventTracker::GetOrCreate(&context);
   }
 
  protected:
   TraceProcessorContext context;
-  SchedEventTracker* sched_tracker;
 };
 
-TEST_F(EventTrackerTest, InsertSecondSched) {
-  uint32_t cpu = 3;
-  int64_t timestamp = 100;
-  uint32_t pid_1 = 2;
-  int64_t prev_state = 32;
-  static const char kCommProc1[] = "process1";
-  static const char kCommProc2[] = "process2";
-  uint32_t pid_2 = 4;
-  int32_t prio = 1024;
-
-  sched_tracker->PushSchedSwitch(cpu, timestamp, pid_1, kCommProc2, prio,
-                                 prev_state, pid_2, kCommProc1, prio);
-  ASSERT_EQ(context.storage->sched_slice_table().row_count(), 1ul);
-
-  sched_tracker->PushSchedSwitch(cpu, timestamp + 1, pid_2, kCommProc1, prio,
-                                 prev_state, pid_1, kCommProc2, prio);
-
-  ASSERT_EQ(context.storage->sched_slice_table().row_count(), 2ul);
-
-  const auto& timestamps = context.storage->sched_slice_table().ts();
-  ASSERT_EQ(timestamps[0], timestamp);
-  ASSERT_EQ(context.storage->thread_table().start_ts()[1], base::nullopt);
-
-  auto name =
-      context.storage->GetString(context.storage->thread_table().name()[1]);
-  ASSERT_STREQ(name.c_str(), kCommProc1);
-  ASSERT_EQ(context.storage->sched_slice_table().utid()[0], 1u);
-  ASSERT_EQ(context.storage->sched_slice_table().dur()[0], 1);
-}
-
-TEST_F(EventTrackerTest, InsertThirdSched_SameThread) {
-  uint32_t cpu = 3;
-  int64_t timestamp = 100;
-  int64_t prev_state = 32;
-  static const char kCommProc1[] = "process1";
-  static const char kCommProc2[] = "process2";
-  int32_t prio = 1024;
-
-  sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/4, kCommProc2, prio,
-                                 prev_state,
-                                 /*tid=*/2, kCommProc1, prio);
-  ASSERT_EQ(context.storage->sched_slice_table().row_count(), 1u);
-
-  sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/2, kCommProc1,
-                                 prio, prev_state,
-                                 /*tid=*/4, kCommProc2, prio);
-  sched_tracker->PushSchedSwitch(cpu, timestamp + 11, /*tid=*/4, kCommProc2,
-                                 prio, prev_state,
-                                 /*tid=*/2, kCommProc1, prio);
-  sched_tracker->PushSchedSwitch(cpu, timestamp + 31, /*tid=*/2, kCommProc1,
-                                 prio, prev_state,
-                                 /*tid=*/4, kCommProc2, prio);
-  ASSERT_EQ(context.storage->sched_slice_table().row_count(), 4ul);
-
-  const auto& timestamps = context.storage->sched_slice_table().ts();
-  ASSERT_EQ(timestamps[0], timestamp);
-  ASSERT_EQ(context.storage->thread_table().start_ts()[1], base::nullopt);
-  ASSERT_EQ(context.storage->sched_slice_table().dur()[0], 1u);
-  ASSERT_EQ(context.storage->sched_slice_table().dur()[1], 11u - 1u);
-  ASSERT_EQ(context.storage->sched_slice_table().dur()[2], 31u - 11u);
-  ASSERT_EQ(context.storage->sched_slice_table().utid()[0],
-            context.storage->sched_slice_table().utid()[2]);
-}
-
 TEST_F(EventTrackerTest, CounterDuration) {
   uint32_t cpu = 3;
   int64_t timestamp = 100;
diff --git a/src/trace_processor/importers/common/process_tracker_unittest.cc b/src/trace_processor/importers/common/process_tracker_unittest.cc
index 2f41cc1..f9bad28 100644
--- a/src/trace_processor/importers/common/process_tracker_unittest.cc
+++ b/src/trace_processor/importers/common/process_tracker_unittest.cc
@@ -19,7 +19,6 @@
 #include "perfetto/base/logging.h"
 #include "src/trace_processor/importers/common/args_tracker.h"
 #include "src/trace_processor/importers/common/event_tracker.h"
-#include "src/trace_processor/importers/ftrace/sched_event_tracker.h"
 #include "test/gtest_and_gmock.h"
 
 namespace perfetto {
@@ -89,31 +88,6 @@
   ASSERT_EQ(name, "test");
 }
 
-TEST_F(ProcessTrackerTest, UpdateThreadMatch) {
-  uint32_t cpu = 3;
-  int64_t timestamp = 100;
-  int64_t prev_state = 32;
-  static const char kCommProc1[] = "process1";
-  static const char kCommProc2[] = "process2";
-  int32_t prio = 1024;
-  SchedEventTracker* sched_tracker = SchedEventTracker::GetOrCreate(&context);
-
-  sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, kCommProc2, prio,
-                                 prev_state,
-                                 /*tid=*/4, kCommProc1, prio);
-  sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4, kCommProc1,
-                                 prio, prev_state,
-                                 /*tid=*/1, kCommProc2, prio);
-
-  context.process_tracker->SetProcessMetadata(2, base::nullopt, "test");
-  context.process_tracker->UpdateThread(4, 2);
-
-  ASSERT_EQ(context.storage->thread_table().tid()[1], 4u);
-  ASSERT_EQ(context.storage->thread_table().upid()[1].value(), 1u);
-  ASSERT_EQ(context.storage->process_table().pid()[1], 2u);
-  ASSERT_EQ(context.storage->process_table().start_ts()[1], base::nullopt);
-}
-
 TEST_F(ProcessTrackerTest, UpdateThreadCreate) {
   context.process_tracker->UpdateThread(12, 2);
 
diff --git a/src/trace_processor/importers/ftrace/sched_event_tracker_unittest.cc b/src/trace_processor/importers/ftrace/sched_event_tracker_unittest.cc
new file mode 100644
index 0000000..82363f9
--- /dev/null
+++ b/src/trace_processor/importers/ftrace/sched_event_tracker_unittest.cc
@@ -0,0 +1,139 @@
+/*
+ * 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/importers/ftrace/sched_event_tracker.h"
+
+#include "perfetto/base/logging.h"
+#include "src/trace_processor/importers/common/args_tracker.h"
+#include "src/trace_processor/importers/common/event_tracker.h"
+#include "src/trace_processor/importers/common/process_tracker.h"
+#include "test/gtest_and_gmock.h"
+
+namespace perfetto {
+namespace trace_processor {
+namespace {
+
+using ::testing::_;
+using ::testing::InSequence;
+using ::testing::Invoke;
+
+class SchedEventTrackerTest : public ::testing::Test {
+ public:
+  SchedEventTrackerTest() {
+    context.storage.reset(new TraceStorage());
+    context.global_args_tracker.reset(new GlobalArgsTracker(&context));
+    context.args_tracker.reset(new ArgsTracker(&context));
+    context.event_tracker.reset(new EventTracker(&context));
+    context.process_tracker.reset(new ProcessTracker(&context));
+    sched_tracker = SchedEventTracker::GetOrCreate(&context);
+  }
+
+ protected:
+  TraceProcessorContext context;
+  SchedEventTracker* sched_tracker;
+};
+
+TEST_F(SchedEventTrackerTest, InsertSecondSched) {
+  uint32_t cpu = 3;
+  int64_t timestamp = 100;
+  uint32_t pid_1 = 2;
+  int64_t prev_state = 32;
+  static const char kCommProc1[] = "process1";
+  static const char kCommProc2[] = "process2";
+  uint32_t pid_2 = 4;
+  int32_t prio = 1024;
+
+  sched_tracker->PushSchedSwitch(cpu, timestamp, pid_1, kCommProc2, prio,
+                                 prev_state, pid_2, kCommProc1, prio);
+  ASSERT_EQ(context.storage->sched_slice_table().row_count(), 1ul);
+
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 1, pid_2, kCommProc1, prio,
+                                 prev_state, pid_1, kCommProc2, prio);
+
+  ASSERT_EQ(context.storage->sched_slice_table().row_count(), 2ul);
+
+  const auto& timestamps = context.storage->sched_slice_table().ts();
+  ASSERT_EQ(timestamps[0], timestamp);
+  ASSERT_EQ(context.storage->thread_table().start_ts()[1], base::nullopt);
+
+  auto name =
+      context.storage->GetString(context.storage->thread_table().name()[1]);
+  ASSERT_STREQ(name.c_str(), kCommProc1);
+  ASSERT_EQ(context.storage->sched_slice_table().utid()[0], 1u);
+  ASSERT_EQ(context.storage->sched_slice_table().dur()[0], 1);
+}
+
+TEST_F(SchedEventTrackerTest, InsertThirdSched_SameThread) {
+  uint32_t cpu = 3;
+  int64_t timestamp = 100;
+  int64_t prev_state = 32;
+  static const char kCommProc1[] = "process1";
+  static const char kCommProc2[] = "process2";
+  int32_t prio = 1024;
+
+  sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/4, kCommProc2, prio,
+                                 prev_state,
+                                 /*tid=*/2, kCommProc1, prio);
+  ASSERT_EQ(context.storage->sched_slice_table().row_count(), 1u);
+
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/2, kCommProc1,
+                                 prio, prev_state,
+                                 /*tid=*/4, kCommProc2, prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 11, /*tid=*/4, kCommProc2,
+                                 prio, prev_state,
+                                 /*tid=*/2, kCommProc1, prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 31, /*tid=*/2, kCommProc1,
+                                 prio, prev_state,
+                                 /*tid=*/4, kCommProc2, prio);
+  ASSERT_EQ(context.storage->sched_slice_table().row_count(), 4ul);
+
+  const auto& timestamps = context.storage->sched_slice_table().ts();
+  ASSERT_EQ(timestamps[0], timestamp);
+  ASSERT_EQ(context.storage->thread_table().start_ts()[1], base::nullopt);
+  ASSERT_EQ(context.storage->sched_slice_table().dur()[0], 1u);
+  ASSERT_EQ(context.storage->sched_slice_table().dur()[1], 11u - 1u);
+  ASSERT_EQ(context.storage->sched_slice_table().dur()[2], 31u - 11u);
+  ASSERT_EQ(context.storage->sched_slice_table().utid()[0],
+            context.storage->sched_slice_table().utid()[2]);
+}
+
+TEST_F(SchedEventTrackerTest, UpdateThreadMatch) {
+  uint32_t cpu = 3;
+  int64_t timestamp = 100;
+  int64_t prev_state = 32;
+  static const char kCommProc1[] = "process1";
+  static const char kCommProc2[] = "process2";
+  int32_t prio = 1024;
+
+  sched_tracker->PushSchedSwitch(cpu, timestamp, /*tid=*/1, kCommProc2, prio,
+                                 prev_state,
+                                 /*tid=*/4, kCommProc1, prio);
+  sched_tracker->PushSchedSwitch(cpu, timestamp + 1, /*tid=*/4, kCommProc1,
+                                 prio, prev_state,
+                                 /*tid=*/1, kCommProc2, prio);
+
+  context.process_tracker->SetProcessMetadata(2, base::nullopt, "test");
+  context.process_tracker->UpdateThread(4, 2);
+
+  ASSERT_EQ(context.storage->thread_table().tid()[1], 4u);
+  ASSERT_EQ(context.storage->thread_table().upid()[1].value(), 1u);
+  ASSERT_EQ(context.storage->process_table().pid()[1], 2u);
+  ASSERT_EQ(context.storage->process_table().start_ts()[1], base::nullopt);
+}
+
+}  // namespace
+}  // namespace trace_processor
+}  // namespace perfetto