/* * Copyright (C) 2016 The Android Open Source Project * * 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 dalvik.system; import junit.framework.TestCase; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; /** * Created by narayan on 1/7/16. */ public class BlockGuardTest extends TestCase { private BlockGuard.Policy oldPolicy; private RecordingPolicy recorder = new RecordingPolicy(); @Override public void setUp() { oldPolicy = BlockGuard.getThreadPolicy(); BlockGuard.setThreadPolicy(recorder); } @Override public void tearDown() { BlockGuard.setThreadPolicy(oldPolicy); recorder.clear(); } public void testFile() throws Exception { File f = File.createTempFile("foo", "bar"); recorder.expectAndClear("onReadFromDisk", "onWriteToDisk"); f.getAbsolutePath(); f.getParentFile(); f.getName(); f.getParent(); f.getPath(); f.isAbsolute(); recorder.expectNoViolations(); f.mkdir(); recorder.expectAndClear("onWriteToDisk"); f.listFiles(); recorder.expectAndClear("onReadFromDisk"); f.list(); recorder.expectAndClear("onReadFromDisk"); f.length(); recorder.expectAndClear("onReadFromDisk"); f.lastModified(); recorder.expectAndClear("onReadFromDisk"); f.canExecute(); recorder.expectAndClear("onReadFromDisk"); f.canRead(); recorder.expectAndClear("onReadFromDisk"); f.canWrite(); recorder.expectAndClear("onReadFromDisk"); f.isFile(); recorder.expectAndClear("onReadFromDisk"); f.isDirectory(); recorder.expectAndClear("onReadFromDisk"); f.setExecutable(true, false); recorder.expectAndClear("onWriteToDisk"); f.setReadable(true, false); recorder.expectAndClear("onWriteToDisk"); f.setWritable(true, false); recorder.expectAndClear("onWriteToDisk"); f.delete(); recorder.expectAndClear("onWriteToDisk"); } public void testFileInputStream() throws Exception { File f = new File("/proc/version"); recorder.clear(); FileInputStream fis = new FileInputStream(f); recorder.expectAndClear("onReadFromDisk"); fis.read(new byte[4],0, 4); recorder.expectAndClear("onReadFromDisk"); fis.read(); recorder.expectAndClear("onReadFromDisk"); fis.skip(1); recorder.expectAndClear("onReadFromDisk"); fis.close(); } public void testFileOutputStream() throws Exception { File f = File.createTempFile("foo", "bar"); recorder.clear(); FileOutputStream fos = new FileOutputStream(f); recorder.expectAndClear("onWriteToDisk"); fos.write(new byte[3]); recorder.expectAndClear("onWriteToDisk"); fos.write(4); recorder.expectAndClear("onWriteToDisk"); fos.flush(); recorder.expectNoViolations(); fos.close(); recorder.expectNoViolations(); } public static class RecordingPolicy implements BlockGuard.Policy { private final List violations = new ArrayList<>(); @Override public void onWriteToDisk() { addViolation("onWriteToDisk"); } @Override public void onReadFromDisk() { addViolation("onReadFromDisk"); } @Override public void onNetwork() { addViolation("onNetwork"); } private void addViolation(String type) { StackTraceElement[] threadTrace = Thread.currentThread().getStackTrace(); final StackTraceElement violator = threadTrace[4]; violations.add(type + " [caller= " + violator.getMethodName() + "]"); } public void clear() { violations.clear(); } public void expectNoViolations() { if (violations.size() != 0) { throw new AssertionError("Expected 0 violations but found " + violations.size()); } } public void expectAndClear(String... expected) { if (expected.length != violations.size()) { throw new AssertionError("Expected " + expected.length + " violations but found " + violations.size()); } for (int i = 0; i < expected.length; ++i) { if (!violations.get(i).startsWith(expected[i])) { throw new AssertionError("Expected: " + expected[i] + " but was " + violations.get(i)); } } clear(); } @Override public int getPolicyMask() { return 0; } } }