/* * Copyright (C) 2016, Christian Halstrick 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.lfs.lib; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.eclipse.jgit.lfs.LfsPointer; import org.junit.Test; /* * Test LfsPointer file abstraction */ public class LFSPointerTest { private static final String TEST_SHA256 = "27e15b72937fc8f558da24ac3d50ec20302a4cf21e33b87ae8e4ce90e89c4b10"; @Test public void testEncoding() throws IOException { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer ptr = new LfsPointer(id, 4); try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { ptr.encode(baos); assertEquals( "version https://git-lfs.github.com/spec/v1\noid sha256:" + TEST_SHA256 + "\nsize 4\n", baos.toString(UTF_8.name())); } } @Test public void testReadValidLfsPointer() throws Exception { String ptr = "version https://git-lfs.github.com/spec/v1\n" + "oid sha256:" + TEST_SHA256 + '\n' + "size 4\n"; AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); try (ByteArrayInputStream in = new ByteArrayInputStream( ptr.getBytes(UTF_8))) { assertEquals(lfs, LfsPointer.parseLfsPointer(in)); } } @Test public void testReadValidLfsPointerUnordered() throws Exception { // This is actually not allowed per the spec, but JGit accepts it // anyway. String ptr = "version https://git-lfs.github.com/spec/v1\n" + "size 4\n" + "oid sha256:" + TEST_SHA256 + '\n'; AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); try (ByteArrayInputStream in = new ByteArrayInputStream( ptr.getBytes(UTF_8))) { assertEquals(lfs, LfsPointer.parseLfsPointer(in)); } } @Test public void testReadValidLfsPointerVersionNotFirst() throws Exception { // This is actually not allowed per the spec, but JGit accepts it // anyway. String ptr = "oid sha256:" + TEST_SHA256 + '\n' + "size 4\n" + "version https://git-lfs.github.com/spec/v1\n"; AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); try (ByteArrayInputStream in = new ByteArrayInputStream( ptr.getBytes(UTF_8))) { assertEquals(lfs, LfsPointer.parseLfsPointer(in)); } } @Test public void testReadInvalidLfsPointer() throws Exception { String cSource = "size_t someFunction(void *ptr); // Fake C source\n"; try (ByteArrayInputStream in = new ByteArrayInputStream( cSource.getBytes(UTF_8))) { assertNull("Is not a LFS pointer", LfsPointer.parseLfsPointer(in)); } } @Test public void testReadInvalidLfsPointer2() throws Exception { String cSource = "size_t\nsomeFunction(void *ptr);\n// Fake C source\n"; try (ByteArrayInputStream in = new ByteArrayInputStream( cSource.getBytes(UTF_8))) { assertNull("Is not a LFS pointer", LfsPointer.parseLfsPointer(in)); } } @Test public void testReadInValidLfsPointerVersionWrong() throws Exception { String ptr = "version https://git-lfs.example.org/spec/v1\n" + "oid sha256:" + TEST_SHA256 + '\n' + "size 4\n"; try (ByteArrayInputStream in = new ByteArrayInputStream( ptr.getBytes(UTF_8))) { assertNull("Is not a LFS pointer", LfsPointer.parseLfsPointer(in)); } } @Test public void testReadInValidLfsPointerVersionTwice() throws Exception { String ptr = "version https://git-lfs.github.com/spec/v1\n" + "version https://git-lfs.github.com/spec/v1\n" + "oid sha256:" + TEST_SHA256 + '\n' + "size 4\n"; try (ByteArrayInputStream in = new ByteArrayInputStream( ptr.getBytes(UTF_8))) { assertNull("Is not a LFS pointer", LfsPointer.parseLfsPointer(in)); } } @Test public void testReadInValidLfsPointerVersionTwice2() throws Exception { String ptr = "version https://git-lfs.github.com/spec/v1\n" + "oid sha256:" + TEST_SHA256 + '\n' + "version https://git-lfs.github.com/spec/v1\n" + "size 4\n"; try (ByteArrayInputStream in = new ByteArrayInputStream( ptr.getBytes(UTF_8))) { assertNull("Is not a LFS pointer", LfsPointer.parseLfsPointer(in)); } } @Test public void testReadInValidLfsPointerOidTwice() throws Exception { String ptr = "version https://git-lfs.github.com/spec/v1\n" + "oid sha256:" + TEST_SHA256 + '\n' + "oid sha256:" + TEST_SHA256 + '\n' + "size 4\n"; try (ByteArrayInputStream in = new ByteArrayInputStream( ptr.getBytes(UTF_8))) { assertNull("Is not a LFS pointer", LfsPointer.parseLfsPointer(in)); } } @Test public void testReadInValidLfsPointerSizeTwice() throws Exception { String ptr = "version https://git-lfs.github.com/spec/v1\n" + "size 4\n" + "size 4\n" + "oid sha256:" + TEST_SHA256 + '\n'; try (ByteArrayInputStream in = new ByteArrayInputStream( ptr.getBytes(UTF_8))) { assertNull("Is not a LFS pointer", LfsPointer.parseLfsPointer(in)); } } @Test public void testRoundtrip() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer ptr = new LfsPointer(id, 4); try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { ptr.encode(baos); try (ByteArrayInputStream in = new ByteArrayInputStream( baos.toByteArray())) { assertEquals(ptr, LfsPointer.parseLfsPointer(in)); } } } @Test public void testEquals() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); AnyLongObjectId id2 = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs2 = new LfsPointer(id2, 4); assertTrue(lfs.equals(lfs2)); assertTrue(lfs2.equals(lfs)); } @Test public void testEqualsNull() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); assertFalse(lfs.equals(null)); } @Test public void testEqualsSame() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); assertTrue(lfs.equals(lfs)); } @Test public void testEqualsOther() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); assertFalse(lfs.equals(new Object())); } @Test public void testNotEqualsOid() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); AnyLongObjectId id2 = LongObjectId .fromString(TEST_SHA256.replace('7', '5')); LfsPointer lfs2 = new LfsPointer(id2, 4); assertFalse(lfs.equals(lfs2)); assertFalse(lfs2.equals(lfs)); } @Test public void testNotEqualsSize() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); AnyLongObjectId id2 = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs2 = new LfsPointer(id2, 5); assertFalse(lfs.equals(lfs2)); assertFalse(lfs2.equals(lfs)); } @Test public void testCompareToEquals() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); AnyLongObjectId id2 = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs2 = new LfsPointer(id2, 4); assertEquals(0, lfs.compareTo(lfs2)); assertEquals(0, lfs2.compareTo(lfs)); } @Test @SuppressWarnings("SelfComparison") public void testCompareToSame() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); assertEquals(0, lfs.compareTo(lfs)); } @Test public void testCompareToNotEqualsOid() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); AnyLongObjectId id2 = LongObjectId .fromString(TEST_SHA256.replace('7', '5')); LfsPointer lfs2 = new LfsPointer(id2, 4); assertNotEquals(0, lfs.compareTo(lfs2)); assertNotEquals(0, lfs2.compareTo(lfs)); } @Test public void testCompareToNotEqualsSize() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); AnyLongObjectId id2 = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs2 = new LfsPointer(id2, 5); assertNotEquals(0, lfs.compareTo(lfs2)); assertNotEquals(0, lfs2.compareTo(lfs)); } @Test public void testCompareToNull() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); assertThrows(NullPointerException.class, () -> lfs.compareTo(null)); } @Test public void testHashcodeEquals() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); AnyLongObjectId id2 = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs2 = new LfsPointer(id2, 4); assertEquals(lfs.hashCode(), lfs2.hashCode()); } @Test public void testHashcodeSame() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); assertEquals(lfs.hashCode(), lfs.hashCode()); } @Test public void testHashcodeNotEquals() throws Exception { AnyLongObjectId id = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs = new LfsPointer(id, 4); AnyLongObjectId id2 = LongObjectId.fromString(TEST_SHA256); LfsPointer lfs2 = new LfsPointer(id2, 5); assertNotEquals(lfs.hashCode(), lfs2.hashCode()); } }