blob: 7eefa33a2c2cdc2a8517ab1456632fa774420a60 [file] [log] [blame]
// Copyright 2011 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;
import static org.junit.Assert.assertEquals;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/** Tests for {@link GsaFeedFileMaker}. */
public class GsaFeedFileMakerTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
private DocIdEncoder encoder = new MockDocIdCodec();
private AclTransform aclTransform
= new AclTransform(Arrays.<AclTransform.Rule>asList());
private GsaFeedFileMaker meker = new GsaFeedFileMaker(encoder, aclTransform);
@Test
public void testEmptyMetadataAndUrl() {
String golden =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE gsafeed PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<gsafeed>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<header>\n"
+ "<datasource>t3sT</datasource>\n"
+ "<feedtype>metadata-and-url</feedtype>\n"
+ "</header>\n"
+ "<group/>\n"
+ "</gsafeed>\n";
String xml = meker.makeMetadataAndUrlXml("t3sT",
new ArrayList<DocIdPusher.Record>());
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testSimpleMetadataAndUrl() {
String golden =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE gsafeed PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<gsafeed>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<header>\n"
+ "<datasource>t3sT</datasource>\n"
+ "<feedtype>metadata-and-url</feedtype>\n"
+ "</header>\n"
+ "<group>\n"
+ "<record mimetype=\"text/plain\""
+ " url=\"http://localhost/E11\"/>\n"
+ "<record mimetype=\"text/plain\""
+ " url=\"http://localhost/elefenta\"/>\n"
+ "</group>\n"
+ "</gsafeed>\n";
ArrayList<DocIdPusher.Record> ids = new ArrayList<DocIdPusher.Record>();
ids.add(new DocIdPusher.Record.Builder(new DocId("E11")).build());
ids.add(new DocIdPusher.Record.Builder(new DocId("elefenta")).build());
String xml = meker.makeMetadataAndUrlXml("t3sT", ids);
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testPushAttributesMetadataAndUrl()
throws java.net.URISyntaxException {
String golden =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE gsafeed PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<gsafeed>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<header>\n"
+ "<datasource>t3sT</datasource>\n"
+ "<feedtype>metadata-and-url</feedtype>\n"
+ "</header>\n"
+ "<group>\n"
+ "<record displayurl=\"http://f000nkey.net\" mimetype=\"text/plain\""
+ " url=\"http://localhost/E11\"/>\n"
+ "<record crawl-immediately=\"true\""
+ " displayurl=\"http://yankee.doodle.com\""
+ " last-modified=\"Thu, 01 Jan 1970 00:00:00 +0000\""
+ " mimetype=\"text/plain\" url=\"http://localhost/elefenta\"/>\n"
+ "<record displayurl=\"http://google.com/news\""
+ " last-modified=\"Fri, 02 Jan 1970 00:00:00 +0000\""
+ " mimetype=\"text/plain\" url=\"http://localhost/gone\"/>\n"
+ "<record crawl-immediately=\"true\" crawl-once=\"true\""
+ " lock=\"true\" mimetype=\"text/plain\""
+ " url=\"http://localhost/flagson\"/>\n"
+ "<record action=\"delete\" mimetype=\"text/plain\""
+ " url=\"http://localhost/deleted\"/>\n"
+ "</group>\n"
+ "</gsafeed>\n";
ArrayList<DocIdPusher.Record> ids = new ArrayList<DocIdPusher.Record>();
DocIdPusher.Record.Builder attrBuilder
= new DocIdPusher.Record.Builder(new DocId("E11"));
attrBuilder.setResultLink(new URI("http://f000nkey.net"));
ids.add(attrBuilder.build());
attrBuilder.setResultLink(new URI("http://yankee.doodle.com"));
attrBuilder.setLastModified(new Date(0));
attrBuilder.setCrawlImmediately(true);
attrBuilder.setDocId(new DocId("elefenta"));
ids.add(attrBuilder.build());
attrBuilder.setResultLink(new URI("http://google.com/news"));
attrBuilder.setLastModified(new Date(1000 * 60 * 60 * 24));
attrBuilder.setCrawlImmediately(false);
attrBuilder.setDocId(new DocId("gone"));
ids.add(attrBuilder.build());
ids.add(new DocIdPusher.Record.Builder(new DocId("flagson"))
.setLock(true).setCrawlImmediately(true).setCrawlOnce(true).build());
ids.add(new DocIdPusher.Record.Builder(new DocId("deleted"))
.setDeleteFromIndex(true).build());
String xml = meker.makeMetadataAndUrlXml("t3sT", ids);
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testNamedResourcesMetadataAndUrl() {
String golden
= "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE gsafeed PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<gsafeed>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<header>\n"
+ "<datasource>test</datasource>\n"
+ "<feedtype>metadata-and-url</feedtype>\n"
+ "</header>\n"
+ "<group>\n"
+ "<acl url=\"http://localhost/docid1\"/>\n"
+ "<acl inheritance-type=\"and-both-permit\""
+ " url=\"http://localhost/docid2\">\n"
+ "<principal access=\"permit\" scope=\"user\">pu1</principal>\n"
+ "<principal access=\"permit\" scope=\"user\">pu2</principal>\n"
+ "<principal access=\"permit\" scope=\"group\">pg1</principal>\n"
+ "<principal access=\"permit\" scope=\"group\">pg2&lt;</principal>\n"
+ "<principal access=\"deny\" scope=\"user\">du1</principal>\n"
+ "<principal access=\"deny\" scope=\"user\">du2</principal>\n"
+ "<principal access=\"deny\" scope=\"group\">dg1</principal>\n"
+ "<principal access=\"deny\" scope=\"group\">dg2&amp;</principal>\n"
+ "</acl>\n"
+ "<acl inherit-from=\"http://localhost/doc%20id4\""
+ " url=\"http://localhost/doc%20id3%22&amp;%3C\"/>\n"
+ "<acl url=\"http://localhost/docid5\">\n"
+ "<principal access=\"permit\""
+ " case-sensitivity-type=\"everything-case-insensitive\""
+ " namespace=\"my_namespace\" scope=\"user\">pu1</principal>\n"
+ "</acl>\n"
+ "</group>\n"
+ "</gsafeed>\n";
List<DocIdSender.AclItem> acls = new ArrayList<DocIdSender.AclItem>();
acls.add(new DocIdSender.AclItem(new DocId("docid1"), new Acl.Builder()
.build()));
acls.add(new DocIdSender.AclItem(new DocId("docid2"), new Acl.Builder()
.setInheritanceType(Acl.InheritanceType.AND_BOTH_PERMIT)
.setPermitUsers(
Arrays.asList(new UserPrincipal("pu1"), new UserPrincipal("pu2")))
.setDenyUsers(
Arrays.asList(new UserPrincipal("du1"), new UserPrincipal("du2")))
.setPermitGroups(
Arrays.asList(new GroupPrincipal("pg1"),
new GroupPrincipal("pg2<")))
.setDenyGroups(
Arrays.asList(new GroupPrincipal("dg1"),
new GroupPrincipal("dg2&")))
.build()));
acls.add(new DocIdSender.AclItem(new DocId("doc id3\"&<"), new Acl.Builder()
.setInheritFrom(new DocId("doc id4"))
.build()));
acls.add(new DocIdSender.AclItem(new DocId("docid5"), new Acl.Builder()
.setEverythingCaseInsensitive()
.setPermitUsers(Arrays.asList(new UserPrincipal("pu1", "my_namespace")))
.build()));
String xml = meker.makeMetadataAndUrlXml("test", acls);
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testNamedResourcesAclTransform() {
String golden
= "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE gsafeed PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<gsafeed>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<header>\n"
+ "<datasource>test</datasource>\n"
+ "<feedtype>metadata-and-url</feedtype>\n"
+ "</header>\n"
+ "<group>\n"
+ "<acl url=\"http://localhost/docid2\">\n"
+ "<principal access=\"permit\" scope=\"user\">pu2</principal>\n"
+ "</acl>\n"
+ "</group>\n"
+ "</gsafeed>\n";
List<DocIdSender.AclItem> acls = new ArrayList<DocIdSender.AclItem>();
acls.add(new DocIdSender.AclItem(new DocId("docid2"), new Acl.Builder()
.setPermitUsers(
Arrays.asList(new UserPrincipal("pu1")))
.build()));
aclTransform = new AclTransform(Arrays.asList(new AclTransform.Rule(
new AclTransform.MatchData(null, null, null, null),
new AclTransform.MatchData(null, "pu2", null, null))));
meker = new GsaFeedFileMaker(encoder, aclTransform);
String xml = meker.makeMetadataAndUrlXml("test", acls);
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testUnsupportedDocIdSenderItemMetadataAndUrl() {
class UnsupportedItem implements DocIdSender.Item {};
List<UnsupportedItem> items = new ArrayList<UnsupportedItem>();
items.add(new UnsupportedItem());
thrown.expect(IllegalArgumentException.class);
meker.makeMetadataAndUrlXml("test", items);
}
@Test
public void test614RecordWorkaround() {
String golden
= "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE gsafeed PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<gsafeed>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<header>\n"
+ "<datasource>test</datasource>\n"
+ "<feedtype>metadata-and-url</feedtype>\n"
+ "</header>\n"
+ "<group>\n"
+ "<record mimetype=\"text/plain\""
+ " url=\"http://localhost/docid1\"> </record>\n"
+ "</group>\n"
+ "</gsafeed>\n";
List<DocIdPusher.Record> records = new ArrayList<DocIdPusher.Record>();
records.add(new DocIdPusher.Record.Builder(new DocId("docid1")).build());
meker = new GsaFeedFileMaker(encoder, aclTransform,
true /* 6.14 workaround */, false);
String xml = meker.makeMetadataAndUrlXml("test", records);
xml = xml.replace("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void test70RecordWorkaround() {
String golden
= "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE gsafeed PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<gsafeed>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<header>\n"
+ "<datasource>test</datasource>\n"
+ "<feedtype>metadata-and-url</feedtype>\n"
+ "</header>\n"
+ "<group>\n"
+ "<record authmethod=\"httpsso\""
+ " mimetype=\"text/plain\" url=\"http://localhost/docid1\"/>\n"
+ "</group>\n"
+ "</gsafeed>\n";
List<DocIdPusher.Record> records = new ArrayList<DocIdPusher.Record>();
records.add(new DocIdPusher.Record.Builder(new DocId("docid1")).build());
meker = new GsaFeedFileMaker(encoder, aclTransform, false,
true /* 7.0 workaround */);
String xml = meker.makeMetadataAndUrlXml("test", records);
xml = xml.replace("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testAclFragmentMetadataAndUrl() {
String golden
= "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE gsafeed PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<gsafeed>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<header>\n"
+ "<datasource>test</datasource>\n"
+ "<feedtype>metadata-and-url</feedtype>\n"
+ "</header>\n"
+ "<group>\n"
+ "<acl inherit-from=\"http://localhost/docid2?generated\""
+ " url=\"http://localhost/docid1?generated\"/>\n"
+ "</group>\n"
+ "</gsafeed>\n";
DocIdSender.AclItem acl
= new DocIdSender.AclItem(new DocId("docid1"), "generated",
new Acl.Builder()
.setInheritFrom(new DocId("docid2"), "generated").build());
String xml = meker.makeMetadataAndUrlXml("test", Arrays.asList(acl));
xml = xml.replace("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testEmptyGroupDefinitions() {
String golden =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE xmlgroups PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<xmlgroups>\n"
+ "<!--GSA EasyConnector-->\n"
+ "</xmlgroups>\n";
String xml = meker.makeGroupDefinitionsXml(
new TreeMap<GroupPrincipal, List<Principal>>().entrySet(), true);
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testSimpleGroupDefinitions() {
String golden =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE xmlgroups PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<xmlgroups>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<membership>\n"
+ "<principal namespace=\"Default\" scope=\"GROUP\">immortals</principal>\n"
+ "<members>\n"
+ "<principal"
+ " case-sensitivity-type=\"EVERYTHING_CASE_INSENSITIVE\""
+ " namespace=\"Default\""
+ " scope=\"USER\""
+ ">MacLeod\\Duncan</principal>\n"
+ "</members>\n"
+ "</membership>\n"
+ "</xmlgroups>\n";
Map<GroupPrincipal, List<Principal>> groupDefs
= new TreeMap<GroupPrincipal, List<Principal>>();
List<Principal> members = new ArrayList<Principal>();
members.add(new UserPrincipal("MacLeod\\Duncan"));
groupDefs.put(new GroupPrincipal("immortals"), members);
String xml = meker.makeGroupDefinitionsXml(groupDefs.entrySet(), false);
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testMultipleGroupDefinitions() {
String golden =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE xmlgroups PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<xmlgroups>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<membership>\n"
+ "<principal namespace=\"Default\" scope=\"GROUP\">immortals</principal>\n"
+ "<members>\n"
+ "<principal"
+ " case-sensitivity-type=\"EVERYTHING_CASE_INSENSITIVE\""
+ " namespace=\"Default\""
+ " scope=\"USER\""
+ ">MacLeod\\Duncan</principal>\n"
+ "<principal"
+ " case-sensitivity-type=\"EVERYTHING_CASE_INSENSITIVE\""
+ " namespace=\"Default\""
+ " scope=\"USER\""
+ ">Methos</principal>\n"
+ "</members>\n"
+ "</membership>\n"
+ "<membership>\n"
+ "<principal namespace=\"Default\" scope=\"GROUP\">sounds</principal>\n"
+ "<members>\n"
+ "<principal"
+ " case-sensitivity-type=\"EVERYTHING_CASE_INSENSITIVE\""
+ " namespace=\"Default\""
+ " scope=\"USER\""
+ ">plump</principal>\n"
+ "<principal"
+ " case-sensitivity-type=\"EVERYTHING_CASE_INSENSITIVE\""
+ " namespace=\"Default\""
+ " scope=\"USER\""
+ ">splat</principal>\n"
+ "</members>\n"
+ "</membership>\n"
+ "</xmlgroups>\n";
Map<GroupPrincipal, List<Principal>> groupDefs
= new TreeMap<GroupPrincipal, List<Principal>>();
List<Principal> members = new ArrayList<Principal>();
members.add(new UserPrincipal("MacLeod\\Duncan"));
members.add(new UserPrincipal("Methos"));
groupDefs.put(new GroupPrincipal("immortals"), members);
List<Principal> members2 = new ArrayList<Principal>();
members2.add(new UserPrincipal("splat"));
members2.add(new UserPrincipal("plump"));
groupDefs.put(new GroupPrincipal("sounds"), members2);
String xml = meker.makeGroupDefinitionsXml(groupDefs.entrySet(), false);
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testNestedGroupDefinitions() {
String golden =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE xmlgroups PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<xmlgroups>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<membership>\n"
+ "<principal namespace=\"Default\" scope=\"GROUP\">immortals</principal>\n"
+ "<members>\n"
+ "<principal"
+ " case-sensitivity-type=\"EVERYTHING_CASE_SENSITIVE\""
+ " namespace=\"3vil\""
+ " scope=\"GROUP\""
+ ">badguys</principal>\n"
+ "<principal"
+ " case-sensitivity-type=\"EVERYTHING_CASE_SENSITIVE\""
+ " namespace=\"goodguys\""
+ " scope=\"USER\""
+ ">MacLeod\\Duncan</principal>\n"
+ "</members>\n"
+ "</membership>\n"
+ "</xmlgroups>\n";
Map<GroupPrincipal, List<Principal>> groupDefs
= new TreeMap<GroupPrincipal, List<Principal>>();
List<Principal> members = new ArrayList<Principal>();
members.add(new UserPrincipal("MacLeod\\Duncan", "goodguys"));
members.add(new GroupPrincipal("badguys", "3vil"));
groupDefs.put(new GroupPrincipal("immortals"), members);
String xml = meker.makeGroupDefinitionsXml(groupDefs.entrySet(), true);
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
@Test
public void testGroupDefinitionsAclTransform() {
String golden =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+ "<!DOCTYPE xmlgroups PUBLIC \"-//Google//DTD GSA Feeds//EN\" \"\">\n"
+ "<xmlgroups>\n"
+ "<!--GSA EasyConnector-->\n"
+ "<membership>\n"
+ "<principal namespace=\"Default\" scope=\"GROUP\">Clan MacLeod"
+ "</principal>\n"
+ "<members>\n"
+ "<principal case-sensitivity-type=\"EVERYTHING_CASE_INSENSITIVE\""
+ " namespace=\"Default\" scope=\"USER\">MacLeod\\Connor</principal>\n"
+ "</members>\n"
+ "</membership>\n"
+ "</xmlgroups>\n";
Map<GroupPrincipal, List<Principal>> groupDefs
= new TreeMap<GroupPrincipal, List<Principal>>();
List<Principal> members = new ArrayList<Principal>();
members.add(new UserPrincipal("MacLeod\\Duncan"));
groupDefs.put(new GroupPrincipal("immortals"), members);
aclTransform = new AclTransform(Arrays.asList(
new AclTransform.Rule(
new AclTransform.MatchData(null, "Duncan", null, null),
new AclTransform.MatchData(null, "Connor", null, null)),
new AclTransform.Rule(
new AclTransform.MatchData(null, "immortals", null, null),
new AclTransform.MatchData(null, "Clan MacLeod", null, null))));
meker = new GsaFeedFileMaker(encoder, aclTransform);
String xml = meker.makeGroupDefinitionsXml(groupDefs.entrySet(), false);
xml = xml.replaceAll("\r\n", "\n");
assertEquals(golden, xml);
}
}