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

Side by Side Diff: media/midi/midi_message_util_unittest.cc

Issue 68353002: Use MIDIMessageQueue/IsValidWebMIDIData for MIDI byte stream validation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add IsValidMIDIMessagesForWebMIDI to avoid memory copy Created 7 years, 1 month 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
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "media/midi/midi_message_util.h"
6 #include "testing/gtest/include/gtest/gtest.h"
7
8 namespace media {
9 namespace {
10
11 const uint8 kGMOn[] = { 0xf0, 0x7e, 0x7f, 0x09, 0x01, 0xf7 };
12 const uint8 kGSOn[] = {
13 0xf0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7f, 0x00, 0x41, 0xf7,
14 };
15 const uint8 kNoteOn[] = { 0x90, 0x3c, 0x7f };
16 const uint8 kNoteOnWithRunningStatus[] = {
17 0x90, 0x3c, 0x7f, 0x3c, 0x7f, 0x3c, 0x7f,
18 };
19 const uint8 kChannelPressure[] = { 0xd0, 0x01 };
20 const uint8 kChannelPressureWithRunningStatus[] = {
21 0xd0, 0x01, 0x01, 0x01,
22 };
23 const uint8 kTimingClock[] = { 0xf8 };
24 const uint8 kBrokenData1[] = { 0x90 };
25 const uint8 kBrokenData2[] = { 0xf7 };
26 const uint8 kBrokenData3[] = { 0xf2, 0x00 };
27 const uint8 kDataByte0[] = { 0x00 };
28
29 template <typename T, size_t N>
30 void Add(MIDIMessageQueue* queue, const T(&array)[N]) {
31 queue->Add(array, N);
32 }
33
34 template <typename T, size_t N>
35 ::testing::AssertionResult ExpectEqualSequence(
36 const char* expr1, const char* expr2,
37 const T(&expected)[N], const std::vector<T>& actual) {
38 if (actual.size() != N) {
39 return ::testing::AssertionFailure()
40 << "expected: " << ::testing::PrintToString(expected)
41 << ", actual: " << ::testing::PrintToString(actual);
42 }
43 for (size_t i = 0; i < N; ++i) {
44 if (expected[i] != actual[i]) {
45 return ::testing::AssertionFailure()
46 << "expected: " << ::testing::PrintToString(expected)
47 << ", actual: " << ::testing::PrintToString(actual);
48 }
49 }
50 return ::testing::AssertionSuccess();
51 }
52
53 #define EXPECT_MESSAGE(expected, actual) \
54 EXPECT_PRED_FORMAT2(ExpectEqualSequence, expected, actual)
55
56 TEST(MIDIMessageQueueTest, EmptyData) {
57 MIDIMessageQueue queue(false);
58 std::vector<uint8> message;
59 queue.Get(&message);
60 EXPECT_TRUE(message.empty());
61 }
62
63 TEST(MIDIMessageQueueTest, RunningStatusDisabled) {
64 MIDIMessageQueue queue(false);
65 Add(&queue, kGMOn);
66 Add(&queue, kBrokenData1);
67 Add(&queue, kNoteOnWithRunningStatus);
68 Add(&queue, kBrokenData2);
69 Add(&queue, kChannelPressureWithRunningStatus);
70 Add(&queue, kBrokenData3);
71 Add(&queue, kNoteOn);
72 Add(&queue, kBrokenData1);
73 Add(&queue, kGSOn);
74 Add(&queue, kBrokenData2);
75 Add(&queue, kTimingClock);
76 Add(&queue, kBrokenData3);
77
78 std::vector<uint8> message;
79 queue.Get(&message);
80 EXPECT_MESSAGE(kGMOn, message);
81 queue.Get(&message);
82 EXPECT_MESSAGE(kNoteOn, message) << "Running status should be ignored";
83 queue.Get(&message);
84 EXPECT_MESSAGE(kChannelPressure, message)
85 << "Running status should be ignored";
86 queue.Get(&message);
87 EXPECT_MESSAGE(kNoteOn, message);
88 queue.Get(&message);
89 EXPECT_MESSAGE(kGSOn, message);
90 queue.Get(&message);
91 EXPECT_MESSAGE(kTimingClock, message);
92 queue.Get(&message);
93 EXPECT_TRUE(message.empty());
94 }
95
96 TEST(MIDIMessageQueueTest, RunningStatusEnabled) {
97 MIDIMessageQueue queue(true);
98 Add(&queue, kGMOn);
99 Add(&queue, kBrokenData1);
100 Add(&queue, kNoteOnWithRunningStatus);
101 Add(&queue, kBrokenData2);
102 Add(&queue, kChannelPressureWithRunningStatus);
103 Add(&queue, kBrokenData3);
104 Add(&queue, kNoteOn);
105 Add(&queue, kBrokenData1);
106 Add(&queue, kGSOn);
107 Add(&queue, kBrokenData2);
108 Add(&queue, kTimingClock);
109 Add(&queue, kDataByte0);
110
111 std::vector<uint8> message;
112 queue.Get(&message);
113 EXPECT_MESSAGE(kGMOn, message);
114 queue.Get(&message);
115 EXPECT_MESSAGE(kNoteOn, message);
116 queue.Get(&message);
117 EXPECT_MESSAGE(kNoteOn, message)
118 << "Running status should be converted into a canonical MIDI message";
119 queue.Get(&message);
120 EXPECT_MESSAGE(kNoteOn, message)
121 << "Running status should be converted into a canonical MIDI message";
122 queue.Get(&message);
123 EXPECT_MESSAGE(kChannelPressure, message);
124 queue.Get(&message);
125 EXPECT_MESSAGE(kChannelPressure, message)
126 << "Running status should be converted into a canonical MIDI message";
127 queue.Get(&message);
128 EXPECT_MESSAGE(kChannelPressure, message)
129 << "Running status should be converted into a canonical MIDI message";
130 queue.Get(&message);
131 EXPECT_MESSAGE(kNoteOn, message);
132 queue.Get(&message);
133 EXPECT_MESSAGE(kGSOn, message);
134 queue.Get(&message);
135 EXPECT_MESSAGE(kTimingClock, message);
136 queue.Get(&message);
137 EXPECT_TRUE(message.empty())
138 << "Running status must not be applied to real time messages";
139 }
140
141 TEST(MIDIMessageQueueTest, RunningStatusEnabledWithRealTimeEvent) {
142 MIDIMessageQueue queue(true);
143 const uint8 kNoteOnWithRunningStatusWithkTimingClock[] = {
144 0x90, 0xf8, 0x3c, 0xf8, 0x7f, 0xf8, 0x3c, 0xf8, 0x7f, 0xf8, 0x3c, 0xf8,
145 0x7f,
146 };
147 Add(&queue, kNoteOnWithRunningStatusWithkTimingClock);
148 std::vector<uint8> message;
149 queue.Get(&message);
150 EXPECT_MESSAGE(kTimingClock, message);
151 queue.Get(&message);
152 EXPECT_MESSAGE(kTimingClock, message);
153 queue.Get(&message);
154 EXPECT_MESSAGE(kNoteOn, message);
155 queue.Get(&message);
156 EXPECT_MESSAGE(kTimingClock, message);
157 queue.Get(&message);
158 EXPECT_MESSAGE(kTimingClock, message);
159 queue.Get(&message);
160 EXPECT_MESSAGE(kNoteOn, message);
161 queue.Get(&message);
162 EXPECT_MESSAGE(kTimingClock, message);
163 queue.Get(&message);
164 EXPECT_MESSAGE(kTimingClock, message);
165 queue.Get(&message);
166 EXPECT_MESSAGE(kNoteOn, message);
167 queue.Get(&message);
168 EXPECT_TRUE(message.empty());
169 }
170
171 template <typename T, size_t N>
172 const std::vector<T> AsVector(const T(&data)[N]) {
173 std::vector<T> buffer;
174 buffer.insert(buffer.end(), data, data + N);
175 return buffer;
176 }
177
178 template <typename T, size_t N>
179 void PushToVector(const T(&data)[N], std::vector<T>* buffer) {
180 buffer->insert(buffer->end(), data, data + N);
181 }
182
183 TEST(IsValidMIDIMessagesForWebMIDITest, SingleEvent) {
184 EXPECT_TRUE(IsValidMIDIMessagesForWebMIDI(AsVector(kGMOn)));
185 EXPECT_TRUE(IsValidMIDIMessagesForWebMIDI(AsVector(kGSOn)));
186 EXPECT_TRUE(IsValidMIDIMessagesForWebMIDI(AsVector(kNoteOn)));
187 EXPECT_TRUE(IsValidMIDIMessagesForWebMIDI(AsVector(kChannelPressure)));
188 EXPECT_TRUE(IsValidMIDIMessagesForWebMIDI(AsVector(kTimingClock)));
189
190 EXPECT_FALSE(IsValidMIDIMessagesForWebMIDI(AsVector(kBrokenData1)));
191 EXPECT_FALSE(IsValidMIDIMessagesForWebMIDI(AsVector(kBrokenData2)));
192 EXPECT_FALSE(IsValidMIDIMessagesForWebMIDI(AsVector(kBrokenData3)));
193 EXPECT_FALSE(IsValidMIDIMessagesForWebMIDI(AsVector(kDataByte0)));
194 }
195
196 TEST(IsValidMIDIMessagesForWebMIDITest, RunningStatus) {
197 EXPECT_FALSE(IsValidMIDIMessagesForWebMIDI(
198 AsVector(kNoteOnWithRunningStatus)));
199 EXPECT_FALSE(IsValidMIDIMessagesForWebMIDI(
200 AsVector(kChannelPressureWithRunningStatus)));
201 }
202
203 TEST(IsValidMIDIMessagesForWebMIDITest, MultipleEvents) {
204 std::vector<uint8> buffer;
205 PushToVector(kGMOn, &buffer);
206 PushToVector(kNoteOn, &buffer);
207 PushToVector(kGSOn, &buffer);
208 PushToVector(kTimingClock, &buffer);
209 PushToVector(kNoteOn, &buffer);
210 EXPECT_TRUE(IsValidMIDIMessagesForWebMIDI(buffer));
211 PushToVector(kBrokenData1, &buffer);
212 EXPECT_FALSE(IsValidMIDIMessagesForWebMIDI(buffer));
213 }
214
215 TEST(IsValidMIDIMessagesForWebMIDITest, RealTimeMessage) {
216 const uint8 kNoteOnWithRealTimeClock[] = {
217 0x90, 0xf8, 0x3c, 0x7f, 0x90, 0xf8, 0x3c, 0xf8, 0x7f, 0xf8,
218 };
219 EXPECT_TRUE(IsValidMIDIMessagesForWebMIDI(
220 AsVector(kNoteOnWithRealTimeClock)));
221
222 const uint8 kGMOnWithRealTimeClock[] = {
223 0xf0, 0xf8, 0x7e, 0x7f, 0x09, 0x01, 0xf8, 0xf7,
224 };
225 EXPECT_TRUE(IsValidMIDIMessagesForWebMIDI(
226 AsVector(kGMOnWithRealTimeClock)));
227 }
228
229 } // namespace
230 } // namespace media
OLDNEW
« media/midi/midi_message_util.h ('K') | « media/midi/midi_message_util.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698