updater_sample: add FileDownloader

Test: unit tests

Change-Id: I10933e7172d7ebc34c7cf5e4274625d7b8399246
Signed-off-by: Zhomart Mukhamejanov <zhomart@google.com>
This commit is contained in:
Zhomart Mukhamejanov 2018-04-26 16:10:12 -07:00
parent af5958818a
commit 93535dd033
2 changed files with 173 additions and 0 deletions

View file

@ -0,0 +1,93 @@
/*
* Copyright (C) 2018 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 com.example.android.systemupdatersample.util;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
/**
* Downloads chunk of a file from given url using {@code offset} and {@code size},
* and saves to a given location.
*
* In real-life application this helper class should download from HTTP Server,
* but in this sample app it will only download from a local file.
*/
public final class FileDownloader {
private String mUrl;
private long mOffset;
private long mSize;
private File mOut;
public FileDownloader(String url, long offset, long size, File out) {
this.mUrl = url;
this.mOffset = offset;
this.mSize = size;
this.mOut = out;
}
/**
* Downloads the file with given offset and size.
*/
public void download() throws IOException {
Log.d("FileDownloader", "downloading " + mOut.getName()
+ " from " + mUrl
+ " to " + mOut.getAbsolutePath());
URL url = new URL(mUrl);
URLConnection connection = url.openConnection();
connection.connect();
// download the file
try (InputStream input = connection.getInputStream()) {
try (OutputStream output = new FileOutputStream(mOut)) {
long skipped = input.skip(mOffset);
if (skipped != mOffset) {
throw new IOException("Can't download file "
+ mUrl
+ " with given offset "
+ mOffset);
}
byte[] data = new byte[4096];
long total = 0;
while (total < mSize) {
int needToRead = (int) Math.min(4096, mSize - total);
int count = input.read(data, 0, needToRead);
if (count <= 0) {
break;
}
output.write(data, 0, count);
total += count;
}
if (total != mSize) {
throw new IOException("Can't download file "
+ mUrl
+ " with given size "
+ mSize);
}
}
}
}
}

View file

@ -0,0 +1,80 @@
/*
* Copyright (C) 2018 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 com.example.android.systemupdatersample.util;
import static junit.framework.Assert.assertEquals;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import com.example.android.systemupdatersample.tests.R;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* Tests for {@link FileDownloader}
*/
@RunWith(AndroidJUnit4.class)
@SmallTest
public class FileDownloaderTest {
@Rule
public final ExpectedException thrown = ExpectedException.none();
private Context mTestContext;
private Context mTargetContext;
@Before
public void setUp() {
mTestContext = InstrumentationRegistry.getContext();
mTargetContext = InstrumentationRegistry.getTargetContext();
}
@Test
public void download_downloadsChunkOfZip() throws Exception {
// Prepare the target file
File packageFile = Paths
.get(mTargetContext.getCacheDir().getAbsolutePath(), "ota.zip")
.toFile();
Files.delete(packageFile.toPath());
Files.copy(mTestContext.getResources().openRawResource(R.raw.ota_002_package),
packageFile.toPath());
String url = "file://" + packageFile.getAbsolutePath();
// prepare where to download
File outFile = Paths
.get(mTargetContext.getCacheDir().getAbsolutePath(), "care_map.txt")
.toFile();
Files.delete(outFile.toPath());
// download a chunk of ota.zip
FileDownloader downloader = new FileDownloader(url, 160, 8, outFile);
downloader.download();
String downloadedContent = String.join("\n", Files.readAllLines(outFile.toPath()));
// Look at tools/create_test_ota.py
assertEquals("CARE_MAP", downloadedContent);
}
}