/**
* Copyright (C) 2012-2017 the original author or authors.
*
* 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 ninja.utils;
import java.net.URI;
import java.net.URISyntaxException;
import com.google.inject.Injector;
import java.io.Closeable;
import java.io.IOException;
import ninja.standalone.Standalone;
import ninja.standalone.StandaloneHelper;
/**
* Starts a new server using an embedded standalone. Startup is really fast and thus
* usable in integration tests.
*/
public class NinjaTestServer implements Closeable {
private final int port;
private final Standalone<Standalone> standalone;
public NinjaTestServer() {
this(NinjaMode.test);
}
public NinjaTestServer(NinjaMode ninjaMode) {
this(ninjaMode, StandaloneHelper.resolveStandaloneClass());
}
public NinjaTestServer(NinjaMode ninjaMode, Class<? extends Standalone> standaloneClass) {
this.port = StandaloneHelper.findAvailablePort(1000, 10000);
this.standalone = StandaloneHelper.create(standaloneClass);
try {
// configure then start
this.standalone
.port(this.port)
.ninjaMode(ninjaMode);
standalone.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @deprecated This does not affect a running server -- which happens in
* the constructor. You'll want to remove this from your code and include
* the mode in the constructor.
*/
@Deprecated
public NinjaTestServer ninjaMode(NinjaMode ninjaMode) {
standalone.ninjaMode(ninjaMode);
return this;
}
/**
* @deprecated This does not affect a running server -- which happens in
* the constructor. You'll want to remove this from your code and include
* the mode in the constructor.
*/
@Deprecated
public NinjaMode getNinjaMode() {
return standalone.getNinjaMode();
}
/**
* Gets the guice injector for this test server.
* @return The guice injector
*/
public Injector getInjector() {
return standalone.getInjector();
}
/**
* Gets the url of the running server. It represents the scheme, host, and
* port, but does not include the context path of the application. It will
* return something like "http://localhost:8080". You probably want to use
* getBaseUrl() which does include the context path (if one is configured).
* @return The url of the server such as "http://localhost:8080" - note it
* does NOT include a trailing '/'.
* @see #getBaseUrl()
*/
public String getServerUrl() {
return standalone.getServerUrls().get(0);
}
/**
* Gets the url of the running application. It represents the scheme, host,
* port, and context path (if one is configured). It will return something
* like "http://localhost:8080" or "http://localhost:8080/mycontext" if
* a context of "/mycontext" is configured.
* @return The url of the application such as "http://localhost:8080" - note
* it does NOT include a trailing '/'
* @see #getServerUrl()
*/
public String getBaseUrl() {
return standalone.getBaseUrls().get(0);
}
/**
* @deprecated Does not include a configured context path as part of this
* uri. Also returns a uri with a trailing '/', while its more common to
* build a uri as (baseUri + "/path") since "/path" is what an href looks
* like in html.
* @see #getServerUrl()
* @see #getBaseUrl()
*/
@Deprecated
public String getServerAddress() {
return standalone.getServerUrls().get(0) + "/";
}
/**
* @deprecated Does not include a configured context path as part of this
* uri. Also returns a uri with a trailing '/', while its more common to
* build a uri as (baseUri + "/path") since "/path" is what an href looks
* like in html.
* @see #getServerUrl()
* @see #getBaseUrl()
*/
@Deprecated
public URI getServerAddressAsUri() {
try {
return new URI(getServerAddress());
} catch (URISyntaxException e) {
// should not be able to happen...
return null;
}
}
public void shutdown() {
standalone.shutdown();
}
@Override
public void close() throws IOException {
// so a test server can be used in a try-with-resources statement
shutdown();
}
}