/* * Copyright 2011 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.media.client; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.RepeatingCommand; import com.google.gwt.dom.client.MediaElement; import com.google.gwt.dom.client.SourceElement; import com.google.gwt.event.dom.client.LoadedMetadataEvent; import com.google.gwt.event.dom.client.LoadedMetadataHandler; import com.google.gwt.junit.DoNotRunWith; import com.google.gwt.junit.Platform; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.media.dom.client.MediaError; import junit.framework.Assert; /** * Base test for {@link MediaBase}. * * Do not call this class directly. To use, extend this class and override the * getElement and isSupported methods. * * Because HtmlUnit does not support HTML5, you will need to run these tests * manually in order to have them run. To do that, go to "run configurations" or * "debug configurations", select the test you would like to run, and put this * line in the VM args under the arguments tab: -Dgwt.args="-runStyle Manual:1" */ @DoNotRunWith(Platform.HtmlUnitUnknown) public abstract class MediaTest extends GWTTestCase { static native boolean isFirefox35OrLater() /*-{ var geckoVersion = @com.google.gwt.dom.client.DOMImplMozilla::getGeckoVersion()(); return (geckoVersion != -1) && (geckoVersion >= 1009001); }-*/; static native boolean isFirefox40OrEarlier() /*-{ return @com.google.gwt.dom.client.DOMImplMozilla::isGecko2OrBefore()(); }-*/; static native boolean isIE8() /*-{ return $wnd.navigator.userAgent.toLowerCase().indexOf('msie') != -1 && $doc.documentMode == 8; }-*/; static native boolean isOldFirefox() /*-{ return @com.google.gwt.dom.client.DOMImplMozilla::isGecko191OrBefore()(); }-*/; public void disabled_testPreload() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } if (isFirefox40OrEarlier()) { return; // don't continue on older versions of Firefox. } String state = media.getPreload(); assertNotNull(state); assertTrue("Illegal preload state", state.equals(MediaElement.PRELOAD_AUTO) || state.equals(MediaElement.PRELOAD_METADATA) || state.equals(MediaElement.PRELOAD_NONE)); media.setPreload(MediaElement.PRELOAD_METADATA); assertEquals("Preload should be able to be set.", MediaElement.PRELOAD_METADATA, media.getPreload()); } /** * Return the Media associated with the test. * * @return the Media associated with the test. */ public abstract MediaBase getMedia(); @Override public String getModuleName() { return "com.google.gwt.media.MediaTest"; } public void testAddSource() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } // Add some source elements. SourceElement source0 = media.addSource("file.ogg", "audio/ogg"); assertTrue(source0.getSrc().endsWith("file.ogg")); assertEquals("audio/ogg", source0.getType()); SourceElement source1 = media.addSource("file.ogv", "video/ogg"); assertTrue(source1.getSrc().endsWith("file.ogv")); assertEquals("video/ogg", source1.getType()); // Add a source without a type. SourceElement source2 = media.addSource("file.mp3"); assertTrue(source2.getSrc().endsWith("file.mp3")); // Check that the sources are a children of the media. assertEquals(media.getElement(), source0.getParentElement()); assertEquals(media.getElement(), source1.getParentElement()); assertEquals(media.getElement(), source2.getParentElement()); } public void testAutoPlay() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } media.setAutoplay(false); assertFalse("Autoplay should be off.", media.isAutoplay()); media.setAutoplay(true); assertTrue("Autoplay should be on.", media.isAutoplay()); } public void testControls() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } media.setControls(false); assertFalse("Controls should be off.", media.hasControls()); media.setControls(true); assertTrue("Controls should be on.", media.hasControls()); } public void testCurrentSrc() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } media.load(); Assert.assertNotNull( "currentSrc should be set in these tests.", media.getCurrentSrc()); } public void testPlayAndSeek() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } assertAfterLoad(new RepeatingCommand() { boolean afterSeek = false; @Override public boolean execute() { if (media.getCurrentTime() >= 1) { assertFalse(afterSeek); media.setCurrentTime(0); // seek to a previous time afterSeek = true; // In the next loop we will assert the time to check if the seek is successful return true; } if (afterSeek) { assertTrue(media.getCurrentTime() < 1); return false; } // Need more time to complete 1 second of play return true; } }); media.play(); } public void testLoad() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } assertAfterLoad(new RepeatingCommand() { @Override public boolean execute() { assertNoErrors(media); return false; } }); media.load(); } public void testLoop() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } media.setLoop(false); assertFalse("Loop should be off.", media.isLoop()); media.setLoop(true); assertTrue("Loop should be on.", media.isLoop()); } public void testMuted() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } media.setMuted(true); assertTrue("Muted should be true.", media.isMuted()); media.setMuted(false); assertFalse("Muted should be false.", media.isMuted()); } public void testNetworkState() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } int state = media.getNetworkState(); assertTrue("Illegal network state", state == MediaElement.NETWORK_EMPTY || state == MediaElement.NETWORK_IDLE || state == MediaElement.NETWORK_LOADING || state == MediaElement.NETWORK_NO_SOURCE); } public void testPlaybackRate() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } assertEquals("Default playback rate should be 1.0", 1.0, media.getDefaultPlaybackRate()); assertAfterLoad(new RepeatingCommand() { @Override public boolean execute() { assertNoErrors(media); // set rate to 2.0 double rate = 2.0; media.setPlaybackRate(rate); assertEquals("Should be able to change playback rate", rate, media.getPlaybackRate()); // return to 1.0 rate = 1.0; media.setPlaybackRate(rate); assertEquals("Should be able to change playback rate", rate, media.getPlaybackRate()); return false; } }); media.play(); } public void testReadyState() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } int state = media.getReadyState(); assertTrue("Illegal ready state", state == MediaElement.HAVE_CURRENT_DATA || state == MediaElement.HAVE_ENOUGH_DATA || state == MediaElement.HAVE_FUTURE_DATA || state == MediaElement.HAVE_METADATA || state == MediaElement.HAVE_NOTHING); } public void testRemoveSource() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } // Add some source elements. SourceElement source0 = media.addSource("file.ogg", "audio/ogg"); SourceElement source1 = media.addSource("file.ogv", "video/ogg"); SourceElement source2 = media.addSource("file.mp3"); assertEquals(media.getElement(), source0.getParentElement()); assertEquals(media.getElement(), source1.getParentElement()); assertEquals(media.getElement(), source2.getParentElement()); // Remove a source. media.removeSource(source1); assertEquals(media.getElement(), source0.getParentElement()); assertNull(source1.getParentElement()); assertEquals(media.getElement(), source2.getParentElement()); // Let a source remove itself. source2.removeFromParent(); assertEquals(media.getElement(), source0.getParentElement()); assertNull(source1.getParentElement()); assertNull(source2.getParentElement()); // Remove a source that is not a child. media.removeSource(source0); } public void testSupported() { // test the isxxxSupported() call if running known sup or not sup browsers. if (isIE8()) { assertFalse(Audio.isSupported()); assertFalse(Video.isSupported()); } if (isFirefox35OrLater()) { assertTrue(Audio.isSupported()); assertTrue(Video.isSupported()); } } public void testVolume() { final MediaBase media = getMedia(); if (media == null) { return; // don't continue if not supported } media.setVolume(0.5); assertEquals( "Volume should be at one-half loudness.", 0.5, media.getVolume()); media.setVolume(0.75); assertEquals("Volume should be at three-quarters loudness.", 0.75, media.getVolume()); } private void assertAfterLoad(final RepeatingCommand command) { // the media resource needs time to load delayTestFinish(10 * 1000); getMedia().addLoadedMetadataHandler(new LoadedMetadataHandler() { @Override public void onLoadedMetadata(LoadedMetadataEvent event) { assertNoErrors(getMedia()); Scheduler.get().scheduleFixedDelay(new RepeatingCommand() { @Override public boolean execute() { assertNoErrors(getMedia()); boolean finished = !command.execute(); if (finished) { finishTest(); return false; } return true; } }, 100); } }); } private static void assertNoErrors(final MediaBase media) { MediaError error = media.getError(); if (error != null) { fail("Media error (" + error.getCode() + ")"); } } }