blob: 497aecb4933e826969221b233b2bc4890529035b [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.backends;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import android.content.Context;
import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
import com.google.android.libraries.mobiledatadownload.file.common.MalformedUriException;
import com.google.common.io.BaseEncoding;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public final class BlobUriTest {
private final Context context = ApplicationProvider.getApplicationContext();
@Test
public void builder_setCorrectsParameters() throws Exception {
Uri blobUri = BlobUri.builder(context).setBlobParameters("1234").build();
assertThat(blobUri.getScheme()).isEqualTo("blobstore");
assertThat(blobUri.getAuthority()).isEqualTo(context.getPackageName());
assertThat(blobUri.getPath()).isEqualTo("/1234");
assertThat(blobUri.toString())
.isEqualTo(
"blobstore://com.google.android.libraries.mobiledatadownload.file.backends/1234");
Uri leaseUri = BlobUri.builder(context).setAllLeasesParameters().build();
assertThat(leaseUri.getScheme()).isEqualTo("blobstore");
assertThat(leaseUri.getAuthority()).isEqualTo(context.getPackageName());
assertThat(leaseUri.getPath()).isEqualTo("/*.lease");
assertThat(leaseUri.toString())
.isEqualTo(
"blobstore://com.google.android.libraries.mobiledatadownload.file.backends/*.lease");
}
@Test
public void builder_emptyChecksum_shouldThrow() throws Exception {
assertThrows(
MalformedUriException.class, () -> BlobUri.builder(context).setBlobParameters("").build());
assertThrows(
MalformedUriException.class,
() -> BlobUri.builder(context).setLeaseParameters("", 1).build());
}
@Test
public void validateUri_wrongNumberOfSegments_shouldThrow() throws Exception {
Uri invalidUri =
BlobUri.builder(context)
.setBlobParameters("1234")
.build()
.buildUpon()
.appendPath("newSegment")
.build();
assertThrows(MalformedUriException.class, () -> BlobUri.validateUri(invalidUri));
}
@Test
public void validateUri_allowOnlyPermittedChecksumExtensions() throws Exception {
Uri blobUri = BlobUri.builder(context).setBlobParameters("1234").build();
Uri leaseUri = BlobUri.builder(context).setLeaseParameters("1234", 1).build();
BlobUri.validateUri(blobUri);
BlobUri.validateUri(leaseUri);
Uri wrongExtensionUri = blobUri.buildUpon().path("1234.exts").build();
assertThrows(MalformedUriException.class, () -> BlobUri.validateUri(wrongExtensionUri));
Uri emptyChecksum = blobUri.buildUpon().path(".lease").build();
assertThrows(MalformedUriException.class, () -> BlobUri.validateUri(emptyChecksum));
}
@Test
public void validateUri_allowOnlyPermittedQueryParameters() throws Exception {
Uri emptyQueryUri = new Uri.Builder().path("1234").build();
BlobUri.validateUri(emptyQueryUri);
Uri queryWithExpiryDateUri =
new Uri.Builder().path("1234").appendQueryParameter("expiryDateSecs", "1").build();
BlobUri.validateUri(queryWithExpiryDateUri);
Uri queryTooLongUri =
new Uri.Builder()
.path("1234")
.appendQueryParameter("fileSize", "1")
.appendQueryParameter("expiryDate", "1")
.build();
assertThrows(MalformedUriException.class, () -> BlobUri.validateUri(queryTooLongUri));
Uri queryWithUnexpectedParameterUri =
new Uri.Builder().path("1234").appendQueryParameter("wrongParameter", "1").build();
assertThrows(
MalformedUriException.class, () -> BlobUri.validateUri(queryWithUnexpectedParameterUri));
}
@Test
public void isLeaseUri() throws Exception {
Uri leaseUri = BlobUri.builder(context).setLeaseParameters("1234", 1).build();
assertThat(BlobUri.isLeaseUri(leaseUri.getPath())).isTrue();
Uri nonLeaseUri = BlobUri.builder(context).setBlobParameters("1234").build();
assertThat(BlobUri.isLeaseUri(nonLeaseUri.getPath())).isFalse();
nonLeaseUri = new Uri.Builder().path("1234.exts").build();
assertThat(BlobUri.isLeaseUri(nonLeaseUri.getPath())).isFalse();
}
@Test
public void getExpiryDateSecs_shouldSucceed() throws Exception {
Uri leaseUri = BlobUri.builder(context).setLeaseParameters("1234", 1).build();
assertThat(BlobUri.getExpiryDateSecs(leaseUri)).isEqualTo(1);
}
@Test
public void getExpiryDateSecs_emptyQuery_shouldThrow() throws Exception {
Uri leaseUri = BlobUri.builder(context).setBlobParameters("1234").build();
assertThrows(MalformedUriException.class, () -> BlobUri.getExpiryDateSecs(leaseUri));
}
@Test
public void getChecksum() throws Exception {
Uri blobUri = BlobUri.builder(context).setBlobParameters("1234").build();
byte[] expectedBytes = BaseEncoding.base16().lowerCase().decode("1234");
assertThat(BlobUri.getChecksum(blobUri.getPath())).isEqualTo(expectedBytes);
}
}