incidentd can now handle multiple callers asking it for incident reports

Test: bit incident_test:* GtsIncidentManagerTestCases:*
Bug: 123543706
Change-Id: I9f671dd5d8b2ad139f952a23e575c2be16120459
diff --git a/cmds/incidentd/tests/FdBuffer_test.cpp b/cmds/incidentd/tests/FdBuffer_test.cpp
index 3f92c2a..7edfadf 100644
--- a/cmds/incidentd/tests/FdBuffer_test.cpp
+++ b/cmds/incidentd/tests/FdBuffer_test.cpp
@@ -50,9 +50,9 @@
 
     void AssertBufferContent(const char* expected) {
         int i = 0;
-        EncodedBuffer::iterator it = buffer.data();
-        while (it.hasNext()) {
-            ASSERT_EQ(it.next(), expected[i++]);
+        sp<ProtoReader> reader = buffer.data()->read();
+        while (reader->hasNext()) {
+            ASSERT_EQ(reader->next(), expected[i++]);
         }
         EXPECT_EQ(expected[i], '\0');
     }
@@ -92,8 +92,8 @@
 }
 
 TEST_F(FdBufferTest, IterateEmpty) {
-    EncodedBuffer::iterator it = buffer.data();
-    EXPECT_FALSE(it.hasNext());
+    sp<ProtoReader> reader = buffer.data()->read();
+    EXPECT_FALSE(reader->hasNext());
 }
 
 TEST_F(FdBufferTest, ReadAndIterate) {
@@ -102,15 +102,23 @@
     ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
 
     int i = 0;
-    EncodedBuffer::iterator it = buffer.data();
-    while (it.hasNext()) {
-        EXPECT_EQ(it.next(), (uint8_t)testdata[i++]);
-    }
+    sp<ProtoReader> reader = buffer.data()->read();
 
-    it.rp()->rewind();
-    it.rp()->move(buffer.size());
-    EXPECT_EQ(it.bytesRead(), testdata.size());
-    EXPECT_FALSE(it.hasNext());
+    while (reader->hasNext()) {
+        EXPECT_EQ(reader->next(), (uint8_t)testdata[i++]);
+    }
+}
+
+TEST_F(FdBufferTest, Move) {
+    std::string testdata = "FdBuffer test string";
+    ASSERT_TRUE(WriteStringToFile(testdata, tf.path));
+    ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, READ_TIMEOUT));
+
+    sp<ProtoReader> reader = buffer.data()->read();
+    reader->move(buffer.size());
+
+    EXPECT_EQ(reader->bytesRead(), testdata.size());
+    EXPECT_FALSE(reader->hasNext());
 }
 
 TEST_F(FdBufferTest, ReadTimeout) {
@@ -224,7 +232,7 @@
     }
 }
 
-TEST_F(FdBufferTest, ReadInStreamMoreThan4MB) {
+TEST_F(FdBufferTest, ReadInStreamMoreThan4MBWithMove) {
     const std::string testFile = kTestDataPath + "morethan4MB.txt";
     size_t fourMB = (size_t)4 * 1024 * 1024;
     unique_fd fd(open(testFile.c_str(), O_RDONLY | O_CLOEXEC));
@@ -250,15 +258,45 @@
         EXPECT_FALSE(buffer.timedOut());
         EXPECT_TRUE(buffer.truncated());
         wait(&pid);
-        EncodedBuffer::iterator it = buffer.data();
-        it.rp()->move(fourMB);
-        EXPECT_EQ(it.bytesRead(), fourMB);
-        EXPECT_FALSE(it.hasNext());
+        sp<ProtoReader> reader = buffer.data()->read();
+        reader->move(fourMB);
 
-        it.rp()->rewind();
-        while (it.hasNext()) {
-            char c = 'A' + (it.bytesRead() % 64 / 8);
-            ASSERT_TRUE(it.next() == c);
+        EXPECT_EQ(reader->bytesRead(), fourMB);
+        EXPECT_FALSE(reader->hasNext());
+    }
+}
+
+TEST_F(FdBufferTest, ReadInStreamMoreThan4MBWithNext) {
+    const std::string testFile = kTestDataPath + "morethan4MB.txt";
+    size_t fourMB = (size_t)4 * 1024 * 1024;
+    unique_fd fd(open(testFile.c_str(), O_RDONLY | O_CLOEXEC));
+    ASSERT_NE(fd.get(), -1);
+    int pid = fork();
+    ASSERT_TRUE(pid != -1);
+
+    if (pid == 0) {
+        p2cPipe.writeFd().reset();
+        c2pPipe.readFd().reset();
+        ASSERT_TRUE(DoDataStream(p2cPipe.readFd(), c2pPipe.writeFd()));
+        p2cPipe.readFd().reset();
+        c2pPipe.writeFd().reset();
+        _exit(EXIT_SUCCESS);
+    } else {
+        p2cPipe.readFd().reset();
+        c2pPipe.writeFd().reset();
+
+        ASSERT_EQ(NO_ERROR,
+                  buffer.readProcessedDataInStream(fd, std::move(p2cPipe.writeFd()),
+                                                   std::move(c2pPipe.readFd()), READ_TIMEOUT));
+        EXPECT_EQ(buffer.size(), fourMB);
+        EXPECT_FALSE(buffer.timedOut());
+        EXPECT_TRUE(buffer.truncated());
+        wait(&pid);
+        sp<ProtoReader> reader = buffer.data()->read();
+
+        while (reader->hasNext()) {
+            char c = 'A' + (reader->bytesRead() % 64 / 8);
+            ASSERT_TRUE(reader->next() == c);
         }
     }
 }