// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.application.container;
import com.yahoo.application.Application;
import com.yahoo.application.ApplicationBuilder;
import com.yahoo.application.Networking;
import com.yahoo.application.container.handler.Request;
import com.yahoo.application.container.handler.Response;
import com.yahoo.application.container.handlers.TestHandler;
import com.yahoo.component.ComponentSpecification;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import java.nio.charset.CharacterCodingException;
import java.nio.file.FileSystems;
import static com.yahoo.application.container.JDisc.fromServicesXml;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
/**
* @author Tony Vaagenes
* @author gjoranv
* @author ollivir
*/
public class ContainerTest {
@Test
void container_can_be_used_as_top_level_element() {
try (JDisc container = fromServicesXml("" + //
"" + //
"", Networking.disable)) {
assertNotNull(container.search());
}
}
@Test
void container_id_can_be_set() {
try (JDisc container = fromServicesXml("" + //
"" + //
"", Networking.disable)) {
assertNotNull(container.search());
}
}
@Test
void container_can_be_embedded_in_services_tag() {
try (JDisc container = fromServicesXml("" + //
"" + //
"" + //
"" + //
"", Networking.disable)) {
assertNotNull(container.search());
}
}
// container is unused inside the try block
@Test
@SuppressWarnings("try")
void multiple_container_elements_gives_exception() {
try (JDisc container = fromServicesXml("" + //
"" + //
"" + //
"", Networking.disable)) {
fail("expected exception");
} catch (Exception e) {
assertTrue(e.getMessage().contains("container id='id1', container id=''"));
}
}
@Test
void handleRequest_yields_response_from_correct_request_handler() {
final String handlerClass = TestHandler.class.getName();
try (JDisc container = fromServicesXml("" + //
"" + //
"http://*/TestHandler" + //
"" + //
"", Networking.disable)) {
Response response = container.handleRequest(new Request("http://foo/TestHandler"));
try {
assertEquals(TestHandler.RESPONSE, response.getBodyAsString());
} catch (CharacterCodingException e) {
throw new RuntimeException(e);
}
}
}
@Test
void load_searcher_from_bundle() {
try (JDisc container = JDisc.fromPath(FileSystems.getDefault().getPath("src/test/app-packages/searcher-app"),
Networking.disable)) {
Result result = container.search().process(ComponentSpecification.fromString("default"),
new Query("?query=ignored"));
assertEquals("Heal the World!", result.hits().get(0).getField("title").toString());
}
}
@Test
void document_types_can_be_accessed() throws Exception {
try (Application application = new ApplicationBuilder().documentType("example", EXAMPLE_DOCUMENT)
.servicesXml(CONTAINER_WITH_DOCUMENT_PROCESSING).build()) {
JDisc container = application.getJDisc("container");
DocumentProcessing processing = container.documentProcessing();
assertTrue(processing.getDocumentTypes().containsKey("example"));
}
}
@Test
void annotation_types_can_be_accessed() throws Exception {
try (Application application = new ApplicationBuilder().documentType("example", "search example {\n" + //
" " + EXAMPLE_DOCUMENT + "\n" + //
" annotation exampleAnnotation {}\n" + //
"}\n").//
servicesXml(CONTAINER_WITH_DOCUMENT_PROCESSING).build()) {
JDisc container = application.getJDisc("container");
DocumentProcessing processing = container.documentProcessing();
assertTrue(processing.getAnnotationTypes().containsKey("exampleAnnotation"));
}
}
@Disabled // Enable this when static state has been removed.
@Test
void multiple_containers_can_be_run_in_parallel() throws Exception {
try (JDisc jdisc1 = jdiscWithHttp(); JDisc jdisc2 = jdiscWithHttp()) {
sendRequest(jdisc1);
sendRequest(jdisc2);
}
}
private void sendRequest(JDisc jdisc) throws CharacterCodingException {
Response response = jdisc.handleRequest(new Request("http://foo/TestHandler"));
assertEquals(TestHandler.RESPONSE, response.getBodyAsString());
}
public static final String CONTAINER_WITH_DOCUMENT_PROCESSING = //
"" + //
"" + //
"" + //
"";
public static final String EXAMPLE_DOCUMENT = //
"document example {\n" + //
"\n" + //
" field title type string {\n" + //
" indexing: summary | index # How this field should be indexed\n" + //
" weight: 75 # Ranking importancy of this field, used by the built in nativeRank feature\n" + //
" }\n" + //
"}\n";
protected JDisc jdiscWithHttp() {
final String handlerId = TestHandler.class.getName();
final String xml = //
"" + //
"" + //
"\n" + //
"\n" + //
"\n" + //
"" +
"";
return JDisc.fromServicesXml(xml, Networking.disable);
}
}