1 package org.robolectric.internal.dependency; 2 3 import static org.junit.Assert.assertEquals; 4 import static org.mockito.Mockito.any; 5 import static org.mockito.Mockito.mock; 6 import static org.mockito.Mockito.never; 7 import static org.mockito.Mockito.verify; 8 import static org.mockito.Mockito.when; 9 10 import java.io.Serializable; 11 import java.net.MalformedURLException; 12 import java.net.URL; 13 import java.util.HashMap; 14 import java.util.Map; 15 import org.junit.Before; 16 import org.junit.Rule; 17 import org.junit.Test; 18 import org.junit.rules.TemporaryFolder; 19 import org.junit.runner.RunWith; 20 import org.junit.runners.JUnit4; 21 import org.junit.runners.model.InitializationError; 22 import org.robolectric.internal.dependency.CachedDependencyResolver.Cache; 23 import org.robolectric.internal.dependency.CachedDependencyResolver.CacheNamingStrategy; 24 import org.robolectric.internal.dependency.CachedDependencyResolver.CacheValidationStrategy; 25 26 @RunWith(JUnit4.class) 27 public class CachedDependencyResolverTest { 28 @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); 29 private static final String CACHE_NAME = "someName"; 30 private DependencyResolver internalResolver = mock(DependencyResolver.class); 31 private CacheNamingStrategy cacheNamingStrategy = new CacheNamingStrategy() { 32 @Override 33 public String getName(String prefix, DependencyJar... dependencies) { 34 return CACHE_NAME; 35 } 36 }; 37 private CacheValidationStrategy cacheValidationStrategy = new CacheValidationStrategy() { 38 @Override 39 public boolean isValid(URL url) { 40 return true; 41 } 42 43 @Override 44 public boolean isValid(URL[] urls) { 45 return true; 46 } 47 }; 48 49 private URL url; 50 private Cache cache = new CacheStub(); 51 private DependencyJar[] dependencies = new DependencyJar[]{ 52 createDependency("group1", "artifact1"), 53 createDependency("group2", "artifact2"), 54 }; 55 private DependencyJar dependency = dependencies[0]; 56 57 @Before 58 public void setUp() throws InitializationError, MalformedURLException { 59 url = new URL("http://localhost"); 60 } 61 62 @Test 63 public void getLocalArtifactUrl_shouldWriteLocalArtifactUrlWhenCacheMiss() throws Exception{ 64 DependencyResolver res = createResolver(); 65 66 when(internalResolver.getLocalArtifactUrl(dependency)).thenReturn(url); 67 68 URL url = res.getLocalArtifactUrl(dependency); 69 70 assertEquals(this.url, url); 71 assertCacheContents(url); 72 } 73 74 @Test 75 public void getLocalArtifactUrl_shouldReadLocalArtifactUrlFromCacheIfExists() throws Exception { 76 DependencyResolver res = createResolver(); 77 cache.write(CACHE_NAME, url); 78 79 URL url = res.getLocalArtifactUrl(dependency); 80 81 verify(internalResolver, never()).getLocalArtifactUrl(dependency); 82 83 assertEquals(this.url, url); 84 } 85 86 @Test 87 public void getLocalArtifactUrl_whenCacheInvalid_shouldFetchDependencyInformation() { 88 CacheValidationStrategy failStrategy = mock(CacheValidationStrategy.class); 89 when(failStrategy.isValid(any(URL.class))).thenReturn(false); 90 91 DependencyResolver res = new CachedDependencyResolver(internalResolver, cache, cacheNamingStrategy, failStrategy); 92 cache.write(CACHE_NAME, this.url); 93 94 res.getLocalArtifactUrl(dependency); 95 96 verify(internalResolver).getLocalArtifactUrl(dependency); 97 } 98 99 private void assertCacheContents(URL url) { 100 assertEquals(url, cache.load(CACHE_NAME, URL.class)); 101 } 102 103 private DependencyResolver createResolver() { 104 return new CachedDependencyResolver(internalResolver, cache, cacheNamingStrategy, cacheValidationStrategy); 105 } 106 107 private DependencyJar createDependency(final String groupId, final String artifactId) { 108 return new DependencyJar(groupId, artifactId, null, "") { 109 110 @Override 111 public boolean equals(Object o) { 112 if(!(o instanceof DependencyJar)) return false; 113 114 DependencyJar d = (DependencyJar) o; 115 116 return this.getArtifactId().equals(d.getArtifactId()) && this.getGroupId().equals(groupId); 117 } 118 119 @Override 120 public int hashCode() { 121 return 31 * getArtifactId().hashCode() + getGroupId().hashCode(); 122 } 123 }; 124 } 125 126 private static class CacheStub implements CachedDependencyResolver.Cache { 127 private Map<String, Serializable> map = new HashMap<>(); 128 129 @SuppressWarnings("unchecked") 130 @Override 131 public <T extends Serializable> T load(String id, Class<T> type) { 132 Serializable o = map.get(id); 133 134 return o != null && o.getClass() == type ? (T) o : null; 135 } 136 137 @Override 138 public <T extends Serializable> boolean write(String id, T object) { 139 map.put(id, object); 140 return true; 141 } 142 } 143 } 144