blob: 7ae96f654aeab1fd4a52d3c42e740b4e2773637e [file] [log] [blame]
// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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 com.google.enterprise.adaptor.sharepoint;
import static org.junit.Assert.*;
import com.google.enterprise.adaptor.Config;
import com.google.enterprise.adaptor.DocId;
import com.google.enterprise.adaptor.DocIdPusher;
import com.microsoft.schemas.sharepoint.soap.ObjectType;
import org.junit.*;
import org.junit.rules.ExpectedException;
import java.io.ByteArrayOutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.ExecutorService;
/**
* Test cases for {@link HtmlResponseWriter}.
*/
public class HtmlResponseWriterTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
private DocIdPusher docIdPusher = new UnsupportedDocIdPusher();
private MockAdaptorContext context = new MockAdaptorContext(
new Config(), docIdPusher);
private ExecutorService executor = new CallerRunsExecutor();
private Charset charset = Charset.forName("UTF-8");
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private HtmlResponseWriter writer = new HtmlResponseWriter(baos, charset,
context.getDocIdEncoder(), Locale.ENGLISH, 1024 * 1024, docIdPusher,
executor);
@After
public void shutdown() {
executor.shutdownNow();
}
@Test
public void testConstructorNullOutputStream() {
thrown.expect(NullPointerException.class);
new HtmlResponseWriter(null, charset, context.getDocIdEncoder(),
Locale.ENGLISH, 1024 * 1024, docIdPusher, executor);
}
@Test(expected = NullPointerException.class)
public void testConstructorNullCharset() {
new HtmlResponseWriter(baos, null, context.getDocIdEncoder(),
Locale.ENGLISH, 1024 * 1024, docIdPusher, executor);
}
@Test
public void testConstructorNullDocIdEncoder() {
thrown.expect(NullPointerException.class);
new HtmlResponseWriter(baos, charset, null,
Locale.ENGLISH, 1024 * 1024, docIdPusher, executor);
}
@Test
public void testConstructorNullLocale() {
thrown.expect(NullPointerException.class);
new HtmlResponseWriter(baos, charset, context.getDocIdEncoder(),
null, 1024 * 1024, docIdPusher, executor);
}
@Test(expected = NullPointerException.class)
public void testConstructorNullPusher() {
new HtmlResponseWriter(baos, charset, context.getDocIdEncoder(),
Locale.ENGLISH, 1024 * 1024, null, executor);
}
@Test(expected = NullPointerException.class)
public void testConstructorNullExecutor() {
new HtmlResponseWriter(baos, charset, context.getDocIdEncoder(),
Locale.ENGLISH, 1024 * 1024, docIdPusher, null);
}
@Test
public void testBasicFlow() throws Exception {
final String golden = "<!DOCTYPE html>\n"
+ "<html><head><title>Site s</title></head>"
+ "<body><h1>Site s</h1>"
+ "<p>Lists</p>"
+ "<ul><li><a href=\"s/l\">My List</a></li></ul>"
+ "</body></html>";
writer.start(new DocId("s"), ObjectType.SITE, null);
writer.startSection(ObjectType.LIST);
writer.addLink(new DocId("s/l"), "My List");
writer.finish();
assertEquals(golden, new String(baos.toByteArray(), charset));
}
@Test
public void testOverflowToDocIdPusher() throws Exception {
final String golden = "<!DOCTYPE html>\n"
+ "<html><head><title>Site s</title></head>"
+ "<body><h1>Site s</h1>"
+ "<p>Lists</p>"
+ "<ul><li><a href=\"s/l\">My List</a></li></ul>"
+ "</body></html>";
final List<DocIdPusher.Record> goldenRecords = Arrays.asList(
new DocIdPusher.Record.Builder(new DocId("s/l")).build());
AccumulatingDocIdPusher docIdPusher = new AccumulatingDocIdPusher();
writer = new HtmlResponseWriter(baos, charset,
context.getDocIdEncoder(), Locale.ENGLISH, 1, docIdPusher,
executor);
writer.start(new DocId("s"), ObjectType.SITE, null);
writer.startSection(ObjectType.LIST);
writer.addLink(new DocId("s/l"), "My List");
writer.finish();
assertEquals(golden, new String(baos.toByteArray(), charset));
assertEquals(goldenRecords, docIdPusher.getRecords());
}
@Test
public void testStartTwice() throws Exception {
writer.start(new DocId(""), ObjectType.SITE, null);
thrown.expect(IllegalStateException.class);
writer.start(new DocId(""), ObjectType.SITE, null);
}
@Test
public void testStartSectionPremature() throws Exception {
thrown.expect(IllegalStateException.class);
writer.startSection(ObjectType.SITE);
}
@Test
public void testAddLinkPremature() throws Exception {
thrown.expect(IllegalStateException.class);
writer.addLink(new DocId(""), null);
}
@Test
public void testAddLinkNullDocId() throws Exception {
writer.start(new DocId(""), ObjectType.SITE, null);
writer.startSection(ObjectType.SITE);
thrown.expect(NullPointerException.class);
writer.addLink(null, null);
}
@Test
public void testFinishPremature() throws Exception {
thrown.expect(IllegalStateException.class);
writer.finish();
}
@Test
public void testFinishNoSections() throws Exception {
final String golden = "<!DOCTYPE html>\n"
+ "<html><head><title>Site a</title></head>"
+ "<body><h1>Site a</h1></body></html>";
writer.start(new DocId("a"), ObjectType.SITE, "");
writer.finish();
writer.close();
assertEquals(golden, new String(baos.toByteArray(), charset));
}
@Test
public void testRelativizeBaseNoScheme() throws Exception {
URI base = new URI(null, "example.com", "/", null, null);
URI uri = new URI("http://example.com/some/where/file");
assertEquals(uri, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeBaseNoAuthority() throws Exception {
URI base = new URI("http", null, "/", null, null);
URI uri = new URI("http://example.com/some/where/file");
assertEquals(uri, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeBaseDifferentScheme() throws Exception {
URI base = new URI("file", "example.com", "/", null, null);
URI uri = new URI("http://example.com/some/where/file");
assertEquals(uri, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeBaseDifferentAuthority() throws Exception {
URI base = new URI("http", "google.com", "/", null, null);
URI uri = new URI("http://example.com/some/where/file");
assertEquals(uri, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeBaseMatches() throws Exception {
URI base = new URI("http", "example.com", null, null, null);
URI uri = new URI("http://example.com/some/where/file");
URI golden = new URI(null, null, "/some/where/file", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeSimplePathChild() throws Exception {
URI base = new URI("http", "example.com", "/some/where", null, null);
URI uri = new URI("http://example.com/some/where/file");
URI golden = new URI(null, null, "where/file", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeSimplePathParent() throws Exception {
URI base = new URI("http", "example.com", "/some/where/file", null, null);
URI uri = new URI("http://example.com/some/where");
// Note that "." or "./" would not suffice, since we need "where" to not end
// with a slash.
URI golden = new URI(null, null, "../where", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeComplexPathFileBaseFolder()
throws Exception {
URI base = new URI("http", "example.com", "/some/there/", null, null);
URI uri = new URI("http://example.com/some/where/file");
URI golden = new URI(null, null, "../where/file", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeComplexPathFileBaseFile() throws Exception {
URI base = new URI("http", "example.com", "/some/there/file", null, null);
URI uri = new URI("http://example.com/some/where/file");
URI golden = new URI(null, null, "../where/file", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeComplexPathFolderBaseFolder()
throws Exception {
URI base = new URI("http", "example.com", "/some/there/", null, null);
URI uri = new URI("http://example.com/some/where/folder/");
URI golden = new URI(null, null, "../where/folder/", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeComplexPathFolderBaseFile() throws Exception {
URI base = new URI("http", "example.com", "/some/there/file", null, null);
URI uri = new URI("http://example.com/some/where/folder/");
URI golden = new URI(null, null, "../where/folder/", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeSame() throws Exception {
URI uri = new URI("http://example.com/some/where/file");
URI golden = new URI(null, null, null, null, "");
assertEquals(golden, HtmlResponseWriter.relativize(uri, uri));
}
@Test
public void testRelativizeNoMistakenScheme() throws Exception {
URI base = new URI("http", "example.com", "/", null, null);
URI uri = new URI("http://example.com/http://google.com/");
URI golden = new URI(null, null, "./http://google.com/", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeNoMistakenSchemeNoSlash() throws Exception {
URI base = new URI("http", "example.com", "/", null, null);
URI uri = new URI("http://example.com/http:");
URI golden = new URI(null, null, "./http:", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeNoMistakenSchemeSlashFirst() throws Exception {
URI base = new URI("http", "example.com", "/", null, null);
URI uri = new URI("http://example.com/http/:");
URI golden = new URI(null, null, "http/:", null, null);
assertEquals(golden, HtmlResponseWriter.relativize(base, uri));
}
@Test
public void testRelativizeSchemeImpliesAbsoluteUriAssumption()
throws Exception {
thrown.expect(URISyntaxException.class);
new URI("http", "example.com", "doesnt/start/with/a/slash", null, null);
}
}