View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.http;
18  
19  import static org.apache.juneau.TestUtils.*;
20  import static org.apache.juneau.commons.utils.StringUtils.*;
21  import static org.apache.juneau.http.HttpHeaders.*;
22  import static org.apache.juneau.http.HttpResources.*;
23  import static org.apache.juneau.junit.bct.BctAssertions.*;
24  import static org.junit.jupiter.api.Assertions.*;
25  
26  import java.io.*;
27  import java.nio.file.*;
28  
29  import org.apache.juneau.*;
30  import org.apache.juneau.http.header.*;
31  import org.junit.jupiter.api.*;
32  
33  class BasicHttpResource_Test extends TestBase {
34  
35  	@Test void a01_basic() throws Exception {
36  		var f = Files.createTempFile("test","txt").toFile();
37  
38  		var x = stringResource((String)null);
39  		assertNull(x.getContentType());
40  		assertEquals("", toUtf8(x.getContent()));
41  		assertNull(x.getContentEncoding());
42  		assertEmpty(x.getHeaders());
43  
44  		var x2 = stringResource("foo");
45  		assertEquals("foo", toUtf8(x2.getContent()));
46  		assertTrue(x2.isRepeatable());
47  		assertFalse(x2.isStreaming());
48  
49  		var x3 = readerResource(reader("foo"));
50  		assertEquals("foo", toUtf8(x3.getContent()));
51  		assertFalse(x3.isRepeatable());
52  		assertTrue(x3.isStreaming());
53  
54  		var x4 = byteArrayResource("foo".getBytes());
55  		assertEquals("foo", toUtf8(x4.getContent()));
56  		assertTrue(x4.isRepeatable());
57  		assertFalse(x4.isStreaming());
58  
59  		var x5 = streamResource(inputStream("foo"));
60  		assertEquals("foo", toUtf8(x5.getContent()));
61  		assertFalse(x5.isRepeatable());
62  		assertTrue(x5.isStreaming());
63  
64  		var x6 = fileResource(f);
65  		assertEquals("", toUtf8(x6.getContent()));
66  		assertTrue(x6.isRepeatable());
67  		assertFalse(x6.isStreaming());
68  
69  		var x7 = stringResource("foo").setCached();
70  		assertEquals("foo", toUtf8(x7.getContent()));
71  		assertEquals("foo", toUtf8(x7.getContent()));
72  		assertTrue(x7.isRepeatable());
73  
74  		var x8 = readerResource(reader("foo")).setCached();
75  		assertEquals("foo", toUtf8(x8.getContent()));
76  		assertEquals("foo", toUtf8(x8.getContent()));
77  		assertTrue(x8.isRepeatable());
78  
79  		var x9 = byteArrayResource("foo".getBytes()).setCached();
80  		assertEquals("foo", toUtf8(x9.getContent()));
81  		assertEquals("foo", toUtf8(x9.getContent()));
82  		assertTrue(x9.isRepeatable());
83  
84  		var x10 = streamResource(inputStream("foo")).setCached();
85  		assertEquals("foo", toUtf8(x10.getContent()));
86  		assertEquals("foo", toUtf8(x10.getContent()));
87  		assertTrue(x10.isRepeatable());
88  
89  		var x11 = stringResource((String)null).setCached();
90  		assertEquals("", toUtf8(x11.getContent()));
91  		assertTrue(x11.isRepeatable());
92  		x11.writeTo(new ByteArrayOutputStream());
93  
94  		var x12 = fileResource(f).setCached();
95  		assertEquals("", toUtf8(x12.getContent()));
96  		assertTrue(x12.isRepeatable());
97  		x12.writeTo(new ByteArrayOutputStream());
98  
99  		assertEquals(3L, stringResource("foo").getContentLength());
100 		assertEquals(3L, byteArrayResource("foo".getBytes()).getContentLength());
101 		assertEquals(0L, fileResource(f).getContentLength());
102 
103 		assertEquals(-1L, readerResource(reader("foo")).getContentLength());
104 		assertEquals(3L, readerResource(reader("foo")).setContentLength(3).getContentLength());
105 
106 		var x13 = stringResource("foo", contentType("text/plain")).setContentEncoding("identity");
107 		assertEquals("text/plain", x13.getContentType().getValue());
108 		assertEquals("identity", x13.getContentEncoding().getValue());
109 
110 		var x14 = stringResource("foo", null).setContentEncoding((String)null);
111 		assertNull(x14.getContentType());
112 		assertNull(x14.getContentEncoding());
113 	}
114 
115 	@Test void a02_header_String_Object() {
116 		var x = stringResource("foo").addHeader("Foo","bar").addHeader("Foo","baz").addHeader(null,"bar").addHeader("foo",null).getHeaders();
117 		assertEquals("Foo: bar", x.getFirst("Foo").get().toString());
118 		assertEquals("Foo: baz", x.getLast("Foo").get().toString());
119 		assertEmpty(x.getFirst("Bar"));
120 		assertEmpty(x.getLast("Bar"));
121 		assertList(x.getAll(), "Foo: bar", "Foo: baz");
122 	}
123 
124 	@Test void a03_header_Header() {
125 		var x = stringResource("foo").addHeaders(header("Foo","bar")).addHeaders(header("Foo","baz")).addHeaders(header("Bar",null)).getHeaders();
126 		assertEquals("Foo: bar", x.getFirst("Foo").get().toString());
127 		assertEquals("Foo: baz", x.getLast("Foo").get().toString());
128 		assertNull(x.getFirst("Bar").get().getValue());
129 		assertNull(x.getLast("Bar").get().getValue());
130 		assertList(x.getAll(), "Foo: bar", "Foo: baz", "Bar: null");
131 	}
132 
133 	@Test void a04_headers_List() {
134 		var x = stringResource("foo").addHeaders(header("Foo","bar"),header("Foo","baz"),header("Bar",null),null).getHeaders();
135 		assertEquals("Foo: bar", x.getFirst("Foo").get().toString());
136 		assertEquals("Foo: baz", x.getLast("Foo").get().toString());
137 		assertNull(x.getFirst("Bar").get().getValue());
138 		assertNull(x.getLast("Bar").get().getValue());
139 		assertList(x.getAll(), "Foo: bar", "Foo: baz", "Bar: null");
140 	}
141 
142 	@Test void a05_headers_array() {
143 		var x = stringResource("foo").addHeaders(header("Foo","bar"),header("Foo","baz"),header("Bar",null),null).getHeaders();
144 		assertEquals("Foo: bar", x.getFirst("Foo").get().toString());
145 		assertEquals("Foo: baz", x.getLast("Foo").get().toString());
146 		assertNull(x.getFirst("Bar").get().getValue());
147 		assertNull(x.getLast("Bar").get().getValue());
148 		assertList(x.getAll(), "Foo: bar", "Foo: baz", "Bar: null");
149 	}
150 
151 	@Test void a06_chunked() {
152 		var x1 = stringResource("foo").setChunked();
153 		assertTrue(x1.isChunked());
154 		var x2 = stringResource("foo");
155 		assertFalse(x2.isChunked());
156 	}
157 
158 	@Test void a07_chunked_boolean() {
159 		var x1 = stringResource("foo").setChunked(true);
160 		assertTrue(x1.isChunked());
161 		var x2 = stringResource("foo").setChunked(false);
162 		assertFalse(x2.isChunked());
163 	}
164 
165 	@Test void a08_contentType_String() {
166 		var x1 = stringResource("foo").setContentType("text/plain");
167 		assertEquals("text/plain", x1.getContentType().getValue());
168 		var x2 = stringResource("foo").setContentType((String)null);
169 		assertNull(x2.getContentType());
170 	}
171 
172 	@Test void a09_contentEncoding_String() {
173 		var x1 = stringResource("foo").setContentEncoding("identity");
174 		assertEquals("identity", x1.getContentEncoding().getValue());
175 		var x2 = stringResource("foo").setContentEncoding((String)null);
176 		assertNull(x2.getContentEncoding());
177 	}
178 
179 	@Test void a10_setHeader_String_String() {
180 		var x = stringResource("foo").setHeader("Foo","bar").setHeader("Foo","baz").setHeader(null,"bar").setHeader("foo",null).getHeaders();
181 		assertEquals("Foo: baz", x.getFirst("Foo").get().toString());
182 		assertEquals("Foo: baz", x.getLast("Foo").get().toString());
183 		assertEmpty(x.getFirst("Bar"));
184 		assertEmpty(x.getLast("Bar"));
185 		assertList(x.getAll(), "Foo: baz");
186 	}
187 
188 	@Test void a11_setHeaders_array() {
189 		// setHeaders() replaces headers, so last value wins for duplicate names
190 		var x = stringResource("foo").setHeaders(header("Foo","bar"),header("Foo","baz"),header("Bar",null),null).getHeaders();
191 		assertEquals("Foo: baz", x.getFirst("Foo").get().toString());
192 		assertEquals("Foo: baz", x.getLast("Foo").get().toString());
193 		assertNull(x.getFirst("Bar").get().getValue());
194 		assertNull(x.getLast("Bar").get().getValue());
195 		assertList(x.getAll(), "Foo: baz", "Bar: null");
196 	}
197 
198 	@Test void a12_fluentSetters() throws Exception {
199 		// Test that all resource types return correct type for fluent chaining
200 		var s = stringResource("foo");
201 		assertSame(s, s.setHeader("X-Test", "value"));
202 		assertSame(s, s.addHeader("X-Test2", "value2"));
203 		assertSame(s, s.setHeaders(header("X-Test3", "value3")));
204 		assertSame(s, s.addHeaders(header("X-Test4", "value4")));
205 
206 		var ba = byteArrayResource("foo".getBytes());
207 		assertSame(ba, ba.setHeader("X-Test", "value"));
208 		assertSame(ba, ba.addHeader("X-Test2", "value2"));
209 		assertSame(ba, ba.setHeaders(header("X-Test3", "value3")));
210 		assertSame(ba, ba.addHeaders(header("X-Test4", "value4")));
211 
212 		var r = readerResource(reader("foo"));
213 		assertSame(r, r.setHeader("X-Test", "value"));
214 		assertSame(r, r.addHeader("X-Test2", "value2"));
215 		assertSame(r, r.setHeaders(header("X-Test3", "value3")));
216 		assertSame(r, r.addHeaders(header("X-Test4", "value4")));
217 
218 		var st = streamResource(inputStream("foo"));
219 		assertSame(st, st.setHeader("X-Test", "value"));
220 		assertSame(st, st.addHeader("X-Test2", "value2"));
221 		assertSame(st, st.setHeaders(header("X-Test3", "value3")));
222 		assertSame(st, st.addHeaders(header("X-Test4", "value4")));
223 
224 		var f = Files.createTempFile("test","txt").toFile();
225 		var fr = fileResource(f);
226 		assertSame(fr, fr.setHeader("X-Test", "value"));
227 		assertSame(fr, fr.addHeader("X-Test2", "value2"));
228 		assertSame(fr, fr.setHeaders(header("X-Test3", "value3")));
229 		assertSame(fr, fr.addHeaders(header("X-Test4", "value4")));
230 	}
231 
232 	//------------------------------------------------------------------------------------------------------------------
233 	// Utility methods
234 	//------------------------------------------------------------------------------------------------------------------
235 
236 	private static BasicHeader header(String name, Object val) {
237 		return new BasicHeader(name, val);
238 	}
239 }