aboutsummaryrefslogtreecommitdiffstats
path: root/application/src/test/java/com/yahoo/application/container/ContainerDocprocTest.java
blob: 7c786d35fabaa9c9f7e343aca71356a59f878c50 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// 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 =
                "<container version=\"1.0\">\n" +
                "  <document-processing>\n" +
                "    <chain id=\"" + chainName + "\">\n";
        for (String processorId : processorIds) {
            xml += "      <documentprocessor id=\"" + processorId + "\"/>\n";
        }
        xml +=
                "    </chain>\n" +
                "  </document-processing>\n" +
                "  <accesslog type=\"disabled\" />" +
                "</container>\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<DocumentProcessor> 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<DocumentProcessor> 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();
        }

    }

}