blob: 838aff9e45f7963d5aac0cc442c035bdfa8addd4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.wicket.request.resource;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.request.resource.IResource.Attributes;
import org.apache.wicket.util.tester.WicketTestCase;
import org.junit.jupiter.api.Test;
/**
* Unit tests for {@link ByteArrayResource}
*/
class ByteArrayResourceTest extends WicketTestCase
{
/**
* Unit test for {@link ByteArrayResource} with static byte array.
*/
@Test
void staticResource()
{
String contentType = "application/octet-stream";
byte[] array = new byte[] { 1, 2, 3 };
ByteArrayResource resource = new ByteArrayResource(contentType, array)
{
private static final long serialVersionUID = 1L;
@Override
protected void configureCache(ResourceResponse data, Attributes attributes)
{
// no caching is needed
}
};
WebRequest request = mock(WebRequest.class);
WebResponse response = mock(WebResponse.class);
Attributes attributes = new Attributes(request, response);
resource.respond(attributes);
verify(response).write(same(array));
verify(response).setContentLength(eq(3L));
verify(response).setContentType(eq(contentType));
}
/**
* Unit test for {@link ByteArrayResource} with dynamically generated byte array.
*/
@Test
void dynamicResource()
{
String contentType = "application/octet-stream";
final byte[] array = new byte[] { 1, 2, 3 };
ByteArrayResource resource = new ByteArrayResource(contentType)
{
private static final long serialVersionUID = 1L;
@Override
protected byte[] getData(Attributes attributes)
{
return array;
}
@Override
protected void configureCache(ResourceResponse data, Attributes attributes)
{
// no caching is needed
}
};
WebRequest request = mock(WebRequest.class);
WebResponse response = mock(WebResponse.class);
Attributes attributes = new Attributes(request, response);
resource.respond(attributes);
verify(response).write(same(array));
verify(response).setContentLength(eq(3L));
verify(response).setContentType(eq(contentType));
}
/**
* Content-Type should be resolved in the following way:
* <ol>
* <li>first check if the user passed it</li>
* <li>fallback to check by filename extension</li>
* <li>as final resort always use 'application/octet-stream'</li>
* </ol>
*
* See https://issues.apache.org/jira/browse/WICKET-4119
*/
@Test
void contentType()
{
String userSpecifiedContentType = "text/custom";
ByteArrayResource userSpecified = new ByteArrayResource(userSpecifiedContentType,
new byte[] { 1, 2, 3 });
tester.startResource(userSpecified);
assertEquals(userSpecifiedContentType, tester.getLastResponse().getContentType());
ByteArrayResource resolvedByExtension = new ByteArrayResource(null, new byte[] { 1, 2, 3 },
"image.png");
tester.startResource(resolvedByExtension);
assertEquals("image/png", tester.getLastResponse().getContentType());
ByteArrayResource finalResortOctetStream = new ByteArrayResource(null,
new byte[] { 1, 2, 3 }, null);
tester.startResource(finalResortOctetStream);
assertEquals("application/octet-stream", tester.getLastResponse().getContentType());
}
/**
* https://issues.apache.org/jira/browse/WICKET-4301
*
* Verify that HttpServletResponse#SC_NOT_FOUND is returned if there is no data.
*/
@Test
void noData() {
ByteArrayResource resource = new ByteArrayResource("text/plain");
tester.startResource(resource);
assertEquals(HttpServletResponse.SC_NOT_FOUND, tester.getLastResponse().getStatus());
assertEquals(0, tester.getLastResponse().getBinaryContent().length);
}
}