Sfoglia il codice sorgente

test: CFileHandler
fix: CJarHandler#scan

Ranides Atterwim 9 anni fa
parent
commit
7e034fcfe6

+ 28 - 26
assira/src/main/java/net/ranides/assira/io/uri/impl/CFileHandler.java

@@ -133,34 +133,36 @@ public class CFileHandler implements URIHandler {
         
         @Override
         public Set<URIFlags> flags() throws IOException {
-            BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
             Set<URIFlags> flags = URIFlags.collect();
 
-            // @todo (assira #3) CFileHandler: test
-            // @todo (assira #3) CFileHandler: URIFlags.EXISTS
-            
-            if(attr.isDirectory()) {
-                flags.add(URIFlags.DIR);
-                flags.add(URIFlags.EXISTS);
-            }
-            if(attr.isRegularFile()) {
-                flags.add(URIFlags.FILE);
-                flags.add(URIFlags.SIZE);
-                flags.add(URIFlags.SEEK);
-            }
-            if(Files.isReadable(path)) {
-                flags.add(URIFlags.READABLE);
-            }
-            if(Files.isWritable(path)) {
-                flags.add(URIFlags.WRITABLE);
-            }
-            if(Files.isExecutable(path)) {
-                flags.add(URIFlags.EXECUTE);
-            }
-            if(text) {
-                flags.add(URIFlags.TEXT);
-            } else {
-                flags.add(URIFlags.BINARY);
+            try {
+                BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
+
+                if (attr.isDirectory()) {
+                    flags.add(URIFlags.DIR);
+                    flags.add(URIFlags.EXISTS);
+                }
+                if (attr.isRegularFile()) {
+                    flags.add(URIFlags.FILE);
+                    flags.add(URIFlags.SIZE);
+                    flags.add(URIFlags.SEEK);
+                }
+                if (Files.isReadable(path)) {
+                    flags.add(URIFlags.READABLE);
+                }
+                if (Files.isWritable(path)) {
+                    flags.add(URIFlags.WRITABLE);
+                }
+                if (Files.isExecutable(path)) {
+                    flags.add(URIFlags.EXECUTE);
+                }
+                if (text) {
+                    flags.add(URIFlags.TEXT);
+                } else {
+                    flags.add(URIFlags.BINARY);
+                }
+            } catch (IOException _ignore) {
+                // do nothing
             }
             return flags;
         }

+ 4 - 1
assira/src/main/java/net/ranides/assira/io/uri/impl/CJarHandler.java

@@ -12,6 +12,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
 import java.nio.charset.Charset;
+import java.nio.file.NotDirectoryException;
 import java.nio.file.attribute.FileTime;
 import java.time.Instant;
 import java.util.Arrays;
@@ -31,7 +32,6 @@ import net.ranides.assira.text.StringTraits;
 import net.ranides.assira.text.StringUtils;
 
 
-// @todo (assira #1) uri: JAR Handler
 public class CJarHandler implements URIHandler {
     
     private final JARManager man = new JARManager();
@@ -189,6 +189,9 @@ public class CJarHandler implements URIHandler {
         
         @Override
         public CQuery<URIHandle> scan() throws IOException {
+            if(!file.isEmpty() && !info().isDirectory() ) {
+                throw new NotDirectoryException(file);
+            }
             return CQueryBuilder
                 .fromStream(() -> man.shared(jar).stream().filter(e -> isChildren(StringUtils.trim(file,'/'), e)))
                 .map(e -> new CJarHandle(jar, e.getName()));

+ 121 - 0
assira/src/test/java/net/ranides/assira/io/uri/impl/CFileHandleTest.java

@@ -0,0 +1,121 @@
+package net.ranides.assira.io.uri.impl;
+
+import net.ranides.assira.ContractTesters;
+import net.ranides.assira.io.uri.*;
+import net.ranides.assira.text.IOStrings;
+import net.ranides.assira.trace.ExceptionUtils;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+
+import static net.ranides.assira.io.uri.URIFlags.*;
+import static net.ranides.assira.junit.NewAssert.assertThrows;
+import static org.junit.Assert.*;
+
+/**
+ * @author msieron
+ */
+public class CFileHandleTest {
+
+    private static URIHandle resolve(URI uri) throws IOException {
+        return new CFileHandler().resolve(uri);
+    }
+
+    private static URIBuilder uri(String file) {
+        return new URIBuilder(new File(file).toURI());
+    }
+
+    @Test
+    public void testTime() throws URISyntaxException, IOException {
+        URI uri1 = uri("../assira.test/src/main/resources/text").build();
+        URI uri2 = uri("../assira.test/src/main/resources/text/info.txt").build();
+
+        URIHandle handle1 = resolve(uri1);
+        URIHandle handle2 = resolve(uri2);
+
+        assertNotNull(handle1.time(URITime.MODIFIED));
+        assertNotNull(handle1.time(URITime.ACCESSED));
+        assertNotNull(handle1.time(URITime.CREATED));
+
+        assertNotNull(handle2.time(URITime.MODIFIED));
+        assertNotNull(handle2.time(URITime.ACCESSED));
+        assertNotNull(handle2.time(URITime.CREATED));
+
+
+        assertThrows(UnsupportedOperationException.class, () -> {
+            handle1.time(URITime.META_MODIFIED);
+        });
+
+        assertThrows(UnsupportedOperationException.class, () -> {
+            handle2.time(URITime.META_MODIFIED);
+        });
+
+        handle1.close();
+        handle2.close();
+    }
+
+    @Test
+    public void testBasic() throws URISyntaxException, IOException {
+
+        URI uri1 = uri("..").build();
+        URI uri2 = uri("../assira.test/src/main/resources/text").build();
+        URI uri3 = uri("../assira.test/src/main/resources/text/info.txt").build();
+        URI uri4 = uri("../assira.test/src/main/java/net/ranides/assira/test").build();
+        URI uri5 = uri("not-found").build();
+        URI uri6 = uri("../assira.test/src/main/resources/text/info.txt").param("charset","UTF-8").build();
+
+        URIHandle handle1 = resolve(uri1);
+        URIHandle handle2 = resolve(uri2);
+        URIHandle handle3 = resolve(uri3);
+        URIHandle handle4 = resolve(uri4);
+        URIHandle handle5 = resolve(uri5);
+        URIHandle handle6 = resolve(uri6);
+
+        assertEquals(11, handle3.size());
+        assertTrue(handle3.flags().containsAll(
+            URIFlags.collect(READABLE, WRITABLE, FILE, BINARY, SIZE, SEEK)
+        ));
+        assertEquals("Hello world", IOStrings.read(handle3.reader()));
+
+        assertEquals(11, handle6.size());
+        assertTrue(handle6.flags().containsAll(
+            URIFlags.collect(READABLE, WRITABLE, FILE, TEXT, SIZE, SEEK)
+        ));
+        assertEquals("Hello world", IOStrings.read(handle6.reader()));
+
+        assertEquals(17, handle1.scan().size());
+        assertEquals(Arrays.asList("text"), handle3.parent().parent().scan().map(f-> asName(f)).sort().list());
+        assertEquals(Arrays.asList("info.txt"), handle2.scan().map(f-> asName(f)).sort().list());
+        assertThrows(IOException.class, ()->{
+            handle3.scan().list();
+        });
+        assertEquals(7, handle4.scan().map(f-> asName(f)).size());
+
+        assertEquals(URIFlags.collect(READABLE, WRITABLE, EXECUTE, EXISTS, DIR, BINARY), handle2.flags());
+        assertEquals(0, handle2.size());
+        assertTrue(handle2.exists());
+
+        assertEquals(URIFlags.collect(), handle5.flags());
+        assertFalse(handle5.exists());
+
+        handle1.close();
+        handle2.close();
+        handle3.close();
+        handle4.close();
+        handle5.close();
+    }
+
+    private String asName(URIHandle handle) {
+        try {
+            return handle.file().getName().toString();
+        } catch (IOException e) {
+            throw ExceptionUtils.rethrow(e);
+        }
+    }
+
+}

+ 3 - 1
assira/src/test/java/net/ranides/assira/io/uri/impl/CJarHandlerTest.java

@@ -92,7 +92,9 @@ public class CJarHandlerTest {
         assertEquals(Arrays.asList("META-INF/", "net/", "text/"), handle1.scan().map(f-> asName(f)).sort().list());
         assertEquals(Arrays.asList("META-INF/", "net/", "text/"), handle3.parent().parent().scan().map(f-> asName(f)).sort().list());
         assertEquals(Arrays.asList("text/info.txt"), handle2.scan().map(f-> asName(f)).sort().list());
-        assertEquals(Arrays.asList(), handle3.scan().map(f-> asName(f)).sort().list());
+        assertThrows(IOException.class, ()->{
+            handle3.scan().list();
+        });
         assertEquals(7, handle4.scan().map(f-> asName(f)).size());
 
         assertEquals(URIFlags.collect(URIFlags.DIR), handle2.flags());