Index: libadblockplus-android-tests/src/org/adblockplus/libadblockplus/tests/AndroidFileSystemTest.java |
diff --git a/libadblockplus-android-tests/src/org/adblockplus/libadblockplus/tests/AndroidFileSystemTest.java b/libadblockplus-android-tests/src/org/adblockplus/libadblockplus/tests/AndroidFileSystemTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8b693ac8f59709c320ebf5ea8851063d018f2548 |
--- /dev/null |
+++ b/libadblockplus-android-tests/src/org/adblockplus/libadblockplus/tests/AndroidFileSystemTest.java |
@@ -0,0 +1,432 @@ |
+/* |
+ * This file is part of Adblock Plus <https://adblockplus.org/>, |
+ * Copyright (C) 2006-2017 eyeo GmbH |
+ * |
+ * Adblock Plus is free software: you can redistribute it and/or modify |
+ * it under the terms of the GNU General Public License version 3 as |
+ * published by the Free Software Foundation. |
+ * |
+ * Adblock Plus is distributed in the hope that it will be useful, |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ * GNU General Public License for more details. |
+ * |
+ * You should have received a copy of the GNU General Public License |
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
+ */ |
+ |
+package org.adblockplus.libadblockplus.tests; |
+ |
+import android.os.SystemClock; |
+import android.test.AndroidTestCase; |
+import android.util.Log; |
+ |
+import org.adblockplus.libadblockplus.AdblockPlusException; |
+import org.adblockplus.libadblockplus.AppInfo; |
+import org.adblockplus.libadblockplus.FileSystem; |
+import org.adblockplus.libadblockplus.FileSystemUtils; |
+import org.adblockplus.libadblockplus.FilterEngine; |
+import org.adblockplus.libadblockplus.JsEngine; |
+import org.adblockplus.libadblockplus.android.AndroidFileSystem; |
+import org.adblockplus.libadblockplus.android.AndroidWebRequest; |
+import org.adblockplus.libadblockplus.android.Utils; |
+import org.junit.Test; |
+ |
+import java.io.File; |
+import java.io.IOException; |
+import java.util.Arrays; |
+ |
+import static org.adblockplus.libadblockplus.FileSystemUtils.byteFromInt; |
+ |
+public class AndroidFileSystemTest extends AndroidTestCase |
+{ |
+ private static final String TAG = Utils.getTag(AndroidFileSystemTest.class); |
+ |
+ protected static final String TEXT_DATA = "12345qwerty"; |
+ protected static final byte[] EMPTY_DATA_BYTES = {}; |
+ protected static final byte[] TEXT_DATA_BYTES = TEXT_DATA.getBytes(); |
+ protected static final byte[] BINARY_DATA_BYTES = new byte[] |
+ { |
+ byteFromInt(1), |
+ byteFromInt(2), |
+ byteFromInt(3) |
+ }; |
+ |
+ protected final FileSystemUtils fileSystemUtils = new FileSystemUtils(); |
+ protected File basePathFile; |
+ protected AndroidFileSystem fileSystem; |
+ |
+ @Override |
+ protected void setUp() throws Exception |
+ { |
+ String tmpFolder = FileSystemUtils.generateUniqueFileName("tmp", null); |
+ basePathFile = new File(getContext().getCacheDir(), tmpFolder); |
+ basePathFile.mkdirs(); |
+ |
+ fileSystem = new AndroidFileSystem(basePathFile); |
+ } |
+ |
+ protected String generateUniqueFilename() |
+ { |
+ return fileSystemUtils.generateUniqueFileName("file", ".tmp"); |
+ } |
+ |
+ protected File getFullPath(String path) |
+ { |
+ return new File(fileSystem.getBasePath(), path); |
+ } |
+ |
+ @Test |
+ public void testWriteReadBinaryFile() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ fileSystem.write(resolvedPath, BINARY_DATA_BYTES); |
+ |
+ assertTrue(file.exists()); |
+ assertTrue(Arrays.equals(BINARY_DATA_BYTES, fileSystemUtils.readFile(file))); |
+ |
+ byte[] data = fileSystem.read(resolvedPath); |
+ assertNotNull(data); |
+ assertTrue(Arrays.equals(BINARY_DATA_BYTES, data)); |
+ } |
+ |
+ @Test |
+ public void testWriteNullFile() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ fileSystem.write(resolvedPath, null); |
+ |
+ assertTrue(file.exists()); |
+ assertTrue(Arrays.equals(EMPTY_DATA_BYTES, fileSystemUtils.readFile(file))); |
+ } |
+ |
+ @Test |
+ public void testWriteEmptyFile() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ fileSystem.write(resolvedPath, EMPTY_DATA_BYTES); |
+ |
+ assertTrue(file.exists()); |
+ assertTrue(Arrays.equals(EMPTY_DATA_BYTES, fileSystemUtils.readFile(file))); |
+ } |
+ |
+ @Test |
+ public void testWriteInvalidPath() |
+ { |
+ String path = "notExistingDirectory/" + generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ File notExistingDirectoryFile = file.getParentFile(); |
+ assertFalse(notExistingDirectoryFile.exists()); |
+ |
+ try |
+ { |
+ fileSystem.write(resolvedPath, TEXT_DATA_BYTES); |
+ fail("Exception should be thrown"); |
+ } |
+ catch (AdblockPlusException e) |
+ { |
+ // ignored |
+ } |
+ } |
+ |
+ @Test |
+ public void testWriteSingleLineData() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ final String singleLineData = TEXT_DATA.replace("\n", ""); |
+ fileSystem.write(resolvedPath, singleLineData.getBytes()); |
+ |
+ assertTrue(file.exists()); |
+ assertTrue(Arrays.equals(singleLineData.getBytes(), fileSystemUtils.readFile(file))); |
+ } |
+ |
+ @Test |
+ public void testWriteMultiLineData() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ final String multiLineData = TEXT_DATA + "\n" + TEXT_DATA; |
+ fileSystem.write(resolvedPath, multiLineData.getBytes()); |
+ |
+ assertTrue(file.exists()); |
+ assertTrue(Arrays.equals(multiLineData.getBytes(), fileSystemUtils.readFile(file))); |
+ } |
+ |
+ @Test |
+ public void testReadEmptyFile() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ fileSystemUtils.writeFile(file, EMPTY_DATA_BYTES); |
+ assertTrue(file.exists()); |
+ |
+ assertTrue(Arrays.equals(EMPTY_DATA_BYTES, fileSystem.read(resolvedPath))); |
+ } |
+ |
+ @Test |
+ public void testReadSingleLineData() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ final String singleLineData = TEXT_DATA.replace("\n", ""); |
+ fileSystemUtils.writeFile(file, singleLineData.getBytes()); |
+ assertTrue(file.exists()); |
+ |
+ assertTrue(Arrays.equals(singleLineData.getBytes(), fileSystem.read(resolvedPath))); |
+ } |
+ |
+ @Test |
+ public void testReadMultiLineData() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ final String multiLineData = TEXT_DATA + "\n" + TEXT_DATA; |
+ fileSystemUtils.writeFile(file, multiLineData.getBytes()); |
+ assertTrue(file.exists()); |
+ |
+ assertTrue(Arrays.equals(multiLineData.getBytes(), fileSystem.read(resolvedPath))); |
+ } |
+ |
+ @Test |
+ public void testMoveExistingFile() throws IOException |
+ { |
+ String fromPath = generateUniqueFilename(); |
+ String resolvedFromPath= fileSystem.resolve(fromPath); |
+ File fromFile = getFullPath(fromPath); |
+ String toPath = generateUniqueFilename(); |
+ String resolvedToPath = fileSystem.resolve(toPath); |
+ File toFile = getFullPath(toPath); |
+ fileSystemUtils.writeFile(fromFile, TEXT_DATA_BYTES); |
+ |
+ assertTrue(fromFile.exists()); |
+ assertFalse(toFile.exists()); |
+ |
+ fileSystem.move(resolvedFromPath, resolvedToPath); |
+ |
+ assertFalse(fromFile.exists()); |
+ assertTrue(toFile.exists()); |
+ assertTrue(Arrays.equals(TEXT_DATA_BYTES, fileSystemUtils.readFile(toFile))); |
+ } |
+ |
+ @Test |
+ public void testMoveNotExistingFile() |
+ { |
+ String fromPath = generateUniqueFilename(); |
+ String resolvedFromPath = fileSystem.resolve(fromPath); |
+ File fromFile = getFullPath(fromPath); |
+ String toPath = generateUniqueFilename(); |
+ String resolvedToPath = fileSystem.resolve(toPath); |
+ assertFalse(fromFile.exists()); |
+ |
+ try |
+ { |
+ fileSystem.move(resolvedFromPath, resolvedToPath); |
+ fail("Exception should be thrown"); |
+ } |
+ catch (AdblockPlusException e) |
+ { |
+ // ignored |
+ } |
+ } |
+ |
+ @Test |
+ public void testRemoveExistingFile() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ fileSystemUtils.writeFile(file, TEXT_DATA_BYTES); |
+ |
+ assertTrue(file.exists()); |
+ fileSystem.remove(resolvedPath); |
+ assertFalse(file.exists()); |
+ } |
+ |
+ @Test |
+ public void testRemoveNotExistingFile() |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ fileSystem.remove(resolvedPath); |
+ assertFalse(file.exists()); |
+ } |
+ |
+ @Test |
+ public void testStatExistingFile() throws IOException |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ fileSystemUtils.writeFile(file, TEXT_DATA_BYTES); |
+ assertTrue(file.exists()); |
+ |
+ FileSystem.StatResult stat = fileSystem.stat(resolvedPath); |
+ assertNotNull(stat); |
+ assertTrue(stat.exists()); |
+ assertFalse(stat.isDirectory()); |
+ assertTrue(stat.isFile()); |
+ assertTrue(stat.getLastModified() > 0); |
+ } |
+ |
+ @Test |
+ public void testStatExistingDirectory() |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ file.mkdir(); |
+ |
+ FileSystem.StatResult stat = fileSystem.stat(resolvedPath); |
+ assertNotNull(stat); |
+ assertTrue(stat.exists()); |
+ assertFalse(stat.isFile()); |
+ assertTrue(stat.isDirectory()); |
+ assertTrue(stat.getLastModified() > 0); |
+ } |
+ |
+ @Test |
+ public void testStatNotExistingFile() |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ File file = getFullPath(path); |
+ assertFalse(file.exists()); |
+ |
+ fileSystem.remove(resolvedPath); |
+ assertFalse(file.exists()); |
+ FileSystem.StatResult notExistingStat = fileSystem.stat(resolvedPath); |
+ assertFalse(notExistingStat.exists()); |
+ assertEquals(0l, notExistingStat.getLastModified()); |
+ } |
+ |
+ @Test |
+ public void testResolveAbsolute() |
+ { |
+ String path = generateUniqueFilename(); |
+ String resolvedPath = fileSystem.resolve(path); |
+ String fullPath = getFullPath(path).getAbsolutePath(); |
+ assertEquals(fullPath, resolvedPath); |
+ } |
+ |
+ @Test |
+ public void testResolveRelative() |
+ { |
+ String relativePath = "./folder/file2"; |
+ String resolvedPath = fileSystem.resolve(relativePath); |
+ assertNotNull(resolvedPath); |
+ assertEquals(new File(basePathFile, relativePath).getAbsolutePath(), resolvedPath); |
+ } |
+ |
+ private boolean readInvoked; |
+ private boolean writeInvoked; |
+ private boolean statInvoked; |
+ private boolean resolveInvoked; |
+ |
+ private final class TestAndroidFileSystem extends AndroidFileSystem |
+ { |
+ public TestAndroidFileSystem(File basePath) |
+ { |
+ super(basePath); |
+ } |
+ |
+ @Override |
+ public byte[] read(String path) |
+ { |
+ readInvoked = true; |
+ try |
+ { |
+ Log.d(TAG, "Reading from " + path); |
+ String content = new String(FileSystemUtils.readFile(new File(path)), "UTF-8"); |
+ Log.d(TAG, "Read from " + path + ":\n" + content); |
+ } |
+ catch (IOException e) |
+ { |
+ throw new RuntimeException(e); |
+ } |
+ |
+ return super.read(path); |
+ } |
+ |
+ @Override |
+ public void write(String path, byte[] data) |
+ { |
+ writeInvoked = true; |
+ Log.d(TAG, "Write " + data.length + " bytes to " + path); |
+ super.write(path, data); |
+ } |
+ |
+ @Override |
+ public StatResult stat(String path) |
+ { |
+ statInvoked = true; |
+ StatResult stat = super.stat(path); |
+ Log.d(TAG, "Stat for " + path + " is " + stat); |
+ return stat; |
+ } |
+ |
+ @Override |
+ public String resolve(String path) |
+ { |
+ resolveInvoked = true; |
+ |
+ String resolvedPath = super.resolve(path); |
+ Log.d(TAG, "Resolve " + path + " to " + resolvedPath); |
+ return resolvedPath; |
+ } |
+ } |
+ |
+ @Test |
+ public void testInvokeFromNativeCode() |
+ { |
+ readInvoked = false; |
+ writeInvoked = false; |
+ statInvoked = false; |
+ resolveInvoked = false; |
+ |
+ JsEngine jsEngine = new JsEngine(AppInfo.builder().build()); |
+ jsEngine.setDefaultLogSystem(); |
+ jsEngine.setFileSystem(new TestAndroidFileSystem(basePathFile)); |
+ jsEngine.setWebRequest(new AndroidWebRequest()); |
+ |
+ FilterEngine filterEngine = new FilterEngine(jsEngine); |
+ SystemClock.sleep(10 * 1000); |
+ |
+ assertTrue(readInvoked); |
+ assertTrue(writeInvoked); |
+ assertTrue(statInvoked); |
+ assertTrue(resolveInvoked); |
+ } |
+} |