blob: 871226b7a6a9dfa2332a8ddcbeed106c8cd5abd5 [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 Jinba7ee6f2018-04-11 16:11:05 -070045const std::string NEGATIVE_VARINT_FIELD_6 = "\x30\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01"; // -1
Yi Jin99c248f2017-08-25 18:11:58 -070046
Yi Jinc23fad22017-09-15 17:24:59 -070047class PrivacyBufferTest : public Test {
Yi Jin99c248f2017-08-25 18:11:58 -070048public:
Yi Jinc23fad22017-09-15 17:24:59 -070049 virtual ~PrivacyBufferTest() {
George Burgess IVbbe04e82017-09-19 16:36:02 -070050 // Delete in reverse order of construction, to be consistent with
51 // regular allocation/deallocation.
52 while (!privacies.empty()) {
53 delete privacies.back();
54 privacies.pop_back();
55 }
56 }
57
Yi Jinb592e3b2018-02-01 15:17:04 -080058 virtual void SetUp() override { ASSERT_NE(tf.fd, -1); }
Yi Jin99c248f2017-08-25 18:11:58 -070059
Yi Jin6cacbcb2018-03-30 14:04:52 -070060 void writeToFdBuffer(std::string str) {
Wei Wang254102d2017-11-09 21:45:29 -080061 ASSERT_TRUE(WriteStringToFile(str, tf.path));
Yi Jine3dab2d2018-03-22 16:56:39 -070062 ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, 10000));
Yi Jinc23fad22017-09-15 17:24:59 -070063 ASSERT_EQ(str.size(), buffer.size());
Yi Jin99c248f2017-08-25 18:11:58 -070064 }
65
Yi Jin6cacbcb2018-03-30 14:04:52 -070066 void assertBuffer(PrivacyBuffer& buf, std::string expected) {
Yi Jin99c248f2017-08-25 18:11:58 -070067 ASSERT_EQ(buf.size(), expected.size());
68 CaptureStdout();
69 ASSERT_EQ(buf.flush(STDOUT_FILENO), NO_ERROR);
70 ASSERT_THAT(GetCapturedStdout(), StrEq(expected));
71 }
72
Yi Jin6cacbcb2018-03-30 14:04:52 -070073 void assertStrip(uint8_t dest, std::string expected, Privacy* policy) {
Yi Jin3ec5cc72018-01-26 13:42:43 -080074 PrivacySpec spec = PrivacySpec::new_spec(dest);
Yi Jinc23fad22017-09-15 17:24:59 -070075 EncodedBuffer::iterator bufData = buffer.data();
76 PrivacyBuffer privacyBuf(policy, bufData);
77 ASSERT_EQ(privacyBuf.strip(spec), NO_ERROR);
78 assertBuffer(privacyBuf, expected);
Yi Jin99c248f2017-08-25 18:11:58 -070079 }
80
Yi Jin6cacbcb2018-03-30 14:04:52 -070081 void assertStripByFields(uint8_t dest, std::string expected, int size, Privacy* privacy, ...) {
Yi Jinb592e3b2018-02-01 15:17:04 -080082 Privacy* list[size + 1];
Yi Jin99c248f2017-08-25 18:11:58 -070083 list[0] = privacy;
84 va_list args;
85 va_start(args, privacy);
Yi Jinb592e3b2018-02-01 15:17:04 -080086 for (int i = 1; i < size; i++) {
Yi Jin99c248f2017-08-25 18:11:58 -070087 Privacy* p = va_arg(args, Privacy*);
88 list[i] = p;
89 }
90 va_end(args);
91 list[size] = NULL;
Yi Jin7e0b4e52017-09-12 20:00:25 -070092 assertStrip(dest, expected, create_message_privacy(300, list));
Yi Jin99c248f2017-08-25 18:11:58 -070093 }
94
George Burgess IVbbe04e82017-09-19 16:36:02 -070095 Privacy* create_privacy(uint32_t field_id, uint8_t type, uint8_t dest) {
96 Privacy* p = new_uninit_privacy();
97 p->field_id = field_id;
98 p->type = type;
99 p->children = NULL;
100 p->dest = dest;
101 p->patterns = NULL;
102 return p;
103 }
104
105 Privacy* create_message_privacy(uint32_t field_id, Privacy** children) {
106 Privacy* p = new_uninit_privacy();
107 p->field_id = field_id;
108 p->type = MESSAGE_TYPE;
109 p->children = children;
Yi Jinbdf58942017-11-14 17:58:19 -0800110 p->dest = DEST_DEFAULT_VALUE;
George Burgess IVbbe04e82017-09-19 16:36:02 -0700111 p->patterns = NULL;
112 return p;
113 }
114
Yi Jin99c248f2017-08-25 18:11:58 -0700115 FdBuffer buffer;
Yi Jinb592e3b2018-02-01 15:17:04 -0800116
Yi Jin99c248f2017-08-25 18:11:58 -0700117private:
118 TemporaryFile tf;
George Burgess IVbbe04e82017-09-19 16:36:02 -0700119 // Littering this code with unique_ptr (or similar) is ugly, so we just
120 // mass-free everything after the test completes.
Yi Jinb592e3b2018-02-01 15:17:04 -0800121 std::vector<Privacy*> privacies;
George Burgess IVbbe04e82017-09-19 16:36:02 -0700122
Yi Jinb592e3b2018-02-01 15:17:04 -0800123 Privacy* new_uninit_privacy() {
George Burgess IVbbe04e82017-09-19 16:36:02 -0700124 Privacy* p = new Privacy;
125 privacies.push_back(p);
126 return p;
127 }
Yi Jin99c248f2017-08-25 18:11:58 -0700128};
129
Yi Jinbdf58942017-11-14 17:58:19 -0800130TEST_F(PrivacyBufferTest, NullPolicy) {
Yi Jin99c248f2017-08-25 18:11:58 -0700131 writeToFdBuffer(STRING_FIELD_0);
Yi Jinbdf58942017-11-14 17:58:19 -0800132 assertStrip(DEST_EXPLICIT, STRING_FIELD_0, NULL);
Yi Jin99c248f2017-08-25 18:11:58 -0700133}
134
Yi Jinbdf58942017-11-14 17:58:19 -0800135TEST_F(PrivacyBufferTest, StripUnsetField) {
Yi Jin99c248f2017-08-25 18:11:58 -0700136 writeToFdBuffer(STRING_FIELD_0);
Yi Jinbdf58942017-11-14 17:58:19 -0800137 assertStripByFields(DEST_AUTOMATIC, "", 1, create_privacy(0, STRING_TYPE, DEST_UNSET));
Yi Jin99c248f2017-08-25 18:11:58 -0700138}
139
Yi Jinc23fad22017-09-15 17:24:59 -0700140TEST_F(PrivacyBufferTest, StripVarintField) {
Yi Jin99c248f2017-08-25 18:11:58 -0700141 writeToFdBuffer(VARINT_FIELD_1);
Yi Jinbdf58942017-11-14 17:58:19 -0800142 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(1, OTHER_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700143}
144
Yi Jinc23fad22017-09-15 17:24:59 -0700145TEST_F(PrivacyBufferTest, StripLengthDelimitedField_String) {
Yi Jin99c248f2017-08-25 18:11:58 -0700146 writeToFdBuffer(STRING_FIELD_2);
Yi Jinbdf58942017-11-14 17:58:19 -0800147 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(2, STRING_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700148}
149
Yi Jinc23fad22017-09-15 17:24:59 -0700150TEST_F(PrivacyBufferTest, StripFixed64Field) {
Yi Jin99c248f2017-08-25 18:11:58 -0700151 writeToFdBuffer(FIX64_FIELD_3);
Yi Jinbdf58942017-11-14 17:58:19 -0800152 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(3, OTHER_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700153}
154
Yi Jinc23fad22017-09-15 17:24:59 -0700155TEST_F(PrivacyBufferTest, StripFixed32Field) {
Yi Jin99c248f2017-08-25 18:11:58 -0700156 writeToFdBuffer(FIX32_FIELD_4);
Yi Jinbdf58942017-11-14 17:58:19 -0800157 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(4, OTHER_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700158}
159
Yi Jinc23fad22017-09-15 17:24:59 -0700160TEST_F(PrivacyBufferTest, StripLengthDelimitedField_Message) {
Yi Jin99c248f2017-08-25 18:11:58 -0700161 writeToFdBuffer(MESSAGE_FIELD_5);
Yi Jinbdf58942017-11-14 17:58:19 -0800162 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(5, MESSAGE_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700163}
164
Yi Jinba7ee6f2018-04-11 16:11:05 -0700165TEST_F(PrivacyBufferTest, StripNegativeVarint) {
166 writeToFdBuffer(NEGATIVE_VARINT_FIELD_6);
167 assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(6, OTHER_TYPE, DEST_LOCAL));
168}
169
Yi Jinc23fad22017-09-15 17:24:59 -0700170TEST_F(PrivacyBufferTest, NoStripVarintField) {
Yi Jin99c248f2017-08-25 18:11:58 -0700171 writeToFdBuffer(VARINT_FIELD_1);
Yi Jinb592e3b2018-02-01 15:17:04 -0800172 assertStripByFields(DEST_EXPLICIT, VARINT_FIELD_1, 1,
173 create_privacy(1, OTHER_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700174}
175
Yi Jinc23fad22017-09-15 17:24:59 -0700176TEST_F(PrivacyBufferTest, NoStripLengthDelimitedField_String) {
Yi Jin99c248f2017-08-25 18:11:58 -0700177 writeToFdBuffer(STRING_FIELD_2);
Yi Jinb592e3b2018-02-01 15:17:04 -0800178 assertStripByFields(DEST_EXPLICIT, STRING_FIELD_2, 1,
179 create_privacy(2, STRING_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700180}
181
Yi Jinc23fad22017-09-15 17:24:59 -0700182TEST_F(PrivacyBufferTest, NoStripFixed64Field) {
Yi Jin99c248f2017-08-25 18:11:58 -0700183 writeToFdBuffer(FIX64_FIELD_3);
Yi Jinb592e3b2018-02-01 15:17:04 -0800184 assertStripByFields(DEST_EXPLICIT, FIX64_FIELD_3, 1,
185 create_privacy(3, OTHER_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700186}
187
Yi Jinc23fad22017-09-15 17:24:59 -0700188TEST_F(PrivacyBufferTest, NoStripFixed32Field) {
Yi Jin99c248f2017-08-25 18:11:58 -0700189 writeToFdBuffer(FIX32_FIELD_4);
Yi Jinb592e3b2018-02-01 15:17:04 -0800190 assertStripByFields(DEST_EXPLICIT, FIX32_FIELD_4, 1,
191 create_privacy(4, OTHER_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700192}
193
Yi Jinc23fad22017-09-15 17:24:59 -0700194TEST_F(PrivacyBufferTest, NoStripLengthDelimitedField_Message) {
Yi Jin99c248f2017-08-25 18:11:58 -0700195 writeToFdBuffer(MESSAGE_FIELD_5);
Yi Jinb592e3b2018-02-01 15:17:04 -0800196 assertStripByFields(DEST_EXPLICIT, MESSAGE_FIELD_5, 1,
197 create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC));
Yi Jin99c248f2017-08-25 18:11:58 -0700198}
199
Yi Jinba7ee6f2018-04-11 16:11:05 -0700200TEST_F(PrivacyBufferTest, NoStripNegativeVarintField) {
201 writeToFdBuffer(NEGATIVE_VARINT_FIELD_6);
202 assertStripByFields(DEST_EXPLICIT, NEGATIVE_VARINT_FIELD_6, 1,
203 create_privacy(6, OTHER_TYPE, DEST_AUTOMATIC));
204}
205
Yi Jinc23fad22017-09-15 17:24:59 -0700206TEST_F(PrivacyBufferTest, StripVarintAndString) {
Yi Jinb592e3b2018-02-01 15:17:04 -0800207 writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
208 FIX32_FIELD_4);
Yi Jin6cacbcb2018-03-30 14:04:52 -0700209 std::string expected = STRING_FIELD_0 + FIX64_FIELD_3 + FIX32_FIELD_4;
Yi Jinb592e3b2018-02-01 15:17:04 -0800210 assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL),
211 create_privacy(2, STRING_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700212}
213
Yi Jinc23fad22017-09-15 17:24:59 -0700214TEST_F(PrivacyBufferTest, StripVarintAndFixed64) {
Yi Jinb592e3b2018-02-01 15:17:04 -0800215 writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
216 FIX32_FIELD_4);
Yi Jin6cacbcb2018-03-30 14:04:52 -0700217 std::string expected = STRING_FIELD_0 + STRING_FIELD_2 + FIX32_FIELD_4;
Yi Jinb592e3b2018-02-01 15:17:04 -0800218 assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL),
219 create_privacy(3, OTHER_TYPE, DEST_LOCAL));
Yi Jin99c248f2017-08-25 18:11:58 -0700220}
221
Yi Jinc23fad22017-09-15 17:24:59 -0700222TEST_F(PrivacyBufferTest, StripVarintInNestedMessage) {
Yi Jin99c248f2017-08-25 18:11:58 -0700223 writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5);
Yi Jinb592e3b2018-02-01 15:17:04 -0800224 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
Yi Jin6cacbcb2018-03-30 14:04:52 -0700225 std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
Yi Jinbdf58942017-11-14 17:58:19 -0800226 assertStripByFields(DEST_EXPLICIT, expected, 1, create_message_privacy(5, list));
Yi Jin99c248f2017-08-25 18:11:58 -0700227}
228
Yi Jinc23fad22017-09-15 17:24:59 -0700229TEST_F(PrivacyBufferTest, StripFix64AndVarintInNestedMessage) {
Yi Jin99c248f2017-08-25 18:11:58 -0700230 writeToFdBuffer(STRING_FIELD_0 + FIX64_FIELD_3 + MESSAGE_FIELD_5);
Yi Jinb592e3b2018-02-01 15:17:04 -0800231 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
Yi Jin6cacbcb2018-03-30 14:04:52 -0700232 std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
Yi Jinb592e3b2018-02-01 15:17:04 -0800233 assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(3, OTHER_TYPE, DEST_LOCAL),
234 create_message_privacy(5, list));
Yi Jin99c248f2017-08-25 18:11:58 -0700235}
236
Yi Jinc23fad22017-09-15 17:24:59 -0700237TEST_F(PrivacyBufferTest, ClearAndStrip) {
Yi Jin99c248f2017-08-25 18:11:58 -0700238 string data = STRING_FIELD_0 + VARINT_FIELD_1;
239 writeToFdBuffer(data);
Yi Jinb592e3b2018-02-01 15:17:04 -0800240 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
Yi Jinc23fad22017-09-15 17:24:59 -0700241 EncodedBuffer::iterator bufData = buffer.data();
242 PrivacyBuffer privacyBuf(create_message_privacy(300, list), bufData);
Yi Jin3ec5cc72018-01-26 13:42:43 -0800243 PrivacySpec spec1 = PrivacySpec::new_spec(DEST_EXPLICIT);
244 PrivacySpec spec2 = PrivacySpec::new_spec(DEST_LOCAL);
Yi Jin99c248f2017-08-25 18:11:58 -0700245
Yi Jinc23fad22017-09-15 17:24:59 -0700246 ASSERT_EQ(privacyBuf.strip(spec1), NO_ERROR);
247 assertBuffer(privacyBuf, STRING_FIELD_0);
248 ASSERT_EQ(privacyBuf.strip(spec2), NO_ERROR);
249 assertBuffer(privacyBuf, data);
Yi Jin99c248f2017-08-25 18:11:58 -0700250}
251
Yi Jinc23fad22017-09-15 17:24:59 -0700252TEST_F(PrivacyBufferTest, BadDataInFdBuffer) {
Yi Jin99c248f2017-08-25 18:11:58 -0700253 writeToFdBuffer("iambaddata");
Yi Jinb592e3b2018-02-01 15:17:04 -0800254 Privacy* list[] = {create_privacy(4, OTHER_TYPE, DEST_AUTOMATIC), NULL};
Yi Jinc23fad22017-09-15 17:24:59 -0700255 EncodedBuffer::iterator bufData = buffer.data();
256 PrivacyBuffer privacyBuf(create_message_privacy(300, list), bufData);
Yi Jin99c248f2017-08-25 18:11:58 -0700257 PrivacySpec spec;
Yi Jinc23fad22017-09-15 17:24:59 -0700258 ASSERT_EQ(privacyBuf.strip(spec), BAD_VALUE);
Yi Jin99c248f2017-08-25 18:11:58 -0700259}
260
Yi Jinc23fad22017-09-15 17:24:59 -0700261TEST_F(PrivacyBufferTest, BadDataInNestedMessage) {
Yi Jin99c248f2017-08-25 18:11:58 -0700262 writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5 + "aoeoe");
Yi Jinb592e3b2018-02-01 15:17:04 -0800263 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
264 Privacy* field5[] = {create_message_privacy(5, list), NULL};
Yi Jinc23fad22017-09-15 17:24:59 -0700265 EncodedBuffer::iterator bufData = buffer.data();
266 PrivacyBuffer privacyBuf(create_message_privacy(300, field5), bufData);
Yi Jin99c248f2017-08-25 18:11:58 -0700267 PrivacySpec spec;
Yi Jinc23fad22017-09-15 17:24:59 -0700268 ASSERT_EQ(privacyBuf.strip(spec), BAD_VALUE);
Yi Jin99c248f2017-08-25 18:11:58 -0700269}
Yi Jinbe6de302017-10-24 12:30:24 -0700270
271TEST_F(PrivacyBufferTest, SelfRecursionMessage) {
272 string input = "\x2a\"" + VARINT_FIELD_1 + STRING_FIELD_2 + MESSAGE_FIELD_5;
273 writeToFdBuffer(input);
274 Privacy* field5 = create_message_privacy(5, NULL);
Yi Jinb592e3b2018-02-01 15:17:04 -0800275 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), field5, NULL};
Yi Jinbe6de302017-10-24 12:30:24 -0700276 field5->children = list;
Yi Jin6cacbcb2018-03-30 14:04:52 -0700277 std::string expected = "\x2a\x1c" + STRING_FIELD_2 + "\x2a\xd" + STRING_FIELD_2;
Yi Jinbdf58942017-11-14 17:58:19 -0800278 assertStrip(DEST_EXPLICIT, expected, field5);
Yi Jinbe6de302017-10-24 12:30:24 -0700279}
Yi Jinbdf58942017-11-14 17:58:19 -0800280
281TEST_F(PrivacyBufferTest, AutoMessage) {
282 writeToFdBuffer(STRING_FIELD_2 + MESSAGE_FIELD_5);
Yi Jinb592e3b2018-02-01 15:17:04 -0800283 Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
Yi Jinbdf58942017-11-14 17:58:19 -0800284 Privacy* autoMsg = create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC);
285 autoMsg->children = list;
Yi Jin6cacbcb2018-03-30 14:04:52 -0700286 std::string expected = "\x2a\xd" + STRING_FIELD_2;
Yi Jinbdf58942017-11-14 17:58:19 -0800287 assertStripByFields(DEST_AUTOMATIC, expected, 1, autoMsg);
Yi Jinc858e272018-03-28 15:32:50 -0700288}