Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(266)

Side by Side Diff: media/cast/logging/serialize_deserialize_test.cc

Issue 189583004: Cast: Implement log compression and (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/cast/logging/log_serializer.cc ('k') | media/cast/test/sender.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Joint LogSerializer and LogDeserializer testing to make sure they stay in 5 // Joint LogSerializer and LogDeserializer testing to make sure they stay in
6 // sync. 6 // sync.
7 7
8 #include "media/cast/logging/log_deserializer.h" 8 #include "media/cast/logging/log_deserializer.h"
9 #include "media/cast/logging/log_serializer.h" 9 #include "media/cast/logging/log_serializer.h"
10 #include "media/cast/logging/logging_defines.h" 10 #include "media/cast/logging/logging_defines.h"
11 #include "media/cast/logging/proto/proto_utils.h" 11 #include "media/cast/logging/proto/proto_utils.h"
12 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
13 13
14 using media::cast::proto::AggregatedFrameEvent; 14 using media::cast::proto::AggregatedFrameEvent;
15 using media::cast::proto::AggregatedPacketEvent; 15 using media::cast::proto::AggregatedPacketEvent;
16 using media::cast::proto::BasePacketEvent; 16 using media::cast::proto::BasePacketEvent;
17 using media::cast::proto::LogMetadata;
17 18
18 namespace { 19 namespace {
19 20
20 const media::cast::CastLoggingEvent kVideoFrameEvents[] = { 21 const media::cast::CastLoggingEvent kVideoFrameEvents[] = {
21 media::cast::kVideoFrameCaptured, media::cast::kVideoFrameReceived, 22 media::cast::kVideoFrameCaptured, media::cast::kVideoFrameReceived,
22 media::cast::kVideoFrameSentToEncoder, media::cast::kVideoFrameEncoded, 23 media::cast::kVideoFrameSentToEncoder, media::cast::kVideoFrameEncoded,
23 media::cast::kVideoFrameDecoded, media::cast::kVideoRenderDelay}; 24 media::cast::kVideoFrameDecoded, media::cast::kVideoRenderDelay};
24 25
25 const media::cast::CastLoggingEvent kVideoPacketEvents[] = { 26 const media::cast::CastLoggingEvent kVideoPacketEvents[] = {
26 media::cast::kPacketSentToPacer, media::cast::kPacketSentToNetwork, 27 media::cast::kPacketSentToPacer, media::cast::kPacketSentToNetwork,
27 media::cast::kVideoPacketReceived}; 28 media::cast::kVideoPacketReceived};
28 29
29 // The frame event fields cycle through these numbers. 30 // The frame event fields cycle through these numbers.
30 const int kEncodedFrameSize[] = {512, 425, 399, 400, 237}; 31 const int kEncodedFrameSize[] = {512, 425, 399, 400, 237};
31 const int kDelayMillis[] = {15, 4, 8, 42, 23, 16}; 32 const int kDelayMillis[] = {15, 4, 8, 42, 23, 16};
33
34 const int kMaxSerializedBytes = 10000;
32 } 35 }
33 36
34 namespace media { 37 namespace media {
35 namespace cast { 38 namespace cast {
36 39
37 class SerializeDeserializeTest : public ::testing::Test { 40 class SerializeDeserializeTest : public ::testing::Test {
38 protected: 41 protected:
39 SerializeDeserializeTest() : serializer_(kMaxSerializedLogBytes) {} 42 SerializeDeserializeTest()
43 : serialized_(new char[kMaxSerializedBytes]), output_bytes_(0) {}
40 44
41 virtual ~SerializeDeserializeTest() {} 45 virtual ~SerializeDeserializeTest() {}
42 46
43 LogSerializer serializer_; 47 void Init() {
48 metadata_.set_first_rtp_timestamp(12345678 * 90);
49 metadata_.set_is_audio(false);
50 metadata_.set_num_frame_events(10);
51 metadata_.set_num_packet_events(10);
52
53 int64 event_time_micros = 0;
54 // Insert frame and packet events with RTP timestamps 0, 90, 180, ...
55 for (int i = 0; i < metadata_.num_frame_events(); i++) {
56 linked_ptr<AggregatedFrameEvent> frame_event(new AggregatedFrameEvent);
57 frame_event->set_relative_rtp_timestamp(i * 90);
58 for (uint32 event_index = 0; event_index < arraysize(kVideoFrameEvents);
59 ++event_index) {
60 frame_event->add_event_type(
61 ToProtoEventType(kVideoFrameEvents[event_index]));
62 frame_event->add_event_timestamp_micros(event_time_micros);
63 event_time_micros += 1024;
64 }
65 frame_event->set_encoded_frame_size(
66 kEncodedFrameSize[i % arraysize(kEncodedFrameSize)]);
67 frame_event->set_delay_millis(kDelayMillis[i % arraysize(kDelayMillis)]);
68
69 frame_event_map_.insert(
70 std::make_pair(frame_event->relative_rtp_timestamp(), frame_event));
71 }
72
73 event_time_micros = 0;
74 int packet_id = 0;
75 for (int i = 0; i < metadata_.num_packet_events(); i++) {
76 linked_ptr<AggregatedPacketEvent> packet_event(new AggregatedPacketEvent);
77 packet_event->set_relative_rtp_timestamp(i * 90);
78 for (int j = 0; j < 10; j++) {
79 BasePacketEvent* base_event = packet_event->add_base_packet_event();
80 base_event->set_packet_id(packet_id);
81 packet_id++;
82 for (uint32 event_index = 0;
83 event_index < arraysize(kVideoPacketEvents);
84 ++event_index) {
85 base_event->add_event_type(
86 ToProtoEventType(kVideoPacketEvents[event_index]));
87 base_event->add_event_timestamp_micros(event_time_micros);
88 event_time_micros += 256;
89 }
90 }
91 packet_event_map_.insert(
92 std::make_pair(packet_event->relative_rtp_timestamp(), packet_event));
93 }
94 }
95
96 void Verify(const LogMetadata& returned_metadata,
97 const FrameEventMap& returned_frame_events,
98 const PacketEventMap& returned_packet_events) {
99 EXPECT_EQ(metadata_.SerializeAsString(),
100 returned_metadata.SerializeAsString());
101
102 // Check that the returned map is equal to the original map.
103 EXPECT_EQ(frame_event_map_.size(), returned_frame_events.size());
104 for (FrameEventMap::const_iterator frame_it = returned_frame_events.begin();
105 frame_it != returned_frame_events.end();
106 ++frame_it) {
107 FrameEventMap::iterator original_it =
108 frame_event_map_.find(frame_it->first);
109 ASSERT_NE(frame_event_map_.end(), original_it);
110 // Compare protos by serializing and checking the bytes.
111 EXPECT_EQ(original_it->second->SerializeAsString(),
112 frame_it->second->SerializeAsString());
113 frame_event_map_.erase(original_it);
114 }
115 EXPECT_TRUE(frame_event_map_.empty());
116
117 EXPECT_EQ(packet_event_map_.size(), returned_packet_events.size());
118 for (PacketEventMap::const_iterator packet_it =
119 returned_packet_events.begin();
120 packet_it != returned_packet_events.end();
121 ++packet_it) {
122 PacketEventMap::iterator original_it =
123 packet_event_map_.find(packet_it->first);
124 ASSERT_NE(packet_event_map_.end(), original_it);
125 // Compare protos by serializing and checking the bytes.
126 EXPECT_EQ(original_it->second->SerializeAsString(),
127 packet_it->second->SerializeAsString());
128 packet_event_map_.erase(original_it);
129 }
130 EXPECT_TRUE(packet_event_map_.empty());
131 }
132
133 LogMetadata metadata_;
134 FrameEventMap frame_event_map_;
135 PacketEventMap packet_event_map_;
136 scoped_ptr<char[]> serialized_;
137 int output_bytes_;
44 }; 138 };
45 139
46 TEST_F(SerializeDeserializeTest, Basic) { 140 TEST_F(SerializeDeserializeTest, Uncompressed) {
47 RtpTimestamp first_rtp_timestamp = 12345678 * 90; 141 bool compressed = false;
48 FrameEventMap frame_event_map; 142 Init();
49 PacketEventMap packet_event_map;
50 143
51 int64 event_time_micros = 0; 144 bool success = SerializeEvents(metadata_,
52 // Insert frame and packet events with RTP timestamps 0, 90, 180, ... 145 frame_event_map_,
53 for (int i = 0; i < 10; i++) { 146 packet_event_map_,
54 linked_ptr<AggregatedFrameEvent> frame_event(new AggregatedFrameEvent); 147 compressed,
55 frame_event->set_relative_rtp_timestamp(i * 90); 148 kMaxSerializedBytes,
56 for (uint32 event_index = 0; event_index < arraysize(kVideoFrameEvents); 149 serialized_.get(),
57 ++event_index) { 150 &output_bytes_);
58 frame_event->add_event_type(
59 ToProtoEventType(kVideoFrameEvents[event_index]));
60 frame_event->add_event_timestamp_micros(event_time_micros);
61 event_time_micros += 1024;
62 }
63 frame_event->set_encoded_frame_size(
64 kEncodedFrameSize[i % arraysize(kEncodedFrameSize)]);
65 frame_event->set_delay_millis(kDelayMillis[i % arraysize(kDelayMillis)]);
66
67 frame_event_map.insert(
68 std::make_pair(frame_event->relative_rtp_timestamp(), frame_event));
69 }
70
71 event_time_micros = 0;
72 int packet_id = 0;
73 for (int i = 0; i < 10; i++) {
74 linked_ptr<AggregatedPacketEvent> packet_event(new AggregatedPacketEvent);
75 packet_event->set_relative_rtp_timestamp(i * 90);
76 for (int j = 0; j < 10; j++) {
77 BasePacketEvent* base_event = packet_event->add_base_packet_event();
78 base_event->set_packet_id(packet_id);
79 packet_id++;
80 for (uint32 event_index = 0; event_index < arraysize(kVideoPacketEvents);
81 ++event_index) {
82 base_event->add_event_type(
83 ToProtoEventType(kVideoPacketEvents[event_index]));
84 base_event->add_event_timestamp_micros(event_time_micros);
85 event_time_micros += 256;
86 }
87 }
88 packet_event_map.insert(
89 std::make_pair(packet_event->relative_rtp_timestamp(), packet_event));
90 }
91
92 media::cast::proto::LogMetadata metadata;
93 metadata.set_is_audio(false);
94 metadata.set_first_rtp_timestamp(first_rtp_timestamp);
95 metadata.set_num_frame_events(frame_event_map.size());
96 metadata.set_num_packet_events(packet_event_map.size());
97 bool success = serializer_.SerializeEventsForStream(
98 metadata, frame_event_map, packet_event_map);
99 uint32 length = serializer_.GetSerializedLength();
100 scoped_ptr<std::string> serialized = serializer_.GetSerializedLogAndReset();
101 ASSERT_TRUE(success); 151 ASSERT_TRUE(success);
102 ASSERT_EQ(length, serialized->size()); 152 ASSERT_GT(output_bytes_, 0);
103 153
104 FrameEventMap returned_frame_events; 154 FrameEventMap returned_frame_events;
105 PacketEventMap returned_packet_events; 155 PacketEventMap returned_packet_events;
106 media::cast::proto::LogMetadata returned_metadata; 156 LogMetadata returned_metadata;
107 success = DeserializeEvents(*serialized, 157 success = DeserializeEvents(serialized_.get(),
158 output_bytes_,
159 compressed,
108 &returned_metadata, 160 &returned_metadata,
109 &returned_frame_events, 161 &returned_frame_events,
110 &returned_packet_events); 162 &returned_packet_events);
111 ASSERT_TRUE(success); 163 ASSERT_TRUE(success);
112 EXPECT_FALSE(returned_metadata.is_audio());
113 EXPECT_EQ(first_rtp_timestamp, returned_metadata.first_rtp_timestamp());
114 164
115 // Check that the returned map is equal to the original map. 165 Verify(returned_metadata, returned_frame_events, returned_packet_events);
116 EXPECT_EQ(frame_event_map.size(), returned_frame_events.size()); 166 }
117 for (FrameEventMap::iterator frame_it = returned_frame_events.begin();
118 frame_it != returned_frame_events.end();
119 ++frame_it) {
120 FrameEventMap::iterator original_it = frame_event_map.find(frame_it->first);
121 ASSERT_NE(frame_event_map.end(), original_it);
122 // Compare protos by serializing and checking the bytes.
123 EXPECT_EQ(original_it->second->SerializeAsString(),
124 frame_it->second->SerializeAsString());
125 frame_event_map.erase(original_it);
126 }
127 EXPECT_TRUE(frame_event_map.empty());
128 167
129 EXPECT_EQ(packet_event_map.size(), returned_packet_events.size()); 168 TEST_F(SerializeDeserializeTest, UncompressedInsufficientSpace) {
130 for (PacketEventMap::iterator packet_it = returned_packet_events.begin(); 169 bool compressed = false;
131 packet_it != returned_packet_events.end(); 170 Init();
132 ++packet_it) { 171 serialized_.reset(new char[100]);
133 PacketEventMap::iterator original_it = 172 bool success = SerializeEvents(metadata_,
134 packet_event_map.find(packet_it->first); 173 frame_event_map_,
135 ASSERT_NE(packet_event_map.end(), original_it); 174 packet_event_map_,
136 // Compare protos by serializing and checking the bytes. 175 compressed,
137 EXPECT_EQ(original_it->second->SerializeAsString(), 176 100,
138 packet_it->second->SerializeAsString()); 177 serialized_.get(),
139 packet_event_map.erase(original_it); 178 &output_bytes_);
140 } 179 EXPECT_FALSE(success);
141 EXPECT_TRUE(packet_event_map.empty()); 180 EXPECT_EQ(0, output_bytes_);
181 }
182
183 TEST_F(SerializeDeserializeTest, Compressed) {
184 bool compressed = true;
185 Init();
186 bool success = SerializeEvents(metadata_,
187 frame_event_map_,
188 packet_event_map_,
189 compressed,
190 kMaxSerializedBytes,
191 serialized_.get(),
192 &output_bytes_);
193 ASSERT_TRUE(success);
194 ASSERT_GT(output_bytes_, 0);
195
196 FrameEventMap returned_frame_events;
197 PacketEventMap returned_packet_events;
198 LogMetadata returned_metadata;
199 success = DeserializeEvents(serialized_.get(),
200 output_bytes_,
201 compressed,
202 &returned_metadata,
203 &returned_frame_events,
204 &returned_packet_events);
205 ASSERT_TRUE(success);
206 Verify(returned_metadata, returned_frame_events, returned_packet_events);
207 }
208
209 TEST_F(SerializeDeserializeTest, CompressedInsufficientSpace) {
210 bool compressed = true;
211 Init();
212 serialized_.reset(new char[100]);
213 bool success = SerializeEvents(metadata_,
214 frame_event_map_,
215 packet_event_map_,
216 compressed,
217 100,
218 serialized_.get(),
219 &output_bytes_);
220 EXPECT_FALSE(success);
221 EXPECT_EQ(0, output_bytes_);
142 } 222 }
143 223
144 } // namespace cast 224 } // namespace cast
145 } // namespace media 225 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/logging/log_serializer.cc ('k') | media/cast/test/sender.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698