blob: 7d212d540ff5c68ccc99a38c9646f1047bd2ad23 [file] [log] [blame]
/*
* Copyright (C) 2023, Thomas Wolf <twolf@apache.org> 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"));
}
}