mirror of
https://github.com/zhigang1992/AndroidVideoCache.git
synced 2026-03-29 00:08:59 +08:00
fix too long file name for cache. Md5FileNameGenerator tests
This commit is contained in:
@@ -3,8 +3,6 @@ package com.danikula.videocache;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
import static com.danikula.videocache.Preconditions.checkNotNull;
|
||||
|
||||
@@ -15,6 +13,7 @@ import static com.danikula.videocache.Preconditions.checkNotNull;
|
||||
*/
|
||||
public class Md5FileNameGenerator implements FileNameGenerator {
|
||||
|
||||
private static final int MAX_EXTENSION_LENGTH = 4;
|
||||
private final File cacheDirectory;
|
||||
|
||||
public Md5FileNameGenerator(File cacheDirectory) {
|
||||
@@ -25,32 +24,15 @@ public class Md5FileNameGenerator implements FileNameGenerator {
|
||||
public File generate(String url) {
|
||||
checkNotNull(url);
|
||||
String extension = getExtension(url);
|
||||
String name = computeMD5(url);
|
||||
String name = ProxyCacheUtils.computeMD5(url);
|
||||
name = TextUtils.isEmpty(extension) ? name : name + "." + extension;
|
||||
return new File(cacheDirectory, name);
|
||||
}
|
||||
|
||||
private String getExtension(String url) {
|
||||
int dotIndex = url.lastIndexOf('.');
|
||||
int slashIndex = url.lastIndexOf(File.separator);
|
||||
return dotIndex != -1 && dotIndex > slashIndex ? url.substring(dotIndex + 1, url.length()) : "";
|
||||
}
|
||||
|
||||
private String computeMD5(String string) {
|
||||
try {
|
||||
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
|
||||
byte[] digestBytes = messageDigest.digest(string.getBytes());
|
||||
return bytesToHexString(digestBytes);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private String bytesToHexString(byte[] bytes) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
for (byte b : bytes) {
|
||||
sb.append(String.format("%02x", b));
|
||||
}
|
||||
return sb.toString();
|
||||
int slashIndex = url.lastIndexOf('/');
|
||||
return dotIndex != -1 && dotIndex > slashIndex && dotIndex + 2 + MAX_EXTENSION_LENGTH > url.length() ?
|
||||
url.substring(dotIndex + 1, url.length()) : "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLDecoder;
|
||||
import java.net.URLEncoder;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static com.danikula.videocache.Preconditions.checkArgument;
|
||||
@@ -86,4 +88,23 @@ class ProxyCacheUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static String computeMD5(String string) {
|
||||
try {
|
||||
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
|
||||
byte[] digestBytes = messageDigest.digest(string.getBytes());
|
||||
return bytesToHexString(digestBytes);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
}
|
||||
|
||||
static String bytesToHexString(byte[] bytes) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
for (byte b : bytes) {
|
||||
sb.append(String.format("%02x", b));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
package com.danikula.videocache;
|
||||
|
||||
import com.danikula.videocache.test.BuildConfig;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricGradleTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import static org.fest.assertions.api.Assertions.assertThat;
|
||||
import static org.fest.assertions.api.Assertions.fail;
|
||||
|
||||
/**
|
||||
* Tests for {@link FileNameGenerator} and implementations.
|
||||
*
|
||||
* @author Alexey Danilov (danikula@gmail.com).
|
||||
*/
|
||||
@RunWith(RobolectricGradleTestRunner.class)
|
||||
@Config(constants = BuildConfig.class, emulateSdk = BuildConfig.MIN_SDK_VERSION)
|
||||
public class FileNameGeneratorTest {
|
||||
|
||||
@Test
|
||||
public void testMd5SimpleName() throws Exception {
|
||||
String url = "http://host.com/videos/video.mpeg";
|
||||
String path = generateMd5Name("/home", url);
|
||||
String expected = "/home/" + ProxyCacheUtils.computeMD5(url) + ".mpeg";
|
||||
assertThat(path).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMd5NoExtension() throws Exception {
|
||||
String url = "http://host.com/video";
|
||||
String path = generateMd5Name("/home", url);
|
||||
String expected = "/home/" + ProxyCacheUtils.computeMD5(url);
|
||||
assertThat(path).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMd5TooLongExtension() throws Exception {
|
||||
String url = "http://host.com/videos/video-with-dot-.12345";
|
||||
String path = generateMd5Name("/home", url);
|
||||
String expected = "/home/" + ProxyCacheUtils.computeMD5(url);
|
||||
assertThat(path).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMd5InvalidExtension() throws Exception {
|
||||
String url = "http://host.com/videos/video.mp4?token=-648729473536183645";
|
||||
String path = generateMd5Name("/home", url);
|
||||
String expected = "/home/" + ProxyCacheUtils.computeMD5(url);
|
||||
assertThat(path).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMd5ExtraLongExtension() throws Exception {
|
||||
// https://github.com/danikula/AndroidVideoCache/issues/14
|
||||
String url = "https://d1wst0behutosd.cloudfront.net/videos/4367900/10807247.480p.mp4?Expires=1442849176&Signature=JXV~3AoI0rWcGuZBywg3-ukf6Ycw2X8v7Htog3lyvuFwp8o6VUEDFUsTC9-XtIGu-ULxCd7dP3fvB306lRyGFxdvf-sXLX~ar~HCQ7lullNyeLtp8BJOT5Y~W5rJE7X-AZaueNcycGtLFRhRtr5ySTguwtmJNaO3T1apX~-oVrFh1dWStEKbuPoXY04RgkmhMHoFgtwgXMC1ctIDeQHxZeXLi6LLyZnQsgzlUDffCx4P16iiW0uh2-Z~HUOi9BLBwHMQ5k5lYwZqdQ6DhhYoWlniRfQz6mp1IEiMgr4L3Z1ijgGITV4cYeF31CmFzCxaJTE7IIAC5tMDQSTt7M9Q4A__&Key-Pair-Id=APKAJJ6WELAPEP47UKWQ";
|
||||
String path = generateMd5Name("/home", url);
|
||||
String expected = "/home/" + ProxyCacheUtils.computeMD5(url);
|
||||
assertThat(path).isEqualTo(expected);
|
||||
}
|
||||
|
||||
@Test(expected = NullPointerException.class)
|
||||
public void testAssertNullRoot() throws Exception {
|
||||
new Md5FileNameGenerator(null);
|
||||
fail("Root folder should be not null");
|
||||
}
|
||||
|
||||
@Test(expected = NullPointerException.class)
|
||||
public void testAssertNullUrl() throws Exception {
|
||||
FileNameGenerator nameGenerator = new Md5FileNameGenerator(new File("/"));
|
||||
nameGenerator.generate(null);
|
||||
fail("Url should be not null");
|
||||
}
|
||||
|
||||
private String generateMd5Name(String rootFolder, String url) {
|
||||
FileNameGenerator nameGenerator = new Md5FileNameGenerator(new File(rootFolder));
|
||||
return nameGenerator.generate(url).getAbsolutePath();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user