/* * Copyright (C) 2023, 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.storage.file; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.nio.file.Files; import java.nio.file.Path; import org.eclipse.jgit.util.FS; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; public class UserConfigFileTest { @Rule public TemporaryFolder tmp = new TemporaryFolder(); @Test public void testParentOnlyLoad() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); } @Test public void testLoadBoth() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); Files.writeString(user, "[user]\n\temail = a.u.thor@example.com"); UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); } @Test public void testOverwriteChild() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); Files.writeString(user, "[user]\n\temail = a.u.thor@example.com"); UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); config.setString("user", null, "name", "A U Thor"); assertEquals("A U Thor", config.getString("user", null, "name")); config.save(); UserConfigFile config2 = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config2.load(); assertEquals("A U Thor", config2.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); FileBasedConfig cfg = new FileBasedConfig(null, xdg.toFile(), FS.DETECTED); cfg.load(); assertEquals("Archibald Ulysses Thor", cfg.getString("user", null, "name")); assertNull(cfg.getString("user", null, "email")); } @Test public void testUnset() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); Files.writeString(user, "[user]\n\temail = a.u.thor@example.com"); UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); config.setString("user", null, "name", "A U Thor"); assertEquals("A U Thor", config.getString("user", null, "name")); config.unset("user", null, "name"); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); config.save(); UserConfigFile config2 = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config2.load(); assertEquals("Archibald Ulysses Thor", config2.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); FileBasedConfig cfg = new FileBasedConfig(null, user.toFile(), FS.DETECTED); cfg.load(); assertNull(cfg.getString("user", null, "name")); assertEquals("a.u.thor@example.com", cfg.getString("user", null, "email")); } @Test public void testUnsetSection() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); Files.writeString(user, "[user]\n\temail = a.u.thor@example.com"); UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); config.unsetSection("user", null); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); config.save(); assertTrue(Files.readString(user).strip().isEmpty()); } @Test public void testNoChild() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertNull(config.getString("user", null, "email")); config.setString("user", null, "email", "a.u.thor@example.com"); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); config.save(); assertFalse(Files.exists(user)); UserConfigFile config2 = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config2.load(); assertEquals("Archibald Ulysses Thor", config2.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config2.getString("user", null, "email")); } @Test public void testNoFiles() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertNull(config.getString("user", null, "name")); assertNull(config.getString("user", null, "email")); config.setString("user", null, "name", "Archibald Ulysses Thor"); config.setString("user", null, "email", "a.u.thor@example.com"); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); config.save(); assertTrue(Files.exists(user)); assertFalse(Files.exists(xdg)); UserConfigFile config2 = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config2.load(); assertEquals("Archibald Ulysses Thor", config2.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config2.getString("user", null, "email")); } @Test public void testSetInXdg() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); config.setString("user", null, "email", "a.u.thor@example.com"); config.save(); assertFalse(Files.exists(user)); FileBasedConfig cfg = new FileBasedConfig(null, xdg.toFile(), FS.DETECTED); cfg.load(); assertEquals("Archibald Ulysses Thor", cfg.getString("user", null, "name")); assertEquals("a.u.thor@example.com", cfg.getString("user", null, "email")); } @Test public void testUserConfigCreated() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); Thread.sleep(3000); // Avoid racily clean isOutdated() below. UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); Files.writeString(user, "[user]\n\temail = a.u.thor@example.com\n\tname = A U Thor"); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertTrue(config.isOutdated()); config.load(); assertEquals("A U Thor", config.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); } @Test public void testUserConfigDeleted() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); Files.writeString(user, "[user]\n\temail = a.u.thor@example.com\n\tname = A U Thor"); Thread.sleep(3000); // Avoid racily clean isOutdated() below. UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("A U Thor", config.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); Files.delete(user); assertEquals("A U Thor", config.getString("user", null, "name")); assertEquals("a.u.thor@example.com", config.getString("user", null, "email")); assertTrue(config.isOutdated()); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertNull(config.getString("user", null, "email")); } @Test public void testXdgConfigDeleted() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); Thread.sleep(3000); // Avoid racily clean isOutdated() below. UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); Files.delete(xdg); assertEquals("Archibald Ulysses Thor", config.getString("user", null, "name")); assertTrue(config.isOutdated()); config.load(); assertNull(config.getString("user", null, "name")); } @Test public void testXdgConfigDeletedUserConfigExists() throws Exception { Path xdg = tmp.getRoot().toPath().resolve("xdg.cfg"); Files.writeString(xdg, "[user]\n\tname = Archibald Ulysses Thor"); Path user = tmp.getRoot().toPath().resolve("user.cfg"); Files.writeString(user, "[user]\n\temail = a.u.thor@example.com\n\tname = A U Thor"); Thread.sleep(3000); // Avoid racily clean isOutdated() below. UserConfigFile config = new UserConfigFile(null, user.toFile(), xdg.toFile(), FS.DETECTED); config.load(); assertEquals("A U Thor", config.getString("user", null, "name")); Files.delete(xdg); assertTrue(config.isOutdated()); config.load(); assertEquals("A U Thor", config.getString("user", null, "name")); } }