/* * 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.backends; import static com.google.android.libraries.mobiledatadownload.file.common.testing.StreamUtils.makeArrayOfBytesContent; import static com.google.common.truth.Truth.assertThat; import android.net.Uri; import com.google.android.libraries.mobiledatadownload.file.common.FileChannelConvertible; import com.google.android.libraries.mobiledatadownload.file.common.LockScope; import com.google.android.libraries.mobiledatadownload.file.common.Sizable; import com.google.android.libraries.mobiledatadownload.file.common.testing.BackendTestBase; import com.google.android.libraries.mobiledatadownload.file.spi.Backend; import com.google.common.collect.ImmutableList; import com.google.thirdparty.robolectric.GoogleRobolectricTestRunner; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; @RunWith(GoogleRobolectricTestRunner.class) public final class JavaFileBackendTest extends BackendTestBase { private Backend backend = new JavaFileBackend(); @Rule public TemporaryFolder tmpFolder = new TemporaryFolder(); @Test public void openForRead_shouldImplementFileChannelConvertible() throws IOException { backend.openForWrite(uriForTestMethod()).close(); try (InputStream inputStream = backend.openForRead(uriForTestMethod())) { assertThat(inputStream).isInstanceOf(FileChannelConvertible.class); assertThat(((FileChannelConvertible) inputStream).toFileChannel().position()).isEqualTo(0); } } @Test public void openForWrite_shouldImplementFileChannelConvertible() throws IOException { try (OutputStream outputStream = backend.openForWrite(uriForTestMethod())) { assertThat(outputStream).isInstanceOf(FileChannelConvertible.class); assertThat(((FileChannelConvertible) outputStream).toFileChannel().position()).isEqualTo(0); } } @Test public void openForAppend_shouldImplementFileChannelConvertible() throws IOException { try (OutputStream outputStream = backend.openForAppend(uriForTestMethod())) { assertThat(outputStream).isInstanceOf(FileChannelConvertible.class); assertThat(((FileChannelConvertible) outputStream).toFileChannel().position()).isEqualTo(0); } } @Test public void openForRead_shouldImplementSizable() throws IOException { byte[] content = makeArrayOfBytesContent(); try (OutputStream out = backend.openForWrite(uriForTestMethod())) { out.write(content); } try (InputStream inputStream = backend.openForRead(uriForTestMethod())) { assertThat(inputStream).isInstanceOf(Sizable.class); assertThat(((Sizable) inputStream).size()).isEqualTo(content.length); } } @Test public void lockScope_returnsNonNullLockScope() throws IOException { assertThat(backend.lockScope()).isNotNull(); } @Test public void lockScope_canBeOverridden() throws IOException { LockScope lockScope = new LockScope(); backend = new JavaFileBackend(lockScope); assertThat(backend.lockScope()).isSameInstanceAs(lockScope); } @Override protected Backend backend() { return backend; } @Override protected Uri legalUriBase() { return FileUri.fromFile(tmpFolder.getRoot()); } @Override protected List illegalUrisToRead() { String root = legalUriBase().getPath(); return ImmutableList.of( Uri.parse("file://@authority:123/" + root + "/uriWithAuthority"), Uri.parse("file:///" + root + "/uriWithQuery?q=a")); } @Override protected List illegalUrisToWrite() { return ImmutableList.of(); } @Override protected List illegalUrisToAppend() { return illegalUrisToWrite(); } }