/* * Copyright (C) 2020 Thomas Wolf and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Distribution License v. 1.0 which is available at * https://www.eclipse.org/org/documents/edl-v10.php. * * SPDX-License-Identifier: BSD-3-Clause */ package org.eclipse.jgit.lib; import static java.nio.charset.StandardCharsets.US_ASCII; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.util.RawParseUtils; import org.junit.Test; public class TagBuilderTest { // @formatter:off private static final String SIGNATURE = "-----BEGIN PGP SIGNATURE-----\n" + "Version: BCPG v1.60\n" + "\n" + "iQEcBAABCAAGBQJb9cVhAAoJEKX+6Axg/6TZeFsH/0CY0WX/z7U8+7S5giFX4wH4\n" + "opvBwqyt6OX8lgNwTwBGHFNt8LdmDCCmKoq/XwkNi3ARVjLhe3gBcKXNoavvPk2Z\n" + "gIg5ChevGkU4afWCOMLVEYnkCBGw2+86XhrK1P7gTHEk1Rd+Yv1ZRDJBY+fFO7yz\n" + "uSBuF5RpEY2sJiIvp27Gub/rY3B5NTR/feO/z+b9oiP/fMUhpRwG5KuWUsn9NPjw\n" + "3tvbgawYpU/2UnS+xnavMY4t2fjRYjsoxndPLb2MUX8X7vC7FgWLBlmI/rquLZVM\n" + "IQEKkjnA+lhejjK1rv+ulq4kGZJFKGYWYYhRDwFg5PTkzhudhN2SGUq5Wxq1Eg4=\n" + "=b9OI\n" + "-----END PGP SIGNATURE-----"; // @formatter:on private static final String TAGGER_LINE = "A U. Thor 1218123387 +0700"; private static final PersonIdent TAGGER = RawParseUtils .parsePersonIdent(TAGGER_LINE); @Test public void testTagSimple() throws Exception { TagBuilder t = new TagBuilder(); t.setTag("sometag"); t.setObjectId(ObjectId.zeroId(), Constants.OBJ_COMMIT); t.setEncoding(US_ASCII); t.setMessage("Short message only"); t.setTagger(TAGGER); String tag = new String(t.build(), UTF_8); String expected = "object 0000000000000000000000000000000000000000\n" + "type commit\n" // + "tag sometag\n" // + "tagger " + TAGGER_LINE + '\n' // + "encoding US-ASCII\n" // + '\n' // + "Short message only"; assertEquals(expected, tag); } @Test public void testTagWithSignatureShortMessageEndsInLF() throws Exception { TagBuilder t = new TagBuilder(); t.setTag("sometag"); t.setObjectId(ObjectId.zeroId(), Constants.OBJ_COMMIT); t.setEncoding(US_ASCII); t.setMessage("Short message only\n"); t.setTagger(TAGGER); t.setGpgSignature(new GpgSignature(SIGNATURE.getBytes(US_ASCII))); String tag = new String(t.build(), UTF_8); String expected = "object 0000000000000000000000000000000000000000\n" + "type commit\n" // + "tag sometag\n" // + "tagger " + TAGGER_LINE + '\n' // + "encoding US-ASCII\n" // + '\n' // + "Short message only\n" // + SIGNATURE + '\n'; assertEquals(expected, tag); } @Test public void testTagWithSignatureMessageNoLF() { TagBuilder t = new TagBuilder(); t.setTag("sometag"); t.setObjectId(ObjectId.zeroId(), Constants.OBJ_COMMIT); t.setEncoding(US_ASCII); t.setMessage("A message\n\nthat does not end in LF"); t.setTagger(TAGGER); t.setGpgSignature(new GpgSignature(SIGNATURE.getBytes(US_ASCII))); Throwable ex = assertThrows(Throwable.class, t::build); assertEquals(JGitText.get().signedTagMessageNoLf, ex.getMessage()); } @Test public void testTagWithSignatureNoParagraphsMessage() throws Exception { TagBuilder t = new TagBuilder(); t.setTag("sometag"); t.setObjectId(ObjectId.zeroId(), Constants.OBJ_COMMIT); t.setEncoding(US_ASCII); t.setMessage("A strange\ntag message\n"); t.setTagger(TAGGER); t.setGpgSignature(new GpgSignature(SIGNATURE.getBytes(US_ASCII))); String tag = new String(t.build(), UTF_8); String expected = "object 0000000000000000000000000000000000000000\n" + "type commit\n" // + "tag sometag\n" // + "tagger " + TAGGER_LINE + '\n' // + "encoding US-ASCII\n" // + '\n' // + "A strange\ntag message\n" // + SIGNATURE + '\n'; assertEquals(expected, tag); } @Test public void testTagWithSignatureLongMessage() throws Exception { TagBuilder t = new TagBuilder(); t.setTag("sometag"); t.setObjectId(ObjectId.zeroId(), Constants.OBJ_COMMIT); t.setMessage("Short message\n\nFollowed by explanations.\n"); t.setTagger(TAGGER); t.setGpgSignature(new GpgSignature(SIGNATURE.getBytes(US_ASCII))); String tag = new String(t.build(), UTF_8); String expected = "object 0000000000000000000000000000000000000000\n" + "type commit\n" // + "tag sometag\n" // + "tagger " + TAGGER_LINE + '\n' // + '\n' // + "Short message\n\nFollowed by explanations.\n" // + SIGNATURE + '\n'; assertEquals(expected, tag); } @Test public void testTagWithSignatureEmptyMessage() throws Exception { TagBuilder t = new TagBuilder(); t.setTag("sometag"); t.setObjectId(ObjectId.zeroId(), Constants.OBJ_COMMIT); t.setTagger(TAGGER); t.setMessage(""); String emptyMsg = new String(t.build(), UTF_8); t.setGpgSignature(new GpgSignature(SIGNATURE.getBytes(US_ASCII))); String tag = new String(t.build(), UTF_8); String expected = "object 0000000000000000000000000000000000000000\n" + "type commit\n" // + "tag sometag\n" // + "tagger " + TAGGER_LINE + '\n' // + '\n'; assertEquals(expected, emptyMsg); assertEquals(expected + SIGNATURE + '\n', tag); } @Test public void testTagWithSignatureOnly() throws Exception { TagBuilder t = new TagBuilder(); t.setTag("sometag"); t.setObjectId(ObjectId.zeroId(), Constants.OBJ_COMMIT); t.setTagger(TAGGER); String emptyMsg = new String(t.build(), UTF_8); t.setGpgSignature(new GpgSignature(SIGNATURE.getBytes(US_ASCII))); String tag = new String(t.build(), UTF_8); String expected = "object 0000000000000000000000000000000000000000\n" + "type commit\n" // + "tag sometag\n" // + "tagger " + TAGGER_LINE + '\n' // + '\n'; assertEquals(expected, emptyMsg); assertEquals(expected + SIGNATURE + '\n', tag); } }