diff --git a/tests/modules/core/lib/Auth/Process/AttributeLimitTest.php b/tests/modules/core/lib/Auth/Process/AttributeLimitTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c2e6ac7a172b6ffb7a3a4c3bed4d92df980483b
--- /dev/null
+++ b/tests/modules/core/lib/Auth/Process/AttributeLimitTest.php
@@ -0,0 +1,328 @@
+<?php
+/**
+ * Test for the core:AttributeLimit filter.
+ */
+class Test_Core_Auth_Process_AttributeLimitTest extends PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Helper function to run the filter with a given configuration.
+     *
+     * @param array $config  The filter configuration.
+     * @param array $request  The request state.
+     * @return array  The state array after processing.
+     */
+    private static function processFilter(array $config, array $request)
+    {
+        $filter = new sspmod_core_Auth_Process_AttributeLimit($config, NULL);
+        $filter->process($request);
+        return $request;
+    }
+
+    /**
+     * Test reading IdP Attributes.
+     */
+    public function testIdPAttrs()
+    {
+        $config = array(
+            'cn', 'mail'
+        );
+
+        $request = array(
+            'Attributes' => array(
+                 'eduPersonTargetedID' => array('eptid@example.org'),
+                 'eduPersonAffiliation' => array('member'),
+                 'cn' => array('user name'),
+                 'mail' => array('user@example.org'),
+             ),
+            'Destination' => array(
+             ),
+            'Source' => array(
+                'attributes' => array('cn','mail'),
+             ),
+        );
+
+        $result = self::processFilter($config, $request);
+        $attributes = $result['Attributes'];
+        $this->assertArrayHasKey('cn', $attributes);
+        $this->assertArrayHasKey('mail', $attributes);
+        $this->assertArrayNotHasKey('eduPersonTargetedID', $attributes);
+        $this->assertArrayNotHasKey('eduPersonAffiliation', $attributes);
+        $this->assertCount(2, $attributes);
+
+        $config = array(
+            'cn',
+            'default' => TRUE,
+        );
+
+        $result = self::processFilter($config, $request);
+        $attributes = $result['Attributes'];
+        $this->assertArrayHasKey('cn', $attributes);
+        $this->assertArrayHasKey('mail', $attributes);
+        $this->assertArrayNotHasKey('eduPersonTargetedID', $attributes);
+        $this->assertArrayNotHasKey('eduPersonAffiliation', $attributes);
+        $this->assertCount(2, $attributes);
+
+
+    }
+
+    /**
+     * Tests when no attributes are in metadata.
+     */
+    public function testNULLMetadataAttrs()
+    {
+        $config = array(
+            'cn', 'mail'
+        );
+
+        $request = array(
+            'Attributes' => array(
+                 'eduPersonTargetedID' => array('eptid@example.org'),
+                 'eduPersonAffiliation' => array('member'),
+                 'cn' => array('user name'),
+                 'mail' => array('user@example.org'),
+             ),
+            'Destination' => array(
+             ),
+            'Source' => array(
+             ),
+        );
+
+        $result = self::processFilter($config, $request);
+        $attributes = $result['Attributes'];
+        $this->assertArrayHasKey('cn', $attributes);
+        $this->assertArrayHasKey('mail', $attributes);
+        $this->assertArrayNotHasKey('eduPersonTargetedID', $attributes);
+        $this->assertArrayNotHasKey('eduPersonAffiliation', $attributes);
+        $this->assertCount(2, $attributes);
+
+        $config = array(
+            'cn',
+            'default' => TRUE,
+        );
+
+        $result = self::processFilter($config, $request);
+        $attributes = $result['Attributes'];
+        $this->assertArrayHasKey('cn', $attributes);
+        $this->assertArrayNotHasKey('mail', $attributes);
+        $this->assertArrayNotHasKey('eduPersonTargetedID', $attributes);
+        $this->assertArrayNotHasKey('eduPersonAffiliation', $attributes);
+        $this->assertCount(1, $attributes);
+
+        $config = array(
+        );
+
+        $result = self::processFilter($config, $request);
+        $attributes = $result['Attributes'];
+        $this->assertCount(4, $attributes);
+        $this->assertArrayHasKey('eduPersonTargetedID', $attributes);
+        $this->assertArrayHasKey('eduPersonAffiliation', $attributes);
+        $this->assertArrayHasKey('cn', $attributes);
+        $this->assertArrayHasKey('mail', $attributes);
+    }
+
+    /**
+     * setUpBeforeClass a request that will be used for the following tests.
+     * note the above tests don't use self::$request for processFilter input.
+     */
+    protected static $request;
+
+    public static function setUpBeforeClass()
+    {
+        self::$request = array(
+            'Attributes' => array(
+                 'eduPersonTargetedID' => array('eptid@example.org'),
+                 'eduPersonAffiliation' => array('member'),
+                 'cn' => array('common name'),
+                 'mail' => array('user@example.org'),
+             ),
+            'Destination' => array(
+		'attributes' => array('cn','mail'),
+             ),
+            'Source' => array(
+             ),
+        );
+    }
+
+    /**
+     * Test the most basic functionality.
+     */
+    public function testBasic()
+    {
+        $config = array(
+            'cn', 'mail'
+        );
+
+        $result = self::processFilter($config, self::$request);
+        $attributes = $result['Attributes'];
+        $this->assertArrayHasKey('cn', $attributes);
+        $this->assertArrayHasKey('mail', $attributes);
+        $this->assertCount(2, $attributes);
+    }
+
+    /**
+     * Test defaults with metadata available.
+     */
+    public function testDefaultWithMetadata()
+    {
+        $config = array(
+            'default' => TRUE,
+        );
+
+        $result = self::processFilter($config, self::$request);
+        $attributes = $result['Attributes'];
+        $this->assertArrayHasKey('cn', $attributes);
+        $this->assertArrayHasKey('mail', $attributes);
+        $this->assertCount(2, $attributes);
+    }
+
+    /**
+     * Test defaults with attributes and metadata
+     */
+    public function testDefaultWithAttrs()
+    {
+        $config = array(
+            'default' => TRUE,
+            'eduPersonTargetedID', 'eduPersonAffiliation',
+        );
+
+        $result = self::processFilter($config, self::$request);
+        $attributes = $result['Attributes'];
+        $this->assertCount(2, $attributes);
+        $this->assertArrayHasKey('cn', $attributes);
+        $this->assertArrayHasKey('mail', $attributes);
+        $this->assertArrayNotHasKey('eduPersonTargetedID', $attributes);
+        $this->assertArrayNotHasKey('eduPersonAffiliation', $attributes);
+    }
+
+    /**
+     * Test for exception with illegal config.
+     * 
+     * @expectedException Exception 
+     */
+    public function testInvalidConfig()
+    {
+        $config = array(
+            'invalidArg' => TRUE,
+        );
+
+        $result = self::processFilter($config, self::$request);
+    }
+
+    /**
+     * Test for invalid attribute name
+     * 
+     * @expectedException Exception 
+     */
+    public function testInvalidAttributeName()
+    {
+        $config = array(
+		null
+        );
+
+        $result = self::processFilter($config, self::$request);
+    }
+
+
+    /**
+     * Test for attribute value matching
+     */
+    public function testMatchAttributeValues()
+    {
+        $config = array(
+		'eduPersonAffiliation' => array('member')
+        );
+
+        $result = self::processFilter($config, self::$request);
+        $attributes = $result['Attributes'];
+        $this->assertCount(1, $attributes);
+        $this->assertArrayHasKey('eduPersonAffiliation', $attributes);
+        $this->assertEquals($attributes['eduPersonAffiliation'], array('member'));
+
+        $config = array(
+		'eduPersonAffiliation' => array('member','staff')
+        );
+
+        $result = self::processFilter($config, self::$request);
+        $attributes = $result['Attributes'];
+        $this->assertCount(1, $attributes);
+        $this->assertArrayHasKey('eduPersonAffiliation', $attributes);
+        $this->assertEquals($attributes['eduPersonAffiliation'], array('member'));
+
+        $config = array(
+		'eduPersonAffiliation' => array('student')
+        );
+        $result = self::processFilter($config, self::$request);
+        $attributes = $result['Attributes'];
+        $this->assertCount(0, $attributes);
+
+        $config = array(
+		'eduPersonAffiliation' => array('student','staff')
+        );
+        $result = self::processFilter($config, self::$request);
+        $attributes = $result['Attributes'];
+        $this->assertCount(0, $attributes);
+    }
+
+    /**
+     * Test for allowed attributes not an array. 
+     *
+     * This test is very unlikely and would require malformed metadata processing. 
+     * Cannot be generated via config options.
+     *
+     * @expectedException Exception 
+     */
+    public function testMatchAttributeValuesNotArray()
+    {
+        $config = array(
+        );
+
+        $request = array(
+            'Attributes' => array(
+                 'eduPersonTargetedID' => array('eptid@example.org'),
+                 'eduPersonAffiliation' => array('member'),
+                 'cn' => array('user name'),
+                 'mail' => array('user@example.org'),
+                 'discardme' => array('somethingiswrong'),
+             ),
+            'Destination' => array(
+                'attributes' => array('eduPersonAffiliation' => 'student'),
+             ),
+            'Source' => array(
+             ),
+        );
+
+
+        $result = self::processFilter($config, $request);
+    }
+
+    /**
+     * Test attributes not intersecting
+     */
+    public function testNoIntersection()
+    {
+        $config = array(
+            'default' => TRUE,
+        );
+
+        $request = array(
+            'Attributes' => array(
+                 'eduPersonTargetedID' => array('eptid@example.org'),
+                 'eduPersonAffiliation' => array('member'),
+                 'cn' => array('user name'),
+                 'mail' => array('user@example.org'),
+                 'discardme' => array('somethingiswrong'),
+             ),
+            'Destination' => array(
+                'attributes' => array('urn:oid:1.2.840.113549.1.9.1'),
+             ),
+            'Source' => array(
+             ),
+        );
+
+        $result = self::processFilter($config, $request);
+        $attributes = $result['Attributes'];
+        $this->assertCount(0, $attributes);
+        $this->assertEmpty($attributes);
+    }
+}