/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed 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.uberfire.server; import java.net.URI; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.uberfire.io.IOService; import org.uberfire.java.nio.file.Path; import org.uberfire.server.util.FileServletUtil; import static java.lang.String.format; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class FileDownloadServletTest { private static final String PARAM_PATH = "path"; private static final String TEST_ROOT_PATH = "default://master@test-repository/test-project/src/main/resources/test"; @Mock private IOService ioService; @Mock private ServletOutputStream servletOutputStream; @InjectMocks private FileDownloadServlet downloadServlet; /** * Tests the downloading of a file given the following parameters: * <p> * 1) the file path on the server side of a file with no blank spaces in the name. */ @Test public void downloadByPathWithNoSpaces() throws Exception { //test the download of a file name with no blank spaces. String fileName = "FileNameWithNoSpaces.someextension"; String fileContent = "the local file content"; doDownloadByPath(TEST_ROOT_PATH, fileName, fileContent); } /** * Tests the downloading of a file given the following parameters: * <p> * 1) the file path on the server side of a file with blank spaces in the name. */ @Test public void downloadByPathWithSpaces() throws Exception { //test the the download of a file name with blank spaces. String fileName = "File Name With Spaces.some extension"; String fileContent = "the local file content"; doDownloadByPath(TEST_ROOT_PATH, fileName, fileContent); } private void doDownloadByPath(String sourceFolder, String sourceFileName, String fileContent) throws Exception { HttpServletRequest request = mock(HttpServletRequest.class); HttpServletResponse response = mock(HttpServletResponse.class); String sourcePath = sourceFolder + "/" + sourceFileName; //mock the servlet parameters when(request.getParameter(PARAM_PATH)).thenReturn(sourcePath); //mock the servlet output stream when(response.getOutputStream()).thenReturn(servletOutputStream); //mock the path to be generated by the ioService Path path = mock(Path.class); Path pathFileName = mock(Path.class); when(path.getFileName()).thenReturn(pathFileName); when(pathFileName.toString()).thenReturn(sourceFileName); //Expected URI URI expectedURI = new URI(FileServletUtil.encodeFileNamePart(sourcePath)); //mock the path generation when(ioService.get(expectedURI)).thenReturn(path); //mock the returned content when(ioService.readAllBytes(path)).thenReturn(fileContent.getBytes()); downloadServlet.doGet(request, response); verify(response, times(1)).setHeader("Content-Disposition", format("attachment; filename=\"%s\";", sourceFileName)); verify(response, times(1)).setContentType(eq("application/octet-stream")); verify(response, times(1)).getOutputStream(); verify(servletOutputStream, times(1)).write(fileContent.getBytes(), 0, fileContent.getBytes().length); verify(ioService, times(1)).get(eq(expectedURI)); verify(ioService, times(1)).readAllBytes(eq(path)); } }