package org.handwerkszeug.riak.transport.rest;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.handwerkszeug.riak.Hosts;
import org.handwerkszeug.riak.ease.RiakTest;
import org.handwerkszeug.riak.model.DefaultRiakObject;
import org.handwerkszeug.riak.model.Link;
import org.handwerkszeug.riak.model.Location;
import org.handwerkszeug.riak.model.RiakObject;
import org.junit.Test;
/**
* @author taichi
*/
public class RestRiakTest extends RiakTest<RestRiakOperations, RestRiak> {
@Override
protected RestRiak newTarget() {
return RestRiak.create(Hosts.RIAK_HOST);
}
@Test
public void testLinkWalking() throws Exception {
// A -> B -> D
// A -> C -> D
String bucket = "testWalk";
RiakObject<byte[]> D = createData(bucket, "D", new ArrayList<Link>());
put(D);
List<Link> c2d = new ArrayList<Link>();
c2d.add(new Link(D.getLocation(), "2d"));
RiakObject<byte[]> C = createData(bucket, "C", c2d);
put(C);
List<Link> b2d = new ArrayList<Link>();
b2d.add(new Link(D.getLocation(), "2d"));
RiakObject<byte[]> B = createData(bucket, "B", b2d);
put(B);
List<Link> a = new ArrayList<Link>();
a.add(new Link(C.getLocation(), "a2c"));
a.add(new Link(B.getLocation(), "a2b"));
RiakObject<byte[]> A = createData(bucket, "A", a);
put(A);
List<List<byte[]>> expected = new ArrayList<List<byte[]>>();
List<byte[]> phase1 = new ArrayList<byte[]>();
phase1.add(B.getContent());
phase1.add(C.getContent());
expected.add(phase1);
List<byte[]> phase2 = new ArrayList<byte[]>();
phase2.add(D.getContent());
expected.add(phase2);
try {
List<List<RiakObject<byte[]>>> actuals = this.target
.walk(A.getLocation()).step(LinkCondition.KEEP_ANY)
.step(LinkCondition.ANY).execute();
assertEquals(expected.size(), actuals.size());
assertROEquals(phase1, actuals.get(0));
assertROEquals(phase2, actuals.get(1));
} finally {
// delete
delete(D);
delete(C);
delete(B);
delete(A);
}
}
void assertROEquals(List<byte[]> expected, List<RiakObject<byte[]>> actuals) {
List<String> expString = toString(expected);
List<String> actString = toStringRO(actuals);
Collections.sort(expString);
Collections.sort(actString);
assertEquals(expString, actString);
}
List<String> toString(List<byte[]> from) {
List<String> result = new ArrayList<String>();
for (byte[] ary : from) {
result.add(new String(ary));
}
return result;
}
List<String> toStringRO(List<RiakObject<byte[]>> from) {
List<String> result = new ArrayList<String>();
for (RiakObject<byte[]> ro : from) {
result.add(new String(ro.getContent()));
}
return result;
}
RiakObject<byte[]> createData(String bucket, String key, List<Link> links)
throws Exception {
Location location = new Location(bucket, key);
DefaultRiakObject ro = new DefaultRiakObject(location);
ro.setLinks(links);
String data = bucket + key + new Date();
ro.setContent(data.getBytes());
return ro;
}
void put(RiakObject<byte[]> ro) throws Exception {
this.target.put(ro).execute();
}
void delete(RiakObject<byte[]> ro) throws Exception {
this.target.delete(ro.getLocation()).execute();
}
}