OLD | NEW |
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 |
OLD | NEW |