Snap for 4916303 from c5e18407c277ca75b854b4416c70d23dc2c6a90e to pi-qpr1-release

Change-Id: Ic4adee77a3526f949bf45bd1bf5d86c76d58edbc
diff --git a/src/ftrace_reader/ftrace_procfs.cc b/src/ftrace_reader/ftrace_procfs.cc
index 70aa050..bcc2557 100644
--- a/src/ftrace_reader/ftrace_procfs.cc
+++ b/src/ftrace_reader/ftrace_procfs.cc
@@ -170,6 +170,8 @@
     end = s.find(' ', start);
     if (end == std::string::npos)
       end = s.size();
+    while (end > start && s[end - 1] == '\n')
+      end--;
     if (start == end)
       break;
 
diff --git a/src/ftrace_reader/ftrace_procfs_unittest.cc b/src/ftrace_reader/ftrace_procfs_unittest.cc
index bccf2e0..6c86339 100644
--- a/src/ftrace_reader/ftrace_procfs_unittest.cc
+++ b/src/ftrace_reader/ftrace_procfs_unittest.cc
@@ -56,8 +56,44 @@
   EXPECT_THAT(ftrace.GetClock(), "global");
 
   EXPECT_CALL(ftrace, ReadFileIntoString("/root/trace_clock"))
+      .WillOnce(Return("local global [boot]"));
+  EXPECT_THAT(ftrace.GetClock(), "boot");
+
+  EXPECT_CALL(ftrace, ReadFileIntoString("/root/trace_clock"))
       .WillOnce(Return(""));
   EXPECT_THAT(ftrace.AvailableClocks(), IsEmpty());
+
+  // trace_clock text may end in a new line:
+  EXPECT_CALL(ftrace, ReadFileIntoString("/root/trace_clock"))
+      .WillOnce(Return("[local] global boot\n"));
+  EXPECT_THAT(ftrace.AvailableClocks(),
+              UnorderedElementsAre("local", "global", "boot"));
+
+  EXPECT_CALL(ftrace, ReadFileIntoString("/root/trace_clock"))
+      .WillOnce(Return("local global [boot]\n"));
+  EXPECT_THAT(ftrace.AvailableClocks(),
+              UnorderedElementsAre("local", "global", "boot"));
+
+  EXPECT_CALL(ftrace, ReadFileIntoString("/root/trace_clock"))
+      .WillOnce(Return("local global [boot]\n"));
+  EXPECT_THAT(ftrace.GetClock(), "boot");
+
+  EXPECT_CALL(ftrace, ReadFileIntoString("/root/trace_clock"))
+      .WillOnce(Return("\n"));
+  EXPECT_THAT(ftrace.AvailableClocks(), IsEmpty());
+
+  // We should handle many newlines (just in case):
+  EXPECT_CALL(ftrace, ReadFileIntoString("/root/trace_clock"))
+      .WillOnce(Return("local global [boot]\n\n\n"));
+  EXPECT_THAT(ftrace.GetClock(), "boot");
+
+  EXPECT_CALL(ftrace, ReadFileIntoString("/root/trace_clock"))
+      .WillOnce(Return("local global [boot]\n\n"));
+  EXPECT_THAT(ftrace.GetClock(), "boot");
+
+  EXPECT_CALL(ftrace, ReadFileIntoString("/root/trace_clock"))
+      .WillOnce(Return("\n\n\n\n"));
+  EXPECT_THAT(ftrace.AvailableClocks(), IsEmpty());
 }
 
 }  // namespace