From a0d36c6d73e7d603a9066d5f014c208657694c58 Mon Sep 17 00:00:00 2001
From: smaguin <smaguin@localhost>
Date: Tue, 11 Sep 2007 12:32:16 +0000
Subject: [PATCH] new functional testsuite on plugins 

---
 opends/tests/functional-tests/testcases/plugins/plugins_lastmod.xml    |  396 +++++++++++
 opends/tests/functional-tests/testcases/plugins/plugins_setup.xml      |   80 ++
 opends/tests/functional-tests/testcases/plugins/plugins.xml            |   51 +
 opends/tests/functional-tests/testcases/plugins/plugins_cleanup.xml    |   74 ++
 opends/tests/functional-tests/testcases/plugins/plugins_entryUUID.xml  |  284 ++++++++
 opends/tests/functional-tests/testcases/plugins/plugins_uniqueness.xml |  712 ++++++++++++++++++++
 opends/tests/functional-tests/testcases/plugins/plugins_refint.xml     |  414 ++++++++++++
 7 files changed, 2,011 insertions(+), 0 deletions(-)

diff --git a/opends/tests/functional-tests/testcases/plugins/plugins.xml b/opends/tests/functional-tests/testcases/plugins/plugins.xml
new file mode 100755
index 0000000..f6cbfcf
--- /dev/null
+++ b/opends/tests/functional-tests/testcases/plugins/plugins.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ ! -->
+<stax>
+  <defaultcall function="main_plugins"/>
+  <function name="main_plugins">
+    <sequence>
+      <block name="'plugins'">
+         <sequence>
+           <script>
+             CurrentTestPath['group']=STAXCurrentBlock
+           </script>
+          
+          <call function="'testGroup_Preamble'" />
+          <iterate var="_test" in="['setup','refint','uniqueness','lastmod','entryUUID','cleanup']" >
+            <sequence>
+              <import machine="STAF_LOCAL_HOSTNAME"
+                      file="'%s/testcases/plugins/plugins_%s.xml' % (TESTS_DIR,_test)"/>
+              <call function="'plugins_%s' % _test" />
+            </sequence>
+          </iterate>
+          <call function="'testGroup_Postamble'" />
+        </sequence>
+      </block>
+    </sequence>
+  </function>
+</stax>
diff --git a/opends/tests/functional-tests/testcases/plugins/plugins_cleanup.xml b/opends/tests/functional-tests/testcases/plugins/plugins_cleanup.xml
new file mode 100755
index 0000000..80d0566
--- /dev/null
+++ b/opends/tests/functional-tests/testcases/plugins/plugins_cleanup.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Portions Copyright 2007 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="plugins_cleanup"/>
+  <function name="plugins_cleanup">
+    <sequence>
+      <block name="'cleanup'">
+       <sequence>
+          <block name="'Block DS Process Stop'">				
+          <!--- Stop DS -->
+            <sequence>
+              <message>
+                'Stop DS running on port %s' % (DIRECTORY_INSTANCE_PORT)
+              </message>
+
+              <call function="'StopDsWithScript'">
+               { 'location'  : STAF_REMOTE_HOSTNAME,
+                 'dsHost'    : DIRECTORY_INSTANCE_HOST,
+                 'dsPort'    : DIRECTORY_INSTANCE_PORT,
+                 'dsBindDN'  : DIRECTORY_INSTANCE_DN,
+                 'dsBindPwd' : DIRECTORY_INSTANCE_PSWD }
+              </call>
+              <call function="'checkRC'">
+               { 'returncode' : RC ,
+                 'result'     : STAXResult }
+              </call>
+            </sequence>			  
+            <!--- End Block DS Process Stop -->
+          </block>
+          <block name="'Block Remove DS Topology'">
+          <!-- Remove  the topology created for the test suite -->
+            <sequence>
+              <message>
+               'Remove DS topology created for the Test Suite'
+              </message>				  
+              <call function="'removeTopology'"/>
+              <call function="'checkRC'">
+                { 'returncode' : RC ,
+                  'result'     : STAXResult }
+              </call>
+            </sequence>			  
+            <!-- End Block Remove DS Topology-->  
+          </block>	  														  
+        </sequence>        
+      </block>
+     </sequence>
+  </function>
+</stax>
diff --git a/opends/tests/functional-tests/testcases/plugins/plugins_entryUUID.xml b/opends/tests/functional-tests/testcases/plugins/plugins_entryUUID.xml
new file mode 100755
index 0000000..be8445b
--- /dev/null
+++ b/opends/tests/functional-tests/testcases/plugins/plugins_entryUUID.xml
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ ! -->
+<stax>
+  <defaultcall function="plugins_entryUUID"/>
+  <function name="plugins_entryUUID" scope="local">
+    <block name="STAXCurrentFunction">    
+    <sequence>
+      <script>
+        CurrentTestPath['suite']=STAXCurrentFunction
+      </script>
+      <call function="'testSuite_Preamble'" />
+
+                        
+<!---
+#@TestMarker          Plugin entryUUID
+#@TestName            Plugin entryUUID
+#@TestIssue             Check the plugin entryUUID
+#@TestPreamble       none
+#@TestStep              Enable the plugin entryUUID
+#@TestStep              Disable  the virtual attribute entryUUID
+#@TestStep              Add an entry
+#@TestStep              Execute ldapsearch request to get entryUUID attribute
+#@TestPostamble     none
+#@TestResult           The test is passed if the attribute entryUUID is returned
+-->  
+    
+ <testcase name="getTestCaseName('Plugins entryUUID setup')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    <message>'-- Disable the virtual attribute entryUUID --'</message>   
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'     : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'         : 'set-virtual-attribute-prop' ,
+        'objectType'            : 'attribute-name',
+        'objectName'           : 'entryUUID',
+        'optionsString'         : '--set enabled:false',
+        'expectedRC'           : 0 } 
+    </call>    
+    
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+  
+                        
+<!---
+#@TestMarker          Plugin entryUUID
+#@TestName            Plugin entryUUID
+#@TestIssue             Check the plugin entryUUID
+#@TestPreamble       none
+#@TestStep              Enable the plugin entryUUID
+#@TestStep              Disable  the virtual attribute entryUUID
+#@TestStep              Add an entry
+#@TestStep              Execute ldapsearch request to get entryUUID attribute
+#@TestPostamble     none
+#@TestResult           The test is passed if the attribute entryUUID is returned
+-->  
+    
+ <testcase name="getTestCaseName('Plugins entryUUID enable')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    <message>'-- Activate the entryUUID plugin --'</message>   
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'Entry UUID',
+        'optionsString'          : '--set enabled:true',
+        'expectedRC'           : 0 } 
+    </call>	
+
+    
+    <message>'######  Add an entry ###### '</message>
+    <!-- Add an entry --> 
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:testuser_entryuuid')
+      listAttr.append('sn:testuser_entryuuid')
+      listAttr.append('cn:testuser_entryuuid')
+      listAttr.append('mail:testuser_entryuuid')      
+    </script>
+	 
+    
+    <call function="'addAnEntry'">
+      { 'dsInstanceHost'  : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	  : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'        : 'uid=testuser_entryuuid,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes' : listAttr,
+         'expectedRC'     :  0
+       }
+    </call>
+	
+
+    <!-- Check the plugin  -->  
+    <message>'######  Check the plugin entryUUID ###### '</message>     
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+        'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+        'dsBaseDN'        : 'uid=testuser_entryuuid,%s' % DIRECTORY_INSTANCE_SFX,
+        'dsFilter'            : 'objectclass=*'	,
+        'dsScope'          : 'base',		
+        'attributes'	      : 'entryUUID',
+        'expectedRC'	    :  0 }
+    </call>  		
+
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString,
+         'testString'	   : 'entryUUID',
+         'expectedResult'	   : '1' }
+    </call>
+   
+
+    <!-- Cleanup -->
+    <message>'######  Cleanup ###### '</message>    
+    <message>'-- Delete the test entry --'</message>
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	   : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	   : 'uid=testuser_entryuuid,%s' % DIRECTORY_INSTANCE_SFX,
+      }
+    </call>
+                 
+    <message>'-- Disable the entryUUID plugin --'</message>   
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'         : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'           : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'       : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'           : 'set-plugin-prop' ,
+        'objectType'              : 'plugin-name' ,
+        'objectName'             : 'Entry UUID',
+        'optionsString'           : '--set enabled:false',
+        'expectedRC'             : 0 } 
+    </call>
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+<!---
+#@TestMarker          Plugin entryUUID
+#@TestName            Plugin entryUUID
+#@TestIssue             Check the plugin entryUUID
+#@TestPreamble       none
+#@TestStep              Disable the plugin entryUUID
+#@TestStep              Disable  the virtual attribute entryUUID
+#@TestStep              Add an entry
+#@TestStep              Execute ldapsearch request to get entryUUID attribute
+#@TestPostamble     none
+#@TestResult           The test is passed if the attribute entryUUID is not returned
+-->  
+    
+ <testcase name="getTestCaseName('Plugins entryUUID disable')">
+  <sequence>
+    
+    <call function="'testCase_Preamble'"/>
+
+    <message>'-- Disable the entryUUID plugin --'</message>   
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'Entry UUID',
+        'optionsString'          : '--set enabled:false',
+        'expectedRC'           : 0 } 
+    </call>	
+
+       	   	 
+    <!-- Add an entry --> 
+    <message>'######  Add an entry ###### '</message>         
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:testuser_entryuuid')
+      listAttr.append('sn:testuser_entryuuid')
+      listAttr.append('cn:testuser_entryuuid')
+      listAttr.append('mail:testuser_entryuuid')      
+    </script>
+	 
+    <call function="'addAnEntry'">
+      { 'dsInstanceHost'  : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	  : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'        : 'uid=testuser_entryuuid,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes' : listAttr,
+         'expectedRC'     :  0
+       }
+    </call>
+
+    <!-- The plugin is disabled. the attribute entryUUID should not be returned -->
+    <message>'######  Check the plugin entryUUID ###### '</message>     
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        : 'uid=testuser_entryuuid,%s' % DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=*'	,
+          'dsScope'          : 'base',		
+          'attributes'	      : 'entryUUID',
+          'expectedRC'	    :  0 }
+    </call>  		
+ 
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'entryUUID',
+         'expectedResult'	   : '0' }
+    </call>    
+   
+    <message>'######  Cleanup ###### '</message>         
+    <message>'-- Delete the test entry --'</message>
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	   : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	   : 'uid=testuser_entryuuid,%s' % DIRECTORY_INSTANCE_SFX,
+      }
+    </call>
+            
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>            
+      
+ <call function="'testSuite_Postamble'" />
+ </sequence>
+ </block>      
+</function>
+</stax>
diff --git a/opends/tests/functional-tests/testcases/plugins/plugins_lastmod.xml b/opends/tests/functional-tests/testcases/plugins/plugins_lastmod.xml
new file mode 100755
index 0000000..c6d83b8
--- /dev/null
+++ b/opends/tests/functional-tests/testcases/plugins/plugins_lastmod.xml
@@ -0,0 +1,396 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ ! -->
+<stax>
+  <defaultcall function="plugins_lastmod"/>
+  <function name="plugins_lastmod" scope="local">
+   <block name="STAXCurrentFunction">    
+    <sequence>
+      <script>
+        CurrentTestPath['suite']=STAXCurrentFunction
+      </script>
+      <call function="'testSuite_Preamble'" />
+
+                        
+<!---
+#@TestMarker          Plugin lastmod
+#@TestName            Plugin lastmod
+#@TestIssue             Check the plugin lastmod for add operations
+#@TestPreamble       none
+#@TestStep              Add an entry
+#@TestStep              Execute ldapsearch request to get createTimestamp attribute
+#@TestPostamble     none
+#@TestResult           The test is passed if the attribute createTimestamp is returned
+-->  
+ 
+ <testcase name="getTestCaseName('Plugins lastmod enabled  for add operations')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    <!-- Add an entry --> 
+
+    <message>'######  Add an entry  ###### '</message>          
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:testuser_lastmod_enabled')
+      listAttr.append('sn:testuser_lastmod_enabled')
+      listAttr.append('cn:testuser_lastmod_enabled')
+      listAttr.append('mail:testuser_lastmod_enabled')      
+    </script>
+	 
+    
+    <call function="'addAnEntry'">
+      { 'dsInstanceHost'  : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	  : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'        : 'uid=testuser_lastmod_enabled,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes' : listAttr,
+         'expectedRC'     :  0
+       }
+    </call>
+	
+
+    <message>'######  Check the plugin lastmod ###### '</message>                   
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        : 'uid=testuser_lastmod_enabled,%s' % DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=*'	,
+          'dsScope'          : 'base',		
+          'attributes'	      : 'createTimestamp',
+          'expectedRC'	    :  0 }
+    </call>  		
+ 
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    
+   <!-- the attribute must  not be returned -->    
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'createTimestamp',
+         'expectedResult'	   : '1' }
+    </call>
+    
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+                        
+<!---
+#@TestMarker          Plugin lastmod
+#@TestName            Plugin lastmod
+#@TestIssue             Check the plugin lastmod for modify operations
+#@TestPreamble       none
+#@TestStep              Modify an entry
+#@TestStep              Execute ldapsearch request to get modifyTimestamp attribute
+#@TestPostamble     none
+#@TestResult           The test is passed if the attribute modifyTimestamp is returned
+-->  
+ 
+ <testcase name="getTestCaseName('Plugins lastmod enabled for modify operations')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    <!-- Modify an entry --> 
+   
+    <message>'######  Modify an entry ###### '</message>          
+    <call function="'modifyAnAttribute'">
+          { 'dsInstanceHost'	    :  DIRECTORY_INSTANCE_HOST ,
+             'dsInstancePort'	    : DIRECTORY_INSTANCE_PORT ,
+             'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+             'dsInstancePswd'	  : DIRECTORY_INSTANCE_PSWD ,
+             'DNToModify'	        :   'uid=testuser_lastmod_enabled,%s' % DIRECTORY_INSTANCE_SFX,
+             'attributeName'	    :  'description',
+             'newAttributeValue'  : 'lastmod plugin for modify operations',
+             'changetype' : 'add',
+             'expectedRC'	    :  0 }
+    </call>
+
+    <message>'######  Check the plugin lastmod ###### '</message>                  
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        : 'uid=testuser_lastmod_enabled,%s' % DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=*'	,
+          'dsScope'          : 'base',		
+          'attributes'	      : 'modifyTimestamp',
+          'expectedRC'	    :  0 }
+    </call>  		
+ 
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    
+   <!-- the attribute must  be returned -->    
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'modifyTimestamp',
+         'expectedResult'	   : '1' }
+    </call>
+    
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+            
+<!---
+#@TestMarker          Plugin lastmod
+#@TestName            Plugin lastmod
+#@TestIssue             Disable the plugin lastmod for add operations
+#@TestPreamble       none
+#@TestStep              Disable the plugin lastmod
+#@TestStep              Add an entry
+#@TestStep              Execute ldapsearch request to get createTimestamp attribute
+#@TestPostamble     none
+#@TestResult           The test is passed if the attribute createTimestamp is not returned
+-->  
+    
+ <testcase name="getTestCaseName('Plugins lastmod disabled  for add operations')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    <message>'-- Disable the lastmod plugin --'</message>   
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'LastMod',
+        'optionsString'          : '--set enabled:false',
+        'expectedRC'           : 0 } 
+    </call>	
+        	   	   	 
+    <!-- Add an entry --> 
+    <message>'######  Add an entry ###### '</message>     
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:testuser_lastmod_disabled')
+      listAttr.append('sn:testuser_lastmod_disabled')
+      listAttr.append('cn:testuser_lastmod_disabled')
+      listAttr.append('mail:testuser_lastmod_disabled')      
+    </script>
+	 
+    <call function="'addAnEntry'">
+      { 'dsInstanceHost'  : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	  : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'        : 'uid=testuser_lastmod_disabled,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes' : listAttr,
+         'expectedRC'     :  0
+       }
+    </call>
+
+
+    <message>'######  Check the plugin lastmod ###### '</message>              
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        : 'uid=testuser_lastmod_disabled,%s' % DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=*'	,
+          'dsScope'          : 'base',		
+          'attributes'	      : 'createTimestamp',
+          'expectedRC'	    :  0 }
+    </call>  		
+ 
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    
+    <!-- the attribute must  not be returned -->
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'createTimestamp',
+         'expectedResult'	   : '0' }
+    </call>    
+    
+
+    <message>'######  Cleanup  ###### '</message>              
+    <message>'-- Enable the lastmod plugin --'</message>   
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'LastMod',
+        'optionsString'          : '--set enabled:true',
+        'expectedRC'           : 0 } 
+    </call>	                
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>            
+
+
+<!---
+#@TestMarker          Plugin lastmod
+#@TestName            Plugin lastmod
+#@TestIssue             Disable the plugin lastmod for modify operations
+#@TestPreamble       none
+#@TestStep              Disable the plugin lastmod
+#@TestStep              modify an entry
+#@TestStep              Execute ldapsearch request to get modifyTimestamp attribute
+#@TestPostamble     none
+#@TestResult           The test is passed if the attribute modifyTimestamp is not returned
+-->  
+    
+ <testcase name="getTestCaseName('Plugins lastmod disabled  for modify operations')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    <message>'-- Disable the lastmod plugin --'</message>   
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'LastMod',
+        'optionsString'          : '--set enabled:false',
+        'expectedRC'           : 0 } 
+    </call>	
+        	   	   	 
+    <!-- Modify an entry --> 
+
+    <message>'######  Modify an entry ###### '</message>              
+    <call function="'modifyAnAttribute'">
+          { 'dsInstanceHost'	    :  DIRECTORY_INSTANCE_HOST ,
+             'dsInstancePort'	    : DIRECTORY_INSTANCE_PORT ,
+             'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+             'dsInstancePswd'	  : DIRECTORY_INSTANCE_PSWD ,
+             'DNToModify'	        :   'uid=testuser_lastmod_disabled,%s' % DIRECTORY_INSTANCE_SFX,
+             'attributeName'	    :  'description',
+             'newAttributeValue'  : 'lastmod plugin for modify operations',
+             'changetype' : 'add',
+             'expectedRC'	    :  0 }
+    </call>    
+
+
+    <message>'######  Check the plugin lastmod ###### '</message>              
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        : 'uid=testuser_lastmod_disabled,%s' % DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=*'	,
+          'dsScope'          : 'base',		
+          'attributes'	      : 'modifyTimestamp',
+          'expectedRC'	    :  0 }
+    </call>  		
+ 
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    
+    <!-- the attribute must not be returned -->
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'modifyTimestamp',
+         'expectedResult'	   : '0' }
+    </call>    
+    
+
+    <message>'######  Cleanup ###### '</message>              
+    <message>'-- Enable the lastmod plugin --'</message>   
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'LastMod',
+        'optionsString'          : '--set enabled:true',
+        'expectedRC'           : 0 } 
+    </call>	                
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>            
+
+
+<!---
+#@TestMarker          Plugin lastmod
+#@TestName            Plugin lastmod
+#@TestIssue             Cleanup
+#@TestPreamble       none
+#@TestStep              Delete entries
+#@TestPostamble     none
+#@TestResult           The test is passed if the entries are deleted
+-->  
+    
+ <testcase name="getTestCaseName('Plugins lastmod - cleanup')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+    
+    <message>'-- Delete the test entry --'</message>
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	   : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	   : 'uid=testuser_lastmod_disabled,%s' % DIRECTORY_INSTANCE_SFX,
+      }
+    </call>
+
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	   : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	   : 'uid=testuser_lastmod_enabled,%s' % DIRECTORY_INSTANCE_SFX,
+      }
+    </call>
+        
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>                        
+                  
+ <call function="'testSuite_Postamble'" />
+ </sequence>
+ </block>     
+</function>
+</stax>
diff --git a/opends/tests/functional-tests/testcases/plugins/plugins_refint.xml b/opends/tests/functional-tests/testcases/plugins/plugins_refint.xml
new file mode 100755
index 0000000..fd24293
--- /dev/null
+++ b/opends/tests/functional-tests/testcases/plugins/plugins_refint.xml
@@ -0,0 +1,414 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ ! -->
+<stax>
+  <defaultcall function="plugins_refint"/>
+  <function name="plugins_refint" scope="local">
+    <block name="STAXCurrentFunction">    
+    <sequence>
+      <script>
+        CurrentTestPath['suite']=STAXCurrentFunction
+      </script>
+      <call function="'testSuite_Preamble'" />
+
+                   
+<!--
+#@TestMarker       Plugin referential integrity
+#@TestName         Plugin referential integrity
+#@TestIssue        Setup
+#@TestPreamble     none
+#@TestStep         Create Group
+#@TestPostamble    none
+#@TestResult       The test is passed if  the  creation is done
+-->  
+    
+    
+ <testcase name="getTestCaseName('Setup')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+
+ 
+    <message>'######  Add user entries ###### '</message>
+    <message>' '</message>
+
+    <!-- Add an entry -->
+    <iterate var="username" in="['user01','user02','user03','user4','user05']" >
+       <sequence>
+         <script>
+           listAttr=[]
+           listAttr.append('objectclass:top')
+           listAttr.append('objectclass:organizationalperson')
+           listAttr.append('objectclass:inetorgperson')
+           listAttr.append('objectclass:person')
+           listAttr.append('givenname:%s' % username)
+           listAttr.append('cn:%s' % username)
+           listAttr.append('description:%s' % username)
+           listAttr.append('uid:%s' % username)
+           listAttr.append('sn:%s' % username)
+         </script>
+
+         <call function="'addAnEntry'">    
+         { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+            'dsInstancePort'     : DIRECTORY_INSTANCE_PORT ,
+            'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+            'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,	
+            'DNToAdd'             : 'cn=%s,%s' % (username,DIRECTORY_INSTANCE_SFX),
+            'listAttributes'        : listAttr,
+            'expectedRC'         :  0
+          }
+         </call>                      
+      </sequence>
+    </iterate>    
+        
+    <message>'######  Add a static Group ###### '</message>
+    <message>' '</message>
+
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectClass:domain')
+      listAttr.append('dc:groups')
+    </script>
+	    
+   
+    <call function="'addAnEntry'">
+      { 'dsInstanceHost'  : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	  : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'        : 'dc=groups,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes' : listAttr,
+         'expectedRC'     :  0
+       }
+    </call>
+
+    <!-- Add a static group -->
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:groupofuniquenames')
+      listAttr.append('description:this is the description of my_staticgroup')
+      listAttr.append('cn:my_staticgroup')
+      listAttr.append('uniqueMember:cn=user01,%s' % DIRECTORY_INSTANCE_SFX)
+      listAttr.append('uniqueMember:cn=user02,%s' % DIRECTORY_INSTANCE_SFX)      
+      listAttr.append('uniqueMember:cn=user03,%s' % DIRECTORY_INSTANCE_SFX)  
+      listAttr.append('uniqueMember:cn=user04,%s' % DIRECTORY_INSTANCE_SFX)  
+      listAttr.append('uniqueMember:cn=user05,%s' % DIRECTORY_INSTANCE_SFX)              
+    </script>
+	    
+    <call function="'addAnEntry'">
+      { 'dsInstanceHost'  : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	  : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'        : 'cn=my_staticgroup,dc=groups,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes' : listAttr,
+         'expectedRC'     :  0
+       }
+    </call>
+
+
+    <!-- Check the group configuration -->
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        :  DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=groupOfUniqueNames'	,
+          'attributes'        : 'uniqueMember',
+          'expectedRC'	    :  0 }
+    </call>  		
+
+
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'uniqueMember',
+         'expectedResult'	   : '1' }
+    </call>                
+    
+    
+    <message>'######  Activate the referential integrity plugin. ###### '</message>
+    <message>'  '</message> 
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'Referential Integrity',
+        'optionsString'          : '--set enabled:true',
+        'expectedRC'           : 0 } 
+    </call>	
+     
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+
+                  
+<!--
+#@TestMarker       Plugin referential integrity
+#@TestName         Referential integrity check on GROUPS
+#@TestPreamble    none
+#@TestStep           Delete a user
+#@TestStep           Check that the references to the deleted user are gone.
+#@TestStep           Check that the references to an existing user are still present.
+#@TestPostamble    none
+#@TestResult         all steps must be success
+-->  
+    
+   
+ <testcase name="getTestCaseName('Referential integrity on groups with default referential-integrity-attribute-type')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+ 
+    <message>'######  Delete an user entry###### '</message>
+    <message>' '</message>
+
+    <!-- Delete an entry -->
+
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost'    : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'    : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	          :  'cn=user01,%s' % (DIRECTORY_INSTANCE_SFX),
+      }
+    </call>   
+        
+
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        :  DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=groupOfUniqueNames'	,
+          'attributes'        : 'uniquemember',
+          'expectedRC'	    :  0 }
+    </call>  		
+    
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    <message>'references to the delete user must be gone ' </message>    
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'user01',
+         'expectedResult'	   : '0' }
+    </call>                
+
+    <message>'references to an existing user must be still present' </message>
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'user02',
+         'expectedResult'	   : '1' }
+    </call>           
+    
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+      
+
+                  
+<!--
+#@TestMarker       Plugin referential integrity
+#@TestName         Referential integrity check on GROUPS after a change of configuration
+#@TestPreamble    none
+#@TestStep           Check change of the referential-integrity-attribute-type attribute is dynamic
+#@TestStep           Delete the user02  
+#@TestStep           Check that the references to the deleted user are still present
+#@TestPostamble    none
+#@TestResult         all steps must be success
+-->  
+    
+   
+ <testcase name="getTestCaseName('Check the change of the referential-integrity-attribute-type attribute')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+  
+    <message>'######  Remove the attribute uniquemember from the list of referential-integrity-attribute-type ###### '</message>
+    <message>'  '</message> 
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'Referential Integrity',
+        'optionsString'          : '--remove referential-integrity-attribute-type:uniquemember',
+        'expectedRC'           : 0 } 
+    </call>	    
+    
+    <!-- Delete an entry -->
+    <message>'######  Delete an user entry###### '</message>
+    <message>' '</message>
+
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost'    : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'    : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	          :  'cn=user02,%s' % (DIRECTORY_INSTANCE_SFX),
+      }
+    </call>   
+    
+    <!-- Check the new configuration is applied -->
+    <message>'Check the new configuration is applied'</message>   
+    
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        :  DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=groupOfUniqueNames'	,
+          'attributes'        : 'uniquemember',
+          'expectedRC'	    :  0 }
+    </call>  		
+    
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    <message>'The references to the delete user must be still present ' </message>    
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'user02',
+         'expectedResult'	   : '1' }
+    </call>                
+    
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+      
+               
+<!--
+#@TestMarker       Plugin referential integrity
+#@TestName         Referential integrity check on GROUPS is disabled
+#@TestPreamble    none
+#@TestStep           Disable the referential integrity plugin
+#@TestStep           Delete the user03
+#@TestStep           Check that the references to the deleted user are still present
+#@TestPostamble    none
+#@TestResult         all steps must be success
+-->  
+    
+   
+ <testcase name="getTestCaseName('Referential integrity on groups is disabled')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+  
+
+    <message>'######  Disable the referential integrity plugin. ###### '</message>
+    <message>'  '</message> 
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'Referential Integrity',
+        'optionsString'          : '--set enabled:false',
+        'expectedRC'           : 0 } 
+    </call>	    
+    
+    <message>'######  Set the list of referential-integrity-attribute-type ###### '</message>
+    <message>'  '</message> 
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'Referential Integrity',
+        'optionsString'          : '--set referential-integrity-attribute-type:uniquemember --set referential-integrity-attribute-type:member',
+        'expectedRC'           : 0 } 
+    </call>	    
+    
+   
+    <!-- Delete an entry -->
+    <message>'######  Delete an user entry###### '</message>
+    <message>' '</message>
+
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost'    : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'    : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	          :  'cn=user03,%s' % (DIRECTORY_INSTANCE_SFX),
+      }
+    </call>   
+    
+    
+    <!-- Check the new configuration is applied -->
+    <message>'Check the new configuration is applied'</message>   
+    
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        :  DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=groupOfUniqueNames'	,
+          'attributes'        : 'uniquemember',
+          'expectedRC'	    :  0 }
+    </call>  		
+    
+    <script>
+      returnString = STAXResult[0][1]
+    </script>
+    <message>'The references to the delete user must be still present ' </message>    
+    <call function="'searchStringForSubstring'">
+      { 'returnString'	   : returnString ,
+         'testString'	   : 'user03',
+         'expectedResult'	   : '1' }
+    </call>                
+    
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+                                                     
+ <call function="'testSuite_Postamble'" />
+ </sequence>
+ </block>      
+</function>
+</stax>
diff --git a/opends/tests/functional-tests/testcases/plugins/plugins_setup.xml b/opends/tests/functional-tests/testcases/plugins/plugins_setup.xml
new file mode 100755
index 0000000..fc39b2e
--- /dev/null
+++ b/opends/tests/functional-tests/testcases/plugins/plugins_setup.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Portions Copyright 2007 Sun Microsystems, Inc.
+ ! -->
+<stax>
+
+  <defaultcall function="plugins_setup"/>
+  <function name="plugins_setup">
+    <sequence>
+      <block name="'setup'">
+      <sequence>
+        <block name="'Block Create DS Topology'">
+          <!-- Create the topology necessary to the test group/suite -->
+          <sequence>			
+              <message>
+                 'Create DS topology as described in config.py'
+              </message>
+                <call function="'createTopology'">
+                  { 'initialiseInstance' : True }
+                </call>
+                <call function="'checkRC'">
+                  { 'returncode' : RC ,
+                    'result'     : STAXResult }
+                </call>
+          </sequence>      
+          <!--- End Block Create DS Topology -->	
+        </block>				  				  
+        <block name="'Block DS Process Active'">	  	
+        <!--- Start DS -->
+          <sequence>
+           <message>
+            'Start DS to run on port %s' % (DIRECTORY_INSTANCE_PORT)
+           </message>
+
+           <!--- Start DS -->
+           <call function="'StartDsWithScript'">
+             { 'location'  : STAF_REMOTE_HOSTNAME }
+           </call>
+
+           <call function="'checkRC'">
+            { 'returncode' : RC ,
+              'result'     : STAXResult }
+           </call>
+
+           <!--- Check that DS started -->
+           <call function="'isAlive'">
+            { 'noOfLoops'        : 5 ,
+              'noOfMilliSeconds' : 2000 }
+           </call>			
+          </sequence>
+          <!--- End Block DS Process Active -->
+        </block>			  			
+      </sequence>        
+      </block>
+    </sequence>
+  </function>
+</stax>
diff --git a/opends/tests/functional-tests/testcases/plugins/plugins_uniqueness.xml b/opends/tests/functional-tests/testcases/plugins/plugins_uniqueness.xml
new file mode 100755
index 0000000..8c4b289
--- /dev/null
+++ b/opends/tests/functional-tests/testcases/plugins/plugins_uniqueness.xml
@@ -0,0 +1,712 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE stax SYSTEM "../../shared/stax.dtd">
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License").  You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ ! or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at
+ ! trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ ! add the following below this CDDL HEADER, with the fields enclosed
+ ! by brackets "[]" replaced with your own identifying information:
+ !      Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ !      Portions Copyright 2006-2007 Sun Microsystems, Inc.
+ ! -->
+<stax>
+  <defaultcall function="plugins_uniqueness"/>
+  <function name="plugins_uniqueness" scope="local">
+    <block name="STAXCurrentFunction">    
+    <sequence>
+      <script>
+        CurrentTestPath['suite']=STAXCurrentFunction
+      </script>
+      <call function="'testSuite_Preamble'" />
+
+                   
+<!---
+#@TestMarker       Plugin uniqueness
+#@TestName         Plugin uniqueness
+#@TestIssue        Setup
+#@TestPreamble     none
+#@TestStep         Create the user entries used for the test
+#@TestPostamble    none
+#@TestResult       The test is passed if  the  creation is done
+-->  
+    
+    
+ <testcase name="getTestCaseName('Setup')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    <message>'######  Add an user entry ###### '</message>
+    <message>' '</message>
+    
+    <!--  This entry is used as a reference -->
+    <!-- Add an entry --> 
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:testuser_uniqueness')
+      listAttr.append('sn:testuser_uniqueness')
+      listAttr.append('cn:testuser_uniqueness')
+      listAttr.append('mail:testuser_uniqueness@sun')  
+      listAttr.append('description:mydescription1')
+      listAttr.append('description:mydescription2')    
+      listAttr.append('telephoneNumber:1 2 3 4')
+    </script>
+	    
+    <call function="'addAnEntry'">
+      { 'dsInstanceHost'  : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	  : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'        : 'uid=testuser_uniqueness,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes' : listAttr,
+         'expectedRC'     :  0
+       }
+    </call>
+
+
+    <call function="'SearchObject'">
+     { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+          'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+          'dsInstanceDn'     : DIRECTORY_INSTANCE_DN,
+          'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+          'dsBaseDN'        : 'uid=testuser_uniqueness,%s' % DIRECTORY_INSTANCE_SFX,
+          'dsFilter'            : 'objectclass=*'	,
+          'dsScope'          : 'base',		
+          'expectedRC'	    :  0 }
+    </call>  		
+
+
+    <message>'######  Activate the uniqueness plugin. ###### '</message>
+    <message>'  '</message> 
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'UID Unique Attribute',
+        'optionsString'          : '--set enabled:true',
+        'expectedRC'           : 0 } 
+    </call>	
+ 
+
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+  
+                                        
+<!---
+#@TestMarker       Plugin uniqueness
+#@TestName         Plugin uniqueness
+#@TestIssue        Check the plugin uniqueness  with the unique-attribute-type  uid
+#@TestPreamble     none
+#@TestStep         Keep the default configuration ( ie, unique-attribute-type = uid )
+#@TestStep          Check we can't add an entry with the same uid as the user entry reference
+#@TestPostamble    none
+#@TestResult       The test is passed if  the  creation is refused
+-->  
+   
+    
+ <testcase name="getTestCaseName('Enabled with unique-attribute-type defined to uid')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+    
+    <message>'######  Add an entry with an uid already present in the DIT  ###### '</message>
+    <message>'--- The creation must be refused to ensure the uniqueness of the attributes uid '</message>
+    <message>'  '</message>     
+    
+    <!-- Add an entry --> 
+    <!--The uid  testuser_uniqueness already exist in the DIT.  the Add must be refused with the error 19 -->
+    
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:testuser_uniqueness')
+      listAttr.append('sn:testuser_uniqueness')
+      listAttr.append('cn:testuser_uniqueness')
+    </script>
+	    
+   <call function="'addAnEntry'">
+      { 'dsInstanceHost'   : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	    : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'          : 'uid=testuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes'     : listAttr,
+         'expectedRC'      :  19
+       }
+    </call>
+
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+       
+<!---
+#@TestMarker        Plugin uniqueness
+#@TestName          Plugin uniqueness
+#@TestIssue         Check the plugin uniqueness with the unique-attribute-type mail
+#@TestPreamble      none
+#@TestStep          set the unique-attribute-type to mail
+#@TestStep          Check we can't add an entry with the same mail as the user entry reference
+#@TestPostamble     none
+#@TestResult        The test is passed if  the  creation is refused
+-->  
+   
+    
+ <testcase name="getTestCaseName('Enabled with unique-attribute-type defined to mail')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    
+ 
+
+    <message>'######  Set the unique-attribute-type to mail  ###### '</message>
+    <message>' '</message>        
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'UID Unique Attribute',
+        'optionsString'          : '--set unique-attribute-type:mail',
+        'expectedRC'           : 0 } 
+    </call>	        
+
+     
+    <message>'######  Add an entry containing a mail already present in the DIT ###### '</message>
+    <!-- Add an entry --> 
+    <!-- the Add must be refused with the error 19 -->
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:newtestuser_uniqueness')
+      listAttr.append('sn:newtestuser_uniqueness')
+      listAttr.append('cn:newtestuser_uniqueness')
+      listAttr.append('mail:testuser_uniqueness@sun') 
+    </script>
+	    
+
+    <call function="'addAnEntry'">    
+      { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort'     : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'             : 'uid=newtestuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes'        : listAttr,
+         'expectedRC'         :  19
+       }
+    </call>
+         
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+            
+              
+<!---
+#@TestMarker        Plugin uniqueness
+#@TestName          Plugin uniqueness
+#@TestIssue         Check the plugin uniqueness with several unique-attribute-type
+#@TestPreamble      none
+#@TestStep          set the unique-attribute-type to mail and telephonenumber
+#@TestStep          Check we can't add an entry with the same mail as the user entry reference
+#@TestStep          Check we can't add an entry with the same telephonenumber as the user entry reference    
+#@TestPostamble     none
+#@TestResult        The test is passed if  the  creation is refused
+-->  
+   
+ <testcase name="getTestCaseName('Enabled with unique-attribute-type defined to mail and telephoneNumber')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+    
+
+    <message>'######  Set the unique-attribute-type to mail  and telephoneNumber ###### '</message>
+    <message>' '</message>        
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'UID Unique Attribute',
+        'optionsString'          : '--set unique-attribute-type:mail --set unique-attribute-type:telephoneNumber',
+        'expectedRC'           : 0 } 
+    </call>	        
+                
+     
+    <message>'######  Add an entry containing a mail already present in the DIT ###### '</message>
+    <!-- Add an entry --> 
+    <!-- the Add must be refused with the error 19 -->
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:newtestuser_uniqueness')
+      listAttr.append('sn:newtestuser_uniqueness')
+      listAttr.append('cn:newtestuser_uniqueness')
+      listAttr.append('mail:testuser_uniqueness@sun') 
+    </script>
+	    
+
+    <call function="'addAnEntry'">    
+      { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort'     : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'             : 'uid=newtestuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes'        : listAttr,
+         'expectedRC'         :  19
+       }
+    </call>
+         
+
+    <message>'######  Add an entry containing a telephoneNumber already present in the DIT ###### '</message>
+    <!-- Add an entry --> 
+    <!-- the Add must be refused with the error 19 -->
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:newtestuser_uniqueness')
+      listAttr.append('sn:newtestuser_uniqueness')
+      listAttr.append('cn:newtestuser_uniqueness')
+      listAttr.append('telephoneNumber:1 2 3 4') 
+    </script>
+	    
+
+    <call function="'addAnEntry'">    
+      { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort'     : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'             : 'uid=newtestuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes'        : listAttr,
+         'expectedRC'         :  19
+       }
+    </call>
+             
+
+
+    <message>'######  Add an entry containing a telephoneNumber not present in the DIT ###### '</message>
+    <!-- Add an entry --> 
+    <!-- the Add must be accepted -->
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:newtestuser_uniqueness')
+      listAttr.append('sn:newtestuser_uniqueness')
+      listAttr.append('cn:newtestuser_uniqueness')
+      listAttr.append('telephoneNumber:1 2 3 4 5') 
+    </script>
+	    
+
+    <call function="'addAnEntry'">    
+      { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort'     : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'             : 'uid=newtestuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes'        : listAttr,
+         'expectedRC'         :  0
+       }
+    </call>
+        
+    <!-- cleanup -->
+    <message>'######  Cleanup ###### '</message>
+    <message>' '</message>        
+    
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	   : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	   :  'uid=newtestuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+      }
+    </call>
+              
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+            
+<!---
+#@TestMarker         Plugin uniqueness
+#@TestName           Plugin uniqueness
+#@TestIssue          Check the plugin ensures the uniqueness of the attributes multi  valued
+#@TestPreamble       none
+#@TestStep           set the unique-attribute-type to description         
+#@TestStep          Check we can't add an entry with the same description as the user entry reference   
+#@TestStep           the attribute description is multi-valued 
+#@TestPostamble      none
+#@TestResult         The test is passed if  the  creation is refused
+-->  
+   
+ <testcase name="getTestCaseName('Check uniqueness of attributes mutil-valued')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+    
+
+    <message>'######  Set the unique-attribute-type to description ###### '</message>
+    <message>' '</message>        
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'UID Unique Attribute',
+        'optionsString'          : '--set unique-attribute-type:description',
+        'expectedRC'           : 0 } 
+    </call>	        
+
+
+    <message>'######  Add an entry containing a description already present in the DIT ###### '</message>
+    <!-- Add an entry --> 
+    <!-- the Add must be refused with the error 19 -->
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:newtestuser_uniqueness')
+      listAttr.append('sn:newtestuser_uniqueness')
+      listAttr.append('cn:newtestuser_uniqueness')
+      listAttr.append('description:mydescription2') 
+    </script>
+	    
+
+    <call function="'addAnEntry'">    
+      { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort'     : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'             : 'uid=newtestuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes'        : listAttr,
+         'expectedRC'         :  19
+       }
+    </call>
+         
+
+    <message>'######  Add an entry containing a description not present in the DIT ###### '</message>
+    <!-- Add an entry --> 
+    <!-- the Add must be accepted --> 
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:newtestuser_uniqueness')
+      listAttr.append('sn:newtestuser_uniqueness')
+      listAttr.append('cn:newtestuser_uniqueness')
+      listAttr.append('description:mydescription') 
+    </script>
+	    
+
+    <call function="'addAnEntry'">    
+      { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort'     : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'             : 'uid=newtestuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes'        : listAttr,
+         'expectedRC'         :  0
+       }
+    </call>
+          
+        
+    <!-- cleanup -->
+    <message>'######  Cleanup ###### '</message>
+    <message>' '</message>        
+    
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	   : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	   :  'uid=newtestuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+      }
+    </call>
+              
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+      
+
+<!---
+#@TestMarker        Plugin uniqueness
+#@TestName          Plugin uniqueness
+#@TestIssue         Check the plugin uniqueness matchs the scope configured
+#@TestPreamble      none
+#@TestStep          set the unique-attribute-type to description
+#@TestStep          set the unique-attribute-base-dn 
+#@TestStep          Check we can't add an entry under the restricted scope
+#@TestStep          Check we can add an entry outside the restricted scope
+#@TestPostamble     none
+#@TestResult        The test is passed is the plugin respectes the restricted scope
+  -->  
+   
+ <testcase name="getTestCaseName('Restrict the scope of the plugin')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+    
+    <message>'######  Set the unique-attribute-base-dn  to dc=example,%s ###### ' % DIRECTORY_INSTANCE_SFX</message>
+    <message>' '</message>        
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'UID Unique Attribute',
+        'optionsString'          : '--set unique-attribute-type:description  --set unique-attribute-base-dn:dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+        'expectedRC'           : 0 } 
+    </call>	        
+                
+             
+    <message>'######  Add an entry under dc=example,%s ###### ' % DIRECTORY_INSTANCE_SFX</message>
+    <!-- Add an entry --> 
+    <!-- the Add must be accepted -->     
+ 
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:newtestuser_uniqueness')
+      listAttr.append('sn:newtestuser_uniqueness')
+      listAttr.append('cn:newtestuser_uniqueness')
+      listAttr.append('description:mydescription2') 
+    </script>
+	    
+
+    <call function="'addAnEntry'">   
+      { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort'     : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'             : 'uid=newtestuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes'        : listAttr,
+         'expectedRC'         :  0
+       }
+    </call>
+         
+
+    <message>'######  Add an entry under  %s  ###### ' % DIRECTORY_INSTANCE_SFX</message>
+    <!-- Add an entry --> 
+    <!-- the Add must be refused with the error 19 -->    
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:newtestuser_uniqueness')
+      listAttr.append('sn:newtestuser_uniqueness')
+      listAttr.append('cn:newtestuser_uniqueness')
+      listAttr.append('description:mydescription2') 
+    </script>
+	    
+
+    <call function="'addAnEntry'">    
+      { 'dsInstanceHost'     : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort'     : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	      : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd'    : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'             : 'uid=newtestuser_uniqueness,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes'        : listAttr,
+         'expectedRC'         :  0
+       }
+    </call>
+        
+    <!-- cleanup -->
+    <message>'######  Cleanup ###### '</message>
+    <message>' '</message>        
+    
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	   : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	   :  'uid=newtestuser_uniqueness,%s' % DIRECTORY_INSTANCE_SFX,
+      }
+    </call>
+              
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+      
+           
+<!---
+#@TestMarker            Plugin uniqueness
+#@TestName              Plugin uniqueness
+#@TestIssue             Disable  the plugin uniqueness  with the uniqu
+#@TestStep              Disable the plugin uniqueness
+#@TestStep              Keep the default configuration ( ie, unique-attribute-type = uid )
+#@TestStep              Add an entry  containing a uid value already present in the DIT
+#@TestPostamble         none
+#@TestResult            The test is passed if  the  creation is accepted
+-->  
+    
+    
+ <testcase name="getTestCaseName('Disabled with unique-attribute-type defined to uid')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    <message>'######  Disable the uniqueness plugin ###### '</message>
+    <message>' '</message>    
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'UID Unique Attribute',
+        'optionsString'          : '--set enabled:false',
+        'expectedRC'           : 0 } 
+    </call>	
+
+    <message>'######  Add an entry ###### '</message>
+    <message>'-- The creation must be  accepted '</message>
+    <!-- Add an entry --> 
+    <!-- The add must be accepted -->
+    <script>
+      listAttr = []
+      listAttr.append('objectclass:top')
+      listAttr.append('objectclass:organizationalperson')
+      listAttr.append('objectclass:inetorgperson')
+      listAttr.append('objectclass:person')
+      listAttr.append('givenname:testuser_uniqueness')
+      listAttr.append('sn:testuser_uniqueness')
+      listAttr.append('cn:testuser_uniqueness')
+      listAttr.append('uid:testuser_uniqueness')            
+    </script>
+	    
+   <call function="'addAnEntry'">
+      { 'dsInstanceHost'  : DIRECTORY_INSTANCE_HOST ,
+         'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
+         'dsInstanceDn'	  : DIRECTORY_INSTANCE_DN ,
+         'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,	
+         'DNToAdd'        : 'uid=testuser_uniqueness,dc=example,%s' % DIRECTORY_INSTANCE_SFX,
+         'listAttributes' : listAttr,
+         'expectedRC'     :  0
+       }
+    </call>
+
+    <!-- cleanup -->
+    <message>'######  Cleanup ###### '</message>
+    <message>' '</message>        
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	   : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	   : 'uid=testuser_uniqueness,dc=example,%s' %  DIRECTORY_INSTANCE_SFX,
+      }
+    </call>    
+    
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+                  
+                                                                                                                                                         
+<!---
+#@TestMarker         Plugin uniqueness
+#@TestName           Plugin uniqueness
+#@TestIssue          Cleanup
+#@TestPreamble       none
+#@TestStep           delete the user entries 
+#@TestPostamble      none
+#@TestResult         The test is passed if  the  delete are done
+-->  
+    
+    
+ <testcase name="getTestCaseName('Cleanup')">
+  <sequence>
+    <call function="'testCase_Preamble'"/>
+
+    <call function="'DeleteEntry'">
+     { 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
+        'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'	   : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
+        'dsBaseDN'	   : 'uid=testuser_uniqueness,%s' % DIRECTORY_INSTANCE_SFX,
+      }
+    </call>
+
+
+    <message>'######  Desactivate the uniqueness plugin. ###### '</message>
+    <message>'  '</message> 
+       
+    <call function="'dsconfig'">
+      { 'dsInstanceHost'       : DIRECTORY_INSTANCE_HOST,
+        'dsInstancePort'       : DIRECTORY_INSTANCE_PORT ,
+        'dsInstanceDn'         : DIRECTORY_INSTANCE_DN ,
+        'dsInstancePswd'      : DIRECTORY_INSTANCE_PSWD ,
+        'subcommand'          : 'set-plugin-prop' ,
+        'objectType'             : 'plugin-name' ,
+        'objectName'            : 'UID Unique Attribute',
+        'optionsString'          : '--set enabled:false',
+        'expectedRC'           : 0 } 
+    </call>	
+  
+        
+    <call function="'testCase_Postamble'"/>
+  </sequence>
+ </testcase>
+
+           
+ <call function="'testSuite_Postamble'" />
+ </sequence>
+ </block>      
+</function>
+</stax>

--
Gitblit v1.10.0