/* * Copyright (C) 2014 Indeed Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package com.indeed.imhotep.io.caching; import static org.junit.Assert.*; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; /** * Unit test for S3CachedFileSystem */ public class SqarTest { private static List<Map<String,Object>> testSettings; @BeforeClass public static void init() throws IOException { testSettings = new ArrayList<Map<String,Object>>(); Map<String,Object> s3layer = new HashMap<String,Object>(); s3layer.put("type", "SQAR_AUTOMOUNTING"); s3layer.put("order", 2); s3layer.put("mountpoint", "/"); testSettings.add(s3layer); Map<String,Object> cachelayer = new HashMap<String,Object>(); cachelayer.put("type", "CACHED"); cachelayer.put("order", 3); cachelayer.put("mountpoint", "/"); cachelayer.put("cache-dir", "/tmp/sqar_test_temp_cache"); cachelayer.put("cacheSizeMB", 500); testSettings.add(cachelayer); CachedFile.init(testSettings, "testData/", false); } @AfterClass public static void cleanup() throws IOException { CachedFile.init(null, "/", true); } @Test public void testSqarExists() throws IOException { boolean result; CachedFile target; target = CachedFile.create("testData/"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); target = CachedFile.create("testData"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); target = CachedFile.create("testData/test-archive/"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); target = CachedFile.create("testData/test-archive"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); target = CachedFile.create("testData/test-archive/1/2/3"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); target = CachedFile.create("testData/test-archive/1/2/3/"); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/test-archive/1"); result = target.isFile(); assertFalse(result); result = target.isDirectory(); assertTrue(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/test-archive/1/"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); target = CachedFile.create("testData/test-archive/1/2/3/4/5/"); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/test-archive/1/2/3/4/5/12345.file"); result = target.isDirectory(); assertFalse(result); result = target.isFile(); assertTrue(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/test-archive/1/2/3/4/1234.file"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertFalse(result); result = target.isFile(); assertTrue(result); target = CachedFile.create("testData/test-archive/3/4/5/345.file"); result = target.isDirectory(); assertFalse(result); result = target.isFile(); assertTrue(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/test-archive/4/5/45.file"); result = target.isFile(); assertTrue(result); result = target.isDirectory(); assertFalse(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/test-archive/6"); result = target.isFile(); assertFalse(result); result = target.isDirectory(); assertFalse(result); result = target.exists(); assertFalse(result); } @Test public void testSqarListDirectory() throws IOException { String[] result; CachedFile target; String[] dir0 = {"1", "2", "3", "4", "5", "test-archive"}; String[] dir123 = {"4", "123.file"}; String[] dir1 = {"1", "2", "1.file"}; String[] dir11 = new String[2502]; for (int i = 0; i < 2500; i++) { dir11[i] = Integer.toString(i) + ".file"; } dir11[2500] = "2"; dir11[2501] = "3"; Arrays.sort(dir123); Arrays.sort(dir1); Arrays.sort(dir11); target = CachedFile.create("testData"); result = target.list(); Arrays.sort(result); assertNotNull(result); assertArrayEquals(dir0, result); target = CachedFile.create("testData/test-archive/1/2/3"); result = target.list(); Arrays.sort(result); assertNotNull(result); assertArrayEquals(dir123, result); target = CachedFile.create("testData/test-archive/1/2/3/"); result = target.list(); Arrays.sort(result); assertNotNull(result); assertArrayEquals(dir123, result); target = CachedFile.create("testData/test-archive/1"); result = target.list(); assertNotNull(result); Arrays.sort(result); assertArrayEquals(dir1, result); target = CachedFile.create("testData/test-archive/1/"); result = target.list(); assertNotNull(result); Arrays.sort(result); assertArrayEquals(dir1, result); target = CachedFile.create("testData/test-archive/1/2/3/4/5/12345.file"); result = target.list(); assertNull(result); target = CachedFile.create("testData/test-archive/1/2/3/4/1234.file"); result = target.list(); assertNull(result); target = CachedFile.create("testData/test-archive/3/4/5/345.file"); result = target.list(); assertNull(result); target = CachedFile.create("testData/test-archive/4/5/45.file"); result = target.list(); assertNull(result); target = CachedFile.create("testData/test-archive/6"); result = target.list(); assertNull(result); target = CachedFile.create("testData/test-archive/1/1/"); result = target.list(); assertNotNull(result); Arrays.sort(result); assertArrayEquals(dir11, result); } @Test public void testSqarLoadFile() throws IOException { File result = null; CachedFile target; boolean sawException; sawException = false; result = null; try { target = CachedFile.create("testData/test-archive/1/2/3"); result = target.loadFile(); } catch (IOException e) { sawException = true; } assertNull(result); assertTrue(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/test-archive/1"); result = target.loadFile(); } catch (IOException e) { sawException = true; } assertNull(result); assertTrue(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/test-archive/1/"); result = target.loadFile(); } catch (IOException e) { sawException = true; } assertNull(result); assertTrue(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/test-archive/1/2/3/4/5/12345.file"); result = target.loadFile(); int data; FileReader fis = null; String expected = ""; try { for (int i = 0; i< 12345; i ++) { expected += "foo!"; } fis = new FileReader(result); for (int i = 0; i < expected.length(); i++) { data = fis.read(); assert(data == expected.charAt(i)); } assert(fis.read() == -1); } finally { fis.close(); } } catch (IOException e) { sawException = true; } assertNotNull(result); assertFalse(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/test-archive/1/2/3/4/1234.file"); result = target.loadFile(); int data; FileReader fis = null; String expected = ""; try { for (int i = 0; i< 1234; i ++) { expected += "foo!"; } fis = new FileReader(result); for (int i = 0; i < expected.length(); i++) { data = fis.read(); assert(data == expected.charAt(i)); } assert(fis.read() == -1); } finally { fis.close(); } } catch (IOException e) { sawException = true; } assertNotNull(result); assertFalse(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/test-archive/3/4/5/345.file"); result = target.loadFile(); int data; FileReader fis = null; String expected = ""; try { for (int i = 0; i< 345; i ++) { expected += "foo!"; } fis = new FileReader(result); for (int i = 0; i < expected.length(); i++) { data = fis.read(); assert(data == expected.charAt(i)); } assert(fis.read() == -1); } finally { fis.close(); } } catch (IOException e) { sawException = true; } assertNotNull(result); assertFalse(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/test-archive/4/5/45.file"); result = target.loadFile(); int data; FileReader fis = null; String expected = ""; try { for (int i = 0; i< 45; i ++) { expected += "foo!"; } fis = new FileReader(result); for (int i = 0; i < expected.length(); i++) { data = fis.read(); assert(data == expected.charAt(i)); } assert(fis.read() == -1); } finally { fis.close(); } } catch (IOException e) { sawException = true; } assertNotNull(result); assertFalse(sawException); } @Test public void testSqarLoadDirectory() throws IOException { File result; boolean bresult; CachedFile target; target = CachedFile.create("testData/test-archive/1/2/3"); bresult = target.exists(); assertTrue(bresult); result = target.loadDirectory(); assertNotNull(result); } @Test public void testExists() throws IOException { boolean result; CachedFile target; target = CachedFile.create("testData/1/2/3"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); target = CachedFile.create("testData/1/2/3/"); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/1"); result = target.isFile(); assertFalse(result); result = target.isDirectory(); assertTrue(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/1/"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); target = CachedFile.create("testData/1/2/3/4/5/"); result = target.isDirectory(); assertTrue(result); result = target.isFile(); assertFalse(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/1/2/3/4/5/12345.file"); result = target.isDirectory(); assertFalse(result); result = target.isFile(); assertTrue(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/1/2/3/4/1234.file"); result = target.exists(); assertTrue(result); result = target.isDirectory(); assertFalse(result); result = target.isFile(); assertTrue(result); target = CachedFile.create("testData/3/4/5/345.file"); result = target.isDirectory(); assertFalse(result); result = target.isFile(); assertTrue(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/4/5/45.file"); result = target.isFile(); assertTrue(result); result = target.isDirectory(); assertFalse(result); result = target.exists(); assertTrue(result); target = CachedFile.create("testData/6"); result = target.isFile(); assertFalse(result); result = target.isDirectory(); assertFalse(result); result = target.exists(); assertFalse(result); } @Test public void testLoadFile() throws IOException { File result = null; CachedFile target; boolean sawException; sawException = false; result = null; try { target = CachedFile.create("testData/1/2/3"); result = target.loadFile(); } catch (IOException e) { sawException = true; } assertNull(result); assertTrue(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/1"); result = target.loadFile(); } catch (IOException e) { sawException = true; } assertNull(result); assertTrue(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/1/"); result = target.loadFile(); } catch (IOException e) { sawException = true; } assertNull(result); assertTrue(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/1/2/3/4/5/12345.file"); result = target.loadFile(); int data; FileReader fis = null; String expected = ""; try { for (int i = 0; i< 12345; i ++) { expected += "foo!"; } fis = new FileReader(result); for (int i = 0; i < expected.length(); i++) { data = fis.read(); assert(data == expected.charAt(i)); } assert(fis.read() == -1); } finally { fis.close(); } } catch (IOException e) { sawException = true; } assertNotNull(result); assertFalse(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/1/2/3/4/1234.file"); result = target.loadFile(); int data; FileReader fis = null; String expected = ""; try { for (int i = 0; i< 1234; i ++) { expected += "foo!"; } fis = new FileReader(result); for (int i = 0; i < expected.length(); i++) { data = fis.read(); assert(data == expected.charAt(i)); } assert(fis.read() == -1); } finally { fis.close(); } } catch (IOException e) { sawException = true; } assertNotNull(result); assertFalse(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/3/4/5/345.file"); result = target.loadFile(); int data; FileReader fis = null; String expected = ""; try { for (int i = 0; i< 345; i ++) { expected += "foo!"; } fis = new FileReader(result); for (int i = 0; i < expected.length(); i++) { data = fis.read(); assert(data == expected.charAt(i)); } assert(fis.read() == -1); } finally { fis.close(); } } catch (IOException e) { sawException = true; } assertNotNull(result); assertFalse(sawException); sawException = false; result = null; try { target = CachedFile.create("testData/4/5/45.file"); result = target.loadFile(); int data; FileReader fis = null; String expected = ""; try { for (int i = 0; i< 45; i ++) { expected += "foo!"; } fis = new FileReader(result); for (int i = 0; i < expected.length(); i++) { data = fis.read(); assert(data == expected.charAt(i)); } assert(fis.read() == -1); } finally { fis.close(); } } catch (IOException e) { sawException = true; } assertNotNull(result); assertFalse(sawException); } @Test public void testListDirectory() throws IOException { String[] result; CachedFile target; String[] dir123 = {"4", "123.file"}; String[] dir1 = {"1", "2", "1.file"}; String[] dir11 = new String[2502]; for (int i = 0; i < 2500; i++) { dir11[i] = Integer.toString(i) + ".file"; } dir11[2500] = "2"; dir11[2501] = "3"; Arrays.sort(dir123); Arrays.sort(dir1); Arrays.sort(dir11); target = CachedFile.create("testData/1/2/3"); result = target.list(); Arrays.sort(result); assertNotNull(result); assertArrayEquals(dir123, result); target = CachedFile.create("testData/1/2/3/"); result = target.list(); Arrays.sort(result); assertNotNull(result); assertArrayEquals(dir123, result); target = CachedFile.create("testData/1"); result = target.list(); assertNotNull(result); Arrays.sort(result); assertArrayEquals(dir1, result); target = CachedFile.create("testData/1/"); result = target.list(); assertNotNull(result); Arrays.sort(result); assertArrayEquals(dir1, result); target = CachedFile.create("testData/1/2/3/4/5/12345.file"); result = target.list(); assertNull(result); target = CachedFile.create("testData/1/2/3/4/1234.file"); result = target.list(); assertNull(result); target = CachedFile.create("testData/3/4/5/345.file"); result = target.list(); assertNull(result); target = CachedFile.create("testData/4/5/45.file"); result = target.list(); assertNull(result); target = CachedFile.create("testData/6"); result = target.list(); assertNull(result); target = CachedFile.create("testData/1/1/"); result = target.list(); assertNotNull(result); Arrays.sort(result); assertArrayEquals(dir11, result); } @Test public void testListFiles() throws IOException { CachedFile[] result; String[] fnames; CachedFile target; String[] dir123 = {"testData/1/2/3/4", "testData/1/2/3/123.file"}; String[] dir1 = {"testData/1/1", "testData/1/2", "testData/1/1.file"}; String[] dir11 = new String[2502]; for (int i = 0; i < 2500; i++) { dir11[i] = "testData/1/1/" + Integer.toString(i) + ".file"; } dir11[2500] = "testData/1/1/2"; dir11[2501] = "testData/1/1/3"; Arrays.sort(dir123); Arrays.sort(dir1); Arrays.sort(dir11); target = CachedFile.create("testData/1/2/3"); result = target.listFiles(); fnames = new String[result.length]; for (int i = 0; i < result.length; i++) { CachedFile f = result[i]; fnames[i] = f.getCanonicalPath(); } Arrays.sort(fnames); assertNotNull(result); assertArrayEquals(dir123, fnames); target = CachedFile.create("testData/1/2/3/"); result = target.listFiles(); fnames = new String[result.length]; for (int i = 0; i < result.length; i++) { CachedFile f = result[i]; fnames[i] = f.getCanonicalPath(); } Arrays.sort(fnames); assertNotNull(result); assertArrayEquals(dir123, fnames); target = CachedFile.create("testData/1"); result = target.listFiles(); assertNotNull(result); fnames = new String[result.length]; for (int i = 0; i < result.length; i++) { CachedFile f = result[i]; fnames[i] = f.getCanonicalPath(); } Arrays.sort(fnames); assertArrayEquals(dir1, fnames); target = CachedFile.create("testData/1/"); result = target.listFiles(); assertNotNull(result); fnames = new String[result.length]; for (int i = 0; i < result.length; i++) { CachedFile f = result[i]; fnames[i] = f.getCanonicalPath(); } Arrays.sort(fnames); assertArrayEquals(dir1, fnames); target = CachedFile.create("testData/1/2/3/4/5/12345.file"); result = target.listFiles(); assertNull(result); target = CachedFile.create("testData/1/2/3/4/1234.file"); result = target.listFiles(); assertNull(result); target = CachedFile.create("testData/3/4/5/345.file"); result = target.listFiles(); assertNull(result); target = CachedFile.create("testData/4/5/45.file"); result = target.listFiles(); assertNull(result); target = CachedFile.create("testData/6"); result = target.listFiles(); assertNull(result); target = CachedFile.create("testData/1/1/"); result = target.listFiles(); assertNotNull(result); fnames = new String[result.length]; for (int i = 0; i < result.length; i++) { CachedFile f = result[i]; fnames[i] = f.getCanonicalPath(); } Arrays.sort(fnames); assertArrayEquals(dir11, fnames); } @Test public void testCacheRemove() throws IOException { // client.putObject(s3bucket, "1/1/2/112.file", dataFile); // client.putObject(s3bucket, "1/1/3/113.file", dataFile); } }