--- /dev/null
+/*
+ * 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.catalina.ha.session;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.catalina.realm.GenericPrincipal;
+
+import junit.framework.TestCase;
+
+public class TestSerializablePrincipal extends TestCase {
+
+ /**
+ * Simple serialization / de-serialization test for bug 43840.
+ */
+ public void testWriteReadPrincipal() {
+ // Get a temporary file to use for the serialization test
+ File file = null;
+ try {
+ file = File.createTempFile("ser", null);
+ file.deleteOnExit();
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail("ioe creating temporary file");
+ }
+
+ // Create the Principal to serialize
+ List<String> roles = new ArrayList<String>();
+ roles.add("RoleA");
+ roles.add("RoleB");
+ TesterPrincipal tpOriginal = new TesterPrincipal("inner");
+ GenericPrincipal gpOriginal =
+ new GenericPrincipal(null, "usr", "pwd", roles, tpOriginal);
+
+ // Do the serialization
+ try {
+ FileOutputStream fos = new FileOutputStream(file);
+ ObjectOutputStream oos = new ObjectOutputStream(fos);
+ SerializablePrincipal.writePrincipal(gpOriginal, oos);
+ oos.close();
+ fos.close();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ fail("fnfe creating object output stream");
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail("ioe serializing principal");
+ }
+
+ // De-serialize the Principal
+ GenericPrincipal gpNew = null;
+ try {
+ FileInputStream fis = new FileInputStream(file);
+ ObjectInputStream ois = new ObjectInputStream(fis);
+ gpNew = SerializablePrincipal.readPrincipal(ois, null);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ fail("fnfe reading object output stream");
+ } catch (IOException e) {
+ e.printStackTrace();
+ fail("ioe de-serializing principal");
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ fail("cnfe de-serializing principal");
+ }
+
+ // Now test how similar original and de-serialized versions are
+ assertEquals("User names different", gpOriginal.getName(),
+ gpNew.getName());
+ assertEquals("Passwords different", gpOriginal.getPassword(),
+ gpNew.getPassword());
+ assertEquals("Number of roles different", gpOriginal.getRoles().length,
+ gpNew.getRoles().length);
+ for (int i = 0; i < gpOriginal.getRoles().length; i++) {
+ assertEquals("Role name index " + i + "different",
+ gpOriginal.getRoles()[i], gpNew.getRoles()[i]);
+ }
+ // These are the key tests for bug 43840
+ assertNotSame("Inner principal not present", gpNew,
+ gpNew.getUserPrincipal());
+ assertEquals("Inner user names are different", tpOriginal.getName(),
+ gpNew.getUserPrincipal().getName());
+ }
+
+}