blob: 14a39e1a69846c156dd1e72c319f54e40cbafa56 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.tests.internal.localstore;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.localstore.Bucket.Entry;
import org.eclipse.core.internal.localstore.HistoryBucket;
import org.eclipse.core.internal.utils.UniversalUniqueIdentifier;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.resources.ResourceTest;
public class HistoryBucketTest extends ResourceTest {
public static Test suite() {
return new TestSuite(HistoryBucketTest.class);
}
public HistoryBucketTest(String name) {
super(name);
}
/**
* Ensures that if another entry having exactly the same UUID is added,
* the original one is not replaced.
*/
public void testDuplicates() {
IPath baseLocation = getRandomLocation();
try {
HistoryBucket index1 = new HistoryBucket();
IPath location1 = baseLocation.append("location1");
try {
index1.load("foo", location1.toFile());
} catch (CoreException e) {
fail("1.0", e);
}
IPath path = new Path("/foo/bar");
UniversalUniqueIdentifier uuid = new UniversalUniqueIdentifier();
long lastModified = (long) (Math.random() * Long.MAX_VALUE);
index1.addBlob(path, uuid, lastModified);
assertEquals("2.0", 1, index1.getEntryCount());
index1.addBlob(path, uuid, lastModified);
assertEquals("3.0", 1, index1.getEntryCount());
HistoryBucket.HistoryEntry entry = index1.getEntry(path);
assertNotNull("3.1", entry);
assertEquals("3.2", path, entry.getPath());
assertEquals("3.3", 1, entry.getOccurrences());
assertEquals("3.4", uuid, entry.getUUID(0));
assertEquals("3.5", lastModified, entry.getTimestamp(0));
} finally {
ensureDoesNotExistInFileSystem(baseLocation.toFile());
}
}
public void testPersistence() {
IPath baseLocation = getRandomLocation();
try {
HistoryBucket index1 = new HistoryBucket();
IPath location = baseLocation.append("location");
try {
index1.load("foo", location.toFile());
} catch (CoreException e) {
fail("1.0", e);
}
assertEquals("1.1", 0, index1.getEntryCount());
IPath path = new Path("/foo/bar");
UniversalUniqueIdentifier uuid1 = new UniversalUniqueIdentifier();
long lastModified1 = (long) (Math.random() * Long.MAX_VALUE);
index1.addBlob(path, uuid1, lastModified1);
assertEquals("2.0", 1, index1.getEntryCount());
try {
index1.save();
} catch (CoreException e) {
fail("2.1", e);
}
HistoryBucket index2 = new HistoryBucket();
try {
index2.load("foo", location.toFile(), false);
} catch (CoreException e) {
fail("3.0", e);
}
assertEquals("3.1", 1, index1.getEntryCount());
HistoryBucket.HistoryEntry entry = index1.getEntry(path);
assertNotNull("3.2", entry);
assertEquals("3.3", path, entry.getPath());
assertEquals("3.4", 1, entry.getOccurrences());
assertEquals("3.5", uuid1, entry.getUUID(0));
assertEquals("3.6", lastModified1, entry.getTimestamp(0));
UniversalUniqueIdentifier uuid2 = new UniversalUniqueIdentifier();
long lastModified2 = (long) Math.abs((Math.random() * Long.MAX_VALUE));
index2.addBlob(path, uuid2, lastModified2);
try {
index2.save();
} catch (CoreException e) {
fail("4.0", e);
}
try {
index1.load("foo", location.toFile(), true);
} catch (CoreException e) {
fail("4.1", e);
}
assertEquals("4.2", 1, index1.getEntryCount());
entry = index1.getEntry(path);
assertNotNull("4.3", entry);
assertEquals("4.4", path, entry.getPath());
assertEquals("4.5", 2, entry.getOccurrences());
// test deletion
try {
index1.accept(new HistoryBucket.Visitor() {
@Override
public int visit(Entry fileEntry) {
fileEntry.delete();
return CONTINUE;
}
}, path, 0);
} catch (CoreException e) {
fail("5.0", e);
}
entry = index1.getEntry(path);
assertNull("5.1", entry);
try {
index2.load("foo", location.toFile(), true);
} catch (CoreException e) {
fail("5.2", e);
}
entry = index2.getEntry(path);
assertNull("5.3", entry);
} finally {
ensureDoesNotExistInFileSystem(baseLocation.toFile());
}
}
/**
* This test does not cause any data to be written.
*/
public void testSort() {
HistoryBucket index = new HistoryBucket();
IPath path = new Path("/foo");
assertNull("1.0", index.getEntry(path));
UniversalUniqueIdentifier uuid1 = new UniversalUniqueIdentifier();
long timestamp1 = 10;
index.addBlob(path, uuid1, timestamp1);
HistoryBucket.HistoryEntry entry = index.getEntry(path);
assertNotNull("2.0", entry);
assertEquals("2.1", 1, entry.getOccurrences());
assertEquals("2.2", uuid1, entry.getUUID(0));
assertEquals("2.3", timestamp1, entry.getTimestamp(0));
// adds a new state with a more recent timestamp
UniversalUniqueIdentifier uuid2 = new UniversalUniqueIdentifier();
long timestamp2 = timestamp1 + 1;
index.addBlob(path, uuid2, timestamp2);
entry = index.getEntry(path);
assertNotNull("3.0", entry);
// since it is newer, should appear first
assertEquals("3.1", 2, entry.getOccurrences());
assertEquals("3.2", uuid2, entry.getUUID(0));
assertEquals("3.3", timestamp2, entry.getTimestamp(0));
assertEquals("3.4", uuid1, entry.getUUID(1));
assertEquals("3.5", timestamp1, entry.getTimestamp(1));
// adds a 3rd state, with the same timestamp as the 1st
UniversalUniqueIdentifier uuid3 = new UniversalUniqueIdentifier();
long timestamp3 = timestamp1;
index.addBlob(path, uuid3, timestamp3);
entry = index.getEntry(path);
assertNotNull("4.0", entry);
// its UUID was created later so it will be considered more recent
// even if it has the same timestamp
assertEquals("4.1", 3, entry.getOccurrences());
assertEquals("4.2", uuid2, entry.getUUID(0));
assertEquals("4.3", timestamp2, entry.getTimestamp(0));
assertEquals("4.4", uuid3, entry.getUUID(1));
assertEquals("4.5", timestamp3, entry.getTimestamp(1));
assertEquals("4.6", uuid1, entry.getUUID(2));
assertEquals("4.7", timestamp1, entry.getTimestamp(2));
}
}