/** * Returns a new immutable {@link LazyHeaders} object. */ public LazyHeaders build() { copyOnModify = true; return new LazyHeaders(headers); }
@Override public Map<String, String> getHeaders() { if (combinedHeaders == null) { synchronized (this) { if (combinedHeaders == null) { this.combinedHeaders = Collections.unmodifiableMap(generateHeaders()); } } } return combinedHeaders; }
private Map<String, String> generateHeaders() { Map<String, String> combinedHeaders = new HashMap<>(); for (Map.Entry<String, List<LazyHeaderFactory>> entry : headers.entrySet()) { String values = buildHeaderValue(entry.getValue()); if (!TextUtils.isEmpty(values)) { combinedHeaders.put(entry.getKey(), values); } } return combinedHeaders; }
@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 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"); }
@Override public Map<String, String> getHeaders() { if (combinedHeaders == null) { synchronized (this) { if (combinedHeaders == null) { this.combinedHeaders = Collections.unmodifiableMap(generateHeaders()); } } } return combinedHeaders; }
/** * Returns a new immutable {@link LazyHeaders} object. */ public LazyHeaders build() { copyOnModify = true; return new LazyHeaders(headers); }
@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"); }
@Override public Map<String, String> getHeaders() { if (combinedHeaders == null) { synchronized (this) { if (combinedHeaders == null) { this.combinedHeaders = Collections.unmodifiableMap(generateHeaders()); } } } return combinedHeaders; }
/** * Returns a new immutable {@link LazyHeaders} object. */ public LazyHeaders build() { copyOnModify = true; return new LazyHeaders(headers); }
@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 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 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 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 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 testIncludesEagerHeaders() { Map<String, String> headers = new Builder() .addHeader("key", "value") .build() .getHeaders(); assertThat(headers).containsEntry("key", "value"); }
@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 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 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 testMultipleEagerValuesAreSeparatedByCommas() { Map<String, String> headers = new Builder() .addHeader("key", "first") .addHeader("key", "second") .build() .getHeaders(); assertThat(headers).containsEntry("key", "first,second"); }