Skip to content
This repository has been archived by the owner on May 7, 2020. It is now read-only.

Commit

Permalink
[test] Improve AudioManagerTest (#6296)
Browse files Browse the repository at this point in the history
* [test] Improve AudioManagerTest

This also provides a common HTTP test server ported from the FSInternet radio binding.

Signed-off-by: Henning Treu <henning.treu@telekom.de>
  • Loading branch information
htreu authored and kaikreuzer committed Oct 12, 2018
1 parent 493a0a1 commit 301f8b1
Show file tree
Hide file tree
Showing 15 changed files with 540 additions and 467 deletions.
Expand Up @@ -12,12 +12,14 @@ Import-Package:
org.eclipse.jetty.client.api,
org.eclipse.jetty.http,
org.eclipse.jetty.io,
org.eclipse.jetty.servlet,
org.eclipse.jetty.util.component,
org.eclipse.smarthome.test,
org.eclipse.smarthome.test.java,
org.eclipse.smarthome.io.console,
org.eclipse.smarthome.io.console.extensions,
org.eclipse.smarthome.test,
org.eclipse.smarthome.test.java,
org.hamcrest;core=split,
org.junit,
org.osgi.framework
org.mockito,
org.mockito.stubbing
Automatic-Module-Name: org.eclipse.smarthome.core.audio.test
Expand Up @@ -34,9 +34,9 @@
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djetty.port=9090 -Djetty.home.bundle=org.eclipse.jetty.osgi.boot"/>
<stringAttribute key="pde.version" value="3.3"/>
<stringAttribute key="product" value=""/>
<booleanAttribute key="run_in_ui_thread" value="true"/>
<stringAttribute key="selected_target_plugins" value="ch.qos.logback.classic@default:default,ch.qos.logback.core@default:default,ch.qos.logback.slf4j@default:false,com.eclipsesource.jaxrs.jersey-min@default:default,com.google.gson@default:default,com.google.guava@default:default,com.ibm.icu@default:default,javax.activation@default:default,javax.inject@default:default,javax.measure.unit-api@default:default,javax.servlet@default:default,javax.transaction@default:false,javax.xml@default:default,net.bytebuddy.byte-buddy-agent@default:default,net.bytebuddy.byte-buddy@default:default,org.apache.ant@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.felix.scr@1:true,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.codehaus.groovy@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.runtime@default:true,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@default:true,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@2:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.region@default:false,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.equinox.util@default:default,org.eclipse.equinox.weaving.hook@default:false,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.alpn.fragment@default:false,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.osgi.httpservice@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.junit@default:default,org.mockito.mockito-core@default:default,org.objectweb.asm@default:default,org.objenesis@default:default,org.slf4j.api@default:default,tec.uom.lib.uom-lib-common@default:default,tec.uom.se@default:default"/>
<stringAttribute key="selected_workspace_plugins" value="org.eclipse.smarthome.config.core@default:default,org.eclipse.smarthome.config.xml@default:default,org.eclipse.smarthome.core.audio.test@default:false,org.eclipse.smarthome.core.audio@default:default,org.eclipse.smarthome.core.autoupdate@default:default,org.eclipse.smarthome.core.binding.xml@default:default,org.eclipse.smarthome.core.thing.xml@default:default,org.eclipse.smarthome.core.thing@default:default,org.eclipse.smarthome.core@default:default,org.eclipse.smarthome.io.console@default:default,org.eclipse.smarthome.test@default:default"/>
<booleanAttribute key="run_in_ui_thread" value="false"/>
<stringAttribute key="selected_target_plugins" value="ch.qos.logback.classic@default:default,ch.qos.logback.core@default:default,ch.qos.logback.slf4j@default:false,com.eclipsesource.jaxrs.jersey-min@default:default,com.google.gson*2.2.4.v201311231704@default:default,com.google.guava@default:default,com.ibm.icu@default:default,javax.activation@default:default,javax.inject@default:default,javax.measure.unit-api@default:default,javax.servlet*3.1.0.v20140303-1611@default:default,javax.servlet*3.1.0.v201410161800@default:default,javax.transaction@default:false,javax.xml@default:default,net.bytebuddy.byte-buddy-agent@default:default,net.bytebuddy.byte-buddy@default:default,org.apache.ant@default:default,org.apache.commons.codec*1.6.0.v201305230611@default:default,org.apache.commons.codec*1.9.0.v20170208-1614@default:default,org.apache.commons.collections@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.felix.scr@1:true,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.codehaus.groovy@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.runtime@default:true,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.common@default:true,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event*1.4.0.v20170105-1446@2:default,org.eclipse.equinox.event*1.4.200.v20180426-0845@2:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.region@default:false,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.equinox.util@default:default,org.eclipse.equinox.weaving.hook@default:false,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http*9.3.15.v20161220@default:default,org.eclipse.jetty.io*9.3.15.v20161220@default:default,org.eclipse.jetty.osgi.alpn.fragment@default:false,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.osgi.httpservice@default:default,org.eclipse.jetty.security*9.3.15.v20161220@default:default,org.eclipse.jetty.server*9.3.15.v20161220@default:default,org.eclipse.jetty.servlet*9.3.15.v20161220@default:default,org.eclipse.jetty.util*9.3.15.v20161220@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.junit@default:default,org.mockito.mockito-core@default:default,org.objectweb.asm*5.0.1.v201404251740@default:default,org.objectweb.asm*6.1.1.v20180414-0329@default:default,org.objenesis@default:default,org.slf4j.api@default:default,tec.uom.lib.uom-lib-common@default:default,tec.uom.se@default:default"/>
<stringAttribute key="selected_workspace_plugins" value="org.eclipse.smarthome.config.core@default:default,org.eclipse.smarthome.config.xml@default:default,org.eclipse.smarthome.core.audio.test@default:false,org.eclipse.smarthome.core.audio@default:default,org.eclipse.smarthome.core.binding.xml@default:default,org.eclipse.smarthome.core.thing.xml@default:default,org.eclipse.smarthome.core.thing@default:default,org.eclipse.smarthome.core@default:default,org.eclipse.smarthome.io.console@default:default,org.eclipse.smarthome.io.http@default:default,org.eclipse.smarthome.test@default:default"/>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="templateConfig" value="${target_home}\configuration\config.ini"/>
<booleanAttribute key="tracing" value="false"/>
Expand Down
@@ -0,0 +1,124 @@
/**
* Copyright (c) 2014,2018 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.smarthome.core.audio.internal;

import static org.junit.Assert.fail;

import java.util.concurrent.CompletableFuture;

import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.smarthome.core.audio.AudioFormat;
import org.eclipse.smarthome.core.audio.AudioStream;
import org.eclipse.smarthome.core.audio.ByteArrayAudioStream;
import org.eclipse.smarthome.core.audio.FixedLengthAudioStream;
import org.eclipse.smarthome.test.TestPortUtil;
import org.eclipse.smarthome.test.TestServer;
import org.eclipse.smarthome.test.java.JavaTest;
import org.junit.After;
import org.junit.Before;

/**
* Base class for tests using the {@link AudioServlet}.
*
* @author Henning Treu - initial contribution
*
*/
public abstract class AbstractAudioServeltTest extends JavaTest {

protected AudioServlet audioServlet;

private int port;
private TestServer server;

private final static String AUDIO_SERVLET_PROTOCOL = "http";
private final static String AUDIO_SERVLET_HOSTNAME = "localhost";

private CompletableFuture<Boolean> serverStarted;

private HttpClient httpClient;

@Before
public void setupServerAndClient() {
audioServlet = new AudioServlet();

ServletHolder servletHolder = new ServletHolder(audioServlet);

port = TestPortUtil.findFreePort();
server = new TestServer(AUDIO_SERVLET_HOSTNAME, port, 10000, servletHolder);
serverStarted = server.startServer();

httpClient = new HttpClient();
}

@After
public void tearDownServerAndClient() throws Exception {
server.stopServer();
httpClient.stop();
}

protected ByteArrayAudioStream getByteArrayAudioStream(byte[] byteArray, String container, String codec) {
int bitDepth = 16;
int bitRate = 1000;
long frequency = 16384;

AudioFormat audioFormat = new AudioFormat(container, codec, true, bitDepth, bitRate, frequency);

return new ByteArrayAudioStream(byteArray, audioFormat);
}

protected ContentResponse getHttpResponse(AudioStream audioStream) throws Exception {
String url = serveStream(audioStream);
return getHttpRequest(url).send();
}

protected String serveStream(AudioStream stream) throws Exception {
return serveStream(stream, null);
}

protected void startHttpClient(HttpClient client) {
if (!client.isStarted()) {
try {
client.start();
} catch (Exception e) {
fail("An exception " + e + " was thrown, while starting the HTTP client");
}
}
}

protected Request getHttpRequest(String url) {
startHttpClient(httpClient);
return httpClient.newRequest(url).method(HttpMethod.GET);
}

protected String serveStream(AudioStream stream, Integer timeInterval) throws Exception {
serverStarted.get(); // wait for the server thread to be started

String path;
if (timeInterval != null) {
path = audioServlet.serve((FixedLengthAudioStream) stream, timeInterval);
} else {
path = audioServlet.serve(stream);
}

return generateURL(AUDIO_SERVLET_PROTOCOL, AUDIO_SERVLET_HOSTNAME, port, path);
}

private String generateURL(String protocol, String hostname, int port, String path) {
return String.format("%s://%s:%s%s", protocol, hostname, port, path);
}

}

0 comments on commit 301f8b1

Please sign in to comment.