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