]> source.dussan.org Git - jgit.git/commitdiff
Don't allow DirCacheEntry with mode of 0 63/263/3
authorShawn O. Pearce <spearce@spearce.org>
Fri, 11 Sep 2009 19:33:05 +0000 (12:33 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Thu, 4 Feb 2010 03:58:20 +0000 (19:58 -0800)
A 0 file mode in a DirCacheEntry is not a valid mode.  To C git
such a value indicates the record should not be present.  We already
were catching this bad state and exceptioning out when writing tree
objects to disk, but we did not fail when writing the dircache back
to disk.  This allowed JGit applications to create a dircache file
which C git would not like to read.

Instead of checking the mode during writes, we now check during
mutation.  This allows application bugs to be detected sooner and
closer to the cause site.  It also allows us to avoid checking most
of the records which we read in from disk, as we can assume these
are formatted correctly.

Some of our unit tests were not setting the FileMode on their test
entry, so they had to be updated to use REGULAR_FILE.

Change-Id: Ie412053c390b737c0ece57b8e063e4355ee32437
Originally: http://thread.gmane.org/gmane.comp.version-control.git/128214/focus=128213
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
CC: Adam W. Hawks <awhawks@writeme.com>
12 files changed:
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBasicTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheBuilderTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheEntryTest.java [new file with mode: 0644]
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheFindTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheIteratorTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheLargePathTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheTreeTest.java
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheBuilder.java
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEditor.java
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java
org.spearce.jgit.test/tst/org/spearce/jgit/dircache/DirCacheEntryTest.java [deleted file]

index cc37c2bf8b1f94d77a08a74c0e8ea9aa04b1f7f1..b35fc761755168c6d485a23a99da10cf9345dd9d 100644 (file)
@@ -46,6 +46,7 @@ package org.eclipse.jgit.dircache;
 import java.io.File;
 
 import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.RepositoryTestCase;
 
 public class DirCacheBasicTest extends RepositoryTestCase {
@@ -176,8 +177,10 @@ public class DirCacheBasicTest extends RepositoryTestCase {
 
                final String[] paths = { "a.", "a.b", "a/b", "a0b" };
                final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
-               for (int i = 0; i < paths.length; i++)
+               for (int i = 0; i < paths.length; i++) {
                        ents[i] = new DirCacheEntry(paths[i]);
+                       ents[i].setFileMode(FileMode.REGULAR_FILE);
+               }
 
                final DirCacheBuilder b = dc.builder();
                for (int i = 0; i < ents.length; i++)
index fe02a1b23ea1c464a194f562b5cf11dbd4816b90..e919e41f4d947338d74bbb091404367a5d91cb83 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -65,6 +65,20 @@ public class DirCacheBuilderTest extends RepositoryTestCase {
                }
        }
 
+       public void testBuildRejectsUnsetFileMode() throws Exception {
+               final DirCache dc = DirCache.newInCore();
+               final DirCacheBuilder b = dc.builder();
+               assertNotNull(b);
+
+               final DirCacheEntry e = new DirCacheEntry("a");
+               assertEquals(0, e.getRawMode());
+               try {
+                       b.add(e);
+               } catch (IllegalArgumentException err) {
+                       assertEquals("FileMode not set for path a", err.getMessage());
+               }
+       }
+
        public void testBuildOneFile_FinishWriteCommit() throws Exception {
                final String path = "a-file-path";
                final FileMode mode = FileMode.REGULAR_FILE;
@@ -168,6 +182,7 @@ public class DirCacheBuilderTest extends RepositoryTestCase {
                assertNotNull(b);
 
                final DirCacheEntry entOrig = new DirCacheEntry(path);
+               entOrig.setFileMode(FileMode.REGULAR_FILE);
                assertNotSame(path, entOrig.getPathString());
                assertEquals(path, entOrig.getPathString());
                b.add(entOrig);
@@ -191,8 +206,10 @@ public class DirCacheBuilderTest extends RepositoryTestCase {
 
                final String[] paths = { "a.", "a.b", "a/b", "a0b" };
                final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
-               for (int i = 0; i < paths.length; i++)
+               for (int i = 0; i < paths.length; i++) {
                        ents[i] = new DirCacheEntry(paths[i]);
+                       ents[i].setFileMode(FileMode.REGULAR_FILE);
+               }
 
                final DirCacheBuilder b = dc.builder();
                for (int i = 0; i < ents.length; i++)
@@ -213,8 +230,10 @@ public class DirCacheBuilderTest extends RepositoryTestCase {
 
                final String[] paths = { "a.", "a.b", "a/b", "a0b" };
                final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
-               for (int i = 0; i < paths.length; i++)
+               for (int i = 0; i < paths.length; i++) {
                        ents[i] = new DirCacheEntry(paths[i]);
+                       ents[i].setFileMode(FileMode.REGULAR_FILE);
+               }
 
                final DirCacheBuilder b = dc.builder();
                for (int i = ents.length - 1; i >= 0; i--)
@@ -235,8 +254,10 @@ public class DirCacheBuilderTest extends RepositoryTestCase {
 
                final String[] paths = { "a.", "a.b", "a/b", "a0b" };
                final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
-               for (int i = 0; i < paths.length; i++)
+               for (int i = 0; i < paths.length; i++) {
                        ents[i] = new DirCacheEntry(paths[i]);
+                       ents[i].setFileMode(FileMode.REGULAR_FILE);
+               }
                {
                        final DirCacheBuilder b = dc.builder();
                        for (int i = 0; i < ents.length; i++)
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheEntryTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheEntryTest.java
new file mode 100644 (file)
index 0000000..446fd70
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2009, Google Inc.
+ * and other copyright owners as documented in the project's IP log.
+ *
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Distribution License v1.0 which
+ * accompanies this distribution, is reproduced below, and is
+ * available at http://www.eclipse.org/org/documents/edl-v10.php
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Eclipse Foundation, Inc. nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.eclipse.jgit.dircache;
+
+import junit.framework.TestCase;
+
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.FileMode;
+
+public class DirCacheEntryTest extends TestCase {
+       public void testIsValidPath() {
+               assertTrue(isValidPath("a"));
+               assertTrue(isValidPath("a/b"));
+               assertTrue(isValidPath("ab/cd/ef"));
+
+               assertFalse(isValidPath(""));
+               assertFalse(isValidPath("/a"));
+               assertFalse(isValidPath("a//b"));
+               assertFalse(isValidPath("ab/cd//ef"));
+               assertFalse(isValidPath("a/"));
+               assertFalse(isValidPath("ab/cd/ef/"));
+               assertFalse(isValidPath("a\u0000b"));
+       }
+
+       private static boolean isValidPath(final String path) {
+               return DirCacheEntry.isValidPath(Constants.encode(path));
+       }
+
+       public void testCreate_ByStringPath() {
+               assertEquals("a", new DirCacheEntry("a").getPathString());
+               assertEquals("a/b", new DirCacheEntry("a/b").getPathString());
+
+               try {
+                       new DirCacheEntry("/a");
+                       fail("Incorrectly created DirCacheEntry");
+               } catch (IllegalArgumentException err) {
+                       assertEquals("Invalid path: /a", err.getMessage());
+               }
+       }
+
+       public void testCreate_ByStringPathAndStage() {
+               DirCacheEntry e;
+
+               e = new DirCacheEntry("a", 0);
+               assertEquals("a", e.getPathString());
+               assertEquals(0, e.getStage());
+
+               e = new DirCacheEntry("a/b", 1);
+               assertEquals("a/b", e.getPathString());
+               assertEquals(1, e.getStage());
+
+               e = new DirCacheEntry("a/c", 2);
+               assertEquals("a/c", e.getPathString());
+               assertEquals(2, e.getStage());
+
+               e = new DirCacheEntry("a/d", 3);
+               assertEquals("a/d", e.getPathString());
+               assertEquals(3, e.getStage());
+
+               try {
+                       new DirCacheEntry("/a", 1);
+                       fail("Incorrectly created DirCacheEntry");
+               } catch (IllegalArgumentException err) {
+                       assertEquals("Invalid path: /a", err.getMessage());
+               }
+
+               try {
+                       new DirCacheEntry("a", -11);
+                       fail("Incorrectly created DirCacheEntry");
+               } catch (IllegalArgumentException err) {
+                       assertEquals("Invalid stage -11 for path a", err.getMessage());
+               }
+
+               try {
+                       new DirCacheEntry("a", 4);
+                       fail("Incorrectly created DirCacheEntry");
+               } catch (IllegalArgumentException err) {
+                       assertEquals("Invalid stage 4 for path a", err.getMessage());
+               }
+       }
+
+       public void testSetFileMode() {
+               final DirCacheEntry e = new DirCacheEntry("a");
+
+               assertEquals(0, e.getRawMode());
+
+               e.setFileMode(FileMode.REGULAR_FILE);
+               assertSame(FileMode.REGULAR_FILE, e.getFileMode());
+               assertEquals(FileMode.REGULAR_FILE.getBits(), e.getRawMode());
+
+               e.setFileMode(FileMode.EXECUTABLE_FILE);
+               assertSame(FileMode.EXECUTABLE_FILE, e.getFileMode());
+               assertEquals(FileMode.EXECUTABLE_FILE.getBits(), e.getRawMode());
+
+               e.setFileMode(FileMode.SYMLINK);
+               assertSame(FileMode.SYMLINK, e.getFileMode());
+               assertEquals(FileMode.SYMLINK.getBits(), e.getRawMode());
+
+               e.setFileMode(FileMode.GITLINK);
+               assertSame(FileMode.GITLINK, e.getFileMode());
+               assertEquals(FileMode.GITLINK.getBits(), e.getRawMode());
+
+               try {
+                       e.setFileMode(FileMode.MISSING);
+                       fail("incorrectly accepted FileMode.MISSING");
+               } catch (IllegalArgumentException err) {
+                       assertEquals("Invalid mode 0 for path a", err.getMessage());
+               }
+
+               try {
+                       e.setFileMode(FileMode.TREE);
+                       fail("incorrectly accepted FileMode.TREE");
+               } catch (IllegalArgumentException err) {
+                       assertEquals("Invalid mode 40000 for path a", err.getMessage());
+               }
+       }
+}
index cdc659a21c923423d673ee630c942ce3a5967081..d5a632c48cbc36498e594d9885581620a8a72097 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -43,6 +43,7 @@
 
 package org.eclipse.jgit.dircache;
 
+import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.RepositoryTestCase;
 
 public class DirCacheFindTest extends RepositoryTestCase {
@@ -51,8 +52,10 @@ public class DirCacheFindTest extends RepositoryTestCase {
 
                final String[] paths = { "a.", "a/b", "a/c", "a/d", "a0b" };
                final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
-               for (int i = 0; i < paths.length; i++)
+               for (int i = 0; i < paths.length; i++) {
                        ents[i] = new DirCacheEntry(paths[i]);
+                       ents[i].setFileMode(FileMode.REGULAR_FILE);
+               }
                final int aFirst = 1;
                final int aLast = 3;
 
index db9f684fed4a970ef36137b89040dde5d2fbb4b0..efea117388f714d395ccf759e8976966265a247d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -74,8 +74,10 @@ public class DirCacheIteratorTest extends RepositoryTestCase {
 
                final String[] paths = { "a.", "a0b" };
                final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
-               for (int i = 0; i < paths.length; i++)
+               for (int i = 0; i < paths.length; i++) {
                        ents[i] = new DirCacheEntry(paths[i]);
+                       ents[i].setFileMode(FileMode.REGULAR_FILE);
+               }
 
                final DirCacheBuilder b = dc.builder();
                for (int i = 0; i < ents.length; i++)
index ceaadf97b63c2cc3cbdf95ed388853ecb7f81775..0926ab9899c2618204ebc31cbd709808cc209456 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -46,6 +46,7 @@ package org.eclipse.jgit.dircache;
 import java.io.IOException;
 
 import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.RepositoryTestCase;
 
 public class DirCacheLargePathTest extends RepositoryTestCase {
@@ -76,6 +77,10 @@ public class DirCacheLargePathTest extends RepositoryTestCase {
 
                final DirCacheEntry longEnt = new DirCacheEntry(longPath);
                final DirCacheEntry shortEnt = new DirCacheEntry(shortPath);
+
+               longEnt.setFileMode(FileMode.REGULAR_FILE);
+               shortEnt.setFileMode(FileMode.REGULAR_FILE);
+
                assertEquals(longPath, longEnt.getPathString());
                assertEquals(shortPath, shortEnt.getPathString());
 
index f74a35cd35bdb462d743b739fdc7bd70132f8afd..8345c5d83dada2c2c0621540ea22016468b3f12b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -46,6 +46,7 @@ package org.eclipse.jgit.dircache;
 import java.io.IOException;
 
 import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.RepositoryTestCase;
 
 public class DirCacheTreeTest extends RepositoryTestCase {
@@ -81,8 +82,10 @@ public class DirCacheTreeTest extends RepositoryTestCase {
 
                final String[] paths = { "a.", "a/b", "a/c", "a/d", "a0b" };
                final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
-               for (int i = 0; i < paths.length; i++)
+               for (int i = 0; i < paths.length; i++) {
                        ents[i] = new DirCacheEntry(paths[i]);
+                       ents[i].setFileMode(FileMode.REGULAR_FILE);
+               }
                final int aFirst = 1;
                final int aLast = 3;
 
@@ -116,8 +119,10 @@ public class DirCacheTreeTest extends RepositoryTestCase {
 
                final String[] paths = { "a.", "a/b", "a/c/e", "a/c/f", "a/d", "a0b" };
                final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
-               for (int i = 0; i < paths.length; i++)
+               for (int i = 0; i < paths.length; i++) {
                        ents[i] = new DirCacheEntry(paths[i]);
+                       ents[i].setFileMode(FileMode.REGULAR_FILE);
+               }
                final int aFirst = 1;
                final int aLast = 4;
                final int acFirst = 2;
@@ -173,8 +178,10 @@ public class DirCacheTreeTest extends RepositoryTestCase {
                final String B = String.format("b%2000s", "b");
                final String[] paths = { A + ".", A + "." + B, A + "/" + B, A + "0" + B };
                final DirCacheEntry[] ents = new DirCacheEntry[paths.length];
-               for (int i = 0; i < paths.length; i++)
+               for (int i = 0; i < paths.length; i++) {
                        ents[i] = new DirCacheEntry(paths[i]);
+                       ents[i].setFileMode(FileMode.REGULAR_FILE);
+               }
 
                final DirCacheBuilder b = dc.builder();
                for (int i = 0; i < ents.length; i++)
index f294f5cf515def98e0325c1cd6cb86d7fd0203ae..69f5444c643b09451d0b976f13ae74faee3183a3 100644 (file)
@@ -48,7 +48,6 @@ import java.io.IOException;
 import java.util.Arrays;
 
 import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.FileMode;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.lib.WindowCursor;
 import org.eclipse.jgit.treewalk.AbstractTreeIterator;
@@ -97,8 +96,13 @@ public class DirCacheBuilder extends BaseDirCacheEditor {
         *
         * @param newEntry
         *            the new entry to add.
+        * @throws IllegalArgumentException
+        *             If the FileMode of the entry was not set by the caller.
         */
        public void add(final DirCacheEntry newEntry) {
+               if (newEntry.getRawMode() == 0)
+                       throw new IllegalArgumentException("FileMode not set for path "
+                                       + newEntry.getPathString());
                beforeAdd(newEntry);
                fastAdd(newEntry);
        }
@@ -194,8 +198,6 @@ public class DirCacheBuilder extends BaseDirCacheEditor {
        }
 
        private void beforeAdd(final DirCacheEntry newEntry) {
-               if (FileMode.TREE.equals(newEntry.getRawMode()))
-                       throw bad(newEntry, "Adding subtree not allowed");
                if (sorted && entryCnt > 0) {
                        final DirCacheEntry lastEntry = entries[entryCnt - 1];
                        final int cr = DirCache.cmp(lastEntry, newEntry);
index 1ad8e355d5ae399c40e2ee04d95b38b2e75739db..85ad8b4d790119a6a888fdc1bc482dd8041af319 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008, Google Inc.
+ * Copyright (C) 2008-2009, Google Inc.
  * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
  * and other copyright owners as documented in the project's IP log.
  *
@@ -145,11 +145,16 @@ public class DirCacheEditor extends BaseDirCacheEditor {
                        }
 
                        final DirCacheEntry ent;
-                       if (missing)
+                       if (missing) {
                                ent = new DirCacheEntry(e.path);
-                       else
+                               e.apply(ent);
+                               if (ent.getRawMode() == 0)
+                                       throw new IllegalArgumentException("FileMode not set"
+                                                       + " for path " + ent.getPathString());                                                  
+                       } else {
                                ent = cache.getEntry(eIdx);
-                       e.apply(ent);
+                               e.apply(ent);
+                       }
                        fastAdd(ent);
                }
 
index eed33401d510780de69118cc047f4e5d4b77fdab..415de095b2a1fda56dc8f81e706bf1ed49a04b19 100644 (file)
@@ -388,8 +388,18 @@ public class DirCacheEntry {
         *
         * @param mode
         *            the new mode constant.
+        * @throws IllegalArgumentException
+        *             If {@code mode} is {@link FileMode#MISSING},
+        *             {@link FileMode#TREE}, or any other type code not permitted
+        *             in a tree object.
         */
        public void setFileMode(final FileMode mode) {
+               switch (mode.getBits() & FileMode.TYPE_MASK) {
+               case FileMode.TYPE_MISSING:
+               case FileMode.TYPE_TREE:
+                       throw new IllegalArgumentException("Invalid mode " + mode
+                                       + " for path " + getPathString());
+               }
                NB.encodeInt32(info, infoOffset + P_MODE, mode.getBits());
        }
 
index fc29aa71b85b054352c93e176b5c420965aaa883..144b1a6cfc4b18766550c5f619a933e0b0889340 100644 (file)
@@ -382,10 +382,6 @@ public class DirCacheTree {
                        }
 
                        final FileMode mode = e.getFileMode();
-                       if (mode.getObjectType() == Constants.OBJ_BAD)
-                               throw new IllegalStateException("Entry \"" + e.getPathString()
-                                               + "\" has incorrect mode set up.");
-
                        size += mode.copyToLength();
                        size += ep.length - pathOffset;
                        size += OBJECT_ID_LENGTH + 2;
diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/dircache/DirCacheEntryTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/dircache/DirCacheEntryTest.java
deleted file mode 100644 (file)
index fa035d3..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2009, Google Inc.
- * and other copyright owners as documented in the project's IP log.
- *
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Distribution License v1.0 which
- * accompanies this distribution, is reproduced below, and is
- * available at http://www.eclipse.org/org/documents/edl-v10.php
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- *   copyright notice, this list of conditions and the following
- *   disclaimer in the documentation and/or other materials provided
- *   with the distribution.
- *
- * - Neither the name of the Eclipse Foundation, Inc. nor the
- *   names of its contributors may be used to endorse or promote
- *   products derived from this software without specific prior
- *   written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.spearce.jgit.dircache;
-
-import junit.framework.TestCase;
-
-import org.spearce.jgit.lib.Constants;
-
-public class DirCacheEntryTest extends TestCase {
-       public void testIsValidPath() {
-               assertTrue(isValidPath("a"));
-               assertTrue(isValidPath("a/b"));
-               assertTrue(isValidPath("ab/cd/ef"));
-
-               assertFalse(isValidPath(""));
-               assertFalse(isValidPath("/a"));
-               assertFalse(isValidPath("a//b"));
-               assertFalse(isValidPath("ab/cd//ef"));
-               assertFalse(isValidPath("a/"));
-               assertFalse(isValidPath("ab/cd/ef/"));
-               assertFalse(isValidPath("a\u0000b"));
-       }
-
-       private static boolean isValidPath(final String path) {
-               return DirCacheEntry.isValidPath(Constants.encode(path));
-       }
-
-       public void testCreate_ByStringPath() {
-               assertEquals("a", new DirCacheEntry("a").getPathString());
-               assertEquals("a/b", new DirCacheEntry("a/b").getPathString());
-
-               try {
-                       new DirCacheEntry("/a");
-                       fail("Incorrectly created DirCacheEntry");
-               } catch (IllegalArgumentException err) {
-                       assertEquals("Invalid path: /a", err.getMessage());
-               }
-       }
-
-       public void testCreate_ByStringPathAndStage() {
-               DirCacheEntry e;
-
-               e = new DirCacheEntry("a", 0);
-               assertEquals("a", e.getPathString());
-               assertEquals(0, e.getStage());
-
-               e = new DirCacheEntry("a/b", 1);
-               assertEquals("a/b", e.getPathString());
-               assertEquals(1, e.getStage());
-
-               e = new DirCacheEntry("a/c", 2);
-               assertEquals("a/c", e.getPathString());
-               assertEquals(2, e.getStage());
-
-               e = new DirCacheEntry("a/d", 3);
-               assertEquals("a/d", e.getPathString());
-               assertEquals(3, e.getStage());
-
-               try {
-                       new DirCacheEntry("/a", 1);
-                       fail("Incorrectly created DirCacheEntry");
-               } catch (IllegalArgumentException err) {
-                       assertEquals("Invalid path: /a", err.getMessage());
-               }
-
-               try {
-                       new DirCacheEntry("a", -11);
-                       fail("Incorrectly created DirCacheEntry");
-               } catch (IllegalArgumentException err) {
-                       assertEquals("Invalid stage -11 for path a", err.getMessage());
-               }
-
-               try {
-                       new DirCacheEntry("a", 4);
-                       fail("Incorrectly created DirCacheEntry");
-               } catch (IllegalArgumentException err) {
-                       assertEquals("Invalid stage 4 for path a", err.getMessage());
-               }
-       }
-}