Hi,

In our environment we noticed that CryptoKeyCreateActionTest was
failing. AFAIU, failure was due to the fact that the mocked request did
not have the uploaded file in it, that is, it was not a multipart request.

In order to fix that I added some code to support multipart requests in
RhnPostMockStrutsTestCase (patch 008). Code is a little convoluted
because the API required an extra class, yet I prefer
RhnPostMockStrutsTestCase to be self-contained - other solutions are
possible if you particularly dislike the proposed implementation. This
is of course reusable in other cases where mocking an uploaded file is
needed.

Patch 009 adds code to insert an (empty) uploaded key in
CryptoKeyCreateActionTest and this allowed the action to complete. I
also noticed that for whatever reason the "crypto.key.nokey" action
error is never issued, since CryptoKeyCreateAction extends
BaseCryptoKeyEditAction with isContentsRequired() always returning true,
so I removed that assertion as well.

Regards,
-- 
Silvio Moioli
SUSE LINUX Products GmbH
Maxfeldstraße 5, 90409 Nürnberg Germany


>From bc726176a9b91dbc51449673e6c845909bf999c2 Mon Sep 17 00:00:00 2001
From: Silvio Moioli <smoi...@suse.de>
Date: Tue, 10 Sep 2013 11:53:36 +0200
Subject: [PATCH 08/22] Add support for uploaded files in mocked requests

---
 .../rhn/testing/RhnPostMockStrutsTestCase.java     | 126 +++++++++++++++++++++
 1 file changed, 126 insertions(+)

diff --git a/java/code/src/com/redhat/rhn/testing/RhnPostMockStrutsTestCase.java b/java/code/src/com/redhat/rhn/testing/RhnPostMockStrutsTestCase.java
index 62f9596..5cb22af 100644
--- a/java/code/src/com/redhat/rhn/testing/RhnPostMockStrutsTestCase.java
+++ b/java/code/src/com/redhat/rhn/testing/RhnPostMockStrutsTestCase.java
@@ -14,6 +14,18 @@
  */
 package com.redhat.rhn.testing;
 
+import java.io.ByteArrayInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Hashtable;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.struts.Globals;
+import org.apache.struts.upload.CommonsMultipartRequestHandler;
+import org.apache.struts.upload.FormFile;
+
 import servletunit.HttpServletRequestSimulator;
 
 
@@ -30,5 +42,119 @@ public class RhnPostMockStrutsTestCase extends RhnMockStrutsTestCase {
     public void setUp() throws Exception {
         super.setUp();
         request.setMethod(HttpServletRequestSimulator.POST);
+        UploadsHandler.clear();
+    }
+
+    /**
+     * Adds an uploaded text file to the form.
+     *
+     * @param parameterName upload form parameter name
+     * @param fileName the file name
+     * @param contents the file contents
+     */
+    public void addUploadedFile(String parameterName, final String fileName,
+            final String contents) {
+
+        request.setContentType("multipart/form-data");
+        request.setAttribute(Globals.MULTIPART_KEY, UploadsHandler.class.getName());
+
+        final FormFile ff = new FormFile() {
+            public void destroy() {
+            }
+
+            public String getContentType() {
+                return "text/plain";
+            }
+
+            public byte[] getFileData() throws FileNotFoundException, IOException {
+                return contents.getBytes();
+            }
+
+            public String getFileName() {
+                return fileName;
+            }
+
+            public int getFileSize() {
+                return contents.length();
+            }
+
+            public InputStream getInputStream() throws FileNotFoundException, IOException {
+                return new ByteArrayInputStream(contents.getBytes());
+            }
+
+            public void setContentType(String contentType) {
+            }
+
+            public void setFileName(String fileName) {
+            }
+
+            public void setFileSize(int fileSize) {
+            }
+        };
+
+        UploadsHandler.addUpload(parameterName, ff);
+    }
+
+    /**
+     * An utility class to handle multipart requests.
+     */
+    public static final class UploadsHandler extends CommonsMultipartRequestHandler {
+        /** The request. */
+        private HttpServletRequest request = null;
+
+        /**
+         * Hashtable of uploaded file elements.
+         */
+        private static Hashtable<String, FormFile> uploadedFileElements =
+                new Hashtable<String, FormFile>();
+
+        /**
+         * Adds an uploaded file.
+         * @param parameterName the parameter name
+         * @param file the file
+         */
+        public static void addUpload(String parameterName, FormFile file) {
+            uploadedFileElements.put(parameterName, file);
+        }
+
+        /**
+         * Clears uploaded files.
+         */
+        public static void clear() {
+            uploadedFileElements.clear();
+        }
+
+
+        /**
+         * Handles a request.
+         * @param requestIn the request
+         */
+        @Override
+        public void handleRequest(HttpServletRequest requestIn) {
+            request = requestIn;
+        }
+
+
+        /**
+         * Returns all request elements, including uploaded files.
+         *
+         * @return the all elements
+         */
+        @SuppressWarnings("unchecked")
+        @Override
+        public Hashtable<String, Object> getAllElements() {
+            Hashtable<String, Object> result =
+                    new Hashtable<String, Object>(uploadedFileElements);
+            result.putAll(request.getParameterMap());
+            return result;
+        }
+
+        /**
+         * Cleans up if problems arise.
+         */
+        @Override
+        public void rollback() {
+            // nothing to do since this is just a stub
+        }
     }
 }
-- 
1.8.1.4



>From 9109c7911c5fe922d51fa7a20019884c6bc0e611 Mon Sep 17 00:00:00 2001
From: Silvio Moioli <smoi...@suse.de>
Date: Tue, 10 Sep 2013 11:52:48 +0200
Subject: [PATCH 09/22] CryptoKeyCreateActionTest: do not expect errors from
 testEdit, add uploaded file to testCreateSubmit()

---
 .../rhn/frontend/action/keys/test/CryptoKeyCreateActionTest.java     | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/java/code/src/com/redhat/rhn/frontend/action/keys/test/CryptoKeyCreateActionTest.java b/java/code/src/com/redhat/rhn/frontend/action/keys/test/CryptoKeyCreateActionTest.java
index 43efc1c..cecb61c 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/keys/test/CryptoKeyCreateActionTest.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/keys/test/CryptoKeyCreateActionTest.java
@@ -47,6 +47,7 @@ public class CryptoKeyCreateActionTest extends RhnPostMockStrutsTestCase {
         addRequestParameter(CryptoKeyCreateAction.DESCRIPTION, "somedesc");
         addRequestParameter(CryptoKeyCreateAction.TYPE,
                 KickstartFactory.KEY_TYPE_GPG.getLabel());
+        addUploadedFile(CryptoKeyCreateAction.CONTENTS, "somekey", "");
         actionPerform();
         assertNotNull(request.getAttribute(CryptoKeyCreateAction.KEY));
         String[] keys = {"crypto.key.nokey"};
@@ -65,9 +66,9 @@ public class CryptoKeyCreateActionTest extends RhnPostMockStrutsTestCase {
         TestUtils.flushAndEvict(key);
         addRequestParameter(RequestContext.KEY_ID,
                 key.getId().toString());
+        addUploadedFile(CryptoKeyCreateAction.CONTENTS, "somekey", "");
         actionPerform();
-        String[] keys = {"crypto.key.nokey"};
-        verifyActionErrors(keys);
+        verifyNoActionErrors();
     }
 }
 
-- 
1.8.1.4


_______________________________________________
Spacewalk-devel mailing list
Spacewalk-devel@redhat.com
https://www.redhat.com/mailman/listinfo/spacewalk-devel

Reply via email to