You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ja...@apache.org on 2012/04/23 17:04:12 UTC

svn commit: r1329269 - in /ace/trunk: ace-connectionfactory/ ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/ ace-connectionfactory/src/test/ ace-connectionfactory/src/test/java/ ace-connectionfactory/src/test/java/org/ ace-co...

Author: jawi
Date: Mon Apr 23 15:04:11 2012
New Revision: 1329269

URL: http://svn.apache.org/viewvc?rev=1329269&view=rev
Log:
ACE-255: added some additional JUnit tests.

Added:
    ace/trunk/ace-connectionfactory/src/test/
    ace/trunk/ace-connectionfactory/src/test/java/
    ace/trunk/ace-connectionfactory/src/test/java/org/
    ace/trunk/ace-connectionfactory/src/test/java/org/apache/
    ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/
    ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/
    ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/
    ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImplTest.java   (with props)
    ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactoryTest.java   (with props)
    ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsTest.java   (with props)
    ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/authentication/LogAuthenticationTest.java   (with props)
Modified:
    ace/trunk/ace-connectionfactory/pom.xml
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImpl.java
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentials.java
    ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactory.java

Modified: ace/trunk/ace-connectionfactory/pom.xml
URL: http://svn.apache.org/viewvc/ace/trunk/ace-connectionfactory/pom.xml?rev=1329269&r1=1329268&r2=1329269&view=diff
==============================================================================
--- ace/trunk/ace-connectionfactory/pom.xml (original)
+++ ace/trunk/ace-connectionfactory/pom.xml Mon Apr 23 15:04:11 2012
@@ -42,6 +42,7 @@
         
     <properties>
         <import.package>
+        	!org.junit,
         	org.apache.ace.connectionfactory;version=${project.version},
         	org.osgi.framework,
         	org.osgi.service.cm,

Modified: ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImpl.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImpl.java?rev=1329269&r1=1329268&r2=1329269&view=diff
==============================================================================
--- ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImpl.java (original)
+++ ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImpl.java Mon Apr 23 15:04:11 2012
@@ -120,18 +120,16 @@ public class ConnectionFactoryImpl imple
             creds = m_credentialMapping.get(pid);
         }
 
