// 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.component.ComponentId; import com.yahoo.component.ComponentSpecification; import com.yahoo.application.container.docprocs.Rot13DocumentProcessor; import com.yahoo.container.Container; import com.yahoo.docproc.DocumentProcessor; import com.yahoo.document.Document; import com.yahoo.document.DocumentPut; import com.yahoo.document.DocumentType; import com.yahoo.processing.execution.chain.ChainRegistry; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; /** * @author Einar M R Rosenvinge */ public class ContainerDocprocTest { private static final String DOCUMENT = "document music {\n" + " field title type string { }\n" + "}\n"; private static final String CHAIN_NAME = "myChain"; private static String getXML(String chainName, String... processorIds) { String xml = "\n" + " \n" + " \n"; for (String processorId : processorIds) { xml += " \n"; } xml += " \n" + " \n" + " " + "\n"; return xml; } @Before public void resetContainer() { Container.resetInstance(); } @Test public void requireThatBasicDocumentProcessingWorks() throws Exception { try (Application app = new ApplicationBuilder() .servicesXml(getXML(CHAIN_NAME, Rot13DocumentProcessor.class.getCanonicalName())) .documentType("music", DOCUMENT).build()) { JDisc container = app.getJDisc("container"); DocumentProcessing docProc = container.documentProcessing(); DocumentType type = docProc.getDocumentTypes().get("music"); ChainRegistry chains = docProc.getChains(); assertTrue(chains.allComponentsById().containsKey(new ComponentId(CHAIN_NAME))); Document doc = new Document(type, "id:this:music::is:a:great:album"); doc.setFieldValue("title", "Great Album!"); com.yahoo.docproc.Processing processing; DocumentProcessor.Progress progress; DocumentPut put = new DocumentPut(doc); processing = com.yahoo.docproc.Processing.of(put); progress = docProc.process(ComponentSpecification.fromString(CHAIN_NAME), processing); assertSame(progress, DocumentProcessor.Progress.DONE); assertEquals("Terng Nyohz!", doc.getFieldValue("title").toString()); processing = com.yahoo.docproc.Processing.of(put); progress = docProc.process(ComponentSpecification.fromString(CHAIN_NAME), processing); assertSame(progress, DocumentProcessor.Progress.DONE); assertEquals("Great Album!", doc.getFieldValue("title").toString()); } } @Test public void requireThatLaterDocumentProcessingWorks() throws Exception { try (Application app = new ApplicationBuilder() .servicesXml(getXML(CHAIN_NAME, Rot13DocumentProcessor.class.getCanonicalName())) .networking(Networking.disable) .documentType("music", DOCUMENT).build()) { JDisc container = app.getJDisc("container"); DocumentProcessing docProc = container.documentProcessing(); DocumentType type = docProc.getDocumentTypes().get("music"); ChainRegistry chains = docProc.getChains(); assertTrue(chains.allComponentsById().containsKey(new ComponentId(CHAIN_NAME))); Document doc = new Document(type, "id:this:music::is:a:great:album"); doc.setFieldValue("title", "Great Album!"); com.yahoo.docproc.Processing processing; DocumentProcessor.Progress progress; DocumentPut put = new DocumentPut(doc); processing = com.yahoo.docproc.Processing.of(put); progress = docProc.processOnce(ComponentSpecification.fromString(CHAIN_NAME), processing); assertTrue(progress instanceof DocumentProcessor.LaterProgress); assertEquals("Great Album!", doc.getFieldValue("title").toString()); progress = docProc.processOnce(ComponentSpecification.fromString(CHAIN_NAME), processing); assertTrue(progress instanceof DocumentProcessor.LaterProgress); assertEquals("Great Album!", doc.getFieldValue("title").toString()); progress = docProc.processOnce(ComponentSpecification.fromString(CHAIN_NAME), processing); assertSame(progress, DocumentProcessor.Progress.DONE); assertEquals("Terng Nyohz!", doc.getFieldValue("title").toString()); } } @Test(expected = IllegalArgumentException.class) public void requireThatUnknownChainThrows() { try (JDisc container = JDisc.fromServicesXml( getXML("foo", Rot13DocumentProcessor.class.getCanonicalName()), Networking.disable)) { container.documentProcessing().process(ComponentSpecification.fromString("unknown"), new com.yahoo.docproc.Processing()); } } @Test(expected = UnsupportedOperationException.class) public void requireThatProcessingFails() { try (JDisc container = JDisc.fromServicesXml( getXML("foo", Rot13DocumentProcessor.class.getCanonicalName()), Networking.disable)) { container.processing(); } } @Test(expected = UnsupportedOperationException.class) public void requireThatSearchFails() { try (JDisc container = JDisc.fromServicesXml( getXML("foo", Rot13DocumentProcessor.class.getCanonicalName()), Networking.disable)) { container.search(); } } }