OLD | NEW |
| (Empty) |
1 <!doctype html> | |
2 <html> | |
3 <head> | |
4 <title>Test decodeAudioData promises</title> | |
5 | |
6 <script src="../resources/js-test.js"></script> | |
7 <script src="resources/compatibility.js"></script> | |
8 <script src="resources/audio-testing.js"></script> | |
9 </head> | |
10 | |
11 <body> | |
12 <script> | |
13 description("Basic tests for decodeAudioData promise."); | |
14 | |
15 window.jsTestIsAsync = true; | |
16 | |
17 var context = new AudioContext(); | |
18 // Test files for decodeAudioData | |
19 var validAudioFile = "resources/media/24bit-44khz.wav"; | |
20 var invalidAudioFile = "resources/media/invalid-audio-file.txt"; | |
21 | |
22 // Decoded data from validAudioFile | |
23 var referenceDecodedAudioBuffer; | |
24 // Encoded audio data for testing decodeAudioData after the context has been
closed. | |
25 var encodedAudioData; | |
26 // Decoded data from decodeAudioData after the context has been closed. | |
27 var decodedAudioBufferAfterClose; | |
28 | |
29 // Utility to load an encoded audio file from |url| and decode it. |success
| and |failure| are | |
30 // functions to handle the then and else cases of the promise returned by de
codeAudioData. | |
31 function runDecode(url, success, failure, done) { | |
32 var request = new XMLHttpRequest(); | |
33 request.open("GET", url, true); | |
34 request.responseType = "arraybuffer"; | |
35 | |
36 request.onload = function () { | |
37 context.decodeAudioData(request.response) | |
38 .then(success, failure) | |
39 .then(done); | |
40 }; | |
41 | |
42 request.send(); | |
43 } | |
44 | |
45 // Compare that two audio buffers are the same | |
46 function audioBuffersCompareEqual(actualBuffer, expectedBuffer) { | |
47 if (actualBuffer.length != expectedBuffer.length) { | |
48 testFailed("Decoded buffer length is " + actualBuffer.length + ", but ex
pected " + expectedBuffer.length); | |
49 return false; | |
50 } | |
51 | |
52 if (actualBuffer.duration != expectedBuffer.duration) { | |
53 testFailed("Decoded buffer duration is " + actualBuffer.duration + ", bu
t expected " + expectedBuffer.duration); | |
54 return false; | |
55 } | |
56 | |
57 if (actualBuffer.sampleRate != expectedBuffer.sampleRate) { | |
58 //testFailed("Decoded buffer rate is " + actualBuffer.sampleRate + ", bu
t expected " + expectedBuffer.sampleRate); | |
59 return false; | |
60 } | |
61 | |
62 if (actualBuffer.numberOfChannels != expectedBuffer.numberOfChannels) { | |
63 //testFailed("Decoded buffer has " + actualBuffer.numberOfChannels + "ch
annels , but expected " + expectedBuffer.numberOfChannels); | |
64 return false; | |
65 } | |
66 | |
67 for (var c = 0; c < expectedBuffer.numberOfChannels; ++c) { | |
68 var actualData = actualBuffer.getChannelData(c); | |
69 var expectedData = expectedBuffer.getChannelData(c); | |
70 for (var k = 0; k < expectedData.length; ++k) { | |
71 if (actualData[k] != expectedData[k]) { | |
72 //testFailed("Decoded buffer differs from expected at channel " + c
+ " frame " + k + ": " + actualData[k] + ", expected " + expectedData[k]); | |
73 return false; | |
74 } | |
75 } | |
76 } | |
77 | |
78 return true; | |
79 } | |
80 | |
81 // Tests | |
82 var audit = Audit.createTaskRunner(); | |
83 | |
84 // Test that a null audioBuffer causes the promise to be rejected with an In
validStateError. | |
85 audit.defineTask("null-audiobuffer", function (done) { | |
86 context.decodeAudioData(null).then(function () { | |
87 testFailed("decodeAudioData(null) incorrectly resolved promise successfu
lly."); | |
88 }, function (e) { | |
89 testPassed("decodeAudioData(null) correctly rejected promise: " + e.toSt
ring()); | |
90 }).then(done); | |
91 }); | |
92 | |
93 // Decode a valid encoded file and verify that the promise succeeds correctl
y. | |
94 audit.defineTask('decode-valid-file', function (done) { | |
95 var url = validAudioFile; | |
96 var prefix = "Decode valid file with promise: "; | |
97 runDecode(url, | |
98 function (buffer) { | |
99 // Save the buffer for later testing. | |
100 referenceDecodedAudioBuffer = buffer; | |
101 testPassed(prefix + "Correctly succeeded in decoding " + url); | |
102 }, | |
103 function (e) { | |
104 testFailed(prefix + "Incorrectly failed to decode " + url + ": " + e.t
oString()); | |
105 }, done); | |
106 }); | |
107 | |
108 // Decode a invalid encoded file and verify that the promise is rejected cor
rectly. | |
109 audit.defineTask("decode-invalid-file", function (done) { | |
110 var url = invalidAudioFile; | |
111 var prefix = "Decode invalid file with promise: "; | |
112 runDecode(url, | |
113 function (buffer) { | |
114 testFailed(prefix + "Incorrectly succeeded in decoding " + url); | |
115 }, | |
116 function (e) { | |
117 testPassed(prefix + "Correctly failed to decode " + url + ": " + e.toS
tring()); | |
118 }, done); | |
119 }); | |
120 | |
121 // Decode a valid file and verify that the promise is fulfilled and the succ
essCallback is | |
122 // invoked and both have identical decode audio buffers. | |
123 audit.defineTask("promise-and-success-callback", function(done) { | |
124 var request = new XMLHttpRequest(); | |
125 request.open("GET", validAudioFile, true); | |
126 request.responseType = "arraybuffer"; | |
127 | |
128 request.onload = function() { | |
129 var prefix = "Decoding valid file with promise and callback: "; | |
130 // The buffer returned by the success callback | |
131 var callbackBuffer; | |
132 // The buffer returned by the promise | |
133 var promiseBuffer; | |
134 | |
135 context.decodeAudioData(request.response, function(b) { | |
136 testPassed(prefix + "successCallback invoked correctly"); | |
137 callbackBuffer = b; | |
138 }, function(e) { | |
139 testFailed(prefix + "errorCallback incorrectly invoked with " + e); | |
140 }).then(function(b) { | |
141 testPassed(prefix + "Promise correctly fulfilled"); | |
142 promiseBuffer = b; | |
143 }, function(e) { | |
144 testFailed(prefix + "Promise incorrectly rejected with " + e); | |
145 }).then(function() { | |
146 if (promiseBuffer === callbackBuffer) | |
147 testPassed(prefix + "Promise and successCallback returned the same b
uffer"); | |
148 else | |
149 testFailed(prefix + "Promise and successCallback returned different
uffers"); | |
150 }).then(done, done); | |
151 }; | |
152 | |
153 request.send(); | |
154 }); | |
155 | |
156 // Decode an invalid file and verify that the promise is rejected and the er
rorCallback is | |
157 // invoked. | |
158 audit.defineTask("promise-and-error-callback", function(done) { | |
159 var request = new XMLHttpRequest(); | |
160 request.open("GET", invalidAudioFile, true); | |
161 request.responseType = "arraybuffer"; | |
162 | |
163 request.onload = function() { | |
164 var prefix = "Decoding invalid file with promise and callback: "; | |
165 | |
166 context.decodeAudioData(request.response, function() { | |
167 testFailed(prefix + "successCallback invoked but should not have been"
); | |
168 }, function(e) { | |
169 testPassed(prefix + "errorCallback invoked correctly with: " + e); | |
170 }).then(function() { | |
171 testFailed(prefix + "Promise fulfilled but should not have been"); | |
172 }, function(e) { | |
173 testPassed(prefix + "Promise correctly rejected with: " + e); | |
174 }).then(done, done); | |
175 }; | |
176 | |
177 request.send(); | |
178 }); | |
179 | |
180 // Just load up a file so we can run decodeAudioData on it | |
181 audit.defineTask("load-data", function (done) { | |
182 var request = new XMLHttpRequest(); | |
183 request.open("GET", validAudioFile, true); | |
184 request.responseType = "arraybuffer"; | |
185 | |
186 request.onload = function () { | |
187 encodedAudioData = request.response; | |
188 done(); | |
189 }; | |
190 | |
191 request.send(); | |
192 }); | |
193 | |
194 // If the context is closing before decodeAudioData has finished decoding, w
e should reject the | |
195 // promise from decodeAudioData. | |
196 audit.defineTask("close-context-with-pending-decode", function(done) { | |
197 context.close().then(function() { | |
198 return context.decodeAudioData(encodedAudioData); | |
199 }).then(function(b) { | |
200 // Compare this buffer with the reference decoded buffer (that we obta
ined earlier). Pass | |
201 // if they're identical. | |
202 if (audioBuffersCompareEqual(b, referenceDecodedAudioBuffer)) { | |
203 testPassed("Correctly decoded data after the context has been closed
"); | |
204 } else { | |
205 testFailed("decodeAudioData succeeded, but data is incorrect"); | |
206 } | |
207 }, | |
208 function(e) { | |
209 testFailed("Failed to decode valid file after context has been closed:
" + e); | |
210 }).then(done, done); | |
211 }); | |
212 | |
213 audit.defineTask("finish", function (done) { | |
214 finishJSTest(); | |
215 done(); | |
216 }); | |
217 | |
218 audit.runTasks( | |
219 "null-audiobuffer", | |
220 "decode-valid-file", | |
221 "decode-invalid-file", | |
222 "promise-and-success-callback", | |
223 "promise-and-error-callback", | |
224 "load-data", | |
225 "close-context-with-pending-decode", | |
226 "finish" | |
227 ); | |
228 | |
229 successfullyParsed = true; | |
230 </script> | |
231 </body> | |
232 </html> | |
OLD | NEW |