1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include <gtest/gtest.h>
8 #include "MediaQueue.h"
10 using namespace mozilla
;
11 using mozilla::media::TimeUnit
;
13 MediaData
* CreateDataRawPtr(int64_t aStartTime
, int64_t aEndTime
) {
14 const TimeUnit startTime
= TimeUnit::FromMicroseconds(aStartTime
);
15 const TimeUnit endTime
= TimeUnit::FromMicroseconds(aEndTime
);
16 return new NullData(0, startTime
, endTime
- startTime
);
19 already_AddRefed
<MediaData
> CreateData(int64_t aStartTime
, int64_t aEndTime
) {
20 RefPtr
<MediaData
> data
= CreateDataRawPtr(aStartTime
, aEndTime
);
24 // Used to avoid the compile error `comparison of integers of different signs`
25 // when comparing 'const unsigned long' and 'const int'.
26 #define EXPECT_EQUAL_SIZE_T(lhs, rhs) EXPECT_EQ(size_t(lhs), size_t(rhs))
28 TEST(MediaQueue
, BasicPopOperations
)
30 MediaQueue
<MediaData
> queue
;
31 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 0);
33 // Test only one element
34 const RefPtr
<MediaData
> data
= CreateDataRawPtr(0, 10);
35 queue
.Push(data
.get());
36 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 1);
38 RefPtr
<MediaData
> rv
= queue
.PopFront();
41 queue
.Push(data
.get());
42 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 1);
46 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 0);
48 // Test multiple elements
49 const RefPtr
<MediaData
> data1
= CreateDataRawPtr(0, 10);
50 const RefPtr
<MediaData
> data2
= CreateDataRawPtr(11, 20);
51 const RefPtr
<MediaData
> data3
= CreateDataRawPtr(21, 30);
52 queue
.Push(data1
.get());
53 queue
.Push(data2
.get());
54 queue
.Push(data3
.get());
55 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 3);
57 rv
= queue
.PopFront();
58 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 2);
62 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 1);
66 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 0);
70 TEST(MediaQueue
, BasicPeekOperations
)
72 MediaQueue
<MediaData
> queue
;
73 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 0);
75 // Test only one element
76 const RefPtr
<MediaData
> data1
= CreateDataRawPtr(0, 10);
77 queue
.Push(data1
.get());
78 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 1);
80 RefPtr
<MediaData
> rv
= queue
.PeekFront();
81 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 1);
84 rv
= queue
.PeekBack();
85 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 1);
88 // Test multiple elements
89 const RefPtr
<MediaData
> data2
= CreateDataRawPtr(11, 20);
90 const RefPtr
<MediaData
> data3
= CreateDataRawPtr(21, 30);
91 queue
.Push(data2
.get());
92 queue
.Push(data3
.get());
93 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 3);
95 rv
= queue
.PeekFront();
96 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 3);
99 rv
= queue
.PeekBack();
100 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 3);
101 EXPECT_EQ(rv
, data3
);
104 TEST(MediaQueue
, FinishQueue
)
106 MediaQueue
<MediaData
> queue
;
107 EXPECT_FALSE(queue
.IsFinished());
110 EXPECT_TRUE(queue
.IsFinished());
113 TEST(MediaQueue
, EndOfStream
)
115 MediaQueue
<MediaData
> queue
;
116 EXPECT_FALSE(queue
.IsFinished());
118 queue
.Push(CreateData(0, 10));
119 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 1);
122 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 1);
123 EXPECT_TRUE(queue
.IsFinished());
124 EXPECT_FALSE(queue
.AtEndOfStream());
126 RefPtr
<MediaData
> rv
= queue
.PopFront();
127 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 0);
128 EXPECT_TRUE(queue
.IsFinished());
129 EXPECT_TRUE(queue
.AtEndOfStream());
132 TEST(MediaQueue
, QueueDuration
)
134 MediaQueue
<MediaData
> queue
;
135 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 0);
137 queue
.Push(CreateData(0, 10));
138 queue
.Push(CreateData(11, 20));
139 queue
.Push(CreateData(21, 30));
140 EXPECT_EQUAL_SIZE_T(queue
.GetSize(), 3);
142 const int64_t rv
= queue
.Duration();
146 TEST(MediaQueue
, CallGetElementAfterOnSingleElement
)
148 MediaQueue
<MediaData
> queue
;
149 queue
.Push(CreateData(0, 10));
151 // Target time is earlier than data's end time
152 TimeUnit targetTime
= TimeUnit::FromMicroseconds(5);
153 nsTArray
<RefPtr
<MediaData
>> foundResult
;
154 queue
.GetElementsAfter(targetTime
, &foundResult
);
155 EXPECT_EQUAL_SIZE_T(foundResult
.Length(), 1);
156 EXPECT_TRUE(foundResult
[0]->GetEndTime() > targetTime
);
158 // Target time is later than data's end time
159 targetTime
= TimeUnit::FromMicroseconds(15);
160 nsTArray
<RefPtr
<MediaData
>> emptyResult
;
161 queue
.GetElementsAfter(targetTime
, &emptyResult
);
162 EXPECT_TRUE(emptyResult
.IsEmpty());
165 TEST(MediaQueue
, CallGetElementAfterOnMultipleElements
)
167 MediaQueue
<MediaData
> queue
;
168 queue
.Push(CreateData(0, 10));
169 queue
.Push(CreateData(11, 20));
170 queue
.Push(CreateData(21, 30));
171 queue
.Push(CreateData(31, 40));
172 queue
.Push(CreateData(41, 50));
174 // Should find [21,30], [31,40] and [41,50]
175 TimeUnit targetTime
= TimeUnit::FromMicroseconds(25);
176 nsTArray
<RefPtr
<MediaData
>> foundResult
;
177 queue
.GetElementsAfter(targetTime
, &foundResult
);
178 EXPECT_EQUAL_SIZE_T(foundResult
.Length(), 3);
179 for (const auto& data
: foundResult
) {
180 EXPECT_TRUE(data
->GetEndTime() > targetTime
);
183 // Should find [31,40] and [41,50]
184 targetTime
= TimeUnit::FromMicroseconds(30);
186 queue
.GetElementsAfter(targetTime
, &foundResult
);
187 EXPECT_EQUAL_SIZE_T(foundResult
.Length(), 2);
188 for (const auto& data
: foundResult
) {
189 EXPECT_TRUE(data
->GetEndTime() > targetTime
);
192 // Should find no data.
193 targetTime
= TimeUnit::FromMicroseconds(60);
194 nsTArray
<RefPtr
<MediaData
>> emptyResult
;
195 queue
.GetElementsAfter(targetTime
, &emptyResult
);
196 EXPECT_TRUE(emptyResult
.IsEmpty());
199 #undef EXPECT_EQUAL_SIZE_T