| /******************************************************************************* |
| * 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)); |
| } |
| } |