199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// Copyright (C) 2017 The Android Open Source Project 299c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// 399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// Licensed under the Apache License, Version 2.0 (the "License"); 499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// you may not use this file except in compliance with the License. 599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// You may obtain a copy of the License at 699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// 799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// http://www.apache.org/licenses/LICENSE-2.0 899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// 999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// Unless required by applicable law or agreed to in writing, software 1099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// distributed under the License is distributed on an "AS IS" BASIS, 1199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1299c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// See the License for the specific language governing permissions and 1399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin// limitations under the License. 144e843106a6f510a7d77fedfbeaec8e95b57905b7Yi Jin#define DEBUG false 15b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin#include "Log.h" 16bdf58942c86240070bacc25203177cf47f6a1577Yi Jin 17c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#include "FdBuffer.h" 18c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#include "PrivacyBuffer.h" 1999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 2099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin#include <android-base/file.h> 2199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin#include <android-base/test_utils.h> 22bdf58942c86240070bacc25203177cf47f6a1577Yi Jin#include <android/os/IncidentReportArgs.h> 2399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin#include <gmock/gmock.h> 2499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin#include <gtest/gtest.h> 2599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin#include <string.h> 2699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 2799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinusing namespace android; 2899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinusing namespace android::base; 29bdf58942c86240070bacc25203177cf47f6a1577Yi Jinusing namespace android::os; 306cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinusing namespace android::os::incidentd; 3199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinusing ::testing::StrEq; 3299c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinusing ::testing::Test; 3399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinusing ::testing::internal::CaptureStdout; 3499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinusing ::testing::internal::GetCapturedStdout; 3599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 3699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinconst uint8_t OTHER_TYPE = 1; 3799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinconst uint8_t STRING_TYPE = 9; 3899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinconst uint8_t MESSAGE_TYPE = 11; 396cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinconst std::string STRING_FIELD_0 = "\x02\viamtestdata"; 406cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinconst std::string VARINT_FIELD_1 = "\x08\x96\x01"; // 150 416cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinconst std::string STRING_FIELD_2 = "\x12\vandroidwins"; 426cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinconst std::string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff"; // -1 436cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinconst std::string FIX32_FIELD_4 = "\x25\xff\xff\xff\xff"; // -1 446cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jinconst std::string MESSAGE_FIELD_5 = "\x2a\x10" + VARINT_FIELD_1 + STRING_FIELD_2; 45ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jinconst std::string NEGATIVE_VARINT_FIELD_6 = "\x30\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01"; // -1 4699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 47c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinclass PrivacyBufferTest : public Test { 4899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinpublic: 49c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin virtual ~PrivacyBufferTest() { 50bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV // Delete in reverse order of construction, to be consistent with 51bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV // regular allocation/deallocation. 52bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV while (!privacies.empty()) { 53bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV delete privacies.back(); 54bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV privacies.pop_back(); 55bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV } 56bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV } 57bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV 58b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin virtual void SetUp() override { ASSERT_NE(tf.fd, -1); } 5999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 606cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin void writeToFdBuffer(std::string str) { 61254102d858942393482589b8f1e6102b33797b58Wei Wang ASSERT_TRUE(WriteStringToFile(str, tf.path)); 62e3dab2d906ee45954e58826b11cce9219c005cc5Yi Jin ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, 10000)); 63c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin ASSERT_EQ(str.size(), buffer.size()); 6499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin } 6599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 666cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin void assertBuffer(PrivacyBuffer& buf, std::string expected) { 6799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin ASSERT_EQ(buf.size(), expected.size()); 6899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin CaptureStdout(); 6999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin ASSERT_EQ(buf.flush(STDOUT_FILENO), NO_ERROR); 7099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin ASSERT_THAT(GetCapturedStdout(), StrEq(expected)); 7199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin } 7299c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 736cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin void assertStrip(uint8_t dest, std::string expected, Privacy* policy) { 743ec5cc792e932dc668bf9fb2cf5e6c6288a7f9b4Yi Jin PrivacySpec spec = PrivacySpec::new_spec(dest); 75c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin EncodedBuffer::iterator bufData = buffer.data(); 76c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin PrivacyBuffer privacyBuf(policy, bufData); 77c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin ASSERT_EQ(privacyBuf.strip(spec), NO_ERROR); 78c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin assertBuffer(privacyBuf, expected); 7999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin } 8099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 816cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin void assertStripByFields(uint8_t dest, std::string expected, int size, Privacy* privacy, ...) { 82b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* list[size + 1]; 8399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin list[0] = privacy; 8499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin va_list args; 8599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin va_start(args, privacy); 86b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin for (int i = 1; i < size; i++) { 8799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin Privacy* p = va_arg(args, Privacy*); 8899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin list[i] = p; 8999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin } 9099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin va_end(args); 9199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin list[size] = NULL; 927e0b4e5880d389e6af1af602373aefa5b0b04d34Yi Jin assertStrip(dest, expected, create_message_privacy(300, list)); 9399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin } 9499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 95bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV Privacy* create_privacy(uint32_t field_id, uint8_t type, uint8_t dest) { 96bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV Privacy* p = new_uninit_privacy(); 97bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV p->field_id = field_id; 98bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV p->type = type; 99bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV p->children = NULL; 100bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV p->dest = dest; 101bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV p->patterns = NULL; 102bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV return p; 103bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV } 104bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV 105bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV Privacy* create_message_privacy(uint32_t field_id, Privacy** children) { 106bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV Privacy* p = new_uninit_privacy(); 107bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV p->field_id = field_id; 108bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV p->type = MESSAGE_TYPE; 109bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV p->children = children; 110bdf58942c86240070bacc25203177cf47f6a1577Yi Jin p->dest = DEST_DEFAULT_VALUE; 111bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV p->patterns = NULL; 112bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV return p; 113bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV } 114bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV 11599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin FdBuffer buffer; 116b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin 11799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinprivate: 11899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin TemporaryFile tf; 119bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV // Littering this code with unique_ptr (or similar) is ugly, so we just 120bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV // mass-free everything after the test completes. 121b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin std::vector<Privacy*> privacies; 122bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV 123b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* new_uninit_privacy() { 124bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV Privacy* p = new Privacy; 125bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV privacies.push_back(p); 126bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV return p; 127bbe04e87e9f7227b4a661a5ef05967fcca8439ecGeorge Burgess IV } 12899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin}; 12999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 130bdf58942c86240070bacc25203177cf47f6a1577Yi JinTEST_F(PrivacyBufferTest, NullPolicy) { 13199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(STRING_FIELD_0); 132bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStrip(DEST_EXPLICIT, STRING_FIELD_0, NULL); 13399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 13499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 135bdf58942c86240070bacc25203177cf47f6a1577Yi JinTEST_F(PrivacyBufferTest, StripUnsetField) { 13699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(STRING_FIELD_0); 137bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStripByFields(DEST_AUTOMATIC, "", 1, create_privacy(0, STRING_TYPE, DEST_UNSET)); 13899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 13999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 140c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, StripVarintField) { 14199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(VARINT_FIELD_1); 142bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(1, OTHER_TYPE, DEST_LOCAL)); 14399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 14499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 145c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, StripLengthDelimitedField_String) { 14699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(STRING_FIELD_2); 147bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(2, STRING_TYPE, DEST_LOCAL)); 14899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 14999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 150c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, StripFixed64Field) { 15199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(FIX64_FIELD_3); 152bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(3, OTHER_TYPE, DEST_LOCAL)); 15399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 15499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 155c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, StripFixed32Field) { 15699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(FIX32_FIELD_4); 157bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(4, OTHER_TYPE, DEST_LOCAL)); 15899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 15999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 160c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, StripLengthDelimitedField_Message) { 16199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(MESSAGE_FIELD_5); 162bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(5, MESSAGE_TYPE, DEST_LOCAL)); 16399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 16499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 165ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi JinTEST_F(PrivacyBufferTest, StripNegativeVarint) { 166ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jin writeToFdBuffer(NEGATIVE_VARINT_FIELD_6); 167ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jin assertStripByFields(DEST_EXPLICIT, "", 1, create_privacy(6, OTHER_TYPE, DEST_LOCAL)); 168ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jin} 169ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jin 170c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, NoStripVarintField) { 17199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(VARINT_FIELD_1); 172b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin assertStripByFields(DEST_EXPLICIT, VARINT_FIELD_1, 1, 173b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin create_privacy(1, OTHER_TYPE, DEST_AUTOMATIC)); 17499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 17599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 176c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, NoStripLengthDelimitedField_String) { 17799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(STRING_FIELD_2); 178b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin assertStripByFields(DEST_EXPLICIT, STRING_FIELD_2, 1, 179b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin create_privacy(2, STRING_TYPE, DEST_AUTOMATIC)); 18099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 18199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 182c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, NoStripFixed64Field) { 18399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(FIX64_FIELD_3); 184b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin assertStripByFields(DEST_EXPLICIT, FIX64_FIELD_3, 1, 185b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin create_privacy(3, OTHER_TYPE, DEST_AUTOMATIC)); 18699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 18799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 188c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, NoStripFixed32Field) { 18999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(FIX32_FIELD_4); 190b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin assertStripByFields(DEST_EXPLICIT, FIX32_FIELD_4, 1, 191b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin create_privacy(4, OTHER_TYPE, DEST_AUTOMATIC)); 19299c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 19399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 194c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, NoStripLengthDelimitedField_Message) { 19599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(MESSAGE_FIELD_5); 196b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin assertStripByFields(DEST_EXPLICIT, MESSAGE_FIELD_5, 1, 197b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC)); 19899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 19999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 200ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi JinTEST_F(PrivacyBufferTest, NoStripNegativeVarintField) { 201ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jin writeToFdBuffer(NEGATIVE_VARINT_FIELD_6); 202ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jin assertStripByFields(DEST_EXPLICIT, NEGATIVE_VARINT_FIELD_6, 1, 203ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jin create_privacy(6, OTHER_TYPE, DEST_AUTOMATIC)); 204ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jin} 205ba7ee6ff11de405bf271c9c2f653e6a6c96c4607Yi Jin 206c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, StripVarintAndString) { 207b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 + 208b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin FIX32_FIELD_4); 2096cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin std::string expected = STRING_FIELD_0 + FIX64_FIELD_3 + FIX32_FIELD_4; 210b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL), 211b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin create_privacy(2, STRING_TYPE, DEST_LOCAL)); 21299c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 21399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 214c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, StripVarintAndFixed64) { 215b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 + 216b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin FIX32_FIELD_4); 2176cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin std::string expected = STRING_FIELD_0 + STRING_FIELD_2 + FIX32_FIELD_4; 218b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL), 219b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin create_privacy(3, OTHER_TYPE, DEST_LOCAL)); 22099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 22199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 222c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, StripVarintInNestedMessage) { 22399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5); 224b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL}; 2256cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2; 226bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStripByFields(DEST_EXPLICIT, expected, 1, create_message_privacy(5, list)); 22799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 22899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 229c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, StripFix64AndVarintInNestedMessage) { 23099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(STRING_FIELD_0 + FIX64_FIELD_3 + MESSAGE_FIELD_5); 231b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL}; 2326cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2; 233b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(3, OTHER_TYPE, DEST_LOCAL), 234b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin create_message_privacy(5, list)); 23599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 23699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 237c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, ClearAndStrip) { 23899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin string data = STRING_FIELD_0 + VARINT_FIELD_1; 23999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(data); 240b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL}; 241c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin EncodedBuffer::iterator bufData = buffer.data(); 242c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin PrivacyBuffer privacyBuf(create_message_privacy(300, list), bufData); 2433ec5cc792e932dc668bf9fb2cf5e6c6288a7f9b4Yi Jin PrivacySpec spec1 = PrivacySpec::new_spec(DEST_EXPLICIT); 2443ec5cc792e932dc668bf9fb2cf5e6c6288a7f9b4Yi Jin PrivacySpec spec2 = PrivacySpec::new_spec(DEST_LOCAL); 24599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 246c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin ASSERT_EQ(privacyBuf.strip(spec1), NO_ERROR); 247c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin assertBuffer(privacyBuf, STRING_FIELD_0); 248c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin ASSERT_EQ(privacyBuf.strip(spec2), NO_ERROR); 249c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin assertBuffer(privacyBuf, data); 25099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 25199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 252c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, BadDataInFdBuffer) { 25399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer("iambaddata"); 254b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* list[] = {create_privacy(4, OTHER_TYPE, DEST_AUTOMATIC), NULL}; 255c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin EncodedBuffer::iterator bufData = buffer.data(); 256c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin PrivacyBuffer privacyBuf(create_message_privacy(300, list), bufData); 25799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin PrivacySpec spec; 258c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin ASSERT_EQ(privacyBuf.strip(spec), BAD_VALUE); 25999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 26099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin 261c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi JinTEST_F(PrivacyBufferTest, BadDataInNestedMessage) { 26299c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5 + "aoeoe"); 263b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL}; 264b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* field5[] = {create_message_privacy(5, list), NULL}; 265c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin EncodedBuffer::iterator bufData = buffer.data(); 266c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin PrivacyBuffer privacyBuf(create_message_privacy(300, field5), bufData); 26799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin PrivacySpec spec; 268c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin ASSERT_EQ(privacyBuf.strip(spec), BAD_VALUE); 26999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin} 270be6de3017b2045926424dcbc8b65ce63376963a2Yi Jin 271be6de3017b2045926424dcbc8b65ce63376963a2Yi JinTEST_F(PrivacyBufferTest, SelfRecursionMessage) { 272be6de3017b2045926424dcbc8b65ce63376963a2Yi Jin string input = "\x2a\"" + VARINT_FIELD_1 + STRING_FIELD_2 + MESSAGE_FIELD_5; 273be6de3017b2045926424dcbc8b65ce63376963a2Yi Jin writeToFdBuffer(input); 274be6de3017b2045926424dcbc8b65ce63376963a2Yi Jin Privacy* field5 = create_message_privacy(5, NULL); 275b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), field5, NULL}; 276be6de3017b2045926424dcbc8b65ce63376963a2Yi Jin field5->children = list; 2776cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin std::string expected = "\x2a\x1c" + STRING_FIELD_2 + "\x2a\xd" + STRING_FIELD_2; 278bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStrip(DEST_EXPLICIT, expected, field5); 279be6de3017b2045926424dcbc8b65ce63376963a2Yi Jin} 280bdf58942c86240070bacc25203177cf47f6a1577Yi Jin 281bdf58942c86240070bacc25203177cf47f6a1577Yi JinTEST_F(PrivacyBufferTest, AutoMessage) { 282bdf58942c86240070bacc25203177cf47f6a1577Yi Jin writeToFdBuffer(STRING_FIELD_2 + MESSAGE_FIELD_5); 283b592e3bc3169e39bd6b0bfce9f788631d5d22acdYi Jin Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL}; 284bdf58942c86240070bacc25203177cf47f6a1577Yi Jin Privacy* autoMsg = create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC); 285bdf58942c86240070bacc25203177cf47f6a1577Yi Jin autoMsg->children = list; 2866cacbcbf436be744a34f7ea0d4f838ff97757446Yi Jin std::string expected = "\x2a\xd" + STRING_FIELD_2; 287bdf58942c86240070bacc25203177cf47f6a1577Yi Jin assertStripByFields(DEST_AUTOMATIC, expected, 1, autoMsg); 288c858e2781c437c9b659141fb42299c1df4c95d74Yi Jin} 289