blob: 685759ffcf39cb01c82aa541572105109b57bfc5 [file] [log] [blame]
Yi Jin99c248f2017-08-25 18:11:58 -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 Jinbdf58942017-11-14 17:58:19 -080016
Yi Jinc23fad22017-09-15 17:24:59 -070017#include "FdBuffer.h"
18#include "PrivacyBuffer.h"
Yi Jin99c248f2017-08-25 18:11:58 -070019
20#include <android-base/file.h>
21#include <android-base/test_utils.h>
Yi Jinbdf58942017-11-14 17:58:19 -080022#include <android/os/IncidentReportArgs.h>
Yi Jin99c248f2017-08-25 18:11:58 -070023#include <gmock/gmock.h>
24#include <gtest/gtest.h>
25#include <string.h>
26
27using namespace android;
28using namespace android::base;
Yi Jinbdf58942017-11-14 17:58:19 -080029using namespace android::os;
Yi Jin6cacbcb2018-03-30 14:04:52 -070030using namespace android::os::incidentd;
Yi Jin99c248f2017-08-25 18:11:58 -070031using ::testing::StrEq;
32using ::testing::Test;
33using ::testing::internal::CaptureStdout;
34using ::testing::internal::GetCapturedStdout;
35
Yi Jin99c248f2017-08-25 18:11:58 -070036const uint8_t OTHER_TYPE = 1;
37const uint8_t STRING_TYPE = 9;
38const uint8_t MESSAGE_TYPE = 11;
Yi Jin6cacbcb2018-03-30 14:04:52 -070039const std::string STRING_FIELD_0 = "\x02\viamtestdata";
40const std::string VARINT_FIELD_1 = "\x08\x96\x01"; // 150
41const std::string STRING_FIELD_2 = "\x12\vandroidwins";
42const std::string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff"; // -1
43const std::string FIX32_FIELD_4 = "\x25\xff\xff\xff\xff"; // -1
44const std::string MESSAGE_FIELD_5 = "\x2a\x10" + VARINT_FIELD_1 + STRING_FIELD_2;
Yi Jin99c248f2017-08-25 18:11:58 -070045
Yi Jinc23fad22017-09-15 17:24:59 -070046class PrivacyBufferTest : public Test {
Yi Jin99c248f2017-08-25 18:11:58 -070047public:
Yi Jinc23fad22017-09-15 17:24:59 -070048 virtual ~PrivacyBufferTest() {
George Burgess IVbbe04e82017-09-19 16:36:02 -070049 // Delete in reverse order of construction, to be consistent with
50 // regular allocation/deallocation.
51 while (!privacies.empty()) {
52 delete privacies.back();
53 privacies.pop_back();
54 }
55 }
56
Yi Jinb592e3b2018-02-01 15:17:04 -080057 virtual void SetUp() override { ASSERT_NE(tf.fd, -1); }
Yi Jin99c248f2017-08-25 18:11:58 -070058
Yi Jin6cacbcb2018-03-30 14:04:52 -070059 void writeToFdBuffer(std::string str) {
Wei Wang254102d2017-11-09 21:45:29 -080060 ASSERT_TRUE(WriteStringToFile(str, tf.path));
Yi Jine3dab2d2018-03-22 16:56:39 -070061 ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, 10000));
Yi Jinc23fad22017-09-15 17:24:59 -070062 ASSERT_EQ(str.size(), buffer.size());
Yi Jin99c248f2017-08-25 18:11:58 -070063 }
64
Yi Jin6cacbcb2018-03-30 14:04:52 -070065 void assertBuffer(PrivacyBuffer& buf, std::string expected) {
Yi Jin99c248f2017-08-25 18:11:58 -070066 ASSERT_EQ(buf.size(), expected.size());
67 CaptureStdout();
68 ASSERT_EQ(buf.flush(STDOUT_FILENO), NO_ERROR);
69 ASSERT_THAT(GetCapturedStdout(), StrEq(expected));
70 }
71
Yi Jin6cacbcb2018-03-30 14:04:52 -070072 void assertStrip(uint8_t dest, std::string expected, Privacy* policy) {
Yi Jin3ec5cc72018-01-26 13:42:43 -080073 PrivacySpec spec = PrivacySpec::new_spec(dest);
Yi Jinc23fad22017-09-15 17:24:59 -070074 EncodedBuffer::iterator bufData = buffer.data();
75 PrivacyBuffer privacyBuf(policy, bufData);
76 ASSERT_EQ(privacyBuf.strip(spec), NO_ERROR);
77 assertBuffer(privacyBuf, expected);
Yi Jin99c248f2017-08-25 18:11:58 -070078 }
79
Yi Jin6cacbcb2018-03-30 14:04:52 -070080 void assertStripByFields(uint8_t dest, std::string expected, int size, Privacy* privacy, ...) {
Yi Jinb592e3b2018-02-01 15:17:04 -080081 Privacy* list[size + 1];
Yi Jin99c248f2017-08-25 18:11:58 -070082 list[0] = privacy;
83 va_list args;
84 va_start(args, privacy);
Yi Jinb592e3b2018-02-01 15:17:04 -080085 for (int i = 1; i < size; i++) {
Yi Jin99c248f2017-08-25 18:11:58 -070086 Privacy* p = va_arg(args, Privacy*);
87 list[i] = p;
88 }
89 va_end(args);
90 list[size] = NULL;
Yi Jin7e0b4e52017-09-12 20:00:25 -070091 assertStrip(dest, expected, create_message_privacy(300, list));
Yi Jin99c248f2017-08-25 18:11:58 -070092 }
93
George Burgess IVbbe04e82017-09-19 16:36:02 -070094 Privacy* create_privacy(uint32_t field_id, uint8_t type, uint8_t dest) {
95 Privacy* p = new_uninit_privacy();
96 p->field_id = field_id;
97 p->type = type;
98 p->children = NULL;
99 p->dest = dest;
100 p->patterns = NULL;
101 return p;
102 }
103
104 Privacy* create_message_privacy(uint32_t field_id, Privacy** children) {
105 Privacy* p = new_uninit_privacy();
106 p->field_id = field_id;
107 p->type = MESSAGE_TYPE;
108 p->children = children;
Yi Jinbdf58942017-11-14 17:58:19 -0800109 p->dest = DEST_DEFAULT_VALUE;
George Burgess IVbbe04e82017-09-19 16:36:02 -0700110 p->patterns = NULL;
111 return p;
112 }
113
Yi Jin99c248f2017-08-25 18:11:58 -0700114 FdBuffer buffer;
Yi Jinb592e3b2018-02-01 15:17:04 -0800115
Yi Jin99c248f2017-08-25 18:11:58 -0700116private:
117 TemporaryFile tf;
George Burgess IVbbe04e82017-09-19 16:36:02 -0700118 // Littering this code with unique_ptr (or similar) is ugly, so we just
119 // mass-free everything after the test completes.
Yi Jinb592e3b2018-02-01 15:17:04 -0800120 std::vector<Privacy*> privacies;
George Burgess IVbbe04e82017-09-19 16:36:02 -0700121
Yi Jinb592e3b2018-02-01 15:17:04 -0800122 Privacy* new_uninit_privacy() {
George Burgess IVbbe04e82017-09-19 16:36:02 -0700123 Privacy* p = new Privacy;
124 privacies.push_back(p);
125 return p;
126 }
Yi Jin99c248f2017-08-25 18:11:58 -0700127};
128
Yi Jinbdf58942017-11-14 17:58:19 -0800129TEST_F(PrivacyBufferTest, NullPolicy) {
Yi Jin99c248f2017-08-25 18:11:58 -0700130 writeToFdBuffer(STRING_FIELD_0);
Yi Jinbdf58942017-11-14 17:58:19 -0800131 assertStrip(DEST_EXPLICIT, STRING_FIELD_0, NULL);
Yi Jin99c248f2017-08-25 18:11:58 -0700132}
133
Yi Jinbdf58942017-11-14 17:58:19 -0800134TEST_F(PrivacyBufferTest, StripUnsetField) {
Yi Jin99c248f2017-08-25 18:11:58 -0700135 writeToFdBuffer(STRING_FIELD_0);
Yi Jinbdf58942017-11-14 17:58:19 -0800136 assertStripByFields(DEST_AUTOMATIC, "", 1, create_privacy(0, STRING_TYPE, DEST_UNSET));
Yi Jin99c248f2017-08-25 18:11:58 -0700137}
138
Yi Jinc23fad22017-09-15 17:24:59 -0700139TEST_F(PrivacyBufferTest, StripVarintField) {
Yi Jin99c248f2017-08-25 18:11:58 -0700140 writeToFdBuffer(VARINT_FIELD_1);
Yi Jinbdf58942017-11-14 17:58:19 -0800141 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(1, OTHER_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700142}
143
Yi Jinc23fad22017-09-15 17:24:59 -0700144TEST_F(PrivacyBufferTest, StripLengthDelimitedField_String) {
Yi Jin99c248f2017-08-25 18:11:58 -0700145 writeToFdBuffer(STRING_FIELD_2);
Yi Jinbdf58942017-11-14 17:58:19 -0800146 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(2, STRING_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700147}
148
Yi Jinc23fad22017-09-15 17:24:59 -0700149TEST_F(PrivacyBufferTest, StripFixed64Field) {
Yi Jin99c248f2017-08-25 18:11:58 -0700150 writeToFdBuffer(FIX64_FIELD_3);
Yi Jinbdf58942017-11-14 17:58:19 -0800151 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(3, OTHER_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700152}
153
Yi Jinc23fad22017-09-15 17:24:59 -0700154TEST_F(PrivacyBufferTest, StripFixed32Field) {
Yi Jin99c248f2017-08-25 18:11:58 -0700155 writeToFdBuffer(FIX32_FIELD_4);
Yi Jinbdf58942017-11-14 17:58:19 -0800156 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(4, OTHER_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700157}
158
Yi Jinc23fad22017-09-15 17:24:59 -0700159TEST_F(PrivacyBufferTest, StripLengthDelimitedField_Message) {
Yi Jin99c248f2017-08-25 18:11:58 -0700160 writeToFdBuffer(MESSAGE_FIELD_5);
Yi Jinbdf58942017-11-14 17:58:19 -0800161 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(5, MESSAGE_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700162}
163
Yi Jinc23fad22017-09-15 17:24:59 -0700164TEST_F(PrivacyBufferTest, NoStripVarintField) {
Yi Jin99c248f2017-08-25 18:11:58 -0700165 writeToFdBuffer(VARINT_FIELD_1);
Yi Jinb592e3b2018-02-01 15:17:04 -0800166 assertStripByFields(DEST_EXPLICIT, VARINT_FIELD_1, 1,
167 create_privacy(1, OTHER_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700168}
169
Yi Jinc23fad22017-09-15 17:24:59 -0700170TEST_F(PrivacyBufferTest, NoStripLengthDelimitedField_String) {
Yi Jin99c248f2017-08-25 18:11:58 -0700171 writeToFdBuffer(STRING_FIELD_2);
Yi Jinb592e3b2018-02-01 15:17:04 -0800172 assertStripByFields(DEST_EXPLICIT, STRING_FIELD_2, 1,
173 create_privacy(2, STRING_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700174}
175
Yi Jinc23fad22017-09-15 17:24:59 -0700176TEST_F(PrivacyBufferTest, NoStripFixed64Field) {
Yi Jin99c248f2017-08-25 18:11:58 -0700177 writeToFdBuffer(FIX64_FIELD_3);
Yi Jinb592e3b2018-02-01 15:17:04 -0800178 assertStripByFields(DEST_EXPLICIT, FIX64_FIELD_3, 1,
179 create_privacy(3, OTHER_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700180}
181
Yi Jinc23fad22017-09-15 17:24:59 -0700182TEST_F(PrivacyBufferTest, NoStripFixed32Field) {
Yi Jin99c248f2017-08-25 18:11:58 -0700183 writeToFdBuffer(FIX32_FIELD_4);
Yi Jinb592e3b2018-02-01 15:17:04 -0800184 assertStripByFields(DEST_EXPLICIT, FIX32_FIELD_4, 1,
185 create_privacy(4, OTHER_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700186}
187
Yi Jinc23fad22017-09-15 17:24:59 -0700188TEST_F(PrivacyBufferTest, NoStripLengthDelimitedField_Message) {
Yi Jin99c248f2017-08-25 18:11:58 -0700189 writeToFdBuffer(MESSAGE_FIELD_5);
Yi Jinb592e3b2018-02-01 15:17:04 -0800190 assertStripByFields(DEST_EXPLICIT, MESSAGE_FIELD_5, 1,
191 create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700192}
193
Yi Jinc23fad22017-09-15 17:24:59 -0700194TEST_F(PrivacyBufferTest, StripVarintAndString) {
Yi Jinb592e3b2018-02-01 15:17:04 -0800195 writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
196 FIX32_FIELD_4);
Yi Jin6cacbcb2018-03-30 14:04:52 -0700197 std::string expected = STRING_FIELD_0 + FIX64_FIELD_3 + FIX32_FIELD_4;
Yi Jinb592e3b2018-02-01 15:17:04 -0800198 assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL),
199 create_privacy(2, STRING_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700200}
201
Yi Jinc23fad22017-09-15 17:24:59 -0700202TEST_F(PrivacyBufferTest, StripVarintAndFixed64) {
Yi Jinb592e3b2018-02-01 15:17:04 -0800203 writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
204 FIX32_FIELD_4);
Yi Jin6cacbcb2018-03-30 14:04:52 -0700205 std::string expected = STRING_FIELD_0 + STRING_FIELD_2 + FIX32_FIELD_4;
Yi Jinb592e3b2018-02-01 15:17:04 -0800206 assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL),
207 create_privacy(3, OTHER_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700208}
209
Yi Jinc23fad22017-09-15 17:24:59 -0700210TEST_F(PrivacyBufferTest, StripVarintInNestedMessage) {
Yi Jin99c248f2017-08-25 18:11:58 -0700211 writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5);
Yi Jinb592e3b2018-02-01 15:17:04 -0800212 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
Yi Jin6cacbcb2018-03-30 14:04:52 -0700213 std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
Yi Jinbdf58942017-11-14 17:58:19 -0800214 assertStripByFields(DEST_EXPLICIT, expected, 1, create_message_privacy(5, list));
Yi Jin99c248f2017-08-25 18:11:58 -0700215}
216
Yi Jinc23fad22017-09-15 17:24:59 -0700217TEST_F(PrivacyBufferTest, StripFix64AndVarintInNestedMessage) {
Yi Jin99c248f2017-08-25 18:11:58 -0700218 writeToFdBuffer(STRING_FIELD_0 + FIX64_FIELD_3 + MESSAGE_FIELD_5);
Yi Jinb592e3b2018-02-01 15:17:04 -0800219 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
Yi Jin6cacbcb2018-03-30 14:04:52 -0700220 std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
Yi Jinb592e3b2018-02-01 15:17:04 -0800221 assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(3, OTHER_TYPE, DEST_LOCAL),
222 create_message_privacy(5, list));
Yi Jin99c248f2017-08-25 18:11:58 -0700223}
224
Yi Jinc23fad22017-09-15 17:24:59 -0700225TEST_F(PrivacyBufferTest, ClearAndStrip) {
Yi Jin99c248f2017-08-25 18:11:58 -0700226 string data = STRING_FIELD_0 + VARINT_FIELD_1;
227 writeToFdBuffer(data);
Yi Jinb592e3b2018-02-01 15:17:04 -0800228 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
Yi Jinc23fad22017-09-15 17:24:59 -0700229 EncodedBuffer::iterator bufData = buffer.data();
230 PrivacyBuffer privacyBuf(create_message_privacy(300, list), bufData);
Yi Jin3ec5cc72018-01-26 13:42:43 -0800231 PrivacySpec spec1 = PrivacySpec::new_spec(DEST_EXPLICIT);
232 PrivacySpec spec2 = PrivacySpec::new_spec(DEST_LOCAL);
Yi Jin99c248f2017-08-25 18:11:58 -0700233
Yi Jinc23fad22017-09-15 17:24:59 -0700234 ASSERT_EQ(privacyBuf.strip(spec1), NO_ERROR);
235 assertBuffer(privacyBuf, STRING_FIELD_0);
236 ASSERT_EQ(privacyBuf.strip(spec2), NO_ERROR);
237 assertBuffer(privacyBuf, data);
Yi Jin99c248f2017-08-25 18:11:58 -0700238}
239
Yi Jinc23fad22017-09-15 17:24:59 -0700240TEST_F(PrivacyBufferTest, BadDataInFdBuffer) {
Yi Jin99c248f2017-08-25 18:11:58 -0700241 writeToFdBuffer("iambaddata");
Yi Jinb592e3b2018-02-01 15:17:04 -0800242 Privacy* list[] = {create_privacy(4, OTHER_TYPE, DEST_AUTOMATIC), NULL};
Yi Jinc23fad22017-09-15 17:24:59 -0700243 EncodedBuffer::iterator bufData = buffer.data();
244 PrivacyBuffer privacyBuf(create_message_privacy(300, list), bufData);
Yi Jin99c248f2017-08-25 18:11:58 -0700245 PrivacySpec spec;
Yi Jinc23fad22017-09-15 17:24:59 -0700246 ASSERT_EQ(privacyBuf.strip(spec), BAD_VALUE);
Yi Jin99c248f2017-08-25 18:11:58 -0700247}
248
Yi Jinc23fad22017-09-15 17:24:59 -0700249TEST_F(PrivacyBufferTest, BadDataInNestedMessage) {
Yi Jin99c248f2017-08-25 18:11:58 -0700250 writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5 + "aoeoe");
Yi Jinb592e3b2018-02-01 15:17:04 -0800251 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
252 Privacy* field5[] = {create_message_privacy(5, list), NULL};
Yi Jinc23fad22017-09-15 17:24:59 -0700253 EncodedBuffer::iterator bufData = buffer.data();
254 PrivacyBuffer privacyBuf(create_message_privacy(300, field5), bufData);
Yi Jin99c248f2017-08-25 18:11:58 -0700255 PrivacySpec spec;
Yi Jinc23fad22017-09-15 17:24:59 -0700256 ASSERT_EQ(privacyBuf.strip(spec), BAD_VALUE);
Yi Jin99c248f2017-08-25 18:11:58 -0700257}
Yi Jinbe6de302017-10-24 12:30:24 -0700258
259TEST_F(PrivacyBufferTest, SelfRecursionMessage) {
260 string input = "\x2a\"" + VARINT_FIELD_1 + STRING_FIELD_2 + MESSAGE_FIELD_5;
261 writeToFdBuffer(input);
262 Privacy* field5 = create_message_privacy(5, NULL);
Yi Jinb592e3b2018-02-01 15:17:04 -0800263 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), field5, NULL};
Yi Jinbe6de302017-10-24 12:30:24 -0700264 field5->children = list;
Yi Jin6cacbcb2018-03-30 14:04:52 -0700265 std::string expected = "\x2a\x1c" + STRING_FIELD_2 + "\x2a\xd" + STRING_FIELD_2;
Yi Jinbdf58942017-11-14 17:58:19 -0800266 assertStrip(DEST_EXPLICIT, expected, field5);
Yi Jinbe6de302017-10-24 12:30:24 -0700267}
Yi Jinbdf58942017-11-14 17:58:19 -0800268
269TEST_F(PrivacyBufferTest, AutoMessage) {
270 writeToFdBuffer(STRING_FIELD_2 + MESSAGE_FIELD_5);
Yi Jinb592e3b2018-02-01 15:17:04 -0800271 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
Yi Jinbdf58942017-11-14 17:58:19 -0800272 Privacy* autoMsg = create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC);
273 autoMsg->children = list;
Yi Jin6cacbcb2018-03-30 14:04:52 -0700274 std::string expected = "\x2a\xd" + STRING_FIELD_2;
Yi Jinbdf58942017-11-14 17:58:19 -0800275 assertStripByFields(DEST_AUTOMATIC, expected, 1, autoMsg);
Yi Jinc858e272018-03-28 15:32:50 -0700276}