package dw.xmlrpc.itest;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import dw.xmlrpc.DokuJClient;
import dw.xmlrpc.LockResult;
import dw.xmlrpc.exception.DokuException;
import dw.xmlrpc.exception.DokuPageLockedException;
@RunWith(value = Parameterized.class)
public class Test_Lock extends TestHelper {
private DokuJClient _client;
private DokuJClient _otherClient;
public Test_Lock(TestParams params) throws Exception{
_client = new DokuJClient(params.url, TestParams.user, TestParams.password);
_otherClient = new DokuJClient(params.url, TestParams.writerLogin, TestParams.writerPwd);
clean();
}
@Parameters
public static Collection<Object[]> data() {
return TestParams.data();
}
@org.junit.After
public void clean() throws Exception {
tryUnlock(_client, "ns2:p1");
tryUnlock(_client, "ns2:p2");
tryUnlock(_client, "ns2:p3");
tryUnlock(_client, "ns2:p4");
tryUnlock(_otherClient, "ns2:p1");
tryUnlock(_otherClient, "ns2:p2");
}
private void tryUnlock(DokuJClient client, String pageId) throws DokuException{
try {
client.unlock(pageId);
} catch (DokuPageLockedException e){ }
}
@org.junit.Test
public void iCanPlayWihLockToAllowYouToWriteOrNot() throws Exception{
String pageId = "ns1:start";
_client.lock(pageId);
assertPageIsLockForMe(pageId, _otherClient);
assertTrue(_client.unlock("ns1:start"));
assertPageIsUnlockForMe(pageId, _otherClient);
}
@org.junit.Test
public void iCanLockOrUnlockSeveralPagesAtOnce() throws Exception{
//1st round: lock some pages and unlock some already unlock pages
List<String> pagesToLock = new ArrayList<String>();
pagesToLock.add("ns2:p1");
pagesToLock.add("ns2:p2");
List<String> pagesToUnlock = new ArrayList<String>();
pagesToUnlock.add("ns2:p3");
pagesToUnlock.add("ns2:p4");
_client.setLocks(pagesToLock, pagesToUnlock);
assertPagesAreLockForMe(pagesToLock, _otherClient);
assertPagesAreUnlockForMe(pagesToUnlock, _otherClient);
//2nd round: lock some pages, some of which are already locked. Play with unlock too
pagesToLock = new ArrayList<String>();
pagesToLock.add("ns2:p1");
pagesToLock.add("ns2:p3");
pagesToUnlock = new ArrayList<String>();
pagesToUnlock.add("ns2:p2");
pagesToUnlock.add("ns2:p4");
_client.setLocks(pagesToLock, pagesToUnlock);
assertPagesAreLockForMe(pagesToLock, _otherClient);
assertPagesAreUnlockForMe(pagesToUnlock, _otherClient);
}
//This doesn't really test the client, but it documents Dokuwiki's behavior,
//hence it documents a non-intuitive behavior of the client
@org.junit.Test
public void iUnlockAutomaticallyWhenIWrite() throws Exception {
String pageId = "ns1:start";
String initialContent = "init";
String addedContent1 = "added1";
String addedContent2 = "added2";
//Get a known state
_client.putPage(pageId, initialContent);
assertTrue(_client.lock(pageId));
//Now I write to let Dokuwiki unlock the page
_client.appendPage(pageId, addedContent1);
//And I make sure everyone may now write
_otherClient.appendPage(pageId, addedContent2);
String currentContent = _client.getPage(pageId);
assertEquals(initialContent + addedContent1 + addedContent2, currentContent);
}
@org.junit.Test
public void lockResult() throws Exception {
Set<String> emptySet = new HashSet<String>();
//1st round: lock some pages and unlock some already unlocked pages
List<String> pagesToLock = new ArrayList<String>();
pagesToLock.add("ns2:p1");
pagesToLock.add("ns2:p2");
List<String> pagesToUnlock = new ArrayList<String>();
pagesToUnlock.add("ns2:p3");
pagesToUnlock.add("ns2:p4");
LockResult expected = new LockResult(new HashSet<String>(pagesToLock), emptySet, emptySet, new HashSet<String>(pagesToUnlock));
LockResult actual = _client.setLocks(pagesToLock, pagesToUnlock);
assertEquals(expected, actual);
//2nd round: lock some pages, some of which are already locked. Play with unlock too
pagesToLock = new ArrayList<String>();
pagesToLock.add("ns2:p1");
pagesToLock.add("ns2:p3");
pagesToUnlock = new ArrayList<String>();
pagesToUnlock.add("ns2:p2");
pagesToUnlock.add("ns2:p4");
Set<String> locked = new HashSet<String>();
locked.add("ns2:p1");
locked.add("ns2:p3");
Set<String> unlocked = new HashSet<String>();
unlocked.add("ns2:p2");
Set<String> failedUnlock = new HashSet<String>();
failedUnlock.add("ns2:p4");
expected = new LockResult(locked, emptySet, unlocked, failedUnlock);
actual = _client.setLocks(pagesToLock, pagesToUnlock);
assertEquals(expected, actual);
}
@org.junit.Test
public void getFailedLockedAndUnlockedPages() throws Exception {
Set<String> emptySet = new HashSet<String>();
_otherClient.lock("ns2:p1");
_otherClient.lock("ns2:p2");
List<String> pagesToLock = new ArrayList<String>();
pagesToLock.add("ns2:p1");
List<String> pagesToUnlock = new ArrayList<String>();
pagesToUnlock.add("ns2:p2");
LockResult expected = new LockResult(emptySet, new HashSet<String>(pagesToLock), emptySet, new HashSet<String>(pagesToUnlock));
LockResult actual = _client.setLocks(pagesToLock, pagesToUnlock);
assertEquals(expected, actual);
}
}