blob: 858f7d07c9306a0e6faad8a5da0adc563c070654 [file] [log] [blame]
Yi Jin0a3406f2017-06-22 19:23:11 -07001// Copyright (C) 2017 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Yi Jin4e843102018-02-14 15:36:18 -080014#define DEBUG false
Yi Jinb592e3b2018-02-01 15:17:04 -080015#include "Log.h"
Yi Jin0a3406f2017-06-22 19:23:11 -070016
17#include "Section.h"
18
19#include <android-base/file.h>
20#include <android-base/test_utils.h>
Yi Jin329130b2018-02-09 16:47:47 -080021#include <android/os/IncidentReportArgs.h>
Yi Jinc858e272018-03-28 15:32:50 -070022#include <android/util/protobuf.h>
Joe Onorato99598ee2019-02-11 15:55:13 +000023#include <frameworks/base/core/proto/android/os/incident.pb.h>
24#include <frameworks/base/core/proto/android/os/header.pb.h>
Yi Jin0a3406f2017-06-22 19:23:11 -070025#include <gmock/gmock.h>
26#include <gtest/gtest.h>
27#include <string.h>
28
Yi Jin6cacbcb2018-03-30 14:04:52 -070029using namespace android;
30using namespace android::base;
31using namespace android::binder;
32using namespace android::os;
33using namespace android::os::incidentd;
34using namespace android::util;
35using ::testing::StrEq;
36using ::testing::Test;
37using ::testing::internal::CaptureStdout;
38using ::testing::internal::GetCapturedStdout;
39
Yi Jin99c248f2017-08-25 18:11:58 -070040const int TIMEOUT_PARSER = -1;
41const int NOOP_PARSER = 0;
42const int REVERSE_PARSER = 1;
43
Yi Jinb44f7d42017-07-21 12:12:59 -070044const int QUICK_TIMEOUT_MS = 100;
45
Yi Jin6cacbcb2018-03-30 14:04:52 -070046const std::string VARINT_FIELD_1 = "\x08\x96\x01"; // 150
47const std::string STRING_FIELD_2 = "\x12\vandroidwins";
48const std::string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff"; // -1
Yi Jin0a3406f2017-06-22 19:23:11 -070049
Yi Jinedfd5bb2017-09-06 17:09:11 -070050// NOTICE: this test requires /system/bin/incident_helper is installed.
Yi Jin1a11fa12018-02-22 16:44:10 -080051class SectionTest : public Test {
52public:
53 virtual void SetUp() override { ASSERT_NE(tf.fd, -1); }
54
Yi Jin86dce412018-03-07 11:36:57 -080055 void printDebugString(std::string s) {
56 fprintf(stderr, "size: %zu\n", s.length());
57 for (size_t i = 0; i < s.length(); i++) {
58 char c = s[i];
59 fprintf(stderr, "\\x%x", c);
60 }
61 fprintf(stderr, "\n");
62 }
63
Yi Jin1a11fa12018-02-22 16:44:10 -080064protected:
65 TemporaryFile tf;
Yi Jin1a11fa12018-02-22 16:44:10 -080066
67 const std::string kTestPath = GetExecutableDirectory();
68 const std::string kTestDataPath = kTestPath + "/testdata/";
69};
Yi Jinedfd5bb2017-09-06 17:09:11 -070070
Yi Jinb592e3b2018-02-01 15:17:04 -080071class SimpleListener : public IIncidentReportStatusListener {
Yi Jin0f047162017-09-05 13:44:22 -070072public:
Yi Jinb592e3b2018-02-01 15:17:04 -080073 SimpleListener(){};
74 virtual ~SimpleListener(){};
Yi Jin0f047162017-09-05 13:44:22 -070075
76 virtual Status onReportStarted() { return Status::ok(); };
Joe Onorato99598ee2019-02-11 15:55:13 +000077 virtual Status onReportSectionStatus(int /*section*/, int /*status*/)
78 { return Status::ok(); };
Yi Jin0f047162017-09-05 13:44:22 -070079 virtual Status onReportFinished() { return Status::ok(); };
80 virtual Status onReportFailed() { return Status::ok(); };
81
82protected:
83 virtual IBinder* onAsBinder() override { return nullptr; };
84};
85
Joe Onorato99598ee2019-02-11 15:55:13 +000086/*
Yi Jin1a11fa12018-02-22 16:44:10 -080087TEST_F(SectionTest, MetadataSection) {
Yi Jin329130b2018-02-09 16:47:47 -080088 MetadataSection ms;
Yi Jin329130b2018-02-09 16:47:47 -080089
Joe Onorato99598ee2019-02-11 15:55:13 +000090 vector<sp<ReportRequest>> requests;
91 ReportRequestSet requestSet(requests);
92 requestSet.setMainFd(STDOUT_FILENO);
93
94 requestSet.setMainPrivacyPolicy(android::os::PRIVACY_POLICY_LOCAL);
95 requestSet.editSectionStats(1)->set_success(true);
Yi Jin329130b2018-02-09 16:47:47 -080096
97 CaptureStdout();
Joe Onorato99598ee2019-02-11 15:55:13 +000098 ASSERT_EQ(NO_ERROR, ms.Execute(&requestSet));
99
100 string out = GetCapturedStdout();
101 IncidentProto expectedIncident;
102 expectedIncident.ParseFromArray(out.data(), out.size());
103 ASSERT_TRUE(expectedIncident.has_metadata());
104 const IncidentMetadata& expectedMetadata = expectedIncident.metadata();
105 ASSERT_EQ(IncidentMetadata::LOCAL, expectedMetadata.dest());
106 ASSERT_EQ(1, expectedMetadata.sections_size());
107 ASSERT_EQ(1, expectedMetadata.sections(0).id());
108 ASSERT_TRUE(expectedMetadata.sections(0).has_success());
109 ASSERT_TRUE(expectedMetadata.sections(0).success());
Yi Jin329130b2018-02-09 16:47:47 -0800110}
111
Yi Jin1a11fa12018-02-22 16:44:10 -0800112TEST_F(SectionTest, FileSection) {
Yi Jin99c248f2017-08-25 18:11:58 -0700113 FileSection fs(REVERSE_PARSER, tf.path);
Yi Jin0a3406f2017-06-22 19:23:11 -0700114
Wei Wang254102d2017-11-09 21:45:29 -0800115 ASSERT_TRUE(WriteStringToFile("iamtestdata", tf.path));
Yi Jin0a3406f2017-06-22 19:23:11 -0700116
Joe Onorato99598ee2019-02-11 15:55:13 +0000117 vector<sp<ReportRequest>> requests;
118 ReportRequestSet requestSet(requests);
119 requestSet.setMainFd(STDOUT_FILENO);
Yi Jin0a3406f2017-06-22 19:23:11 -0700120
121 CaptureStdout();
Joe Onorato99598ee2019-02-11 15:55:13 +0000122 ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
Yi Jin0a3406f2017-06-22 19:23:11 -0700123 // The input string is reversed in incident helper
124 // The length is 11, in 128Varint it is "0000 1011" -> \v
Yi Jin99c248f2017-08-25 18:11:58 -0700125 EXPECT_THAT(GetCapturedStdout(), StrEq("\xa\vatadtsetmai"));
Yi Jin0a3406f2017-06-22 19:23:11 -0700126}
127
Yi Jin3f360352018-04-16 16:13:04 -0700128TEST_F(SectionTest, FileSectionNotExist) {
Joe Onorato99598ee2019-02-11 15:55:13 +0000129 vector<sp<ReportRequest>> requests;
130 ReportRequestSet requestSet(requests);
131
Kweku Adamse04ef772018-06-13 12:24:38 -0700132 FileSection fs1(NOOP_PARSER, "notexist", QUICK_TIMEOUT_MS);
Joe Onorato99598ee2019-02-11 15:55:13 +0000133 ASSERT_EQ(NO_ERROR, fs1.Execute(&requestSet));
Yi Jin3f360352018-04-16 16:13:04 -0700134
Kweku Adamse04ef772018-06-13 12:24:38 -0700135 FileSection fs2(NOOP_PARSER, "notexist", QUICK_TIMEOUT_MS);
Joe Onorato99598ee2019-02-11 15:55:13 +0000136 ASSERT_EQ(NO_ERROR, fs2.Execute(&requestSet));
Yi Jin3f360352018-04-16 16:13:04 -0700137}
138
Yi Jin1a11fa12018-02-22 16:44:10 -0800139TEST_F(SectionTest, FileSectionTimeout) {
Joe Onorato99598ee2019-02-11 15:55:13 +0000140 vector<sp<ReportRequest>> requests;
141 ReportRequestSet requestSet(requests);
142
Kweku Adamse04ef772018-06-13 12:24:38 -0700143 FileSection fs(TIMEOUT_PARSER, tf.path, QUICK_TIMEOUT_MS);
Joe Onorato99598ee2019-02-11 15:55:13 +0000144 ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
145 ASSERT_TRUE(requestSet.getSectionStats(TIMEOUT_PARSER)->timed_out());
Yi Jinb44f7d42017-07-21 12:12:59 -0700146}
147
Yi Jin1a11fa12018-02-22 16:44:10 -0800148TEST_F(SectionTest, GZipSection) {
149 const std::string testFile = kTestDataPath + "kmsg.txt";
150 const std::string testGzFile = testFile + ".gz";
151 GZipSection gs(NOOP_PARSER, "/tmp/nonexist", testFile.c_str(), NULL);
152
Joe Onorato99598ee2019-02-11 15:55:13 +0000153 vector<sp<ReportRequest>> requests;
154 ReportRequestSet requestSet(requests);
155 requestSet.setMainFd(tf.fd);
156 requestSet.setMainPrivacyPolicy(android::os::PRIVACY_POLICY_LOCAL);
Yi Jin1a11fa12018-02-22 16:44:10 -0800157
Joe Onorato99598ee2019-02-11 15:55:13 +0000158 ASSERT_EQ(NO_ERROR, gs.Execute(&requestSet));
Yi Jinc858e272018-03-28 15:32:50 -0700159 std::string expected, gzFile, actual;
Yi Jin1a11fa12018-02-22 16:44:10 -0800160 ASSERT_TRUE(ReadFileToString(testGzFile, &gzFile));
161 ASSERT_TRUE(ReadFileToString(tf.path, &actual));
Yi Jinc858e272018-03-28 15:32:50 -0700162 // generates the expected protobuf result.
163 size_t fileLen = testFile.size();
164 size_t totalLen = 1 + get_varint_size(fileLen) + fileLen + 3 + gzFile.size();
165 uint8_t header[20];
Yi Jin6cacbcb2018-03-30 14:04:52 -0700166 header[0] = '\x2'; // header 0 << 3 + 2
Yi Jinc858e272018-03-28 15:32:50 -0700167 uint8_t* ptr = write_raw_varint(header + 1, totalLen);
Yi Jin6cacbcb2018-03-30 14:04:52 -0700168 *ptr = '\n'; // header 1 << 3 + 2
Yi Jinc858e272018-03-28 15:32:50 -0700169 ptr = write_raw_varint(++ptr, fileLen);
170 expected.assign((const char*)header, ptr - header);
171 expected += testFile + "\x12\x9F\x6" + gzFile;
172 EXPECT_THAT(actual, StrEq(expected));
Yi Jin1a11fa12018-02-22 16:44:10 -0800173}
174
175TEST_F(SectionTest, GZipSectionNoFileFound) {
176 GZipSection gs(NOOP_PARSER, "/tmp/nonexist1", "/tmp/nonexist2", NULL);
Joe Onorato99598ee2019-02-11 15:55:13 +0000177 vector<sp<ReportRequest>> requests;
178 ReportRequestSet requestSet(requests);
179 requestSet.setMainFd(STDOUT_FILENO);
180 ASSERT_EQ(NO_ERROR, gs.Execute(&requestSet));
Yi Jin1a11fa12018-02-22 16:44:10 -0800181}
182
183TEST_F(SectionTest, CommandSectionConstructor) {
Yi Jinb44f7d42017-07-21 12:12:59 -0700184 CommandSection cs1(1, "echo", "\"this is a test\"", "ooo", NULL);
185 CommandSection cs2(2, "single_command", NULL);
186 CommandSection cs3(1, 3123, "echo", "\"this is a test\"", "ooo", NULL);
187 CommandSection cs4(2, 43214, "single_command", NULL);
188
Yi Jinc36e91d2018-03-08 11:25:58 -0800189 EXPECT_THAT(cs1.name.string(), StrEq("cmd echo \"this is a test\" ooo"));
190 EXPECT_THAT(cs2.name.string(), StrEq("cmd single_command"));
Yi Jinb44f7d42017-07-21 12:12:59 -0700191 EXPECT_EQ(3123, cs3.timeoutMs);
192 EXPECT_EQ(43214, cs4.timeoutMs);
Yi Jinc36e91d2018-03-08 11:25:58 -0800193 EXPECT_THAT(cs3.name.string(), StrEq("cmd echo \"this is a test\" ooo"));
194 EXPECT_THAT(cs4.name.string(), StrEq("cmd single_command"));
Yi Jinb44f7d42017-07-21 12:12:59 -0700195}
196
Yi Jin1a11fa12018-02-22 16:44:10 -0800197TEST_F(SectionTest, CommandSectionEcho) {
Yi Jin99c248f2017-08-25 18:11:58 -0700198 CommandSection cs(REVERSE_PARSER, "/system/bin/echo", "about", NULL);
Joe Onorato99598ee2019-02-11 15:55:13 +0000199 vector<sp<ReportRequest>> requests;
200 ReportRequestSet requestSet(requests);
201 requestSet.setMainFd(STDOUT_FILENO);
Yi Jinb44f7d42017-07-21 12:12:59 -0700202 CaptureStdout();
Joe Onorato99598ee2019-02-11 15:55:13 +0000203 ASSERT_EQ(NO_ERROR, cs.Execute(&requestSet));
Yi Jin99c248f2017-08-25 18:11:58 -0700204 EXPECT_THAT(GetCapturedStdout(), StrEq("\xa\x06\ntuoba"));
Yi Jinb44f7d42017-07-21 12:12:59 -0700205}
206
Yi Jin1a11fa12018-02-22 16:44:10 -0800207TEST_F(SectionTest, CommandSectionCommandTimeout) {
Yi Jin99c248f2017-08-25 18:11:58 -0700208 CommandSection cs(NOOP_PARSER, QUICK_TIMEOUT_MS, "/system/bin/yes", NULL);
Joe Onorato99598ee2019-02-11 15:55:13 +0000209 vector<sp<ReportRequest>> requests;
210 ReportRequestSet requestSet(requests);
211 ASSERT_EQ(NO_ERROR, cs.Execute(&requestSet));
212 ASSERT_TRUE(requestSet.getSectionStats(NOOP_PARSER)->timed_out());
Yi Jinb44f7d42017-07-21 12:12:59 -0700213}
214
Yi Jin1a11fa12018-02-22 16:44:10 -0800215TEST_F(SectionTest, CommandSectionIncidentHelperTimeout) {
Yi Jin99c248f2017-08-25 18:11:58 -0700216 CommandSection cs(TIMEOUT_PARSER, QUICK_TIMEOUT_MS, "/system/bin/echo", "about", NULL);
Joe Onorato99598ee2019-02-11 15:55:13 +0000217 vector<sp<ReportRequest>> requests;
218 ReportRequestSet requestSet(requests);
219 requestSet.setMainFd(STDOUT_FILENO);
220 ASSERT_EQ(NO_ERROR, cs.Execute(&requestSet));
221 ASSERT_TRUE(requestSet.getSectionStats(TIMEOUT_PARSER)->timed_out());
Yi Jinb44f7d42017-07-21 12:12:59 -0700222}
223
Yi Jin1a11fa12018-02-22 16:44:10 -0800224TEST_F(SectionTest, CommandSectionBadCommand) {
Yi Jin3c034c92017-12-22 17:36:47 -0800225 CommandSection cs(NOOP_PARSER, "echoo", "about", NULL);
Joe Onorato99598ee2019-02-11 15:55:13 +0000226 vector<sp<ReportRequest>> requests;
227 ReportRequestSet requestSet(requests);
228 ASSERT_EQ(NAME_NOT_FOUND, cs.Execute(&requestSet));
Yi Jinb44f7d42017-07-21 12:12:59 -0700229}
230
Yi Jin1a11fa12018-02-22 16:44:10 -0800231TEST_F(SectionTest, CommandSectionBadCommandAndTimeout) {
Yi Jin99c248f2017-08-25 18:11:58 -0700232 CommandSection cs(TIMEOUT_PARSER, QUICK_TIMEOUT_MS, "nonexistcommand", "-opt", NULL);
Yi Jinb44f7d42017-07-21 12:12:59 -0700233 // timeout will return first
Joe Onorato99598ee2019-02-11 15:55:13 +0000234 vector<sp<ReportRequest>> requests;
235 ReportRequestSet requestSet(requests);
236 ASSERT_EQ(NO_ERROR, cs.Execute(&requestSet));
237 ASSERT_TRUE(requestSet.getSectionStats(TIMEOUT_PARSER)->timed_out());
Yi Jin99c248f2017-08-25 18:11:58 -0700238}
239
Yi Jin1a11fa12018-02-22 16:44:10 -0800240TEST_F(SectionTest, LogSectionBinary) {
Yi Jin3c034c92017-12-22 17:36:47 -0800241 LogSection ls(1, LOG_ID_EVENTS);
Joe Onorato99598ee2019-02-11 15:55:13 +0000242 vector<sp<ReportRequest>> requests;
243 ReportRequestSet requestSet(requests);
244 requestSet.setMainFd(STDOUT_FILENO);
Yi Jin3c034c92017-12-22 17:36:47 -0800245 CaptureStdout();
Joe Onorato99598ee2019-02-11 15:55:13 +0000246 ASSERT_EQ(NO_ERROR, ls.Execute(&requestSet));
Yi Jin6cacbcb2018-03-30 14:04:52 -0700247 std::string results = GetCapturedStdout();
Yi Jin3c034c92017-12-22 17:36:47 -0800248 EXPECT_FALSE(results.empty());
249}
250
Yi Jin1a11fa12018-02-22 16:44:10 -0800251TEST_F(SectionTest, LogSectionSystem) {
Yi Jin3c034c92017-12-22 17:36:47 -0800252 LogSection ls(1, LOG_ID_SYSTEM);
Joe Onorato99598ee2019-02-11 15:55:13 +0000253 vector<sp<ReportRequest>> requests;
254 ReportRequestSet requestSet(requests);
255 requestSet.setMainFd(STDOUT_FILENO);
Yi Jin3c034c92017-12-22 17:36:47 -0800256 CaptureStdout();
Joe Onorato99598ee2019-02-11 15:55:13 +0000257 ASSERT_EQ(NO_ERROR, ls.Execute(&requestSet));
Yi Jin6cacbcb2018-03-30 14:04:52 -0700258 std::string results = GetCapturedStdout();
Yi Jin3c034c92017-12-22 17:36:47 -0800259 EXPECT_FALSE(results.empty());
260}
261
Yi Jin1a11fa12018-02-22 16:44:10 -0800262TEST_F(SectionTest, TestFilterPiiTaggedFields) {
Yi Jin99c248f2017-08-25 18:11:58 -0700263 FileSection fs(NOOP_PARSER, tf.path);
Yi Jin99c248f2017-08-25 18:11:58 -0700264
Wei Wang254102d2017-11-09 21:45:29 -0800265 ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, tf.path));
Yi Jin99c248f2017-08-25 18:11:58 -0700266
Joe Onorato99598ee2019-02-11 15:55:13 +0000267 vector<sp<ReportRequest>> requests;
268 ReportRequestSet requestSet(requests);
269 requestSet.setMainFd(STDOUT_FILENO);
Yi Jin99c248f2017-08-25 18:11:58 -0700270
271 CaptureStdout();
Joe Onorato99598ee2019-02-11 15:55:13 +0000272 ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
Yi Jin99c248f2017-08-25 18:11:58 -0700273 EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
Yi Jin0f047162017-09-05 13:44:22 -0700274}
275
Yi Jin1a11fa12018-02-22 16:44:10 -0800276TEST_F(SectionTest, TestBadFdRequest) {
277 FileSection fs(NOOP_PARSER, tf.path);
278 ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, tf.path));
Yi Jin0f047162017-09-05 13:44:22 -0700279
280 IncidentReportArgs args;
281 args.setAll(true);
Joe Onorato99598ee2019-02-11 15:55:13 +0000282 args.setPrivacyPolicy(0);
Yi Jin0f047162017-09-05 13:44:22 -0700283 sp<ReportRequest> badFdRequest = new ReportRequest(args, new SimpleListener(), 1234567);
Joe Onorato99598ee2019-02-11 15:55:13 +0000284
285 vector<sp<ReportRequest>> requests;
286 requests.push_back(badFdRequest);
287 ReportRequestSet requestSet(requests);
288 requestSet.setMainFd(STDOUT_FILENO);
Yi Jin0f047162017-09-05 13:44:22 -0700289
290 CaptureStdout();
Joe Onorato99598ee2019-02-11 15:55:13 +0000291 ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
Yi Jin0f047162017-09-05 13:44:22 -0700292 EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
293 EXPECT_EQ(badFdRequest->err, -EBADF);
294}
295
Yi Jin1a11fa12018-02-22 16:44:10 -0800296TEST_F(SectionTest, TestBadRequests) {
297 FileSection fs(NOOP_PARSER, tf.path);
298 ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, tf.path));
Yi Jin0f047162017-09-05 13:44:22 -0700299
300 IncidentReportArgs args;
301 args.setAll(true);
Joe Onorato99598ee2019-02-11 15:55:13 +0000302 args.setPrivacyPolicy(0);
303
304 vector<sp<ReportRequest>> requests;
305 requests.push_back(new ReportRequest(args, new SimpleListener(), -1));
306 ReportRequestSet requestSet(requests);
307
308 EXPECT_EQ(fs.Execute(&requestSet), -EBADF);
Yi Jin0f047162017-09-05 13:44:22 -0700309}
310
Yi Jin1a11fa12018-02-22 16:44:10 -0800311TEST_F(SectionTest, TestMultipleRequests) {
312 TemporaryFile output1, output2, output3;
313 FileSection fs(NOOP_PARSER, tf.path);
Yi Jin0f047162017-09-05 13:44:22 -0700314
Yi Jin0f047162017-09-05 13:44:22 -0700315 ASSERT_TRUE(output1.fd != -1);
316 ASSERT_TRUE(output2.fd != -1);
317 ASSERT_TRUE(output3.fd != -1);
Yi Jin1a11fa12018-02-22 16:44:10 -0800318 ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, tf.path));
Yi Jin0f047162017-09-05 13:44:22 -0700319
320 IncidentReportArgs args1, args2, args3;
321 args1.setAll(true);
Joe Onorato99598ee2019-02-11 15:55:13 +0000322 args1.setPrivacyPolicy(android::os::PRIVACY_POLICY_LOCAL);
Yi Jin329130b2018-02-09 16:47:47 -0800323 args2.setAll(true);
Joe Onorato99598ee2019-02-11 15:55:13 +0000324 args2.setPrivacyPolicy(android::os::PRIVACY_POLICY_EXPLICIT);
Yi Jin0f047162017-09-05 13:44:22 -0700325 sp<SimpleListener> l = new SimpleListener();
Joe Onorato99598ee2019-02-11 15:55:13 +0000326
327 vector<sp<ReportRequest>> requests;
328 requests.push_back(new ReportRequest(args1, l, output1.fd));
329 requests.push_back(new ReportRequest(args2, l, output2.fd));
330 requests.push_back(new ReportRequest(args3, l, output3.fd));
331 ReportRequestSet requestSet(requests);
332 requestSet.setMainFd(STDOUT_FILENO);
Yi Jin0f047162017-09-05 13:44:22 -0700333
334 CaptureStdout();
Joe Onorato99598ee2019-02-11 15:55:13 +0000335 ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
Yi Jin0f047162017-09-05 13:44:22 -0700336 EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
337
Yi Jin6cacbcb2018-03-30 14:04:52 -0700338 std::string content, expect;
Yi Jin0f047162017-09-05 13:44:22 -0700339 expect = VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3;
Yi Jinb592e3b2018-02-01 15:17:04 -0800340 char c = (char)expect.size();
Yi Jin0f047162017-09-05 13:44:22 -0700341 EXPECT_TRUE(ReadFileToString(output1.path, &content));
342 EXPECT_THAT(content, StrEq(string("\x02") + c + expect));
343
344 expect = STRING_FIELD_2 + FIX64_FIELD_3;
Yi Jinb592e3b2018-02-01 15:17:04 -0800345 c = (char)expect.size();
Yi Jin0f047162017-09-05 13:44:22 -0700346 EXPECT_TRUE(ReadFileToString(output2.path, &content));
347 EXPECT_THAT(content, StrEq(string("\x02") + c + expect));
348
349 // because args3 doesn't set section, so it should receive nothing
350 EXPECT_TRUE(ReadFileToString(output3.path, &content));
351 EXPECT_THAT(content, StrEq(""));
352}
353
Yi Jin1a11fa12018-02-22 16:44:10 -0800354TEST_F(SectionTest, TestMultipleRequestsBySpec) {
355 TemporaryFile output1, output2, output3;
356 FileSection fs(NOOP_PARSER, tf.path);
Yi Jin0f047162017-09-05 13:44:22 -0700357
Yi Jin0f047162017-09-05 13:44:22 -0700358 ASSERT_TRUE(output1.fd != -1);
359 ASSERT_TRUE(output2.fd != -1);
360 ASSERT_TRUE(output3.fd != -1);
361
Yi Jin1a11fa12018-02-22 16:44:10 -0800362 ASSERT_TRUE(WriteStringToFile(VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3, tf.path));
Yi Jin0f047162017-09-05 13:44:22 -0700363
Yi Jin329130b2018-02-09 16:47:47 -0800364 IncidentReportArgs args1, args2, args3;
Yi Jin0f047162017-09-05 13:44:22 -0700365 args1.setAll(true);
Joe Onorato99598ee2019-02-11 15:55:13 +0000366 args1.setPrivacyPolicy(android::os::PRIVACY_POLICY_EXPLICIT);
Yi Jin0f047162017-09-05 13:44:22 -0700367 args2.setAll(true);
Joe Onorato99598ee2019-02-11 15:55:13 +0000368 args2.setPrivacyPolicy(android::os::PRIVACY_POLICY_EXPLICIT);
Yi Jin329130b2018-02-09 16:47:47 -0800369 args3.setAll(true);
Yi Jin0f047162017-09-05 13:44:22 -0700370 sp<SimpleListener> l = new SimpleListener();
Joe Onorato99598ee2019-02-11 15:55:13 +0000371
372 vector<sp<ReportRequest>> requests;
373 requests.push_back(new ReportRequest(args1, l, output1.fd));
374 requests.push_back(new ReportRequest(args2, l, output2.fd));
375 requests.push_back(new ReportRequest(args3, l, output3.fd));
376 ReportRequestSet requestSet(requests);
377 requestSet.setMainFd(STDOUT_FILENO);
Yi Jin0f047162017-09-05 13:44:22 -0700378
379 CaptureStdout();
Joe Onorato99598ee2019-02-11 15:55:13 +0000380 ASSERT_EQ(NO_ERROR, fs.Execute(&requestSet));
Yi Jin0f047162017-09-05 13:44:22 -0700381 EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
382
Yi Jin6cacbcb2018-03-30 14:04:52 -0700383 std::string content, expect;
Yi Jin0f047162017-09-05 13:44:22 -0700384 expect = STRING_FIELD_2 + FIX64_FIELD_3;
Yi Jinb592e3b2018-02-01 15:17:04 -0800385 char c = (char)expect.size();
Yi Jin0f047162017-09-05 13:44:22 -0700386
387 // output1 and output2 are the same
388 EXPECT_TRUE(ReadFileToString(output1.path, &content));
389 EXPECT_THAT(content, StrEq(string("\x02") + c + expect));
390 EXPECT_TRUE(ReadFileToString(output2.path, &content));
391 EXPECT_THAT(content, StrEq(string("\x02") + c + expect));
392
Yi Jin329130b2018-02-09 16:47:47 -0800393 // output3 has only auto field
Yi Jinb592e3b2018-02-01 15:17:04 -0800394 c = (char)STRING_FIELD_2.size();
Yi Jin0f047162017-09-05 13:44:22 -0700395 EXPECT_TRUE(ReadFileToString(output3.path, &content));
Yi Jin329130b2018-02-09 16:47:47 -0800396 EXPECT_THAT(content, StrEq(string("\x02") + c + STRING_FIELD_2));
Yi Jin1a11fa12018-02-22 16:44:10 -0800397}
Joe Onorato99598ee2019-02-11 15:55:13 +0000398*/