/*
* Copyright (c) 2008 Wayne Meissner
*
* This file is part of gstreamer-java.
*
* gstreamer-java is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* gstreamer-java is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with gstreamer-java. If not, see <http://www.gnu.org/licenses/>.
*/
package org.freedesktop.gstreamer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.lang.ref.WeakReference;
import java.util.concurrent.TimeUnit;
import org.freedesktop.gstreamer.event.BufferSizeEvent;
import org.freedesktop.gstreamer.event.CapsEvent;
import org.freedesktop.gstreamer.event.EOSEvent;
import org.freedesktop.gstreamer.event.FlushStartEvent;
import org.freedesktop.gstreamer.event.FlushStopEvent;
import org.freedesktop.gstreamer.event.LatencyEvent;
import org.freedesktop.gstreamer.event.QOSEvent;
import org.freedesktop.gstreamer.event.ReconfigureEvent;
import org.freedesktop.gstreamer.event.SeekEvent;
import org.freedesktop.gstreamer.event.SegmentEvent;
import org.freedesktop.gstreamer.event.StepEvent;
import org.freedesktop.gstreamer.event.StreamStartEvent;
import org.freedesktop.gstreamer.event.TagEvent;
import org.freedesktop.gstreamer.lowlevel.GstAPI;
import static org.freedesktop.gstreamer.lowlevel.GstEventAPI.GSTEVENT_API;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
*
* @author wayne
*/
public class EventTest {
public EventTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
Gst.init("EventTest", new String[] {});
}
@AfterClass
public static void tearDownClass() throws Exception {
Gst.deinit();
}
@Test public void verifyFlags() {
// Verify that the flags in the enum match the native ones.
EventType[] types = EventType.values();
for (EventType t : types) {
int flags = GSTEVENT_API.gst_event_type_get_flags(t);
assertEquals("Incorrect flags for: " + t.name(), flags, t.intValue() & 0xFF);
}
}
@Test public void createEOSEvent() throws Exception {
new EOSEvent();
}
@Test public void createFlushStartEvent() throws Exception {
new FlushStartEvent();
}
@Test public void createFlushStopEvent() throws Exception {
new FlushStopEvent();
}
@Test public void createLatencyEvent() throws Exception {
new LatencyEvent(ClockTime.ZERO);
}
@Test public void createSegmentEvent() throws Exception {
GstAPI.GstSegmentStruct struct = new GstAPI.GstSegmentStruct();
struct.flags = SegmentFlags.NONE;
struct.rate = 1.0;
struct.applied_rate = 1.0;
struct.format = Format.TIME;
new SegmentEvent(struct);
}
@Test public void createCapsEvent() throws Exception {
new CapsEvent(Caps.fromString("video/x-raw,format=I420"));
}
@Test public void createReconfigureEvent() throws Exception {
new ReconfigureEvent();
}
@Test public void createStreamStartEvent() throws Exception {
new StreamStartEvent("a stream_id");
}
@Test public void createStepEvent() throws Exception {
new StepEvent(Format.BUFFERS, 1, 1, true, false);
}
@Test public void gst_event_new_eos() {
Event eos = GSTEVENT_API.gst_event_new_eos();
assertNotNull("gst_event_new_eos returned null", eos);
assertTrue("gst_event_new_eos returned a non-EOS event", eos instanceof EOSEvent);
}
@Test public void gst_event_new_flush_start() {
Event ev = GSTEVENT_API.gst_event_new_flush_start();
assertNotNull("gst_event_new_flush_start returned null", ev);
assertTrue("gst_event_new_flush_start returned a non-FLUSH_START event", ev instanceof FlushStartEvent);
}
@Test public void gst_event_new_flush_stop() {
Event ev = GSTEVENT_API.gst_event_new_flush_stop();
assertNotNull("gst_event_new_flush_stop returned null", ev);
assertTrue("gst_event_new_flush_stop returned a non-FLUSH_STOP event", ev instanceof FlushStopEvent);
}
@Test public void gst_event_new_latency() {
Event ev = GSTEVENT_API.gst_event_new_latency(ClockTime.ZERO);
assertNotNull("gst_event_new_latency returned null", ev);
assertTrue("gst_event_new_latency returned a non-LATENCY event", ev instanceof LatencyEvent);
}
@Test public void gst_event_new_new_segment() {
GstAPI.GstSegmentStruct struct = new GstAPI.GstSegmentStruct();
struct.flags = SegmentFlags.NONE;
struct.rate = 1.0;
struct.applied_rate = 1.0;
struct.format = Format.TIME;
Event ev = GSTEVENT_API.gst_event_new_segment(struct);
assertNotNull("gst_event_new_latency returned null", ev);
assertTrue("gst_event_new_latency returned a non-NEWSEGMENT event", ev instanceof SegmentEvent);
}
@Test public void getLatency() {
final ClockTime MAGIC = ClockTime.valueOf(0xdeadbeef, TimeUnit.NANOSECONDS);
LatencyEvent ev = new LatencyEvent(MAGIC);
assertEquals("Incorrect latency returned", MAGIC, ev.getLatency());
}
@Test public void NewSegment_getRate() {
final double RATE = (double) 0xdeadbeef;
SegmentEvent ev = new SegmentEvent(new GstAPI.GstSegmentStruct(SegmentFlags.NONE, RATE, RATE, Format.TIME, 0, 0, 0, 0, 0, 0, 0));
assertEquals("Incorrect rate returned from getRate", RATE, ev.getSegment().rate, 0.0);
}
@Test public void NewSegment_getStart() {
final long START = 0xdeadbeefL;
SegmentEvent ev = new SegmentEvent(new GstAPI.GstSegmentStruct(SegmentFlags.NONE, 0.1, 0.1, Format.TIME, 0, 0, START, -1L, 0, 0, 0));
assertEquals("Incorrect rate returned from getStart", START, ev.getSegment().start);
}
@Test public void NewSegment_getStop() {
final long STOP = 0xdeadbeefL;
SegmentEvent ev = new SegmentEvent(new GstAPI.GstSegmentStruct(SegmentFlags.NONE, 0.1, 0.1, Format.TIME, 0, 0, 0L, STOP, 0, 0, 0));
assertEquals("Incorrect rate returned from getRate", STOP, ev.getSegment().stop);
}
@Test public void gst_event_new_tag() {
Event ev = GSTEVENT_API.gst_event_new_tag(new TagList());
assertNotNull("gst_event_new_tag returned null", ev);
assertTrue("gst_event_new_tag returned a non-TAG event", ev instanceof TagEvent);
}
@Test public void TagEvent_testGC() throws Exception {
TagEvent ev = new TagEvent(new TagList());
@SuppressWarnings("unused")
TagList tl = ev.getTagList();
WeakReference<Event> evRef = new WeakReference<Event>(ev);
ev = null;
assertFalse("Event ref collected before TagList is unreferenced", GCTracker.waitGC(evRef));
tl = null;
assertTrue("Event ref not collected after TagList is unreferenced", GCTracker.waitGC(evRef));
}
@Test public void Event_testGC() throws Exception {
Event ev = new LatencyEvent(ClockTime.NONE);
@SuppressWarnings("unused")
Structure s = ev.getStructure();
WeakReference<Event> evRef = new WeakReference<Event>(ev);
ev = null;
assertFalse("Event ref collected before Structure is unreferenced", GCTracker.waitGC(evRef));
s = null;
assertTrue("Event ref not collected after Structure is unreferenced", GCTracker.waitGC(evRef));
}
@Test public void gst_event_new_buffer_size() {
final long MIN = 0x1234;
final long MAX = 0xdeadbeef;
final boolean ASYNC = false;
Event ev = GSTEVENT_API.gst_event_new_buffer_size(Format.BYTES, MIN, MAX, ASYNC);
assertNotNull("gst_event_new_buffer_size returned null", ev);
assertTrue("gst_event_new_buffer_size returned a non-BUFFERSIZE event", ev instanceof BufferSizeEvent);
}
@Test public void BufferSize_getMinimumSize() {
final long MIN = 0x1234;
final long MAX = 0xdeadbeef;
final boolean ASYNC = false;
BufferSizeEvent ev = (BufferSizeEvent) GSTEVENT_API.gst_event_new_buffer_size(Format.BYTES, MIN, MAX, ASYNC);
assertEquals("Wrong minimum size stored", MIN, ev.getMinimumSize());
}
@Test public void BufferSize_getMaximumSize() {
final long MIN = 0x1234;
final long MAX = 0xdeadbeef;
final boolean ASYNC = false;
BufferSizeEvent ev = (BufferSizeEvent) GSTEVENT_API.gst_event_new_buffer_size(Format.BYTES, MIN, MAX, ASYNC);
assertEquals("Wrong minimum size stored", MAX, ev.getMaximumSize());
}
@Test public void BufferSize_isAsync() {
final long MIN = 0x1234;
final long MAX = 0xdeadbeef;
final boolean ASYNC = false;
BufferSizeEvent ev = (BufferSizeEvent) GSTEVENT_API.gst_event_new_buffer_size(Format.BYTES, MIN, MAX, ASYNC);
assertEquals("Wrong minimum size stored", ASYNC, ev.isAsync());
BufferSizeEvent ev2 = (BufferSizeEvent) GSTEVENT_API.gst_event_new_buffer_size(Format.BYTES, MIN, MAX, !ASYNC);
assertEquals("Wrong minimum size stored", !ASYNC, ev2.isAsync());
}
@Test public void gst_event_new_qos() {
Event ev = GSTEVENT_API.gst_event_new_qos(QOSType.THROTTLE, 0.0, 0, ClockTime.NONE);
assertNotNull("gst_event_new_qos returned null", ev);
assertTrue("gst_event_new_qos returned a non-QOS event", ev instanceof QOSEvent);
}
@Test public void QOS_getProportion() {
final double PROPORTION = (double) 0xdeadbeef;
QOSEvent ev = new QOSEvent(QOSType.THROTTLE, PROPORTION, 0, ClockTime.ZERO);
assertEquals("Wrong proportion", PROPORTION, ev.getProportion(), 0d);
}
@Test public void QOS_getDifference() {
long DIFF = 0x4096;
QOSEvent ev = new QOSEvent(QOSType.THROTTLE, 0d, DIFF, ClockTime.ZERO);
assertEquals("Wrong difference", DIFF, ev.getDifference());
}
@Test public void QOS_getTimestamp() {
final ClockTime STAMP = ClockTime.valueOf(0xdeadbeef, TimeUnit.NANOSECONDS);
QOSEvent ev = new QOSEvent(QOSType.THROTTLE, 0d, 0, STAMP);
assertEquals("Wrong timestamp", STAMP, ev.getTimestamp());
}
@Test
public void QOS_getType() {
final ClockTime STAMP = ClockTime.valueOf(0xdeadbeef, TimeUnit.NANOSECONDS);
QOSEvent ev = new QOSEvent(QOSType.THROTTLE, 0d, 0, STAMP);
assertEquals("Wrong QOSType", QOSType.THROTTLE, ev.getType());
}
@Test public void gst_event_new_seek() {
Event ev = GSTEVENT_API.gst_event_new_seek(1.0, Format.TIME, 0,
SeekType.SET, 0, SeekType.SET, 0);
assertNotNull("gst_event_new_seek returned null", ev);
assertTrue("gst_event_new_seek returned a non-SEEK event", ev instanceof SeekEvent);
}
@Test public void Seek_getFormat() {
for (Format FORMAT : new Format[] { Format.TIME, Format.BYTES }) {
SeekEvent ev = new SeekEvent(1.0, FORMAT, 0,
SeekType.SET, 0, SeekType.SET, 0);
assertEquals("Wrong format in SeekEvent", FORMAT, ev.getFormat());
}
}
@Test public void Seek_getStartType() {
for (SeekType TYPE : new SeekType[] { SeekType.SET, SeekType.END }) {
SeekEvent ev = new SeekEvent(1.0, Format.TIME, 0,
TYPE, 0, SeekType.NONE, 0);
assertEquals("Wrong startType in SeekEvent", TYPE, ev.getStartType());
}
}
@Test public void Seek_getStopType() {
for (SeekType TYPE : new SeekType[] { SeekType.SET, SeekType.END }) {
SeekEvent ev = new SeekEvent(1.0, Format.TIME, 0,
SeekType.NONE, 0, TYPE, 0);
assertEquals("Wrong stopType in SeekEvent", TYPE, ev.getStopType());
}
}
@Test public void Seek_getStart() {
final long START = 0xdeadbeef;
SeekEvent ev = new SeekEvent(1.0, Format.TIME, 0,
SeekType.SET, START, SeekType.SET, -1);
assertEquals("Wrong start in SeekEvent", START, ev.getStart());
}
@Test public void Seek_getStop() {
final long STOP = 0xdeadbeef;
SeekEvent ev = new SeekEvent(1.0, Format.TIME, 0,
SeekType.SET, 0, SeekType.SET, STOP);
assertEquals("Wrong stop in SeekEvent", STOP, ev.getStop());
}
@Test public void Seek_rateZero() {
try {
new SeekEvent(0.0, Format.TIME, 0,
SeekType.SET, 0, SeekType.SET, -1);
fail("A rate of 0.0 should throw an exception");
} catch (IllegalArgumentException ex) {
}
}
@Test public void gst_event_new_caps() {
Event ev = GSTEVENT_API.gst_event_new_caps(Caps.fromString("video/x-raw,format=I420"));
assertNotNull("gst_event_new_caps returned null", ev);
assertTrue("gst_event_new_caps returned a non-CAPS event", ev instanceof CapsEvent);
}
@Test public void gst_event_new_reconfigure() {
Event ev = GSTEVENT_API.gst_event_new_reconfigure();
assertNotNull("gst_event_new_reconfigure returned null", ev);
assertTrue("gst_event_new_reconfigure returned a non-RECONFIGURE event", ev instanceof ReconfigureEvent);
}
@Test public void gst_event_new_stream_start() {
Event ev = GSTEVENT_API.gst_event_new_stream_start("a stream id");
assertNotNull("gst_event_new_stream_start returned null", ev);
assertTrue("gst_event_new_stream_start returned a non-STREAM-START event", ev instanceof StreamStartEvent);
}
@Test public void gst_event_new_step() {
Event ev = GSTEVENT_API.gst_event_new_step(Format.BUFFERS, 1, 1, true, false);
assertNotNull("gst_event_new_step returned null", ev);
assertTrue("gst_event_new_step returned a non-STEP event", ev instanceof StepEvent);
}
}