blob: aa5be3a86dddf47e1ff79b00f8bb56f68baae5f2 [file] [log] [blame]
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "perfetto/protozero/scattered_heap_buffer.h"
#include "src/trace_redaction/proto_util.h"
#include "test/gtest_and_gmock.h"
#include "protos/perfetto/config/test_config.gen.h"
#include "protos/perfetto/config/test_config.pbzero.h"
#include "protos/perfetto/trace/trace_packet.gen.h"
namespace perfetto::trace_redaction {
namespace proto_util {
class ProtoUtilTest : public testing::Test {
protected:
void Reserialize(const protos::gen::TestConfig_DummyFields& fields) {
// Serialize the object and then deserialize it with proto decoder. This is
// needed to get the fields.
auto serialized = fields.SerializeAsString();
protozero::ProtoDecoder decoder(serialized);
protozero::HeapBuffered<protos::pbzero::TestConfig_DummyFields> message;
for (auto field = decoder.ReadField(); field.valid();
field = decoder.ReadField()) {
AppendField(field, message.get());
}
auto reserialized = message.SerializeAsString();
ASSERT_EQ(serialized, reserialized);
}
};
class ProtoUtilUint32Test : public ProtoUtilTest,
public testing::WithParamInterface<uint32_t> {};
class ProtoUtilUint64Test : public ProtoUtilTest,
public testing::WithParamInterface<uint64_t> {};
class ProtoUtilInt32Test : public ProtoUtilTest,
public testing::WithParamInterface<int32_t> {};
class ProtoUtilInt64Test : public ProtoUtilTest,
public testing::WithParamInterface<int64_t> {};
class ProtoUtilFixed32Test : public ProtoUtilTest,
public testing::WithParamInterface<uint32_t> {};
class ProtoUtilFixed64Test : public ProtoUtilTest,
public testing::WithParamInterface<uint64_t> {};
class ProtoUtilSfixed32Test : public ProtoUtilTest,
public testing::WithParamInterface<int32_t> {};
class ProtoUtilSfixed64Test : public ProtoUtilTest,
public testing::WithParamInterface<int64_t> {};
class ProtoUtilDoubleTest : public ProtoUtilTest,
public testing::WithParamInterface<double> {};
class ProtoUtilFloatTest : public ProtoUtilTest,
public testing::WithParamInterface<float> {};
class ProtoUtilSint32Test : public ProtoUtilTest,
public testing::WithParamInterface<int32_t> {};
class ProtoUtilSint64Test : public ProtoUtilTest,
public testing::WithParamInterface<int64_t> {};
class ProtoUtilStringTest : public ProtoUtilTest,
public testing::WithParamInterface<std::string> {};
class ProtoUtilBytesTest : public ProtoUtilTest,
public testing::WithParamInterface<std::string> {};
TEST_P(ProtoUtilUint32Test, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_uint32(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilUint32Test,
testing::Values(std::numeric_limits<uint32_t>::min(),
0,
0xFAAAAAAA,
std::numeric_limits<uint32_t>::max()));
TEST_P(ProtoUtilUint64Test, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_uint64(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilUint64Test,
testing::Values(std::numeric_limits<uint64_t>::min(),
0,
0xFAAAAAAAAAAAAAAA,
std::numeric_limits<uint64_t>::max()));
TEST_P(ProtoUtilInt32Test, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_int32(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilInt32Test,
testing::Values(std::numeric_limits<int32_t>::min(),
0xFAAAAAAA,
0,
0x0AAAAAAA,
std::numeric_limits<int32_t>::max()));
TEST_P(ProtoUtilInt64Test, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_int64(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilInt64Test,
testing::Values(std::numeric_limits<int64_t>::min(),
0xFAAAAAAAAAAAAAAA,
0,
0x0AAAAAAAAAAAAAAA,
std::numeric_limits<int64_t>::max()));
TEST_P(ProtoUtilFixed32Test, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_fixed32(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilFixed32Test,
testing::Values(std::numeric_limits<uint32_t>::min(),
0,
0xFAAAAAAAAAAAAAAA,
std::numeric_limits<uint32_t>::max()));
TEST_P(ProtoUtilSfixed32Test, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_sfixed32(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilSfixed32Test,
testing::Values(std::numeric_limits<int32_t>::min(),
0xFAAAAAAA,
0,
0x0AAAAAAA,
std::numeric_limits<int32_t>::max()));
TEST_P(ProtoUtilDoubleTest, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_double(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(
Reserialize,
ProtoUtilDoubleTest,
testing::Values(std::numeric_limits<double>::min(),
0.0,
1.0,
std::numeric_limits<double>::infinity(),
std::numeric_limits<double>::max()));
TEST_P(ProtoUtilFloatTest, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_float(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilFloatTest,
testing::Values(std::numeric_limits<float>::min(),
0.0f,
1.0f,
std::numeric_limits<float>::infinity(),
std::numeric_limits<float>::max()));
TEST_P(ProtoUtilSint64Test, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_sint64(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilSint64Test,
testing::Values(std::numeric_limits<int64_t>::min(),
0xFAAAAAAAAAAAAAAA,
0,
0x0AAAAAAAAAAAAAAA,
std::numeric_limits<int64_t>::max()));
TEST_P(ProtoUtilSint32Test, FullDomain) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_sint32(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilSint32Test,
testing::Values(std::numeric_limits<int32_t>::min(),
0xFAAAAAAA,
0,
0x0AAAAAAA,
std::numeric_limits<int32_t>::max()));
TEST_P(ProtoUtilStringTest, Various) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_string(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilStringTest,
testing::Values("",
"a",
"abcdefghijklmonpqrstuvwxyz",
std::string(1024, 'a')));
TEST_P(ProtoUtilBytesTest, Various) {
auto value = GetParam();
protos::gen::TestConfig_DummyFields fields;
fields.set_field_bytes(value);
Reserialize(fields);
}
INSTANTIATE_TEST_SUITE_P(Reserialize,
ProtoUtilBytesTest,
testing::Values("",
"a",
"abcdefghijklmonpqrstuvwxyz",
std::string(1024, 'a')));
} // namespace proto_util
} // namespace perfetto::trace_redaction