Files
palemoon27/mobile/android/tests/browser/junit3/src/TestImageDownloader.java
T
2018-07-24 23:11:02 +08:00

206 lines
6.8 KiB
Java

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
package org.mozilla.goanna;
import android.content.Context;
import android.content.res.Resources;
import android.content.SharedPreferences;
import android.net.Uri;
import android.test.mock.MockResources;
import android.test.RenamingDelegatingContext;
import android.util.DisplayMetrics;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.mozilla.goanna.distribution.Distribution;
import org.mozilla.goanna.home.ImageLoader.ImageDownloader;
public class TestImageDownloader extends BrowserTestCase {
private static class TestContext extends RenamingDelegatingContext {
private static final String PREFIX = "TestImageDownloader-";
private final Resources resources;
private final Set<String> usedPrefs;
public TestContext(Context context) {
super(context, PREFIX);
resources = new TestResources();
usedPrefs = Collections.synchronizedSet(new HashSet<String>());
}
@Override
public Resources getResources() {
return resources;
}
@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
usedPrefs.add(name);
return super.getSharedPreferences(PREFIX + name, mode);
}
public void clearUsedPrefs() {
for (String prefsName : usedPrefs) {
getSharedPreferences(prefsName, 0).edit().clear().commit();
}
usedPrefs.clear();
}
}
private static class TestResources extends MockResources {
private final DisplayMetrics metrics;
public TestResources() {
metrics = new DisplayMetrics();
}
@Override
public DisplayMetrics getDisplayMetrics() {
return metrics;
}
public void setDensityDpi(int densityDpi) {
metrics.densityDpi = densityDpi;
}
}
private static class TestDistribution extends Distribution {
final List<String> accessedFiles;
public TestDistribution(Context context) {
super(context);
accessedFiles = new ArrayList<String>();
}
@Override
public File getDistributionFile(String name) {
accessedFiles.add(name);
// Return null to ensure the ImageDownloader will go
// through a complete density lookup for each filename.
return null;
}
public List<String> getAccessedFiles() {
return Collections.unmodifiableList(accessedFiles);
}
public void resetAccessedFiles() {
accessedFiles.clear();
}
}
private TestContext context;
private TestResources resources;
private TestDistribution distribution;
private ImageDownloader downloader;
protected void setUp() {
context = new TestContext(getApplicationContext());
resources = (TestResources) context.getResources();
distribution = new TestDistribution(context);
downloader = new ImageDownloader(context, distribution);
}
protected void tearDown() {
context.clearUsedPrefs();
}
private void triggerLoad(Uri uri) {
try {
downloader.load(uri, false);
} catch (IOException e) {
// Ignore any IO exceptions.
}
}
private void checkAccessedFiles(String[] filenames) {
List<String> accessedFiles = distribution.getAccessedFiles();
for (int i = 0; i < filenames.length; i++) {
assertEquals(filenames[i], accessedFiles.get(i));
}
}
private void checkAccessedFilesForUri(Uri uri, int densityDpi, String[] filenames) {
resources.setDensityDpi(densityDpi);
triggerLoad(uri);
checkAccessedFiles(filenames);
distribution.resetAccessedFiles();
}
public void testAccessedFiles() {
// Filename only.
checkAccessedFilesForUri(Uri.parse("goanna.distribution://file"),
DisplayMetrics.DENSITY_MEDIUM,
new String[] {
"mdpi/file.png",
"xhdpi/file.png",
"hdpi/file.png"
});
// Directory and filename.
checkAccessedFilesForUri(Uri.parse("goanna.distribution://dir/file"),
DisplayMetrics.DENSITY_MEDIUM,
new String[] {
"dir/mdpi/file.png",
"dir/xhdpi/file.png",
"dir/hdpi/file.png"
});
// Sub-directories and filename.
checkAccessedFilesForUri(Uri.parse("goanna.distribution://dir/subdir/file"),
DisplayMetrics.DENSITY_MEDIUM,
new String[] {
"dir/subdir/mdpi/file.png",
"dir/subdir/xhdpi/file.png",
"dir/subdir/hdpi/file.png"
});
}
public void testDensityLookup() {
Uri uri = Uri.parse("goanna.distribution://file");
// Medium density
checkAccessedFilesForUri(uri,
DisplayMetrics.DENSITY_MEDIUM,
new String[] {
"mdpi/file.png",
"xhdpi/file.png",
"hdpi/file.png"
});
checkAccessedFilesForUri(uri,
DisplayMetrics.DENSITY_HIGH,
new String[] {
"hdpi/file.png",
"xxhdpi/file.png",
"xhdpi/file.png"
});
checkAccessedFilesForUri(uri,
DisplayMetrics.DENSITY_XHIGH,
new String[] {
"xhdpi/file.png",
"xxhdpi/file.png",
"mdpi/file.png"
});
checkAccessedFilesForUri(uri,
DisplayMetrics.DENSITY_XXHIGH,
new String[] {
"xxhdpi/file.png",
"hdpi/file.png"
});
}
}