blob: bc1f90ad5fba245ca3b47516c637ee13693da644 [file] [log] [blame]
/*
* Copyright 2022 Google LLC
*
* 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.google.android.libraries.mobiledatadownload.file.common.testing;
import static org.junit.Assert.assertThrows;
import android.net.Uri;
import android.util.Pair;
import com.google.android.libraries.mobiledatadownload.file.common.GcParam;
import com.google.android.libraries.mobiledatadownload.file.common.UnsupportedFileStorageOperation;
import com.google.android.libraries.mobiledatadownload.file.spi.Backend;
import com.google.common.collect.ImmutableList;
import java.io.Closeable;
import java.io.IOException;
import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public final class FakeFileBackendTest extends BackendTestBase {
private final FakeFileBackend backend = new FakeFileBackend();
@Rule public TemporaryUri tmpUri = new TemporaryUri();
@Override
protected Backend backend() {
return backend;
}
@Override
protected Uri legalUriBase() throws IOException {
return tmpUri.newDirectoryUri();
}
@Override
protected List<Uri> illegalUrisToRead() {
return ImmutableList.of();
}
@Override
protected List<Uri> illegalUrisToWrite() {
return ImmutableList.of();
}
@Override
protected List<Uri> illegalUrisToAppend() {
return ImmutableList.of();
}
@Test
public void throwsExceptions_forRead() throws Exception {
Uri uri = tmpUri.newUri();
backend.setFailure(FakeFileBackend.OperationType.READ, new FakeIOException("test"));
assertThrows(FakeIOException.class, () -> backend.openForRead(uri));
assertThrows(FakeIOException.class, () -> backend.openForNativeRead(uri));
backend.clearFailure(FakeFileBackend.OperationType.READ);
try (Closeable resource = backend.openForRead(uri)) {}
Pair<Uri, Closeable> nativeOpen = backend.openForNativeRead(uri);
try (Closeable resource = nativeOpen.second) {}
}
@Test
public void throwsExceptions_forWrite() throws Exception {
Uri uri = tmpUri.newUri();
backend.setFailure(FakeFileBackend.OperationType.WRITE, new FakeIOException("test"));
assertThrows(FakeIOException.class, () -> backend.openForWrite(uri));
assertThrows(FakeIOException.class, () -> backend.openForAppend(uri));
backend.clearFailure(FakeFileBackend.OperationType.WRITE);
try (Closeable resource = backend.openForWrite(uri)) {}
try (Closeable resource = backend.openForAppend(uri)) {}
}
@Test
public void throwsExceptions_forQuery() throws Exception {
Uri uri = tmpUri.newUri();
Uri dir = tmpUri.newDirectoryUri();
backend.setFailure(FakeFileBackend.OperationType.QUERY, new FakeIOException("test"));
assertThrows(FakeIOException.class, () -> backend.exists(uri));
assertThrows(FakeIOException.class, () -> backend.isDirectory(uri));
assertThrows(FakeIOException.class, () -> backend.fileSize(uri));
assertThrows(FakeIOException.class, () -> backend.children(dir));
assertThrows(FakeIOException.class, () -> backend.getGcParam(uri));
assertThrows(FakeIOException.class, () -> backend.toFile(uri));
backend.clearFailure(FakeFileBackend.OperationType.QUERY);
backend.exists(uri);
backend.isDirectory(uri);
backend.fileSize(uri);
backend.children(dir);
assertThrows(UnsupportedFileStorageOperation.class, () -> backend.getGcParam(uri));
backend.toFile(uri);
}
@Test
public void throwsExceptions_forManage() throws Exception {
Uri uri = tmpUri.newUri();
Uri uri2 = tmpUri.newUri();
Uri dir = tmpUri.newDirectoryUri();
backend.setFailure(FakeFileBackend.OperationType.MANAGE, new FakeIOException("test"));
assertThrows(FakeIOException.class, () -> backend.deleteFile(uri));
assertThrows(FakeIOException.class, () -> backend.deleteDirectory(dir));
assertThrows(FakeIOException.class, () -> backend.rename(uri, uri2));
assertThrows(FakeIOException.class, () -> backend.createDirectory(dir));
assertThrows(FakeIOException.class, () -> backend.setGcParam(uri, GcParam.none()));
backend.clearFailure(FakeFileBackend.OperationType.MANAGE);
assertThrows(
UnsupportedFileStorageOperation.class, () -> backend.setGcParam(uri, GcParam.none()));
backend.rename(uri, uri2);
backend.deleteFile(uri2);
backend.deleteDirectory(dir);
backend.createDirectory(dir);
}
@Test
public void throwsExceptions_forAll() throws Exception {
Uri uri = tmpUri.newUri();
backend.setFailure(FakeFileBackend.OperationType.ALL, new FakeIOException("test"));
assertThrows(FakeIOException.class, () -> backend.openForRead(uri)); // READ
assertThrows(FakeIOException.class, () -> backend.openForWrite(uri)); // WRITE
assertThrows(FakeIOException.class, () -> backend.exists(uri)); // QUERY
assertThrows(FakeIOException.class, () -> backend.deleteFile(uri)); // MANAGE
backend.clearFailure(FakeFileBackend.OperationType.ALL);
try (Closeable resource = backend.openForRead(uri)) {}
try (Closeable resource = backend.openForWrite(uri)) {}
backend.exists(uri);
backend.deleteFile(uri);
}
private static class FakeIOException extends IOException {
FakeIOException(String message) {
super(message);
}
}
}