package com.bumptech.glide.load.model;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.support.annotation.Nullable;
import com.bumptech.glide.load.model.LazyHeaders.Builder;
import com.google.common.testing.EqualsTester;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, sdk = 18)
public class LazyHeadersTest {
private static final String DEFAULT_USER_AGENT = "default_user_agent";
private static final String DEFAULT_USER_AGENT_PROPERTY = "http.agent";
private String initialUserAgent;
@Before
public void setUp() {
initialUserAgent = System.getProperty(DEFAULT_USER_AGENT_PROPERTY);
System.setProperty(DEFAULT_USER_AGENT_PROPERTY, DEFAULT_USER_AGENT);
}
@After
public void tearDown() {
if (initialUserAgent != null) {
System.setProperty(DEFAULT_USER_AGENT_PROPERTY, initialUserAgent);
}
}
@Test
public void testIncludesEagerHeaders() {
Map<String, String> headers = new Builder()
.addHeader("key", "value")
.build()
.getHeaders();
assertThat(headers).containsEntry("key", "value");
}
@Test
public void testIncludesLazyHeaders() {
LazyHeaderFactory factory = mock(LazyHeaderFactory.class);
when(factory.buildHeader()).thenReturn("value");
Map<String, String> headers = new Builder()
.addHeader("key", factory)
.build()
.getHeaders();
assertThat(headers).containsEntry("key", "value");
}
@Test
public void testMultipleEagerValuesAreSeparatedByCommas() {
Map<String, String> headers = new Builder()
.addHeader("key", "first")
.addHeader("key", "second")
.build()
.getHeaders();
assertThat(headers).containsEntry("key", "first,second");
}
@Test
public void testMultipleLazyValuesAreSeparatedByCommas() {
LazyHeaderFactory first = mock(LazyHeaderFactory.class);
when(first.buildHeader()).thenReturn("first");
LazyHeaderFactory second = mock(LazyHeaderFactory.class);
when(second.buildHeader()).thenReturn("second");
Map<String, String> headers = new Builder()
.addHeader("key", first)
.addHeader("key", second)
.build()
.getHeaders();
assertThat(headers).containsEntry("key", "first,second");
}
@Test
public void testMixedEagerAndLazyValuesAreIncluded() {
LazyHeaderFactory factory = mock(LazyHeaderFactory.class);
when(factory.buildHeader()).thenReturn("first");
Map<String, String> headers = new Builder()
.addHeader("key", factory)
.addHeader("key", "second")
.build()
.getHeaders();
assertThat(headers).containsEntry("key", "first,second");
headers = new Builder()
.addHeader("key", "second")
.addHeader("key", factory)
.build()
.getHeaders();
assertThat(headers).containsEntry("key", "second,first");
}
@Test
public void testCanAddMultipleKeys() {
LazyHeaderFactory factory = mock(LazyHeaderFactory.class);
when(factory.buildHeader()).thenReturn("lazy");
Map<String, String> headers = new Builder()
.addHeader("first", factory)
.addHeader("second", "eager")
.build()
.getHeaders();
assertThat(headers).containsEntry("first", "lazy");
assertThat(headers).containsEntry("second", "eager");
}
@Test
public void testUpdatingBuilderAfterBuildingDoesNotModifyOriginalHeaders() {
Builder builder = new Builder();
builder.addHeader("key", "firstValue");
builder.addHeader("otherKey", "otherValue");
LazyHeaders first = builder.build();
LazyHeaderFactory factory = mock(LazyHeaderFactory.class);
when(factory.buildHeader()).thenReturn("otherValue");
builder.addHeader("key", "secondValue");
builder.setHeader("otherKey", factory);
LazyHeaders second = builder.build();
assertThat(first.getHeaders()).isNotEqualTo(second.getHeaders());
assertThat(first.getHeaders()).containsEntry("key", "firstValue");
assertThat(first.getHeaders()).containsEntry("otherKey", "otherValue");
assertThat(second.getHeaders()).containsEntry("key", "firstValue,secondValue");
assertThat(second.getHeaders()).containsEntry("otherKey", "otherValue");
}
@Test
public void testSetHeaderReplacesExistingHeaders() {
Builder builder = new Builder();
builder.addHeader("key", "first")
.addHeader("key", "second")
.setHeader("key", "third");
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("key", "third");
}
@Test
public void testSetHeaderWithNullStringRemovesExistingHeader() {
Builder builder = new Builder();
builder.addHeader("key", "first")
.addHeader("key", "second")
.setHeader("key", (String) null);
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).doesNotContainKey("key");
}
@Test
public void testSetHeaderWithNullLazyHeaderFactoryRemovesExistingHeader() {
Builder builder = new Builder();
builder.addHeader("key", "first")
.addHeader("key", "second")
.setHeader("key", (LazyHeaderFactory) null);
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).doesNotContainKey("key");
}
@Test
public void testAddingEncodingHeaderReplacesDefaultThenAppends() {
Builder builder = new Builder();
builder.addHeader("Accept-Encoding", "false");
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("Accept-Encoding", "false");
builder.addHeader("Accept-Encoding", "true");
headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("Accept-Encoding", "false,true");
}
@Test
public void testRemovingAndAddingEncodingHeaderReplacesDefaultThenAppends() {
Builder builder = new Builder();
builder.setHeader("Accept-Encoding", (String) null);
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).doesNotContainKey("Accept-Encoding");
builder.addHeader("Accept-Encoding", "false");
headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("Accept-Encoding", "false");
builder.addHeader("Accept-Encoding", "true");
headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("Accept-Encoding", "false,true");
}
@Test
public void testAddingUserAgentHeaderReplacesDefaultThenAppends() {
Builder builder = new Builder();
builder.addHeader("User-Agent", "false");
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("User-Agent", "false");
builder.addHeader("User-Agent", "true");
headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("User-Agent", "false,true");
}
@Test
public void testRemovingAndAddingUserAgentHeaderReplacesDefaultThenAppends() {
Builder builder = new Builder();
builder.setHeader("User-Agent", (String) null);
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).doesNotContainKey("User-Agent");
builder.addHeader("User-Agent", "false");
headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("User-Agent", "false");
builder.addHeader("User-Agent", "true");
headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("User-Agent", "false,true");
}
@Test
public void testKeyNotIncludedWithFactoryThatReturnsNullValue() {
Builder builder = new Builder();
builder.setHeader("test", new LazyHeaderFactory() {
@Nullable
@Override
public String buildHeader() {
return null;
}
});
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).doesNotContainKey("test");
}
@Test
public void testKeyNotIncludedWithFactoryThatReturnsEmptyValue() {
Builder builder = new Builder();
builder.setHeader("test", new LazyHeaderFactory() {
@Nullable
@Override
public String buildHeader() {
return "";
}
});
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).doesNotContainKey("test");
}
@Test
public void testKeyIncludedWithOneFactoryThatReturnsNullAndOneFactoryThatDoesNotReturnNull() {
Builder builder = new Builder();
builder.addHeader("test", new LazyHeaderFactory() {
@Nullable
@Override
public String buildHeader() {
return null;
}
});
builder.addHeader("test", new LazyHeaderFactory() {
@Nullable
@Override
public String buildHeader() {
return "value";
}
});
LazyHeaders headers = builder.build();
assertThat(headers.getHeaders()).containsEntry("test", "value");
}
@Test
public void testEquals() {
LazyHeaderFactory firstLazyFactory = mock(LazyHeaderFactory.class);
LazyHeaderFactory secondLazyFactory = mock(LazyHeaderFactory.class);
new EqualsTester()
.addEqualityGroup(
new Builder().build(),
new Builder().build()
)
.addEqualityGroup(
new Builder().addHeader("key", "value").build(),
new Builder().addHeader("key", "value").build()
)
.addEqualityGroup(
new Builder().addHeader("key", "value").addHeader("key", "value").build()
)
.addEqualityGroup(
new Builder().addHeader("key", firstLazyFactory).build(),
new Builder().addHeader("key", firstLazyFactory).build()
)
.addEqualityGroup(
new Builder()
.addHeader("key", firstLazyFactory)
.addHeader("key", firstLazyFactory)
.build()
)
.addEqualityGroup(
new Builder()
.addHeader("firstKey", "value")
.addHeader("secondKey", firstLazyFactory)
.build(),
new Builder()
.addHeader("secondKey", firstLazyFactory)
.addHeader("firstKey", "value")
.build()
)
.addEqualityGroup(
new Builder().addHeader("key", "secondValue")
)
.addEqualityGroup(
new Builder().addHeader("secondKey", "value")
)
.addEqualityGroup(
new Builder().addHeader("key", secondLazyFactory)
)
.addEqualityGroup(
new Builder().addHeader("secondKey", firstLazyFactory)
)
.addEqualityGroup(
new Builder()
.addHeader("firstKey", "firstValue")
.addHeader("secondKey", "secondValue")
.build(),
new Builder()
.addHeader("firstKey", "firstValue")
.addHeader("secondKey", "secondValue")
.build(),
new Builder()
.addHeader("secondKey", "secondValue")
.addHeader("firstKey", "firstValue")
.build()
)
.addEqualityGroup(
new Builder()
.addHeader("firstKey", firstLazyFactory)
.addHeader("secondKey", secondLazyFactory)
.build(),
new Builder()
.addHeader("firstKey", firstLazyFactory)
.addHeader("secondKey", secondLazyFactory)
.build(),
new Builder()
.addHeader("secondKey", secondLazyFactory)
.addHeader("firstKey", firstLazyFactory)
.build()
)
.testEquals();
}
}