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

Side by Side Diff: content/public/android/javatests/src/org/chromium/content/browser/MediaResourceGetterTest.java

Issue 23684004: Fix broken duration logic in MediaResourceGetter for non-video media. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: No more findbugs warnings. Created 6 years, 8 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 | « content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 package org.chromium.content.browser;
6
7 import android.content.Context;
8 import android.content.pm.PackageManager;
9 import android.media.MediaMetadataRetriever;
10 import android.net.ConnectivityManager;
11 import android.test.InstrumentationTestCase;
12 import android.test.mock.MockContext;
13 import android.test.suitebuilder.annotation.SmallTest;
14 import android.util.SparseArray;
15
16 import org.chromium.content.browser.MediaResourceGetter.MediaMetadata;
17
18 import java.io.File;
19 import java.util.Collections;
20 import java.util.HashMap;
21 import java.util.Map;
22
23 /**
24 * Tests for MediaResourceGetter.
25 */
26 public class MediaResourceGetterTest extends InstrumentationTestCase {
27 private static final String TEST_HTTP_URL = "http://example.com";
28 private static final String TEST_USER_AGENT = // Anyhting, really
29 "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 " +
30 "(KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36";
31 private static final String TEST_FILE_PATH = "/mnt/sdcard/test";
32 private static final String TEST_FILE_URL = "file://" + TEST_FILE_PATH;
33 private static final String TEST_COOKIES = "yum yum yum!";
34 private static final MediaMetadata sEmptyMetadata = new MediaMetadata(0, 0, 0, false);
35 private static final String sExternalStorageDirectory = "/test_external_stor age";
36
37 private static final Map<String,String> sHeadersCookieOnly;
38 private static final Map<String,String> sHeadersCookieAndUA;
39 private static final Map<String,String> sHeadersUAOnly;
40 static {
41 Map<String,String> headers = new HashMap<String, String>();
42 headers.put("Cookie", TEST_COOKIES);
43 sHeadersCookieOnly = Collections.unmodifiableMap(headers);
44
45 headers = new HashMap<String, String>();
46 headers.put("User-Agent", TEST_USER_AGENT);
47 sHeadersUAOnly = Collections.unmodifiableMap(headers);
48
49 headers = new HashMap<String, String>();
50 headers.putAll(sHeadersCookieOnly);
51 headers.putAll(sHeadersUAOnly);
52 sHeadersCookieAndUA = Collections.unmodifiableMap(headers);
53 }
54
55 private static class FakeFile extends File {
56 final boolean mExists;
57
58 public FakeFile(String path, boolean exists) {
59 super(path);
60 mExists = exists;
61 }
62
63 @Override
64 public int hashCode() {
65 final int prime = 31;
66 int result = super.hashCode();
67 result = prime * result + (mExists ? 1231 : 1237);
68 return result;
69 }
70
71 @Override
72 public boolean equals(Object obj) {
73 if (this == obj)
74 return true;
75 if (!super.equals(obj))
76 return false;
77 if (getClass() != obj.getClass())
78 return false;
79 FakeFile other = (FakeFile) obj;
80 if (mExists != other.mExists)
81 return false;
82 return true;
83 }
84
85 @Override
86 public boolean exists() {
87 return mExists;
88 }
89 }
90
91 /**
92 * Helper class that fakes functionality we cannot perform without real
93 * media resources. The class being faked here has been architected
94 * carefully to allow most of the functionality to be tested. What remains
95 * here is overrides of trivial functionality.
96 */
97 private static class FakeMediaResourceGetter extends MediaResourceGetter {
98 // Read these back in tests to ensure proper values passed through
99 String mUri = null;
100 Map<String,String> mHeaders = null;
101 String mPath = null;
102
103 // Write these before tests to configure functionality
104 SparseArray<String> mMetadata = null;
105 Integer mNetworkType = null;
106 boolean mThrowExceptionInConfigure = false;
107 boolean mThrowExceptionInExtract = false;
108 boolean mFileExists = false;
109
110 // Can't use a real MediaMetadataRetriever as we have no media
111 @Override
112 public void configure(String uri, Map<String, String> headers) {
113 if (mThrowExceptionInConfigure) {
114 throw new RuntimeException("test exception");
115 }
116 mUri = uri;
117 mHeaders = headers;
118 }
119
120 // Can't use a real MediaMetadataRetriever as we have no media
121 @Override
122 public void configure(String path) {
123 if (mThrowExceptionInConfigure) {
124 throw new RuntimeException("test exception");
125 }
126 mPath = path;
127 }
128
129 // Can't use a real MediaMetadataRetriever as we have no media
130 @Override
131 public String extractMetadata(int key) {
132 if (mThrowExceptionInExtract) {
133 throw new RuntimeException("test exception");
134 }
135 if (mMetadata == null) {
136 return null;
137 }
138 return mMetadata.get(key);
139 }
140
141 // Can't use a real NetworkInfo object because there is no way to
142 // mock the ConnectivityManager in Android.
143 @Override
144 Integer getNetworkType(Context context) {
145 return mNetworkType;
146 }
147
148 // Can't use Environment.getExternalStorageDirectory because it could
149 // be inconsistent depending upon the state of the real or emulated
150 // device upon which we are testing.
151 @Override
152 String getExternalStorageDirectory() {
153 return sExternalStorageDirectory;
154 }
155
156 // Can't use regular File because we need to control the return from
157 // File.exists() on arbitrary paths.
158 @Override
159 File uriToFile(String path) {
160 FakeFile result = new FakeFile(path, mFileExists);
161 return result;
162 }
163
164 /**
165 * Convenience method to bind a metadata value to a key.
166 * @param key the key
167 * @param value the value
168 */
169 void bind(int key, String value) {
170 if (mMetadata == null) {
171 mMetadata = new SparseArray<String>();
172 }
173 mMetadata.put(key, value);
174 }
175
176 }
177
178 /**
179 * Helper class to control the result of permission checks.
180 */
181 private static class InternalMockContext extends MockContext {
182 boolean allowPermission = false;
183 @Override
184 public int checkCallingOrSelfPermission(String permission) {
185 assertEquals(android.Manifest.permission.ACCESS_NETWORK_STATE,
186 permission);
187 return allowPermission ? PackageManager.PERMISSION_GRANTED :
188 PackageManager.PERMISSION_DENIED;
189 }
190 }
191
192 // Our test objects.
193 private FakeMediaResourceGetter mFakeMRG;
194 private InternalMockContext mMockContext;
195
196 @Override
197 protected void setUp() throws Exception {
198 super.setUp();
199 mFakeMRG = new FakeMediaResourceGetter();
200 mMockContext = new InternalMockContext();
201 }
202
203 @SmallTest
204 public void testMediaMetadataEquals() {
205 assertEquals(sEmptyMetadata, sEmptyMetadata);
206 assertEquals(sEmptyMetadata, new MediaMetadata(0, 0, 0, false));
207 assertFalse(sEmptyMetadata.equals(null));
208 assertFalse(sEmptyMetadata.equals("test"));
209 assertFalse(sEmptyMetadata.equals(new MediaMetadata(1, 0, 0, false)));
210 assertFalse(sEmptyMetadata.equals(new MediaMetadata(0, 1, 0, false)));
211 assertFalse(sEmptyMetadata.equals(new MediaMetadata(0, 0, 1, false)));
212 assertFalse(sEmptyMetadata.equals(new MediaMetadata(0, 0, 0, true)));
213 }
214
215 @SmallTest
216 public void testMediaMetadataHashCode() {
217 assertEquals(sEmptyMetadata.hashCode(), sEmptyMetadata.hashCode());
218 assertEquals(sEmptyMetadata.hashCode(), new MediaMetadata(0, 0, 0, false ).hashCode());
219 assertFalse(sEmptyMetadata.hashCode() == new MediaMetadata(1, 0, 0, fals e).hashCode());
220 assertFalse(sEmptyMetadata.hashCode() == new MediaMetadata(0, 1, 0, fals e).hashCode());
221 assertFalse(sEmptyMetadata.hashCode() == new MediaMetadata(0, 0, 1, fals e).hashCode());
222 assertFalse(sEmptyMetadata.hashCode() == new MediaMetadata(0, 0, 0, true ).hashCode());
223 }
224
225 @SmallTest
226 public void testMediaMetadataGetters() {
227 MediaMetadata data = new MediaMetadata(1, 2, 3, true);
228 assertEquals(1, data.getDurationInMilliseconds());
229 assertEquals(2, data.getWidth());
230 assertEquals(3, data.getHeight());
231 assertTrue(data.isSuccess());
232
233 // Validate no overlap of test values with defaults
234 data = new MediaMetadata(4, 5, 6, false);
235 assertEquals(4, data.getDurationInMilliseconds());
236 assertEquals(5, data.getWidth());
237 assertEquals(6, data.getHeight());
238 assertFalse(data.isSuccess());
239 }
240
241 @SmallTest
242 public void testConfigure_Net_NoPermissions() {
243 mMockContext.allowPermission = false;
244 assertFalse(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
245 TEST_COOKIES, TEST_USER_AGENT));
246 }
247
248 @SmallTest
249 public void testConfigure_Net_NoActiveNetwork() {
250 mMockContext.allowPermission = true;
251 mFakeMRG.mNetworkType = null;
252 assertFalse(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
253 TEST_COOKIES, TEST_USER_AGENT));
254 }
255
256 @SmallTest
257 public void testConfigure_Net_Disallowed_Mobile() {
258 mMockContext.allowPermission = true;
259 mFakeMRG.mNetworkType = ConnectivityManager.TYPE_MOBILE;
260 assertFalse(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
261 TEST_COOKIES, TEST_USER_AGENT));
262 }
263
264 @SmallTest
265 public void testConfigure_Net_Disallowed_Wimax() {
266 mMockContext.allowPermission = true;
267 mFakeMRG.mNetworkType = ConnectivityManager.TYPE_WIMAX;
268 assertFalse(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
269 TEST_COOKIES, TEST_USER_AGENT));
270 }
271
272 @SmallTest
273 public void testConfigure_Net_Allowed_Ethernet_Cookies_NoUA() {
274 mMockContext.allowPermission = true;
275 mFakeMRG.mNetworkType = ConnectivityManager.TYPE_ETHERNET;
276 assertTrue(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
277 TEST_COOKIES, null));
278 assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
279 assertEquals(sHeadersCookieOnly, mFakeMRG.mHeaders);
280 assertNull(mFakeMRG.mPath);
281 }
282
283 @SmallTest
284 public void testConfigure_Net_Allowed_Wifi_Cookies_NoUA() {
285 mMockContext.allowPermission = true;
286 mFakeMRG.mNetworkType = ConnectivityManager.TYPE_WIFI;
287 assertTrue(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
288 TEST_COOKIES, null));
289 assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
290 assertEquals(sHeadersCookieOnly, mFakeMRG.mHeaders);
291 assertNull(mFakeMRG.mPath);
292 }
293
294 @SmallTest
295 public void testConfigure_Net_Allowed_Ethernet_NoCookies_NoUA() {
296 mMockContext.allowPermission = true;
297 mFakeMRG.mNetworkType = ConnectivityManager.TYPE_ETHERNET;
298 assertTrue(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
299 "", null));
300 assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
301 assertEquals(Collections.emptyMap(), mFakeMRG.mHeaders);
302 assertNull(mFakeMRG.mPath);
303 }
304
305 @SmallTest
306 public void testConfigure_Net_Allowed_Ethernet_Cookies_WithUA() {
307 mMockContext.allowPermission = true;
308 mFakeMRG.mNetworkType = ConnectivityManager.TYPE_ETHERNET;
309 assertTrue(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
310 TEST_COOKIES, TEST_USER_AGENT));
311 assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
312 assertEquals(sHeadersCookieAndUA, mFakeMRG.mHeaders);
313 assertNull(mFakeMRG.mPath);
314 }
315
316 @SmallTest
317 public void testConfigure_Net_Allowed_Ethernet_NoCookies_WithUA() {
318 mMockContext.allowPermission = true;
319 mFakeMRG.mNetworkType = ConnectivityManager.TYPE_ETHERNET;
320 assertTrue(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
321 "", TEST_USER_AGENT));
322 assertEquals(TEST_HTTP_URL, mFakeMRG.mUri);
323 assertEquals(sHeadersUAOnly, mFakeMRG.mHeaders);
324 assertNull(mFakeMRG.mPath);
325 }
326
327 @SmallTest
328 public void testConfigure_Net_Allowed_Ethernet_Exception() {
329 mMockContext.allowPermission = true;
330 mFakeMRG.mThrowExceptionInConfigure = true;
331 mFakeMRG.mNetworkType = ConnectivityManager.TYPE_ETHERNET;
332 assertFalse(mFakeMRG.configure(mMockContext, TEST_HTTP_URL,
333 "", TEST_USER_AGENT));
334 assertNull(mFakeMRG.mUri);
335 assertNull(mFakeMRG.mHeaders);
336 }
337
338 @SmallTest
339 public void testConfigure_File_Allowed_MntSdcard() {
340 final String path = "/mnt/sdcard/test";
341 final String url = "file://" + path;
342 mFakeMRG.mFileExists = true;
343 assertTrue(mFakeMRG.configure(mMockContext, url, "", null));
344 assertEquals(path, mFakeMRG.mPath);
345 assertNull(mFakeMRG.mUri);
346 assertNull(mFakeMRG.mHeaders);
347 }
348
349 @SmallTest
350 public void testConfigure_File_Allowed_Sdcard() {
351 final String path = "/sdcard/test";
352 final String url = "file://" + path;
353 mFakeMRG.mFileExists = true;
354 assertTrue(mFakeMRG.configure(mMockContext, url, "", null));
355 assertEquals(path, mFakeMRG.mPath);
356 assertNull(mFakeMRG.mUri);
357 assertNull(mFakeMRG.mHeaders);
358 }
359
360 @SmallTest
361 public void testConfigure_File_Allowed_Sdcard_DoesntExist() {
362 final String path = "/sdcard/test";
363 final String url = "file://" + path;
364 mFakeMRG.mFileExists = false;
365 assertFalse(mFakeMRG.configure(mMockContext, url, "", null));
366 assertNull(mFakeMRG.mPath);
367 }
368
369 @SmallTest
370 public void testConfigure_File_Allowed_ExternalStorage() {
371 final String path = sExternalStorageDirectory + "/test";
372 final String url = "file://" + path;
373 mFakeMRG.mFileExists = true;
374 assertTrue(mFakeMRG.configure(mMockContext, url, "", null));
375 assertEquals(path, mFakeMRG.mPath);
376 assertNull(mFakeMRG.mUri);
377 assertNull(mFakeMRG.mHeaders);
378 }
379
380 @SmallTest
381 public void testConfigure_File_Disallowed_Innocent() {
382 final String path = "/malicious/path";
383 final String url = "file://" + path;
384 mFakeMRG.mFileExists = true;
385 assertFalse(mFakeMRG.configure(mMockContext, url, "", null));
386 assertNull(mFakeMRG.mPath);
387 }
388
389 @SmallTest
390 public void testConfigure_File_Disallowed_Malicious() {
391 final String path = "/mnt/sdcard/../../data";
392 final String url = "file://" + path;
393 mFakeMRG.mFileExists = true;
394 assertFalse(mFakeMRG.configure(mMockContext, url, "", null));
395 assertNull(mFakeMRG.mPath);
396 }
397
398 @SmallTest
399 public void testConfigure_File_Allowed_Exception() {
400 final String path = "/mnt/sdcard/test";
401 final String url = "file://" + path;
402 mFakeMRG.mFileExists = true;
403 mFakeMRG.mThrowExceptionInConfigure = true;
404 assertFalse(mFakeMRG.configure(mMockContext, url, "", null));
405 assertNull(mFakeMRG.mPath);
406 }
407
408 @SmallTest
409 public void testExtract_NoMetadata() {
410 mFakeMRG.mFileExists = true;
411 assertEquals(sEmptyMetadata, mFakeMRG.extract(
412 mMockContext, TEST_FILE_URL, null, null));
413 assertEquals("configured successfully when we shouldn't have",
414 TEST_FILE_PATH, mFakeMRG.mPath); // tricky
415 }
416
417 @SmallTest
418 public void testExtract_WithMetadata_ValidDuration() {
419 mFakeMRG.mFileExists = true;
420 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_DURATION, "1");
421 final MediaMetadata expected = new MediaMetadata(1, 0, 0, true);
422 assertEquals(expected, mFakeMRG.extract(mMockContext, TEST_FILE_URL, nul l, null));
423 }
424
425 @SmallTest
426 public void testExtract_WithMetadata_InvalidDuration() {
427 mFakeMRG.mFileExists = true;
428 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_DURATION, "i am not an integer");
429 assertEquals(sEmptyMetadata, mFakeMRG.extract(mMockContext, TEST_FILE_UR L, null, null));
430 }
431
432 @SmallTest
433 public void testExtract_WithMetadata_ValidDuration_HasVideo_NoWidth_NoHeight () {
434 mFakeMRG.mFileExists = true;
435 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_DURATION, "1");
436 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO, "yes");
437 assertEquals(sEmptyMetadata, mFakeMRG.extract(mMockContext, TEST_FILE_UR L, null, null));
438 }
439
440 @SmallTest
441 public void testExtract_WithMetadata_ValidDuration_HasVideo_ValidWidth_NoHei ght() {
442 mFakeMRG.mFileExists = true;
443 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_DURATION, "1");
444 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO, "yes");
445 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH, "1");
446 assertEquals(sEmptyMetadata, mFakeMRG.extract(mMockContext, TEST_FILE_UR L, null, null));
447 }
448
449 @SmallTest
450 public void testExtract_WithMetadata_ValidDuration_HasVideo_InvalidWidth_NoH eight() {
451 mFakeMRG.mFileExists = true;
452 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_DURATION, "1");
453 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO, "yes");
454 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH, "i am not an integer");
455 assertEquals(sEmptyMetadata, mFakeMRG.extract(mMockContext, TEST_FILE_UR L, null, null));
456 }
457
458 @SmallTest
459 public void testExtract_WithMetadata_ValidDuration_HasVideo_ValidWidth_Valid Height() {
460 mFakeMRG.mFileExists = true;
461 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_DURATION, "1");
462 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO, "yes");
463 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH, "2");
464 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT, "3");
465 final MediaMetadata expected = new MediaMetadata(1, 2, 3, true);
466 assertEquals(expected, mFakeMRG.extract(mMockContext, TEST_FILE_URL, nul l, null));
467 }
468
469 @SmallTest
470 public void testExtract_WithMetadata_ValidDuration_HasVideo_ValidWidth_Inval idHeight() {
471 mFakeMRG.mFileExists = true;
472 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_DURATION, "1");
473 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO, "yes");
474 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH, "1");
475 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT, "i am no t an integer");
476 assertEquals(sEmptyMetadata, mFakeMRG.extract(mMockContext, TEST_FILE_UR L, null, null));
477 }
478
479 @SmallTest
480 public void testExtract_WithMetadata_ValidDuration_ExceptionInExtract() {
481 mFakeMRG.mFileExists = true;
482 mFakeMRG.mThrowExceptionInExtract = true;
483 mFakeMRG.bind(MediaMetadataRetriever.METADATA_KEY_DURATION, "1");
484 assertEquals(sEmptyMetadata, mFakeMRG.extract(mMockContext, TEST_FILE_UR L, null, null));
485 }
486
487 @SmallTest
488 public void testAndroidDeviceOk_BadModel_BadVersion() {
489 assertFalse(MediaResourceGetter.androidDeviceOk(
490 "GT-I9100", android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR 1));
491 }
492
493 @SmallTest
494 public void testAndroidDeviceOk_BadModel_GoodVersion() {
495 assertTrue(MediaResourceGetter.androidDeviceOk(
496 "GT-I9100", android.os.Build.VERSION_CODES.JELLY_BEAN));
497 }
498
499 @SmallTest
500 public void testAndroidDeviceOk_GoodModel_AnyVersion() {
501 assertTrue(MediaResourceGetter.androidDeviceOk(
502 "Happy Device", android.os.Build.VERSION_CODES.ICE_CREAM_SANDWIC H));
503 }
504 }
OLDNEW
« no previous file with comments | « content/public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698