1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package org.apache.hc.client5.http.protocol;
30
31
32 import static org.junit.jupiter.api.Assertions.assertThrows;
33 import static org.mockito.Answers.RETURNS_DEEP_STUBS;
34 import static org.mockito.Mockito.mock;
35 import static org.mockito.Mockito.when;
36
37 import org.apache.hc.core5.http.EntityDetails;
38 import org.apache.hc.core5.http.Header;
39 import org.apache.hc.core5.http.HttpHeaders;
40 import org.apache.hc.core5.http.HttpRequest;
41 import org.apache.hc.core5.http.ProtocolException;
42 import org.apache.hc.core5.http.protocol.HttpContext;
43 import org.junit.jupiter.api.BeforeEach;
44 import org.junit.jupiter.api.Test;
45 import org.mockito.Mock;
46 import org.mockito.MockitoAnnotations;
47
48 class TestRequestIfRange {
49 @Mock
50 private HttpRequest request;
51
52 @Mock
53 private EntityDetails entity;
54
55 @Mock
56 private HttpContext context;
57
58 private RequestIfRange requestIfRange;
59
60 @BeforeEach
61 void setUp() {
62 MockitoAnnotations.openMocks(this);
63 requestIfRange = new RequestIfRange();
64 }
65
66 @Test
67 void testNoIfRangeHeader() throws Exception {
68 when(request.getFirstHeader(HttpHeaders.IF_RANGE)).thenReturn(null);
69 requestIfRange.process(request, entity, context);
70
71 }
72
73 @Test
74 void testIfRangeWithoutRangeHeader() {
75 when(request.getFirstHeader(HttpHeaders.IF_RANGE)).thenReturn(mock(Header.class));
76 when(request.containsHeader(HttpHeaders.RANGE)).thenReturn(false);
77
78 assertThrows(ProtocolException.class, () -> requestIfRange.process(request, entity, context));
79 }
80
81 @Test
82 void testWeakETagInIfRange() {
83 when(request.getFirstHeader(HttpHeaders.IF_RANGE)).thenReturn(mock(Header.class));
84 when(request.containsHeader(HttpHeaders.RANGE)).thenReturn(true);
85 when(request.getFirstHeader(HttpHeaders.ETAG)).thenReturn(mock(Header.class, RETURNS_DEEP_STUBS));
86 when(request.getFirstHeader(HttpHeaders.ETAG).getValue()).thenReturn("W/\"weak-etag\"");
87
88 assertThrows(ProtocolException.class, () -> requestIfRange.process(request, entity, context));
89 }
90
91
92 @Test
93 void testDateHeaderWithStrongValidator() throws Exception {
94 when(request.getFirstHeader(HttpHeaders.IF_RANGE)).thenReturn(mock(Header.class));
95 when(request.containsHeader(HttpHeaders.RANGE)).thenReturn(true);
96 when(request.getFirstHeader(HttpHeaders.DATE)).thenReturn(mock(Header.class, RETURNS_DEEP_STUBS));
97 when(request.getFirstHeader(HttpHeaders.DATE).getValue()).thenReturn("Tue, 15 Nov 2022 08:12:31 GMT");
98 when(request.getFirstHeader(HttpHeaders.LAST_MODIFIED)).thenReturn(mock(Header.class, RETURNS_DEEP_STUBS));
99 when(request.getFirstHeader(HttpHeaders.LAST_MODIFIED).getValue()).thenReturn("Tue, 15 Nov 2022 08:12:30 GMT");
100
101 requestIfRange.process(request, entity, context);
102
103 }
104
105 @Test
106 void testSmallDifferenceWithETagPresent() {
107 when(request.getFirstHeader(HttpHeaders.IF_RANGE)).thenReturn(mock(Header.class));
108 when(request.containsHeader(HttpHeaders.RANGE)).thenReturn(true);
109 when(request.getFirstHeader(HttpHeaders.DATE)).thenReturn(mock(Header.class, RETURNS_DEEP_STUBS));
110 when(request.getFirstHeader(HttpHeaders.DATE).getValue()).thenReturn("Tue, 15 Nov 2022 08:12:30 GMT");
111 when(request.getFirstHeader(HttpHeaders.LAST_MODIFIED)).thenReturn(mock(Header.class, RETURNS_DEEP_STUBS));
112 when(request.getFirstHeader(HttpHeaders.LAST_MODIFIED).getValue()).thenReturn("Tue, 15 Nov 2022 08:12:30 GMT");
113 final Header mockETagHeader = mock(Header.class);
114 when(mockETagHeader.getValue()).thenReturn("\"some-value\"");
115 when(request.getFirstHeader(HttpHeaders.ETAG)).thenReturn(mockETagHeader);
116
117 assertThrows(ProtocolException.class, () -> requestIfRange.process(request, entity, context));
118 }
119
120 @Test
121 void testSmallDifferenceWithETagAbsent() throws Exception {
122 when(request.getFirstHeader(HttpHeaders.IF_RANGE)).thenReturn(mock(Header.class));
123 when(request.containsHeader(HttpHeaders.RANGE)).thenReturn(true);
124 when(request.getFirstHeader(HttpHeaders.DATE)).thenReturn(mock(Header.class, RETURNS_DEEP_STUBS));
125 when(request.getFirstHeader(HttpHeaders.DATE).getValue()).thenReturn("Tue, 15 Nov 2022 08:12:31 GMT");
126 when(request.getFirstHeader(HttpHeaders.LAST_MODIFIED)).thenReturn(mock(Header.class, RETURNS_DEEP_STUBS));
127 when(request.getFirstHeader(HttpHeaders.LAST_MODIFIED).getValue()).thenReturn("Tue, 15 Nov 2022 08:12:30 GMT");
128 when(request.getFirstHeader(HttpHeaders.ETAG)).thenReturn(null);
129
130 requestIfRange.process(request, entity, context);
131
132 }
133
134 }