From 1841b14b21d0240952afc2a29cd1235be85a6cca Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sun, 15 Aug 2010 22:02:40 +0000 Subject: [PATCH] consistent mocks between modules --- .../web/MockMultipartHttpServletRequest.java | 18 +-- .../mock/web/MockServletContext.java | 20 +-- .../portlet/MockMultipartActionRequest.java | 16 +-- .../portlet/MockMultipartActionRequest.java | 17 +-- .../mock/web/MockMultipartFile.java | 132 ++++++++++++++++++ .../web/MockMultipartHttpServletRequest.java | 86 ++++++++++++ .../mock/web/MockServletContext.java | 23 +-- 7 files changed, 269 insertions(+), 43 deletions(-) create mode 100644 org.springframework.web/src/test/java/org/springframework/mock/web/MockMultipartFile.java create mode 100644 org.springframework.web/src/test/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java diff --git a/org.springframework.test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java b/org.springframework.test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java index 5c639461618..7942c4c6ed5 100644 --- a/org.springframework.test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java +++ b/org.springframework.test/src/main/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,13 +18,12 @@ package org.springframework.mock.web; import java.util.Collections; import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import org.springframework.util.Assert; -import org.springframework.util.MultiValueMap; import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; @@ -44,7 +43,8 @@ import org.springframework.web.multipart.MultipartHttpServletRequest; */ public class MockMultipartHttpServletRequest extends MockHttpServletRequest implements MultipartHttpServletRequest { - private final MultiValueMap multipartFiles = new LinkedMultiValueMap(); + private final MultiValueMap multipartFiles = + new LinkedMultiValueMap(); /** @@ -58,7 +58,7 @@ public class MockMultipartHttpServletRequest extends MockHttpServletRequest impl } public Iterator getFileNames() { - return getFileMap().keySet().iterator(); + return this.multipartFiles.keySet().iterator(); } public MultipartFile getFile(String name) { @@ -74,13 +74,13 @@ public class MockMultipartHttpServletRequest extends MockHttpServletRequest impl return Collections.emptyList(); } } - + public Map getFileMap() { - return Collections.unmodifiableMap(this.multipartFiles.toSingleValueMap()); + return this.multipartFiles.toSingleValueMap(); } public MultiValueMap getMultiFileMap() { - return new LinkedMultiValueMap(Collections.unmodifiableMap(this.multipartFiles)); + return new LinkedMultiValueMap(this.multipartFiles); } } diff --git a/org.springframework.test/src/main/java/org/springframework/mock/web/MockServletContext.java b/org.springframework.test/src/main/java/org/springframework/mock/web/MockServletContext.java index b45d01b2397..55d04d71e60 100644 --- a/org.springframework.test/src/main/java/org/springframework/mock/web/MockServletContext.java +++ b/org.springframework.test/src/main/java/org/springframework/mock/web/MockServletContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -89,6 +89,8 @@ public class MockServletContext implements ServletContext { private String contextPath = ""; + private int minorVersion = 5; + private final Map contexts = new HashMap(); private final Map initParameters = new LinkedHashMap(); @@ -97,7 +99,6 @@ public class MockServletContext implements ServletContext { private String servletContextName = "MockServletContext"; - private int minorVersion = 5; /** * Create a new MockServletContext, using no base path and a @@ -181,6 +182,13 @@ public class MockServletContext implements ServletContext { return 2; } + public void setMinorVersion(int minorVersion) { + if (minorVersion < 3 || minorVersion > 5) { + throw new IllegalArgumentException("Only Servlet minor versions between 3 and 5 are supported"); + } + this.minorVersion = minorVersion; + } + public int getMinorVersion() { return this.minorVersion; } @@ -341,11 +349,6 @@ public class MockServletContext implements ServletContext { return this.servletContextName; } - public void setMinorVersion(int minorVersion) { - if (minorVersion <3 || minorVersion > 5) - throw new IllegalArgumentException("Only Servlet minor versions between 3 and 5 are supported"); - this.minorVersion = minorVersion; - } /** * Inner factory class used to just introduce a Java Activation Framework @@ -357,4 +360,5 @@ public class MockServletContext implements ServletContext { return FileTypeMap.getDefaultFileTypeMap().getContentType(filePath); } } -} \ No newline at end of file + +} diff --git a/org.springframework.test/src/main/java/org/springframework/mock/web/portlet/MockMultipartActionRequest.java b/org.springframework.test/src/main/java/org/springframework/mock/web/portlet/MockMultipartActionRequest.java index 97faefa1e12..2f7fa36c429 100644 --- a/org.springframework.test/src/main/java/org/springframework/mock/web/portlet/MockMultipartActionRequest.java +++ b/org.springframework.test/src/main/java/org/springframework/mock/web/portlet/MockMultipartActionRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,13 +18,12 @@ package org.springframework.mock.web.portlet; import java.util.Collections; import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import org.springframework.util.Assert; -import org.springframework.util.MultiValueMap; import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.portlet.multipart.MultipartActionRequest; @@ -43,7 +42,8 @@ import org.springframework.web.portlet.multipart.MultipartActionRequest; */ public class MockMultipartActionRequest extends MockActionRequest implements MultipartActionRequest { - private final MultiValueMap multipartFiles = new LinkedMultiValueMap(); + private final MultiValueMap multipartFiles = + new LinkedMultiValueMap(); /** @@ -57,7 +57,7 @@ public class MockMultipartActionRequest extends MockActionRequest implements Mul } public Iterator getFileNames() { - return getFileMap().keySet().iterator(); + return this.multipartFiles.keySet().iterator(); } public MultipartFile getFile(String name) { @@ -75,11 +75,11 @@ public class MockMultipartActionRequest extends MockActionRequest implements Mul } public Map getFileMap() { - return Collections.unmodifiableMap(this.multipartFiles.toSingleValueMap()); + return this.multipartFiles.toSingleValueMap(); } public MultiValueMap getMultiFileMap() { - return new LinkedMultiValueMap(Collections.unmodifiableMap(this.multipartFiles)); + return new LinkedMultiValueMap(this.multipartFiles); } } diff --git a/org.springframework.web.portlet/src/test/java/org/springframework/mock/web/portlet/MockMultipartActionRequest.java b/org.springframework.web.portlet/src/test/java/org/springframework/mock/web/portlet/MockMultipartActionRequest.java index 8ab007c0ced..25520f448d3 100644 --- a/org.springframework.web.portlet/src/test/java/org/springframework/mock/web/portlet/MockMultipartActionRequest.java +++ b/org.springframework.web.portlet/src/test/java/org/springframework/mock/web/portlet/MockMultipartActionRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,13 +18,12 @@ package org.springframework.mock.web.portlet; import java.util.Collections; import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import org.springframework.util.Assert; -import org.springframework.util.MultiValueMap; import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.portlet.multipart.MultipartActionRequest; @@ -43,7 +42,8 @@ import org.springframework.web.portlet.multipart.MultipartActionRequest; */ public class MockMultipartActionRequest extends MockActionRequest implements MultipartActionRequest { - private final MultiValueMap multipartFiles = new LinkedMultiValueMap(); + private final MultiValueMap multipartFiles = + new LinkedMultiValueMap(); /** @@ -57,7 +57,7 @@ public class MockMultipartActionRequest extends MockActionRequest implements Mul } public Iterator getFileNames() { - return getFileMap().keySet().iterator(); + return this.multipartFiles.keySet().iterator(); } public MultipartFile getFile(String name) { @@ -75,10 +75,11 @@ public class MockMultipartActionRequest extends MockActionRequest implements Mul } public Map getFileMap() { - return Collections.unmodifiableMap(this.multipartFiles.toSingleValueMap()); + return this.multipartFiles.toSingleValueMap(); } public MultiValueMap getMultiFileMap() { - return new LinkedMultiValueMap(Collections.unmodifiableMap(this.multipartFiles)); + return new LinkedMultiValueMap(this.multipartFiles); } + } diff --git a/org.springframework.web/src/test/java/org/springframework/mock/web/MockMultipartFile.java b/org.springframework.web/src/test/java/org/springframework/mock/web/MockMultipartFile.java new file mode 100644 index 00000000000..3bf5523c6ab --- /dev/null +++ b/org.springframework.web/src/test/java/org/springframework/mock/web/MockMultipartFile.java @@ -0,0 +1,132 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * 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.springframework.mock.web; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +import org.springframework.util.Assert; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +/** + * Mock implementation of the {@link org.springframework.web.multipart.MultipartFile} + * interface. + * + *

Useful in conjunction with a {@link MockMultipartHttpServletRequest} + * for testing application controllers that access multipart uploads. + * + * @author Juergen Hoeller + * @author Eric Crampton + * @since 2.0 + * @see MockMultipartHttpServletRequest + */ +public class MockMultipartFile implements MultipartFile { + + private final String name; + + private String originalFilename; + + private String contentType; + + private final byte[] content; + + + /** + * Create a new MockMultipartFile with the given content. + * @param name the name of the file + * @param content the content of the file + */ + public MockMultipartFile(String name, byte[] content) { + this(name, "", null, content); + } + + /** + * Create a new MockMultipartFile with the given content. + * @param name the name of the file + * @param contentStream the content of the file as stream + * @throws java.io.IOException if reading from the stream failed + */ + public MockMultipartFile(String name, InputStream contentStream) throws IOException { + this(name, "", null, FileCopyUtils.copyToByteArray(contentStream)); + } + + /** + * Create a new MockMultipartFile with the given content. + * @param name the name of the file + * @param originalFilename the original filename (as on the client's machine) + * @param contentType the content type (if known) + * @param content the content of the file + */ + public MockMultipartFile(String name, String originalFilename, String contentType, byte[] content) { + Assert.hasLength(name, "Name must not be null"); + this.name = name; + this.originalFilename = (originalFilename != null ? originalFilename : ""); + this.contentType = contentType; + this.content = (content != null ? content : new byte[0]); + } + + /** + * Create a new MockMultipartFile with the given content. + * @param name the name of the file + * @param originalFilename the original filename (as on the client's machine) + * @param contentType the content type (if known) + * @param contentStream the content of the file as stream + * @throws java.io.IOException if reading from the stream failed + */ + public MockMultipartFile(String name, String originalFilename, String contentType, InputStream contentStream) + throws IOException { + + this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream)); + } + + + public String getName() { + return this.name; + } + + public String getOriginalFilename() { + return this.originalFilename; + } + + public String getContentType() { + return this.contentType; + } + + public boolean isEmpty() { + return (this.content.length == 0); + } + + public long getSize() { + return this.content.length; + } + + public byte[] getBytes() throws IOException { + return this.content; + } + + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(this.content); + } + + public void transferTo(File dest) throws IOException, IllegalStateException { + FileCopyUtils.copy(this.content, dest); + } + +} \ No newline at end of file diff --git a/org.springframework.web/src/test/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java b/org.springframework.web/src/test/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java new file mode 100644 index 00000000000..f06d34c85ec --- /dev/null +++ b/org.springframework.web/src/test/java/org/springframework/mock/web/MockMultipartHttpServletRequest.java @@ -0,0 +1,86 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * 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.springframework.mock.web; + +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.springframework.util.Assert; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +/** + * Mock implementation of the + * {@link org.springframework.web.multipart.MultipartHttpServletRequest} interface. + * + *

Useful for testing application controllers that access multipart uploads. + * The {@link org.springframework.mock.web.MockMultipartFile} can be used to populate these mock requests + * with files. + * + * @author Juergen Hoeller + * @author Eric Crampton + * @author Arjen Poutsma + * @since 2.0 + * @see org.springframework.mock.web.MockMultipartFile + */ +public class MockMultipartHttpServletRequest extends MockHttpServletRequest implements MultipartHttpServletRequest { + + private final MultiValueMap multipartFiles = + new LinkedMultiValueMap(); + + + /** + * Add a file to this request. The parameter name from the multipart + * form is taken from the {@link org.springframework.web.multipart.MultipartFile#getName()}. + * @param file multipart file to be added + */ + public void addFile(MultipartFile file) { + Assert.notNull(file, "MultipartFile must not be null"); + this.multipartFiles.add(file.getName(), file); + } + + public Iterator getFileNames() { + return this.multipartFiles.keySet().iterator(); + } + + public MultipartFile getFile(String name) { + return this.multipartFiles.getFirst(name); + } + + public List getFiles(String name) { + List multipartFiles = this.multipartFiles.get(name); + if (multipartFiles != null) { + return multipartFiles; + } + else { + return Collections.emptyList(); + } + } + + public Map getFileMap() { + return this.multipartFiles.toSingleValueMap(); + } + + public MultiValueMap getMultiFileMap() { + return new LinkedMultiValueMap(this.multipartFiles); + } + +} \ No newline at end of file diff --git a/org.springframework.web/src/test/java/org/springframework/mock/web/MockServletContext.java b/org.springframework.web/src/test/java/org/springframework/mock/web/MockServletContext.java index 1f3c1860bd3..abcff79c41d 100644 --- a/org.springframework.web/src/test/java/org/springframework/mock/web/MockServletContext.java +++ b/org.springframework.web/src/test/java/org/springframework/mock/web/MockServletContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -89,6 +89,8 @@ public class MockServletContext implements ServletContext { private String contextPath = ""; + private int minorVersion = 5; + private final Map contexts = new HashMap(); private final Map initParameters = new LinkedHashMap(); @@ -97,8 +99,6 @@ public class MockServletContext implements ServletContext { private String servletContextName = "MockServletContext"; - private int minorVersion = 5; - /** * Create a new MockServletContext, using no base path and a @@ -182,8 +182,15 @@ public class MockServletContext implements ServletContext { return 2; } + public void setMinorVersion(int minorVersion) { + if (minorVersion < 3 || minorVersion > 5) { + throw new IllegalArgumentException("Only Servlet minor versions between 3 and 5 are supported"); + } + this.minorVersion = minorVersion; + } + public int getMinorVersion() { - return minorVersion; + return this.minorVersion; } public String getMimeType(String filePath) { @@ -342,11 +349,6 @@ public class MockServletContext implements ServletContext { return this.servletContextName; } - public void setMinorVersion(int minorVersion) { - if (minorVersion <3 || minorVersion > 5) - throw new IllegalArgumentException("Only Servlet minor versions between 3 and 5 are supported"); - this.minorVersion = minorVersion; - } /** * Inner factory class used to just introduce a Java Activation Framework @@ -358,4 +360,5 @@ public class MockServletContext implements ServletContext { return FileTypeMap.getDefaultFileTypeMap().getContentType(filePath); } } -} \ No newline at end of file + +}