/******************************************************************************* * Copyright (C) 2013 Robin Stocker <robin@nibor.org> * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.eclipse.egit.core.internal.storage; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import org.eclipse.core.resources.IStorage; import org.eclipse.egit.core.test.GitTestCase; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.storage.file.FileRepositoryBuilder; import org.eclipse.jgit.util.IO; import org.junit.After; import org.junit.Before; import org.junit.Test; public class IndexFileRevisionTest extends GitTestCase { private Repository repository; @Override @Before public void setUp() throws Exception { super.setUp(); repository = FileRepositoryBuilder.create(gitDir); repository.create(); } @Override @After public void tearDown() throws Exception { repository.close(); super.tearDown(); } @Test public void stage0WithoutOtherStages() throws Exception { buildIndex(entry("file", 0, "data")); IndexFileRevision revision = new IndexFileRevision(repository, "file"); assertEquals("data", readContents(revision)); } @Test public void stage1WithOtherStages() throws Exception { buildIndex(entry("other", 0, ""), entry("file", 1, "right"), entry("file", 2, "wrong")); IndexFileRevision revision = new IndexFileRevision(repository, "file", 1); assertEquals("right", readContents(revision)); } @Test public void stage3With2Missing() throws Exception { buildIndex(entry("file", 1, "wrong"), entry("file", 3, "right")); IndexFileRevision revision = new IndexFileRevision(repository, "file", 3); assertEquals("right", readContents(revision)); } @Test public void missingStage() throws Exception { buildIndex(entry("file", 1, "wrong"), entry("file", 2, "wrong")); IndexFileRevision revision = new IndexFileRevision(repository, "file", 3); assertEquals("", readContents(revision)); } @Test public void missingEntry() throws Exception { buildIndex(entry("other", 0, "wrong")); IndexFileRevision revision = new IndexFileRevision(repository, "file", 0); assertEquals("", readContents(revision)); } @Test // This is to maintain compatibility with the current behavior public void shouldUseFirstWhenNotSpecified() throws Exception { buildIndex(entry("file", 1, "right")); IndexFileRevision revision = new IndexFileRevision(repository, "file"); assertEquals("right", readContents(revision)); } private void buildIndex(DirCacheEntry... entries) throws IOException { DirCache dirCache = repository.lockDirCache(); DirCacheBuilder builder = dirCache.builder(); try { for (DirCacheEntry entry : entries) builder.add(entry); builder.commit(); } finally { dirCache.unlock(); } } private DirCacheEntry entry(String path, int stage, String data) throws IOException { DirCacheEntry entry = new DirCacheEntry(path, stage); entry.setFileMode(FileMode.REGULAR_FILE); try (ObjectInserter inserter = repository.newObjectInserter()) { ObjectId blob = inserter.insert(Constants.OBJ_BLOB, data.getBytes("UTF-8")); entry.setObjectId(blob); inserter.flush(); } return entry; } private static String readContents(IndexFileRevision revision) throws Exception { IStorage storage = revision.getStorage(null); InputStream in = storage.getContents(); ByteBuffer buffer = IO.readWholeStream(in, 10); return new String(buffer.array(), 0, buffer.limit(), "UTF-8"); } }