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.resource;
18  
19  import static org.apache.juneau.commons.utils.StringUtils.*;
20  import static org.apache.juneau.http.HttpHeaders.*;
21  import static org.junit.jupiter.api.Assertions.*;
22  
23  import java.io.*;
24  import java.nio.file.*;
25  
26  import org.apache.http.*;
27  import org.apache.juneau.*;
28  import org.apache.juneau.http.header.*;
29  import org.junit.jupiter.api.*;
30  
31  class FileResource_Test extends TestBase {
32  
33  	@Test void a01_basic() throws Exception {
34  		File f = Files.createTempFile("test", "txt").toFile();
35  		Files.write(f.toPath(), "foo".getBytes());
36  
37  		var x = new FileResource(null, f);
38  		assertEquals("foo", toUtf8(x.getContent()));
39  		assertTrue(x.isRepeatable());
40  		assertFalse(x.isStreaming());
41  
42  		var x2 = new FileResource(contentType("text/plain"), f);
43  		assertEquals("foo", toUtf8(x2.getContent()));
44  		assertEquals("text/plain", x2.getContentType().getValue());
45  		assertTrue(x2.isRepeatable());
46  		assertFalse(x2.isStreaming());
47  
48  		f.delete();
49  	}
50  
51  	@Test void a02_caching() throws Exception {
52  		File f = Files.createTempFile("test", "txt").toFile();
53  		Files.write(f.toPath(), "foo".getBytes());
54  
55  		var x = new FileResource(null, f).setCached();
56  		assertEquals("foo", toUtf8(x.getContent()));
57  		assertEquals("foo", toUtf8(x.getContent()));
58  		assertTrue(x.isRepeatable());
59  
60  		f.delete();
61  	}
62  
63  	@Test void a03_headers() throws Exception {
64  		File f = Files.createTempFile("test", "txt").toFile();
65  
66  		var x = new FileResource(null, f)
67  			.addHeader("Foo", "bar")
68  			.addHeader("Foo", "baz")
69  			.setHeader("Qux", "quux");
70  
71  		HeaderList headers = x.getHeaders();
72  		assertEquals("Foo: bar", headers.getFirst("Foo").get().toString());
73  		assertEquals("Foo: baz", headers.getLast("Foo").get().toString());
74  		assertEquals("Qux: quux", headers.getFirst("Qux").get().toString());
75  
76  		f.delete();
77  	}
78  
79  	@Test void a04_contentType() throws Exception {
80  		File f = Files.createTempFile("test", "txt").toFile();
81  
82  		var x = new FileResource(null, f)
83  			.setContentType("text/plain");
84  		assertEquals("text/plain", x.getContentType().getValue());
85  
86  		var x2 = new FileResource(null, f)
87  			.setContentType(contentType("text/html"));
88  		assertEquals("text/html", x2.getContentType().getValue());
89  
90  		f.delete();
91  	}
92  
93  	@Test void a05_contentEncoding() throws Exception {
94  		File f = Files.createTempFile("test", "txt").toFile();
95  
96  		var x = new FileResource(null, f)
97  			.setContentEncoding("identity");
98  		assertEquals("identity", x.getContentEncoding().getValue());
99  
100 		var x2 = new FileResource(null, f)
101 			.setContentEncoding(contentEncoding("gzip"));
102 		assertEquals("gzip", x2.getContentEncoding().getValue());
103 
104 		f.delete();
105 	}
106 
107 	@Test void a06_chunked() throws Exception {
108 		File f = Files.createTempFile("test", "txt").toFile();
109 
110 		var x = new FileResource(null, f)
111 			.setChunked();
112 		assertTrue(x.isChunked());
113 
114 		var x2 = new FileResource(null, f)
115 			.setChunked(true);
116 		assertTrue(x2.isChunked());
117 
118 		var x3 = new FileResource(null, f)
119 			.setChunked(false);
120 		assertFalse(x3.isChunked());
121 
122 		f.delete();
123 	}
124 
125 	@Test void a07_fluentSetters() throws Exception {
126 		File f = Files.createTempFile("test", "txt").toFile();
127 		var x = new FileResource(null, f);
128 
129 		// Test setHeader returns correct type
130 		assertSame(x, x.setHeader("X-Test", "value"));
131 		assertEquals("value", x.getHeaders().getFirst("X-Test").get().getValue());
132 
133 		// Test addHeader returns correct type
134 		assertSame(x, x.addHeader("X-Test2", "value2"));
135 		assertEquals("value2", x.getHeaders().getFirst("X-Test2").get().getValue());
136 
137 		// Test setHeaders returns correct type
138 		assertSame(x, x.setHeaders(header("X-Test3", "value3")));
139 		assertEquals("value3", x.getHeaders().getFirst("X-Test3").get().getValue());
140 
141 		// Test addHeaders returns correct type
142 		assertSame(x, x.addHeaders(header("X-Test4", "value4")));
143 		assertEquals("value4", x.getHeaders().getFirst("X-Test4").get().getValue());
144 
145 		f.delete();
146 	}
147 
148 	@Test void a08_copy() throws Exception {
149 		File f = Files.createTempFile("test", "txt").toFile();
150 		Files.write(f.toPath(), "foo".getBytes());
151 
152 		var x = new FileResource(contentType("text/plain"), f)
153 			.setHeader("Foo", "bar");
154 
155 		FileResource x2 = x.copy();
156 		assertNotSame(x, x2);
157 		assertEquals("foo", toUtf8(x2.getContent()));
158 		assertEquals("text/plain", x2.getContentType().getValue());
159 		assertEquals("bar", x2.getHeaders().getFirst("Foo").get().getValue());
160 
161 		f.delete();
162 	}
163 
164 	@Test void a09_contentLength() throws Exception {
165 		File f = Files.createTempFile("test", "txt").toFile();
166 		Files.write(f.toPath(), "foo".getBytes());
167 
168 		var x = new FileResource(null, f);
169 		assertEquals(3L, x.getContentLength());
170 
171 		// Content length is derived from actual file length for FileResource
172 		var x2 = new FileResource(null, f).setContentLength(10);
173 		assertEquals(3L, x2.getContentLength());
174 
175 		f.delete();
176 	}
177 
178 	//------------------------------------------------------------------------------------------------------------------
179 	// Utility methods
180 	//------------------------------------------------------------------------------------------------------------------
181 
182 	private static Header header(String name, Object val) {
183 		return BasicHeader.of(name, val);
184 	}
185 }