blob: c5d06d6d68bdb2f598eb8088c0eca614486ba1cb [file] [log] [blame]
Primiano Tucci42e2de12017-12-07 16:46:04 +00001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "perfetto/tracing/core/trace_packet.h"
18
19#include <string>
20
21#include "gtest/gtest.h"
22
Primiano Tucci20b760c2018-01-19 12:36:12 +000023#include "perfetto/trace/trace_packet.pb.h"
Primiano Tucci42e2de12017-12-07 16:46:04 +000024
25namespace perfetto {
26namespace {
27
28TEST(TracePacketTest, Simple) {
29 protos::TracePacket proto;
Sami Kyostila32e0b542018-02-14 08:55:43 +000030 proto.mutable_for_testing()->set_str("string field");
Primiano Tucci42e2de12017-12-07 16:46:04 +000031 std::string ser_buf = proto.SerializeAsString();
32 TracePacket tp;
Primiano Tucci09db8272018-03-08 17:47:47 +000033 tp.AddSlice(ser_buf.data(), ser_buf.size());
34 auto slice = tp.slices().begin();
35 ASSERT_NE(tp.slices().end(), slice);
Primiano Tucci16d1d632018-02-22 10:16:22 +000036 ASSERT_EQ(ser_buf.data(), slice->start);
37 ASSERT_EQ(ser_buf.size(), slice->size);
Primiano Tucci09db8272018-03-08 17:47:47 +000038 ASSERT_EQ(tp.slices().end(), ++slice);
Primiano Tucci42e2de12017-12-07 16:46:04 +000039
40 ASSERT_TRUE(tp.Decode());
41 ASSERT_TRUE(tp.Decode()); // Decode() should be idempotent.
42 ASSERT_NE(nullptr, tp.operator->());
Sami Kyostila32e0b542018-02-14 08:55:43 +000043 ASSERT_EQ(proto.for_testing().str(), tp->for_testing().str());
44 ASSERT_EQ(proto.for_testing().str(), (*tp).for_testing().str());
Primiano Tucci42e2de12017-12-07 16:46:04 +000045
46 // Check move operators.
47 TracePacket moved_tp(std::move(tp));
48 ASSERT_NE(nullptr, moved_tp.operator->());
Sami Kyostila32e0b542018-02-14 08:55:43 +000049 ASSERT_EQ(proto.for_testing().str(), moved_tp->for_testing().str());
Primiano Tucci42e2de12017-12-07 16:46:04 +000050
51 TracePacket moved_tp_2;
52 moved_tp_2 = std::move(moved_tp);
53 ASSERT_NE(nullptr, moved_tp_2.operator->());
Sami Kyostila32e0b542018-02-14 08:55:43 +000054 ASSERT_EQ(proto.for_testing().str(), moved_tp_2->for_testing().str());
Primiano Tucci42e2de12017-12-07 16:46:04 +000055}
56
Primiano Tucci16d1d632018-02-22 10:16:22 +000057TEST(TracePacketTest, Sliced) {
Primiano Tucci42e2de12017-12-07 16:46:04 +000058 protos::TracePacket proto;
Sami Kyostila32e0b542018-02-14 08:55:43 +000059 proto.mutable_for_testing()->set_str(
60 "this is an arbitrarily long string ........................");
Primiano Tucci42e2de12017-12-07 16:46:04 +000061 std::string ser_buf = proto.SerializeAsString();
62 TracePacket tp;
Primiano Tucci16d1d632018-02-22 10:16:22 +000063 tp.AddSlice({ser_buf.data(), 3});
64 tp.AddSlice({ser_buf.data() + 3, 5});
65 tp.AddSlice({ser_buf.data() + 3 + 5, ser_buf.size() - 3 - 5});
Primiano Tucciaf429f92017-12-19 01:51:50 +010066 ASSERT_EQ(ser_buf.size(), tp.size());
Primiano Tucci42e2de12017-12-07 16:46:04 +000067
Primiano Tucci09db8272018-03-08 17:47:47 +000068 auto slice = tp.slices().begin();
69 ASSERT_NE(tp.slices().end(), slice);
Primiano Tucci16d1d632018-02-22 10:16:22 +000070 ASSERT_EQ(ser_buf.data(), slice->start);
71 ASSERT_EQ(3u, slice->size);
Primiano Tucci42e2de12017-12-07 16:46:04 +000072
Primiano Tucci09db8272018-03-08 17:47:47 +000073 ASSERT_NE(tp.slices().end(), ++slice);
Primiano Tucci16d1d632018-02-22 10:16:22 +000074 ASSERT_EQ(ser_buf.data() + 3, slice->start);
75 ASSERT_EQ(5u, slice->size);
Primiano Tucci42e2de12017-12-07 16:46:04 +000076
Primiano Tucci09db8272018-03-08 17:47:47 +000077 ASSERT_NE(tp.slices().end(), ++slice);
Primiano Tucci16d1d632018-02-22 10:16:22 +000078 ASSERT_EQ(ser_buf.data() + 3 + 5, slice->start);
79 ASSERT_EQ(ser_buf.size() - 3 - 5, slice->size);
Primiano Tucci42e2de12017-12-07 16:46:04 +000080
Primiano Tucci09db8272018-03-08 17:47:47 +000081 ASSERT_EQ(tp.slices().end(), ++slice);
Primiano Tucci42e2de12017-12-07 16:46:04 +000082
83 ASSERT_TRUE(tp.Decode());
84 ASSERT_NE(nullptr, tp.operator->());
Sami Kyostila32e0b542018-02-14 08:55:43 +000085 ASSERT_EQ(proto.for_testing().str(), tp->for_testing().str());
Primiano Tucci42e2de12017-12-07 16:46:04 +000086}
87
88TEST(TracePacketTest, Corrupted) {
89 protos::TracePacket proto;
Sami Kyostila32e0b542018-02-14 08:55:43 +000090 proto.mutable_for_testing()->set_str("string field");
Primiano Tucci42e2de12017-12-07 16:46:04 +000091 std::string ser_buf = proto.SerializeAsString();
92 TracePacket tp;
Primiano Tucci16d1d632018-02-22 10:16:22 +000093 tp.AddSlice({ser_buf.data(), ser_buf.size() - 2}); // corrupted.
Primiano Tucci42e2de12017-12-07 16:46:04 +000094 ASSERT_FALSE(tp.Decode());
Primiano Tucci42e2de12017-12-07 16:46:04 +000095}
96
97} // namespace
98} // namespace perfetto