]> source.dussan.org Git - jgit.git/commitdiff
Test commit with huge commit message 27/123427/9
authorThomas Wolf <thomas.wolf@paranor.ch>
Mon, 28 May 2018 09:35:20 +0000 (11:35 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Thu, 31 May 2018 23:47:58 +0000 (01:47 +0200)
Tests that even a commit with a huge message can be committed and read
if the WindowCache's streamFileThreshold is configured large enough.

Bug: 535092
Change-Id: Id8090c608625010caf11dff7971b47882b5fd20f
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
org.eclipse.jgit.test/pom.xml
org.eclipse.jgit.test/tests.bzl
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/HugeCommitMessageTest.java [new file with mode: 0644]

index 6db6a81040729e70593208a48f6d491b9c002053..c2fd83ed944122c2508088890cd4f147b35b5d50 100644 (file)
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
-          <argLine>-Xmx256m -Dfile.encoding=UTF-8 -Djava.io.tmpdir=${project.build.directory}</argLine>
+          <argLine>-Xmx1024m -Dfile.encoding=UTF-8 -Djava.io.tmpdir=${project.build.directory}</argLine>
           <includes>
             <include>**/*Test.java</include>
             <include>**/*Tests.java</include>
index b1b7b7a9dedc7692fc045b541d3f8589124a154c..64dfe071cf703adc2d0c0168f96bfed3299d3128 100644 (file)
@@ -42,6 +42,10 @@ def tests(tests):
         '//lib:jsch',
       ]
 
+    heap_size = "-Xmx256m"
+    if src.endswith("HugeCommitMessageTest.java"):
+      heap_size = "-Xmx512m"
+
     junit_tests(
       name = name,
       tags = labels,
@@ -57,5 +61,5 @@ def tests(tests):
         '//org.eclipse.jgit.lfs:jgit-lfs',
       ],
       flaky = flaky,
-      jvm_flags = ["-Xmx256m", "-Dfile.encoding=UTF-8"],
+      jvm_flags = [heap_size, "-Dfile.encoding=UTF-8"],
     )
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/HugeCommitMessageTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/HugeCommitMessageTest.java
new file mode 100644 (file)
index 0000000..4193c4b
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018, Thomas Wolf <thomas.wolf@paranor.ch>
+ * 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.lib;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.junit.RepositoryTestCase;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.storage.file.WindowCacheConfig;
+import org.eclipse.jgit.storage.pack.PackConfig;
+import org.junit.Test;
+
+public class HugeCommitMessageTest extends RepositoryTestCase {
+
+       private static final int HUGE_SIZE = Math.max(15 * WindowCacheConfig.MB,
+                       PackConfig.DEFAULT_BIG_FILE_THRESHOLD + WindowCacheConfig.MB);
+       // Larger than the 5MB fallback limit in RevWalk.getCachedBytes(RevObject
+       // obj, ObjectLoader ldr), and also larger than the default
+       // streamFileThreshold.
+
+       @Test
+       public void testHugeCommitMessage() throws Exception {
+               try (Git git = new Git(db)) {
+                       writeTrashFile("foo", "foo");
+                       git.add().addFilepattern("foo").call();
+                       WindowCacheConfig wc = new WindowCacheConfig();
+                       wc.setStreamFileThreshold(HUGE_SIZE + WindowCacheConfig.MB);
+                       wc.install();
+                       RevCommit commit = git.commit()
+                                       .setMessage(insanelyHugeCommitMessage()).call();
+                       Ref master = db.findRef("master");
+                       List<Ref> actual = git.branchList().setContains(commit.getName())
+                                       .call();
+                       assertTrue("Should be contained in branch master",
+                                       actual.contains(master));
+               }
+       }
+
+       private String insanelyHugeCommitMessage() {
+               final String oneLine = "012345678901234567890123456789012345678901234567890123456789\n";
+               StringBuilder b = new StringBuilder(HUGE_SIZE + oneLine.length());
+               // Give the message a real header; otherwise even writing the reflog
+               // message may run into troubles because RevCommit.getShortMessage()
+               // will return the whole message.
+               b.append("An insanely huge commit message\n\n");
+               while (b.length() < HUGE_SIZE) {
+                       b.append(oneLine);
+               }
+               return b.toString();
+       }
+
+}