// Copyright (C) 2006-2009 Google Inc.
//
// 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.connector.mock;
import junit.framework.TestCase;
/**
* Unit tests for Mock Repository
*/
public class MockRepositoryTest extends TestCase {
/**
* Simple creation sanity test
*/
public void testSimpleRepository() {
MockRepositoryEventList mrel =
new MockRepositoryEventList("MockRepositoryEventLog1.txt");
MockRepository r = new MockRepository(mrel);
MockRepositoryDateTime dateTime = new MockRepositoryDateTime(60);
assertTrue(r.getCurrentTime().compareTo(dateTime) == 0);
}
/**
* Test advancing repository time
*/
public void testRepositoryTimes() {
// TODO(ziff): change this file access to use TestUtil
MockRepositoryEventList mrel =
new MockRepositoryEventList("MockRepositoryEventLog1.txt");
MockRepository r = new MockRepository(mrel, new MockRepositoryDateTime(0));
assertEquals(0, r.getStore().size());
r.setTime(new MockRepositoryDateTime(20));
assertEquals(2, r.getStore().size());
r.setTime(new MockRepositoryDateTime(39));
assertEquals(3, r.getStore().size());
r.setTime(new MockRepositoryDateTime(40));
assertEquals(2, r.getStore().size());
r.setTime(new MockRepositoryDateTime(41));
assertEquals(2, r.getStore().size());
r.setTime(new MockRepositoryDateTime(100));
assertEquals(4, r.getStore().size());
}
/**
* Make sure documents have exactly the attributes they should
*/
public void testDocumentIntegrity() {
MockRepositoryEventList mrel =
new MockRepositoryEventList("MockRepositoryEventLog3.txt");
MockRepository r = new MockRepository(mrel);
MockRepositoryDocument doc = r.getStore().getDocByID("doc1");
System.out.println();
int counter = 0;
for (MockRepositoryProperty property : doc.getProplist()) {
System.out.print(property.toString());
System.out.println();
counter++;
}
assertEquals(2, counter);
}
/**
* Test documents for ACL properties.
*/
public void testDocumentAcl() {
MockRepositoryEventList mrel =
new MockRepositoryEventList("MockRepositoryEventLogAcl.txt");
MockRepository r = new MockRepository(mrel);
// Get each document by ID and check it's ACL property list.
// No ACL
MockRepositoryDocument doc = r.getStore().getDocByID("no_acl");
MockRepositoryPropertyList proplist = doc.getProplist();
MockRepositoryProperty aclProp = proplist.getProperty("acl");
assertNull("no ACL", aclProp);
// ACL=[joe,mary,admin]
doc = r.getStore().getDocByID("user_acl");
proplist = doc.getProplist();
aclProp = proplist.getProperty("acl");
assertTrue("is repeating", aclProp.isRepeating());
assertHasScope(MockRepositoryProperty.USER_SCOPE, "joe", aclProp);
assertHasScope(MockRepositoryProperty.USER_SCOPE, "mary", aclProp);
assertHasScope(MockRepositoryProperty.USER_SCOPE, "admin", aclProp);
// ACL=["joe=reader","mary=reader,writer","admin=owner"]
doc = r.getStore().getDocByID("user_role_acl");
proplist = doc.getProplist();
aclProp = proplist.getProperty("acl");
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "joe", "reader",
aclProp);
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "mary", "reader",
aclProp);
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "mary", "writer",
aclProp);
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "admin", "owner",
aclProp);
// ACL=["user:joe=reader","user:mary=reader,writer","user:admin=owner"]
doc = r.getStore().getDocByID("user_scoped_role_acl");
proplist = doc.getProplist();
aclProp = proplist.getProperty("acl");
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "joe", "reader",
aclProp);
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "mary", "reader",
aclProp);
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "mary", "writer",
aclProp);
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "admin", "owner",
aclProp);
// ACL=["user:joe","user:mary","group:eng"]
doc = r.getStore().getDocByID("user_group_acl");
proplist = doc.getProplist();
aclProp = proplist.getProperty("acl");
assertHasScope(MockRepositoryProperty.USER_SCOPE, "joe", aclProp);
assertHasScope(MockRepositoryProperty.USER_SCOPE, "mary", aclProp);
assertHasScope(MockRepositoryProperty.GROUP_SCOPE, "eng", aclProp);
// ACL=["user:joe=reader","user:mary=reader,writer","group:eng=reader"]
doc = r.getStore().getDocByID("user_group_role_acl");
proplist = doc.getProplist();
aclProp = proplist.getProperty("acl");
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "joe", "reader",
aclProp);
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "mary", "reader",
aclProp);
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "mary", "writer",
aclProp);
assertScopeHasRole(MockRepositoryProperty.GROUP_SCOPE, "eng", "reader",
aclProp);
// ACL=joe
doc = r.getStore().getDocByID("user_reader_acl");
proplist = doc.getProplist();
aclProp = proplist.getProperty("acl");
assertHasScope(MockRepositoryProperty.USER_SCOPE, "joe", aclProp);
// ACL="joe=owner"
doc = r.getStore().getDocByID("user_owner_acl");
proplist = doc.getProplist();
aclProp = proplist.getProperty("acl");
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "joe", "owner",
aclProp);
// ACL="user:joe=owner"
doc = r.getStore().getDocByID("user_scoped_owner_acl");
proplist = doc.getProplist();
aclProp = proplist.getProperty("acl");
assertScopeHasRole(MockRepositoryProperty.USER_SCOPE, "joe", "owner",
aclProp);
}
private void assertScopeHasRole(String scopeType, String scopeId, String role,
MockRepositoryProperty aclProp) {
String[] values = aclProp.getValues();
for (int i = 0; i < values.length; i++) {
String aclEntry = values[i];
// Extract the scope type and compare.
int scopeTokPos = aclEntry.indexOf(MockRepositoryProperty.SCOPE_TYPE_SEP);
if (scopeTokPos != -1) {
if (scopeType.equals(aclEntry.substring(0, scopeTokPos))) {
aclEntry = aclEntry.substring(scopeTokPos + 1);
} else {
continue;
}
} else {
// If a scope type is not specified in the aclEntry then it's safe to
// assume a scope type of "user".
if (!MockRepositoryProperty.USER_SCOPE.equals(scopeType)) {
continue;
}
}
// Don't assume any default roles so separate the scope identity from the
// role list and check.
int roleTokPos = aclEntry.indexOf(MockRepositoryProperty.SCOPE_ROLE_SEP);
if (roleTokPos != -1) {
if (scopeId.equals(aclEntry.substring(0, roleTokPos))) {
// Assert the role list contains the given role
String rolesStr = aclEntry.substring(roleTokPos + 1);
String[] roles = rolesStr.split(",", 0);
for (int j = 0; j < roles.length; j++) {
if (role.equals(roles[j])) {
return;
}
}
}
}
}
fail("aclProp does not contain scope (" + scopeType + ":" + scopeId
+ ") with role=" + role);
}
private void assertHasScope(String scopeType, String scopeId,
MockRepositoryProperty aclProp) {
String[] values = aclProp.getValues();
for (int i = 0; i < values.length; i++) {
String aclEntry = values[i];
// Extract the scope type and compare.
int scopeTokPos = aclEntry.indexOf(MockRepositoryProperty.SCOPE_TYPE_SEP);
if (scopeTokPos != -1) {
if (scopeType.equals(aclEntry.substring(0, scopeTokPos))) {
aclEntry = aclEntry.substring(scopeTokPos + 1);
} else {
continue;
}
} else {
// If a scope type is not specified in the aclEntry then it's safe to
// assume a scope type of "user".
if (!MockRepositoryProperty.USER_SCOPE.equals(scopeType)) {
continue;
}
}
int roleTokPos = aclEntry.indexOf(MockRepositoryProperty.SCOPE_ROLE_SEP);
if (roleTokPos != -1) {
if (scopeId.equals(aclEntry.substring(0, roleTokPos))) {
return;
}
} else {
if (scopeId.equals(aclEntry)) {
return;
}
}
}
fail("aclProp does not contain scope (" + scopeType + ":" + scopeId + ")");
}
}