}
@Test
public void modifiedResetWithDiff() throws Exception {
Clock clock = new Clock.Virtual();
clock.waitUntil(System.currentTimeMillis());
Revision.setClock(clock);
DocumentStore docStore = new TimingDocumentStoreWrapper(ds) {
@Override
public void dispose() {
// do not dispose yet
}
};
DocumentNodeStore ns1 = new DocumentMK.Builder()
.setDocumentStore(docStore).setClusterId(1)
.setAsyncDelay(0).clock(clock)
// use a no-op diff cache to simulate a cache miss
// when the diff is made later in the test
.setDiffCache(AmnesiaDiffCache.INSTANCE)
.getNodeStore();
NodeBuilder builder1 = ns1.getRoot().builder();
builder1.child("node");
removeMe.add(getIdFromPath("/node"));
for (int i = 0; i < DocumentMK.MANY_CHILDREN_THRESHOLD; i++) {
builder1.child("node-" + i);
removeMe.add(getIdFromPath("/node/node-" + i));
}
ns1.merge(builder1, EmptyHook.INSTANCE, CommitInfo.EMPTY);
// make sure commit is visible to other node store instance
ns1.runBackgroundOperations();
DocumentNodeStore ns2 = new DocumentMK.Builder()
.setDocumentStore(docStore).setClusterId(2)
.setAsyncDelay(0).clock(clock).getNodeStore();
NodeBuilder builder2 = ns2.getRoot().builder();
builder2.child("node").child("child-a");
removeMe.add(getIdFromPath("/node/child-a"));
ns2.merge(builder2, EmptyHook.INSTANCE, CommitInfo.EMPTY);
// wait at least _modified resolution. in reality the wait may
// not be necessary. e.g. when the clock passes the resolution boundary
// exactly at this time
clock.waitUntil(System.currentTimeMillis() +
SECONDS.toMillis(MODIFIED_IN_SECS_RESOLUTION + 1));
builder1 = ns1.getRoot().builder();
builder1.child("node").child("child-b");
removeMe.add(getIdFromPath("/node/child-b"));