-        if (creds == null) {
-            try {
-                creds = UrlCredentialsFactory.getCredentials(properties);
-                
-                synchronized (m_credentialMapping) {
-                    m_credentialMapping.put(pid, creds);
-                }
-            }
-            catch (MissingValueException e) {
-                throw new ConfigurationException(e.getProperty(), e.getMessage());
+        try {
+            creds = UrlCredentialsFactory.getCredentials(properties);
+            
+            synchronized (m_credentialMapping) {
+                m_credentialMapping.put(pid, creds);
             }
         }
+        catch (MissingValueException e) {
+            throw new ConfigurationException(e.getProperty(), e.getMessage());
+        }
     }
     
     /**
@@ -141,12 +139,12 @@ public class ConnectionFactoryImpl imple
      * @return a {@link UrlCredentials} instance for the given URL, or <code>null</code> 
      *         if none were found, or if none were necessary.
      */
-    private UrlCredentials getCredentials(URL url) {
+    final UrlCredentials getCredentials(URL url) {
         Collection<UrlCredentials> creds;
         synchronized (m_credentialMapping) {
             creds = new ArrayList<UrlCredentials>(m_credentialMapping.values());
         }
-        
+
         for (UrlCredentials c : creds) {
             if (c.matches(url)) {
                 return c;

Modified: ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentials.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentials.java?rev=1329269&r1=1329268&r2=1329269&view=diff
==============================================================================
--- ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentials.java (original)
+++ ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentials.java Mon Apr 23 15:04:11 2012
@@ -55,6 +55,12 @@ final class UrlCredentials {
      * @param credentials the credentials to use, cannot be <code>null</code>, but may be empty.
      */
     public UrlCredentials(AuthType type, URL baseURL, Object... credentials) {
+        if (type == null) {
+            throw new IllegalArgumentException("Type cannot be null!");
+        }
+        if (baseURL == null) {
+            throw new IllegalArgumentException("BaseURL cannot be null!");
+        }
         m_type = type;
         m_baseURL = baseURL;
         m_credentials = (credentials == null) ? new Object[0] : credentials.clone();
@@ -128,4 +134,11 @@ final class UrlCredentials {
         result = prime * result + Arrays.hashCode(m_credentials);
         return result;
     }
+
+    /**
+     * @return the base URL these credentials apply to, cannot be <code>null</code>.
+     */
+    final URL getBaseURL() {
+        return m_baseURL;
+    }
 }

Modified: ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactory.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactory.java?rev=1329269&r1=1329268&r2=1329269&view=diff
==============================================================================
--- ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactory.java (original)
+++ ace/trunk/ace-connectionfactory/src/main/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactory.java Mon Apr 23 15:04:11 2012
@@ -85,6 +85,13 @@ final class UrlCredentialsFactory {
      * @throws MissingValueException in case the given properties is missing values.
      */
     public static UrlCredentials getCredentials(Dictionary props, String prefix) throws MissingValueException {
+        if (props == null) {
+            throw new IllegalArgumentException("Properties cannot be null!");
+        }
+        if (prefix == null) {
+            throw new IllegalArgumentException("Prefix cannot be null!");
+        }
+
         AuthType type;
         URL baseURL; 
         Object[] creds;

Added: ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImplTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImplTest.java?rev=1329269&view=auto
==============================================================================
--- ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImplTest.java (added)
+++ ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImplTest.java Mon Apr 23 15:04:11 2012
@@ -0,0 +1,149 @@
+/*
+ * 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.ace.connectionfactory.impl;
+
+import static org.junit.Assert.*;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Properties;
+
+import org.junit.Test;
+
+/**
+ * Test cases for {@link ConnectionFactoryImpl}.
+ */
+public class ConnectionFactoryImplTest {
+
+    private static final URL TEST_URL;
+    
+    static {
+        try {
+            TEST_URL = new URL("http://localhost:8080/");
+        }
+        catch (MalformedURLException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.ConnectionFactoryImpl#createConnection(java.net.URL)}.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testCreateConnectionNullUrlFail() throws Exception {
+        new ConnectionFactoryImpl().createConnection(null);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.ConnectionFactoryImpl#createConnection(java.net.URL, org.osgi.service.useradmin.User)}.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testCreateConnectionNullUserFail() throws Exception {
+        new ConnectionFactoryImpl().createConnection(new URL("file:///tmp/foo"), null);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.ConnectionFactoryImpl#createConnection(java.net.URL, org.osgi.service.useradmin.User)}.
+     */
+    @Test
+    public void testCreateConnectionOk() throws Exception {
+        URLConnection conn = new ConnectionFactoryImpl().createConnection(new URL("file:///tmp/foo"));
+        assertNotNull(conn);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.ConnectionFactoryImpl#deleted(java.lang.String)}.
+     */
+    @Test
+    public void testDeleted() throws Exception {
+        ConnectionFactoryImpl connFactory = new ConnectionFactoryImpl();
+
+        Properties props = createBasicAuthConfig(TEST_URL.toExternalForm());
+
+        connFactory.updated("pid1", props);
+        
+        UrlCredentials credentials = connFactory.getCredentials(TEST_URL);
+        assertNotNull(credentials);
+        
+        connFactory.deleted("pid1");
+        
+        credentials = connFactory.getCredentials(TEST_URL);
+        assertNull(credentials);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.ConnectionFactoryImpl#updated(java.lang.String, java.util.Dictionary)}.
+     */
+    @Test
+    public void testUpdatedInsertsCredentialsOk() throws Exception {
+        ConnectionFactoryImpl connFactory = new ConnectionFactoryImpl();
+        
+        UrlCredentials credentials = connFactory.getCredentials(TEST_URL);
+        assertNull(credentials);
+        
+        Properties props = createBasicAuthConfig(TEST_URL.toExternalForm());
+
+        connFactory.updated("pid1", props);
+        
+        credentials = connFactory.getCredentials(TEST_URL);
+        assertNotNull(credentials);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.ConnectionFactoryImpl#updated(java.lang.String, java.util.Dictionary)}.
+     */
+    @Test
+    public void testUpdatedUpdatesCredentialsOk() throws Exception {
+        ConnectionFactoryImpl connFactory = new ConnectionFactoryImpl();
+
+        Properties props = createBasicAuthConfig(TEST_URL.toExternalForm());
+
+        connFactory.updated("pid1", props);
+        
+        UrlCredentials credentials1 = connFactory.getCredentials(TEST_URL);
+        assertNotNull(credentials1);
+        
+        URL newURL = new URL("http://localhost:8181/test/");
+        props.put(UrlCredentialsFactory.KEY_AUTH_BASE_URL, newURL.toExternalForm());
+
+        connFactory.updated("pid1", props);
+
+        UrlCredentials credentials2 = connFactory.getCredentials(TEST_URL);
+        assertNull(credentials2);
+
+        credentials2 = connFactory.getCredentials(newURL);
+        assertNotNull(credentials2);
+        
+        assertNotSame(credentials1, credentials2);
+    }
+
+    /**
+     * @return a dictionary containing a configuration for basic authentication, never <code>null</code>.
+     */
+    private Properties createBasicAuthConfig(String url) {
+        Properties props = new Properties();
+        props.put(UrlCredentialsFactory.KEY_AUTH_BASE_URL, url);
+        props.put(UrlCredentialsFactory.KEY_AUTH_TYPE, "basic");
+        props.put(UrlCredentialsFactory.KEY_AUTH_USER_NAME, "foo");
+        props.put(UrlCredentialsFactory.KEY_AUTH_USER_PASSWORD, "bar");
+        return props;
+    }
+}

Propchange: ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/ConnectionFactoryImplTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactoryTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactoryTest.java?rev=1329269&view=auto
==============================================================================
--- ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactoryTest.java (added)
+++ ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactoryTest.java Mon Apr 23 15:04:11 2012
@@ -0,0 +1,122 @@
+/*
+ * 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.ace.connectionfactory.impl;
+
+import java.util.Properties;
+
+import org.apache.ace.connectionfactory.impl.UrlCredentialsFactory.MissingValueException;
+import org.junit.Test;
+
+/**
+ * Test cases for {@link UrlCredentialsFactory}.
+ */
+public class UrlCredentialsFactoryTest {
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentialsFactory#getCredentials(java.util.Dictionary)}.
+     */
+    @Test(expected = MissingValueException.class)
+    public void testGetCredentialsWithDictionaryBasicTypeMissingPasswordFail() {
+        Properties props = new Properties();
+        props.put(UrlCredentialsFactory.KEY_AUTH_BASE_URL, "http://localhost:8080/");
+        props.put(UrlCredentialsFactory.KEY_AUTH_TYPE, "basic");
+        props.put(UrlCredentialsFactory.KEY_AUTH_USER_NAME, "bar");
+
+        UrlCredentialsFactory.getCredentials(props);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentialsFactory#getCredentials(java.util.Dictionary)}.
+     */
+    @Test(expected = MissingValueException.class)
+    public void testGetCredentialsWithDictionaryBasicTypeMissingUserNameFail() {
+        Properties props = new Properties();
+        props.put(UrlCredentialsFactory.KEY_AUTH_BASE_URL, "http://localhost:8080/");
+        props.put(UrlCredentialsFactory.KEY_AUTH_TYPE, "basic");
+        props.put(UrlCredentialsFactory.KEY_AUTH_USER_PASSWORD, "bar");
+
+        UrlCredentialsFactory.getCredentials(props);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentialsFactory#getCredentials(java.util.Dictionary)}.
+     */
+    @Test
+    public void testGetCredentialsWithDictionaryBasicTypeOk() {
+        Properties props = new Properties();
+        props.put(UrlCredentialsFactory.KEY_AUTH_BASE_URL, "http://localhost:8080/");
+        props.put(UrlCredentialsFactory.KEY_AUTH_TYPE, "basic");
+        props.put(UrlCredentialsFactory.KEY_AUTH_USER_NAME, "foo");
+        props.put(UrlCredentialsFactory.KEY_AUTH_USER_PASSWORD, "bar");
+
+        UrlCredentialsFactory.getCredentials(props);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentialsFactory#getCredentials(java.util.Dictionary)}.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testGetCredentialsWithDictionaryInvalidAuthTypeFail() {
+        Properties props = new Properties();
+        props.put(UrlCredentialsFactory.KEY_AUTH_BASE_URL, "http://localhost:8080/");
+        props.put(UrlCredentialsFactory.KEY_AUTH_TYPE, "nonsense");
+
+        UrlCredentialsFactory.getCredentials(props);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentialsFactory#getCredentials(java.util.Dictionary)}.
+     */
+    @Test(expected = MissingValueException.class)
+    public void testGetCredentialsWithDictionaryMissingBaseUrlFail() {
+        Properties props = new Properties();
+        props.put(UrlCredentialsFactory.KEY_AUTH_TYPE, "none");
+
+        UrlCredentialsFactory.getCredentials(props);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentialsFactory#getCredentials(java.util.Dictionary)}.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testGetCredentialsWithNullDictionaryFail() {
+        UrlCredentialsFactory.getCredentials(null);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentialsFactory#getCredentials(java.util.Dictionary, java.lang.String)}.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testGetCredentialsWithNullPrefixFail() {
+        UrlCredentialsFactory.getCredentials(new Properties(), null);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentialsFactory#getCredentials(java.util.Dictionary)}.
+     */
+    @Test
+    public void testGetCredentialsWithValidDictionaryOk() {
+        Properties props = new Properties();
+        props.put(UrlCredentialsFactory.KEY_AUTH_BASE_URL, "http://localhost:8080/");
+        props.put(UrlCredentialsFactory.KEY_AUTH_TYPE, "none");
+
+        UrlCredentialsFactory.getCredentials(props);
+    }
+}

Propchange: ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsFactoryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsTest.java?rev=1329269&view=auto
==============================================================================
--- ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsTest.java (added)
+++ ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsTest.java Mon Apr 23 15:04:11 2012
@@ -0,0 +1,102 @@
+/*
+ * 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.ace.connectionfactory.impl;
+
+import static org.junit.Assert.*;
+
+import java.net.URL;
+
+import org.apache.ace.connectionfactory.impl.UrlCredentials.AuthType;
+import org.junit.Test;
+
+/**
+ * Test cases for {@link UrlCredentials}.
+ */
+public class UrlCredentialsTest {
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentials#UrlCredentials(java.net.URL)}.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testUrlCredentialsNullURLFail() throws Exception {
+        new UrlCredentials(null);
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentials#UrlCredentials(java.net.URL)}.
+     */
+    @Test
+    public void testUrlCredentialsURLOk() throws Exception {
+        new UrlCredentials(new URL("http://localhost:8080/"));
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentials#UrlCredentials(org.apache.ace.connectionfactory.impl.UrlCredentials.AuthType, java.net.URL, java.lang.Object[])}.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testUrlCredentialsNullTypeFail() throws Exception {
+        new UrlCredentials(null, new URL("http://localhost:8080/"));
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentials#UrlCredentials(org.apache.ace.connectionfactory.impl.UrlCredentials.AuthType, java.net.URL, java.lang.Object[])}.
+     */
+    @Test
+    public void testUrlCredentialsTypeAndURLOk() throws Exception {
+        new UrlCredentials(AuthType.NONE, new URL("http://localhost:8080/"));
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentials#matches(java.net.URL)}.
+     */
+    @Test
+    public void testMatchesNullURLOk() throws Exception {
+        UrlCredentials creds = new UrlCredentials(AuthType.NONE, new URL("http://localhost:8080/"));
+        assertFalse(creds.matches(null));
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentials#matches(java.net.URL)}.
+     */
+    @Test
+    public void testMatchesValidURLOk() throws Exception {
+        UrlCredentials creds = new UrlCredentials(AuthType.NONE, new URL("http://localhost:8080/"));
+        assertTrue(creds.matches(new URL("http://localhost:8080/obr")));
+        assertFalse(creds.matches(new URL("http://localhost:8080")));
+        assertFalse(creds.matches(new URL("http://localhost:8081/")));
+    }
+
+    /**
+     * Test method for {@link org.apache.ace.connectionfactory.impl.UrlCredentials#getCredentials()}.
+     */
+    @Test
+    public void testGetCredentialsOk() throws Exception {
+        UrlCredentials creds = new UrlCredentials(AuthType.NONE, new URL("http://localhost:8080/"));
+        assertArrayEquals(new Object[0], creds.getCredentials());
+
+        creds = new UrlCredentials(AuthType.NONE, new URL("http://localhost:8080/"), "foo");
+        assertArrayEquals(new Object[] { "foo" }, creds.getCredentials());
+
+        creds = new UrlCredentials(AuthType.NONE, new URL("http://localhost:8080/"), (Object[]) null );
+        assertArrayEquals(new Object[0], creds.getCredentials());
+
+        creds = new UrlCredentials(AuthType.NONE, new URL("http://localhost:8080/"), (Object) null);
+        assertArrayEquals(new Object[] { null }, creds.getCredentials());
+    }
+}

Propchange: ace/trunk/ace-connectionfactory/src/test/java/org/apache/ace/connectionfactory/impl/UrlCredentialsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/authentication/LogAuthenticationTest.java
URL: http://svn.apache.org/viewvc/ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/authentication/LogAuthenticationTest.java?rev=1329269&view=auto
==============================================================================
--- ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/authentication/LogAuthenticationTest.java (added)
+++ ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/authentication/LogAuthenticationTest.java Mon Apr 23 15:04:11 2012
@@ -0,0 +1,334 @@
+/*
+ * 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.ace.it.authentication;
+
+import static org.apache.ace.it.Options.jetty;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.ace.client.repository.SessionFactory;
+import org.apache.ace.connectionfactory.ConnectionFactory;
+import org.apache.ace.discovery.property.constants.DiscoveryConstants;
+import org.apache.ace.http.listener.constants.HttpConstants;
+import org.apache.ace.identification.property.constants.IdentificationConstants;
+import org.apache.ace.it.IntegrationTestBase;
+import org.apache.ace.it.Options.Ace;
+import org.apache.ace.it.Options.Felix;
+import org.apache.ace.it.Options.Knopflerfish;
+import org.apache.ace.it.Options.Osgi;
+import org.apache.ace.log.Log;
+import org.apache.ace.log.LogDescriptor;
+import org.apache.ace.log.LogEvent;
+import org.apache.ace.repository.Repository;
+import org.apache.ace.repository.impl.constants.RepositoryConstants;
+import org.apache.ace.server.log.store.LogStore;
+import org.apache.ace.test.constants.TestConstants;
+import org.apache.ace.test.utils.NetUtils;
+import org.apache.felix.dm.Component;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.Constants;
+import org.osgi.service.http.HttpService;
+import org.osgi.service.useradmin.UserAdmin;
+
+/**
+ * Integration tests for the audit log. Both a server and a target are setup
+ * on the same machine. The audit log is run and we check if it is indeed
+ * replicated to the server.
+ */
+@RunWith(JUnit4TestRunner.class)
+public class LogAuthenticationTest extends IntegrationTestBase {
+
+    private static final String AUDITLOG_ENDPOINT = "/auditlog";
+
+    private static final String HOST = "localhost";
+    private static final String TARGET_ID = "target-id";
+
+    private volatile Log m_auditLog;
+    private volatile LogStore m_serverStore;
+    private volatile Runnable m_auditLogSyncTask;
+    private volatile Repository m_userRepository;
+    private volatile UserAdmin m_userAdmin;
+    private volatile ConnectionFactory m_connectionFactory;
+
+    /**
+     * @return the PAX Exam configuration options, never <code>null</code>.
+     */
+    @Configuration
+    public Option[] configuration() {
+        return options(
+            systemProperty("org.osgi.service.http.port").value("" + TestConstants.PORT),
+            provision(
+                // Misc bundles...
+                Osgi.compendium(),
+                Felix.dependencyManager(),
+                jetty(),
+                Felix.configAdmin(),
+                Felix.preferences(),
+                Felix.eventAdmin(),
+                Knopflerfish.useradmin(),
+                Knopflerfish.log(),
+                // ACE core bundles...
+                Ace.util(),
+                Ace.authentication(),
+                Ace.authenticationProcessorBasicAuth(),
+                Ace.connectionFactory(),
+                Ace.rangeApi(),
+                Ace.discoveryApi(),
+                Ace.discoveryProperty(),
+                Ace.identificationApi(),
+                Ace.identificationProperty(),
+                Ace.log(),
+                Ace.logListener(),
+                Ace.logServlet(),
+                Ace.serverLogStore(),
+                Ace.logTask(),
+                Ace.targetLog(),
+                Ace.targetLogStore(),
+                Ace.httplistener(),
+                Ace.repositoryApi(),
+                Ace.repositoryImpl(),
+                Ace.repositoryServlet(),
+                Ace.configuratorServeruseradmin(),
+                Ace.obrMetadata(),
+                Ace.obrServlet(),
+                Ace.obrStorage(),
+                Ace.clientRepositoryApi(),
+                Ace.clientRepositoryImpl(),
+                Ace.clientRepositoryHelperBase(),
+                Ace.clientRepositoryHelperBundle(),
+                Ace.clientRepositoryHelperConfiguration(),
+                Ace.scheduler(),
+                Ace.resourceprocessorUseradmin(),
+                Ace.configuratorUseradminTask()
+            )
+        );
+    }
+
+    /**
+     * Tests that accessing the log servlet with authentication works when given the right credentials.
+     */
+    @Test
+    public void testAccessLogServletWithCorrectCredentialsOk() throws Exception {
+        String tid1 = "42";
+        String tid2 = "47";
+
+        // prepare the store
+        List<LogEvent> events = new ArrayList<LogEvent>();
+        events.add(new LogEvent(tid1, 1, 1, 1, 1, new Properties()));
+        events.add(new LogEvent(tid2, 1, 1, 1, 1, new Properties()));
+        m_serverStore.put(events);
+
+        List<String> result = getResponse("http://localhost:" + TestConstants.PORT + "/auditlog/query");
+        assert result.size() > 1 : "We expect at least two logs on the server.";
+    }
+
+    /**
+     * Tests that the log synchronization works when the log servlet has authentication enabled.
+     */
+    @Test
+    public void testLogSynchronizationOk() throws Exception {
+        final int type = 12345;
+        
+        // now log another event
+        Properties props = new Properties();
+        props.put("one", "value1");
+        props.put("two", "value2");
+        m_auditLog.log(type, props);
+
+        boolean found = false;
+        
+        long startTime = System.currentTimeMillis();
+        long waitTime = 5000; // milliseconds
+        
+        while (!found && ((System.currentTimeMillis() - startTime) < waitTime)) {
+            // synchronize again
+            m_auditLogSyncTask.run();
+
+            // get and evaluate results (note that there is some concurrency that might interfere with this test)
+            List<LogDescriptor> ranges2 = m_serverStore.getDescriptors();
+            if (ranges2.isEmpty()) {
+                continue;
+            }
+
+            List<LogEvent> events = m_serverStore.get(ranges2.get(0));
+            for (LogEvent event : events) {
+                if (event.getType() == type) {
+                    Dictionary properties = event.getProperties();
+                    assertEquals("value1", properties.get("one"));
+                    assertEquals("value2", properties.get("two"));
+                    found = true;
+                    break;
+                }
+            }
+
+            // wait if we have not found anything yet
+            if (!found) {
+                TimeUnit.MILLISECONDS.sleep(100);
+            }
+        }
+
+        assertTrue("We could not retrieve our audit log event (after 5 seconds).", found);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void before() throws Exception {
+        
+        String baseURL = "http://" + HOST + ":" + TestConstants.PORT;
+
+        getService(SessionFactory.class).createSession("test-session-ID");
+
+        configureFactory("org.apache.ace.server.repository.factory",
+            RepositoryConstants.REPOSITORY_NAME, "users",
+            RepositoryConstants.REPOSITORY_CUSTOMER, "apache",
+            RepositoryConstants.REPOSITORY_MASTER, "true");
+
+        configure("org.apache.ace.configurator.useradmin.task.UpdateUserAdminTask",
+            "repositoryName", "users",
+            "repositoryCustomer", "apache");
+        
+        configure("org.apache.ace.scheduler",
+            "org.apache.ace.configurator.useradmin.task.UpdateUserAdminTask", "100");
+
+        configure(DiscoveryConstants.DISCOVERY_PID,
+            DiscoveryConstants.DISCOVERY_URL_KEY, baseURL);
+        configure(IdentificationConstants.IDENTIFICATION_PID,
+            IdentificationConstants.IDENTIFICATION_TARGETID_KEY, TARGET_ID);
+
+        configureFactory("org.apache.ace.target.log.store.factory",
+            "name", "auditlog");
+        configureFactory("org.apache.ace.target.log.factory",
+            "name", "auditlog");
+        configureFactory("org.apache.ace.target.log.sync.factory",
+            "name", "auditlog");
+        configureFactory("org.apache.ace.server.log.servlet.factory",
+            "name", "auditlog",
+            HttpConstants.ENDPOINT, AUDITLOG_ENDPOINT,
+            "authentication.enabled", "true");
+        configureFactory("org.apache.ace.server.log.store.factory",
+            "name", "auditlog");
+
+        URL testURL = new URL(baseURL.concat(AUDITLOG_ENDPOINT));
+        assertTrue("Failed to access auditlog in time!", NetUtils.waitForURL(testURL, 401, 15000));
+        
+        String userName = "d";
+        String password = "f";
+
+        importSingleUser(userName, password);
+
+        configureFactory("org.apache.ace.connectionfactory", 
+            "authentication.baseURL", baseURL.concat(AUDITLOG_ENDPOINT), 
+            "authentication.type", "basic",
+            "authentication.user.name", userName,
+            "authentication.user.password", password);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected Component[] getDependencies() {
+        return new Component[] {
+            createComponent()
+                .setImplementation(this)
+                .add(createServiceDependency().setService(UserAdmin.class).setRequired(true))
+                .add(createServiceDependency()
+                    .setService(Repository.class, "(&(" + RepositoryConstants.REPOSITORY_NAME + "=users)(" + RepositoryConstants.REPOSITORY_CUSTOMER + "=apache))")
+                    .setRequired(true))
+                .add(createServiceDependency().setService(ConnectionFactory.class).setRequired(true))
+                .add(createServiceDependency().setService(HttpService.class).setRequired(true))
+                .add(createServiceDependency().setService(Log.class, "(&(" + Constants.OBJECTCLASS + "=" + Log.class.getName() + ")(name=auditlog))").setRequired(true))
+                .add(createServiceDependency().setService(LogStore.class, "(&(" + Constants.OBJECTCLASS + "=" + LogStore.class.getName() + ")(name=auditlog))").setRequired(true))
+                .add(createServiceDependency().setService(Runnable.class, "(&(" + Constants.OBJECTCLASS + "=" + Runnable.class.getName() + ")(taskName=auditlog))").setRequired(true))
+        };
+    }
+
+    private List<String> getResponse(String request) throws IOException {
+        List<String> result = new ArrayList<String>();
+        InputStream in = null;
+        try {
+            in = m_connectionFactory.createConnection(new URL(request)).getInputStream();
+            byte[] response = new byte[in.available()];
+            in.read(response);
+
+            StringBuilder element = new StringBuilder();
+            for (byte b : response) {
+                switch(b) {
+                    case '\n' :
+                        result.add(element.toString());
+                        element = new StringBuilder();
+                        break;
+                    default :
+                        element.append(b);
+                }
+            }
+        }
+        finally {
+            try {
+                in.close();
+            }
+            catch (Exception e) {
+                // no problem.
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Imports a single user into the user repository.
+     * 
+     * @param userName the name of the user to import;
+     * @param password the password of the user to import.
+     * @throws Exception in case of exceptions during the import.
+     */
+    private void importSingleUser(String userName, String password) throws Exception {
+        ByteArrayInputStream bis = new ByteArrayInputStream((
+            "<roles>" +
+                "<user name=\"" + userName + "\">" +
+                "<properties><username>" + userName + "</username></properties>" +
+                "<credentials><password type=\"String\">" + password + "</password></credentials>" +
+                "</user>" +
+            "</roles>").getBytes());
+
+        assertTrue("Committing test user data failed!", m_userRepository.commit(bis, m_userRepository.getRange().getHigh()));
+
+        int count = 0;
+        while ((m_userAdmin.getRole(userName) == null) && (count++ < 60)) {
+            Thread.sleep(100);
+        }
+        assertTrue("Failed to obtain user from userAdmin!", count != 60);
+    }
+}

Propchange: ace/trunk/ace-integrationtests/src/test/java/org/apache/ace/it/authentication/LogAuthenticationTest.java
------------------------------------------------------------------------------
    svn:eol-style = native