GitHub86MissingDataTest.java

package com.github.junrar.bugfixes;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import com.github.junrar.rarfile.HostSystem;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.time.Instant;
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

/*
Test cases for https://github.com/junrar/junrar/issues/86
 */
public class GitHub86MissingDataTest {

    /*
    Data taken from UnRAR
     */
    private static final String[] names = {
            "bushido_red/.readme",
            "bushido_red/appearance/footer.php",
            "bushido_red/appearance/footermsword.php",
            "bushido_red/appearance/footerprint.php",
            "bushido_red/appearance/header.php",
            "bushido_red/appearance/headermsword.php",
            "bushido_red/appearance/headerprint.php",
            "bushido_red/appearance",
            "bushido_red/css/.htaccess",
            "bushido_red/css/wakkamsword.css",
            "bushido_red/css/wakkaprint.css",
            "bushido_red/css/wakkastyle.css",
            "bushido_red/css",
            "bushido_red/icons/.htaccess",
            "bushido_red/icons/1del.gif",
            "bushido_red/icons/1print.gif",
            "bushido_red/icons/1unvisibl.gif",
            "bushido_red/icons/file.gif",
            "bushido_red/icons/key.gif",
            "bushido_red/icons/lock.gif",
            "bushido_red/icons/login.gif",
            "bushido_red/icons/login1.gif",
            "bushido_red/icons/mail.gif",
            "bushido_red/icons/referer.gif",
            "bushido_red/icons/rename.gif",
            "bushido_red/icons/toolbar1.gif",
            "bushido_red/icons/toolbar2.gif",
            "bushido_red/icons/visibl.gif",
            "bushido_red/icons/wacko.ico",
            "bushido_red/icons/web.gif",
            "bushido_red/icons/xml.gif",
            "bushido_red/icons",
            "bushido_red/images/banner-red-w-text.jpg",
            "bushido_red/images/banner-red-wo-text.jpg",
            "bushido_red/images/footer-red.jpg",
            "bushido_red/images",
            "bushido_red/lang/wakka.bg.php",
            "bushido_red/lang/wakka.de.php",
            "bushido_red/lang/wakka.en.php",
            "bushido_red/lang/wakka.es.php",
            "bushido_red/lang/wakka.fr.php",
            "bushido_red/lang/wakka.it.php",
            "bushido_red/lang/wakka.nl.php",
            "bushido_red/lang/wakka.ru.php",
            "bushido_red/lang",
            "bushido_red",
    };

    /*
    Data taken from UnRAR
     */
    private static final String[] times = new String[]{
            "2006-03-11T15:50:25.664526400Z",
            "2006-03-11T10:50:00.000000000Z",
            "2006-03-11T10:50:00.000000000Z",
            "2006-03-11T10:50:00.000000000Z",
            "2006-03-11T15:36:01.000000000Z",
            "2006-03-11T10:50:00.000000000Z",
            "2006-03-11T10:50:00.000000000Z",
            "2006-03-11T15:36:43.281998400Z",
            "2006-03-11T10:50:00.000000000Z",
            "2006-03-11T10:50:00.000000000Z",
            "2006-03-11T10:50:00.985487400Z",
            "2006-03-11T15:52:00.000000000Z",
            "2006-03-11T15:52:59.095148800Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:01.377142800Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.262144000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.865646600Z",
            "2006-03-11T09:48:09.419832000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.583270400Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:49:07.980584000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T10:51:02.031449600Z",
            "2006-03-11T10:51:00.000000000Z",
            "2006-03-11T09:48:10.200955200Z",
            "2006-03-11T09:48:10.200955200Z",
    };

    @Test
    public void testCorruptExtendedTimeData() throws Exception {
        File f = new File(getClass().getResource("gh-86-missing-data.rar").toURI());
        try (Archive archive = new Archive(f)) {
            assertThat(archive.isPasswordProtected()).isFalse();
            assertThat(archive.isEncrypted()).isFalse();

            List<FileHeader> fileHeaders = archive.getFileHeaders();

            assertThat(fileHeaders.size()).isEqualTo(names.length);

            for (int i = 0; i < fileHeaders.size(); i++) {
                FileHeader hd = fileHeaders.get(i);
                assertThat(hd.getFileName().replace('\\', '/')).isEqualTo(names[i]);
                assertThat(hd.getHostOS()).isEqualTo(HostSystem.win32);
                assertThat(hd.getLastAccessTime()).isNull();
                assertThat(hd.getCreationTime()).isNull();
                assertThat(hd.getArchivalTime()).isNull();
                assertThat(hd.getLastModifiedTime()).isNotNull();
                Instant time = Instant.parse(times[i]);
                assertThat(hd.getLastModifiedTime().toInstant().getNano()).isEqualTo(time.getNano());
            }
        }
    }
}