From 4eb1ed8aa50480ae01fd1c187990df25f501535a Mon Sep 17 00:00:00 2001 From: Bartosz Firyn Date: Wed, 11 Jun 2014 16:54:59 +0000 Subject: [PATCH] Add unit tests for VLCj driver --- webcam-capture-drivers/driver-vlcj/pom.xml | 28 +++- .../sarxos/webcam/ds/vlcj/VlcjDevice.java | 52 +----- .../sarxos/webcam/ds/vlcj/VlcjDriver.java | 83 ++++++++- .../github/sarxos/webcam/ds/vlcj/impl/OS.java | 48 ++++++ .../sarxos/webcam/ds/vlcj/VlcjDeviceTest.java | 158 ++++++++++++++++++ webcam-capture/pom.xml | 3 - 6 files changed, 307 insertions(+), 65 deletions(-) create mode 100644 webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/impl/OS.java create mode 100644 webcam-capture-drivers/driver-vlcj/src/test/java/com/github/sarxos/webcam/ds/vlcj/VlcjDeviceTest.java diff --git a/webcam-capture-drivers/driver-vlcj/pom.xml b/webcam-capture-drivers/driver-vlcj/pom.xml index 72277ece..a4020a6b 100644 --- a/webcam-capture-drivers/driver-vlcj/pom.xml +++ b/webcam-capture-drivers/driver-vlcj/pom.xml @@ -11,8 +11,8 @@ webcam-capture-driver-vlcj bundle - Webcam Capture - VLCj Driver - Webcam Capture driver using VLCj framework to grab frames from camera device + Webcam Capture - Vlcj Driver + Webcam Capture driver using vlcj library to grab frames from camera device @@ -31,14 +31,30 @@ vlcj 2.4.1 + + junit + junit + test + + + org.easymock + easymock + test + + + org.powermock + powermock-module-junit4 + test + + + org.powermock + powermock-api-easymock + test + - - org.apache.maven.plugins - maven-assembly-plugin - org.apache.maven.plugins maven-assembly-plugin diff --git a/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/VlcjDevice.java b/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/VlcjDevice.java index 4274d8ed..a3d2ae44 100644 --- a/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/VlcjDevice.java +++ b/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/VlcjDevice.java @@ -14,56 +14,9 @@ import com.github.sarxos.webcam.WebcamDevice; import com.github.sarxos.webcam.WebcamException; import com.github.sarxos.webcam.WebcamResolution; +import com.github.sarxos.webcam.ds.vlcj.impl.OS; -/** - * Just a simple enumeration with supported (not yet confirmed) operating - * systems. - * - * @author Bartosz Firyn (sarxos) - */ -enum OS { - - /** - * Microsoft Windows - */ - WIN, - - /** - * Linux or UNIX. - */ - NIX, - - /** - * Mac OS X - */ - OSX; - - private static OS os = null; - - /** - * Get operating system. - * - * @return OS - */ - public static final OS getOS() { - if (os == null) { - String osp = System.getProperty("os.name").toLowerCase(); - if (osp.indexOf("win") >= 0) { - os = WIN; - } else if (osp.indexOf("mac") >= 0) { - os = OSX; - } else if (osp.indexOf("nix") >= 0 || osp.indexOf("nux") >= 0) { - os = NIX; - } else { - throw new RuntimeException(osp + " is not supported"); - } - } - return os; - } - -} - /** * Capture driver which use vlcj project API to fetch images from camera. It * should not be used when you need performance since vlcj saves snapshot image @@ -76,6 +29,9 @@ public static final OS getOS() { */ public class VlcjDevice implements WebcamDevice { + /** + * Logger. + */ private static final Logger LOG = LoggerFactory.getLogger(VlcjDevice.class); /** diff --git a/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/VlcjDriver.java b/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/VlcjDriver.java index fb734888..0f930032 100644 --- a/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/VlcjDriver.java +++ b/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/VlcjDriver.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import uk.co.caprica.vlcj.binding.LibVlc; import uk.co.caprica.vlcj.medialist.MediaList; @@ -13,6 +14,7 @@ import com.github.sarxos.webcam.WebcamDevice; import com.github.sarxos.webcam.WebcamDiscoverySupport; import com.github.sarxos.webcam.WebcamDriver; +import com.github.sarxos.webcam.ds.vlcj.impl.OS; import com.sun.jna.Native; @@ -25,28 +27,59 @@ */ public class VlcjDriver implements WebcamDriver, WebcamDiscoverySupport { - static { - Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); - } + /** + * Default webcam discovery scan interval in milliseconds. + */ + public static final long DEFAULT_SCAN_INTERVAL = 3000; + + /** + * Are natives initialized. + */ + private static final AtomicBoolean initialized = new AtomicBoolean(); + + /** + * The scan interval. + */ + private long scanInterval = -1; public VlcjDriver() { if (OS.getOS() == OS.WIN) { System.err.println(String.format("WARNING: %s does not support Windows platform", getClass().getSimpleName())); } + initialize(); + } + + /** + * Initialize natives. + */ + protected static void initialize() { + initialize(true); + } + + /** + * Initialize natives. If argument is true the natives are being loaded. In + * case of false this method do nothing. It's used mostly in unit tests. + * + * @param load the control to decide whether to load natives or ignore them + */ + protected static void initialize(boolean load) { + if (load && initialized.compareAndSet(false, true)) { + Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class); + } } @Override - public List getDevices() { + public final List getDevices() { - MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(); + MediaPlayerFactory mediaPlayerFactory = createMediaPlayerFactory(); MediaDiscoverer videoMediaDiscoverer = mediaPlayerFactory.newVideoMediaDiscoverer(); MediaList videoDeviceList = videoMediaDiscoverer.getMediaList(); List devices = new ArrayList(); - List videoDevices = videoDeviceList.items(); + for (MediaListItem item : videoDevices) { - devices.add(new VlcjDevice(item)); + devices.add(mediaListItemToDevice(item)); } videoDeviceList.release(); @@ -56,6 +89,25 @@ public List getDevices() { return devices; } + /** + * Converts media list itemn into webcam device. + * + * @param item the item to be converted to webcam device instance + * @return Webcam device created from media list item + */ + protected WebcamDevice mediaListItemToDevice(MediaListItem item) { + return new VlcjDevice(item); + } + + /** + * Creates media player factory. + * + * @return New media player factory + */ + protected MediaPlayerFactory createMediaPlayerFactory() { + return new MediaPlayerFactory(); + } + @Override public boolean isThreadSafe() { return false; @@ -68,7 +120,22 @@ public String toString() { @Override public long getScanInterval() { - return 3000; + if (scanInterval <= 0) { + return DEFAULT_SCAN_INTERVAL; + } + return scanInterval; + } + + /** + * Set new scan interval. Value must be positive number. If negative or zero + * is used, then the corresponding getter will return default scan interval + * value. + * + * @param scanInterval the new scan interval in milliseconds + * @see VlcjDriver#DEFAULT_SCAN_INTERVAL + */ + public void setScanInterval(long scanInterval) { + this.scanInterval = scanInterval; } @Override diff --git a/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/impl/OS.java b/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/impl/OS.java new file mode 100644 index 00000000..769ebf9b --- /dev/null +++ b/webcam-capture-drivers/driver-vlcj/src/main/java/com/github/sarxos/webcam/ds/vlcj/impl/OS.java @@ -0,0 +1,48 @@ +package com.github.sarxos.webcam.ds.vlcj.impl; + +/** + * Just a simple enumeration with supported (not yet confirmed) operating + * systems. + * + * @author Bartosz Firyn (sarxos) + */ +public enum OS { + + /** + * Microsoft Windows + */ + WIN, + + /** + * Linux or UNIX. + */ + NIX, + + /** + * Mac OS X + */ + OSX; + + private static OS os = null; + + /** + * Get operating system. + * + * @return OS + */ + public static final OS getOS() { + if (os == null) { + String osp = System.getProperty("os.name").toLowerCase(); + if (osp.indexOf("win") >= 0) { + os = WIN; + } else if (osp.indexOf("mac") >= 0) { + os = OSX; + } else if (osp.indexOf("nix") >= 0 || osp.indexOf("nux") >= 0) { + os = NIX; + } else { + throw new RuntimeException(osp + " is not supported"); + } + } + return os; + } +} \ No newline at end of file diff --git a/webcam-capture-drivers/driver-vlcj/src/test/java/com/github/sarxos/webcam/ds/vlcj/VlcjDeviceTest.java b/webcam-capture-drivers/driver-vlcj/src/test/java/com/github/sarxos/webcam/ds/vlcj/VlcjDeviceTest.java new file mode 100644 index 00000000..07630dff --- /dev/null +++ b/webcam-capture-drivers/driver-vlcj/src/test/java/com/github/sarxos/webcam/ds/vlcj/VlcjDeviceTest.java @@ -0,0 +1,158 @@ +package com.github.sarxos.webcam.ds.vlcj; + +import java.awt.Dimension; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import uk.co.caprica.vlcj.medialist.MediaList; +import uk.co.caprica.vlcj.medialist.MediaListItem; +import uk.co.caprica.vlcj.player.MediaPlayerFactory; +import uk.co.caprica.vlcj.player.discoverer.MediaDiscoverer; + +import com.github.sarxos.webcam.WebcamDevice; +import com.github.sarxos.webcam.WebcamResolution; + + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ + MediaList.class, + MediaDiscoverer.class, // +}) +public class VlcjDeviceTest { + + private static class DummyDevice implements WebcamDevice { + + private static final AtomicInteger N = new AtomicInteger(); + private final int number; + + public DummyDevice() { + this.number = N.incrementAndGet(); + } + + @Override + public String getName() { + return "Dummy device " + number; + } + + @Override + public Dimension[] getResolutions() { + return new Dimension[] { WebcamResolution.VGA.getSize() }; + } + + @Override + public Dimension getResolution() { + return WebcamResolution.VGA.getSize(); + } + + @Override + public void setResolution(Dimension size) { + throw new IllegalStateException("Not supported"); + } + + @Override + public BufferedImage getImage() { + return EasyMock.createMock(BufferedImage.class); + } + + @Override + public void open() { + // ignore + } + + @Override + public void close() { + // ignore + } + + @Override + public void dispose() { + // ignore + } + + @Override + public boolean isOpen() { + return true; + } + } + + private VlcjDriver getDriverMock() { + + List items = new ArrayList(); + items.add(EasyMock.createMock(MediaListItem.class)); + items.add(EasyMock.createMock(MediaListItem.class)); + items.add(EasyMock.createMock(MediaListItem.class)); + items.add(EasyMock.createMock(MediaListItem.class)); + for (MediaListItem item : items) { + EasyMock.replay(item); + } + + MediaList list = PowerMock.createNiceMock(MediaList.class); + EasyMock.expect(list.items()).andReturn(items).anyTimes(); + EasyMock.replay(list); + + MediaDiscoverer discoverer = PowerMock.createNiceMock(MediaDiscoverer.class); + EasyMock.expect(discoverer.getMediaList()).andReturn(list).anyTimes(); + EasyMock.replay(discoverer); + + MediaPlayerFactory factory = EasyMock.createNiceMock(MediaPlayerFactory.class); + EasyMock.expect(factory.newVideoMediaDiscoverer()).andReturn(discoverer).anyTimes(); + EasyMock.replay(factory); + + VlcjDriver driver = EasyMock.createMockBuilder(VlcjDriver.class) + .addMockedMethod("createMediaPlayerFactory") + .addMockedMethod("mediaListItemToDevice") + .createMock(); + EasyMock.expect(driver.createMediaPlayerFactory()).andReturn(factory).anyTimes(); + for (MediaListItem item : items) { + EasyMock.expect(driver.mediaListItemToDevice(item)).andReturn(new DummyDevice()).anyTimes(); + } + EasyMock.replay(driver); + + return driver; + } + + @Test + public void test_getDevices() { + VlcjDriver driver = getDriverMock(); + List devices = driver.getDevices(); + Assert.assertNotNull(devices); + Assert.assertEquals(4, devices.size()); + } + + @Test + public void test_isThreadSafe() { + VlcjDriver driver = getDriverMock(); + Assert.assertFalse(driver.isThreadSafe()); + } + + @Test + public void test_isScanPossible() { + VlcjDriver driver = getDriverMock(); + Assert.assertTrue(driver.isScanPossible()); + } + + @Test + public void test_getSetScanInterval() { + VlcjDriver driver = getDriverMock(); + Assert.assertEquals(VlcjDriver.DEFAULT_SCAN_INTERVAL, driver.getScanInterval()); + driver.setScanInterval(12345); + Assert.assertEquals(12345, driver.getScanInterval()); + } + + @Test + public void test_toString() { + VlcjDriver driver = getDriverMock(); + Assert.assertNotNull(driver.toString()); + } + +} diff --git a/webcam-capture/pom.xml b/webcam-capture/pom.xml index 3fb3edc5..d84ca6b9 100644 --- a/webcam-capture/pom.xml +++ b/webcam-capture/pom.xml @@ -38,18 +38,15 @@ org.slf4j slf4j-api - 1.7.2 ch.qos.logback logback-classic - 1.0.9 provided junit junit - 4.11 test