[tests] migrating DigesterTest to NIO

GitOrigin-RevId: d162609fe4e1c69e48adc5872649ebefb02b2ab5
This commit is contained in:
Roman Shevchenko
2023-09-04 09:44:40 +00:00
committed by intellij-monorepo-bot
parent 05378cd250
commit 70ec4fb5dc
2 changed files with 42 additions and 53 deletions
@@ -26,23 +26,26 @@ public final class Digester {
}
public static long digestRegularFile(File file) throws IOException {
Path path = file.toPath();
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
return digest(file.toPath());
}
public static long digest(Path file) throws IOException {
BasicFileAttributes attrs = Files.readAttributes(file, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
if (attrs.isSymbolicLink()) {
Path target = Files.readSymbolicLink(path);
Path target = Files.readSymbolicLink(file);
if (target.isAbsolute()) throw new IOException("An absolute link: " + file + " -> " + target);
return digestStream(new ByteArrayInputStream(target.toString().getBytes(StandardCharsets.UTF_8))) | SYM_LINK;
}
if (attrs.isDirectory()) return DIRECTORY;
long executable = !Utils.IS_WINDOWS && file.canExecute() ? EXECUTABLE : 0;
try (InputStream in = new BufferedInputStream(Utils.newFileInputStream(file))) {
long executable = !Utils.IS_WINDOWS && Files.isExecutable(file) ? EXECUTABLE : 0;
try (InputStream in = Files.newInputStream(file)) {
return digestStream(in) | executable;
}
catch (IOException e) {
throw new IOException(path.toString(), e);
throw new IOException(file.toString(), e);
}
}
@@ -2,86 +2,72 @@
package com.intellij.updater;
import com.intellij.openapi.util.io.IoTestUtil;
import com.intellij.openapi.util.io.NioFiles;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.*;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.Assume.assumeFalse;
public class DigesterTest extends UpdaterTestCase {
@Test
public void testBasics() throws Exception {
File binDir = new File(dataDir, "bin"), libDir = new File(dataDir, "lib");
Path binDir = dataDir.toPath().resolve("bin"), libDir = dataDir.toPath().resolve("lib");
assertEquals(Digester.DIRECTORY, Digester.digestRegularFile(binDir));
assertEquals(Digester.DIRECTORY, Digester.digestRegularFile(libDir));
assertThat(Digester.digest(binDir)).isEqualTo(Digester.DIRECTORY);
assertThat(Digester.digest(libDir)).isEqualTo(Digester.DIRECTORY);
assertEquals(CHECKSUMS.README_TXT, Digester.digestRegularFile(new File(dataDir, "Readme.txt")));
assertEquals(CHECKSUMS.IDEA_BAT, Digester.digestRegularFile(new File(binDir, "idea.bat")));
assertEquals(CHECKSUMS.ANNOTATIONS_JAR, Digester.digestRegularFile(new File(libDir, "annotations.jar")));
assertEquals(CHECKSUMS.ANNOTATIONS_CHANGED_JAR, Digester.digestRegularFile(new File(libDir, "annotations_changed.jar")));
assertEquals(CHECKSUMS.BOOT_JAR, Digester.digestRegularFile(new File(libDir, "boot.jar")));
assertEquals(CHECKSUMS.BOOT_CHANGED_JAR, Digester.digestRegularFile(new File(libDir, "boot_with_directory_becomes_file.jar")));
assertEquals(CHECKSUMS.BOOTSTRAP_JAR, Digester.digestRegularFile(new File(libDir, "bootstrap.jar")));
assertEquals(CHECKSUMS.BOOTSTRAP_DELETED_JAR, Digester.digestRegularFile(new File(libDir, "bootstrap_deleted.jar")));
assertThat(Digester.digest(dataDir.toPath().resolve("Readme.txt"))).isEqualTo(CHECKSUMS.README_TXT);
assertThat(Digester.digest(binDir.resolve("idea.bat"))).isEqualTo(CHECKSUMS.IDEA_BAT);
assertThat(Digester.digest(libDir.resolve("annotations.jar"))).isEqualTo(CHECKSUMS.ANNOTATIONS_JAR);
assertThat(Digester.digest(libDir.resolve("annotations_changed.jar"))).isEqualTo(CHECKSUMS.ANNOTATIONS_CHANGED_JAR);
assertThat(Digester.digest(libDir.resolve("boot.jar"))).isEqualTo(CHECKSUMS.BOOT_JAR);
assertThat(Digester.digest(libDir.resolve("boot_with_directory_becomes_file.jar"))).isEqualTo(CHECKSUMS.BOOT_CHANGED_JAR);
assertThat(Digester.digest(libDir.resolve("bootstrap.jar"))).isEqualTo(CHECKSUMS.BOOTSTRAP_JAR);
assertThat(Digester.digest(libDir.resolve("bootstrap_deleted.jar"))).isEqualTo(CHECKSUMS.BOOTSTRAP_DELETED_JAR);
}
@Test
public void testHelpers() {
assertTrue(Digester.isFile(CHECKSUMS.README_TXT));
assertTrue(Digester.isFile(CHECKSUMS.ANNOTATIONS_JAR));
assertFalse(Digester.isFile(Digester.INVALID));
assertFalse(Digester.isFile(Digester.DIRECTORY));
assertThat(Digester.isFile(CHECKSUMS.README_TXT)).isTrue();
assertThat(Digester.isFile(CHECKSUMS.ANNOTATIONS_JAR)).isTrue();
assertThat(Digester.isFile(Digester.INVALID)).isFalse();
assertThat(Digester.isFile(Digester.DIRECTORY)).isFalse();
assertTrue(Digester.isSymlink(CHECKSUMS.LINK_TO_README_TXT));
assertFalse(Digester.isSymlink(CHECKSUMS.README_TXT));
assertFalse(Digester.isSymlink(Digester.INVALID));
assertFalse(Digester.isSymlink(Digester.DIRECTORY));
assertThat(Digester.isSymlink(CHECKSUMS.LINK_TO_README_TXT)).isTrue();
assertThat(Digester.isSymlink(CHECKSUMS.README_TXT)).isFalse();
assertThat(Digester.isSymlink(Digester.INVALID)).isFalse();
assertThat(Digester.isSymlink(Digester.DIRECTORY)).isFalse();
}
@Test
public void testSymlinks() throws Exception {
IoTestUtil.assumeSymLinkCreationIsSupported();
File simpleLink = getTempFile("Readme.simple.link");
Path link2 = simpleLink.toPath();
Path target2 = Paths.get("Readme.txt");
Files.createSymbolicLink(link2, target2);
File relativeLink = getTempFile("Readme.relative.link");
Path link1 = relativeLink.toPath();
Path target1 = Paths.get("./Readme.txt");
Files.createSymbolicLink(link1, target1);
File absoluteLink = getTempFile("Readme.absolute.link");
Path link = absoluteLink.toPath();
Path target = Paths.get(dataDir.getPath() + "/Readme.txt");
Files.createSymbolicLink(link, target);
Path simpleLink = Files.createSymbolicLink(getTempFile("Readme.simple.link").toPath(), Paths.get("Readme.txt"));
Path relativeLink = Files.createSymbolicLink(getTempFile("Readme.relative.link").toPath(), Paths.get("./Readme.txt"));
Path absoluteLink = Files.createSymbolicLink(getTempFile("Readme.absolute.link").toPath(), dataDir.toPath().resolve("Readme.txt"));
assertEquals(CHECKSUMS.LINK_TO_README_TXT, Digester.digestRegularFile(simpleLink));
assertEquals(CHECKSUMS.LINK_TO_DOT_README_TXT, Digester.digestRegularFile(relativeLink));
assertThat(Digester.digest(simpleLink)).isEqualTo(CHECKSUMS.LINK_TO_README_TXT);
assertThat(Digester.digest(relativeLink)).isEqualTo(CHECKSUMS.LINK_TO_DOT_README_TXT);
try {
Digester.digestRegularFile(absoluteLink);
fail("Absolute links should cause indigestion");
}
catch (IOException e) {
assertThat(e.getMessage()).startsWith("An absolute link");
}
assertThatThrownBy(() -> Digester.digest(absoluteLink))
.isInstanceOf(IOException.class)
.hasMessageStartingWith("An absolute link");
}
@Test
public void testExecutables() throws Exception {
assumeFalse("Windows-allergic", Utils.IS_WINDOWS);
File testFile = new File(tempDir.getRoot(), "idea.bat");
Utils.copy(new File(dataDir, "bin/idea.bat"), testFile, false);
assertEquals(CHECKSUMS.IDEA_BAT, Digester.digestRegularFile(testFile));
Utils.setExecutable(testFile);
assertEquals(CHECKSUMS.IDEA_BAT | Digester.EXECUTABLE, Digester.digestRegularFile(testFile));
Path testFile = Files.copy(dataDir.toPath().resolve("bin/idea.bat"), tempDir.getRoot().toPath().resolve("idea.bat"));
assertThat(Digester.digest(testFile)).isEqualTo(CHECKSUMS.IDEA_BAT);
NioFiles.setExecutable(testFile);
assertThat(Digester.digest(testFile)).isEqualTo(CHECKSUMS.IDEA_BAT | Digester.EXECUTABLE);
}
}