<?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="indexes" />
|
<function name="indexes">
|
<block name="'indexes'">
|
<sequence>
|
<script>
|
CurrentTestPath={'group':'indexes','suite':'indexes'}
|
envAlreadyLoaded='true'
|
_setupSteps=['testGroup_Preamble','testSuite_Preamble','indexes_setup']
|
_testSteps=['indexes_search','indexes_add','indexes_remove']
|
_cleanupSteps=['indexes_cleanup','testSuite_Postamble','testGroup_Postamble']
|
</script>
|
<!---
|
#@TestSuiteName Indexes
|
#@TestSuitePurpose test the database index feature from ldap
|
#@TestSuiteGroup indexes
|
#@TestScript indexes.xml
|
-->
|
|
<try>
|
<!-- the pre-requisites are in a separate iteration -->
|
<sequence>
|
<iterate in="_setupSteps" var="_setupStep">
|
<call function="_setupStep" />
|
</iterate>
|
<iterate in="_testSteps" var="_testStep" indexvar="_testStepNumber">
|
<call function="_testStep" />
|
</iterate>
|
</sequence>
|
<catch exception="'STAXException.Topology.CreationException'">
|
<message log="1" level="'fatal'">'Could not create the topology. Bailing out.'</message>
|
</catch>
|
<catch exception="'STAXException.Topology.StartException'">
|
<message log="1" level="'fatal'">'Could not start at least one server in the topology. Bailing out.'</message>
|
</catch>
|
<finally>
|
<iterate in="_cleanupSteps" var="_cleanupStep">
|
<call function="_cleanupStep" />
|
</iterate>
|
</finally>
|
</try>
|
</sequence>
|
</block>
|
</function>
|
|
<function name="indexes_search" scope="local">
|
<!---
|
This set of tests loop through a set of search filters to verify that
|
the default indexes behave as expected
|
#@TestMarker indexes
|
#@TestName indexes_search
|
#@TestIssue TODO: look up the issue in issue tracker
|
#@TestPurpose harden the default indexes
|
#@TestPreamble none
|
#@TestStep iterate through file search.filters
|
#@TestPostamble none
|
#@TestResult Success if entry are indexed correctly
|
-->
|
<block name="'Search'">
|
<sequence>
|
<message log="1" level="'info'">
|
'starting the search tests'
|
</message>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'search' }
|
</call>
|
</sequence>
|
</block>
|
</function>
|
|
|
<function name="indexes_modify" scope="local">
|
<!--
|
This test alters the uid default index so that it does subString search
|
and then verifies that it worked
|
#@TestMarker indexes
|
#@TestName indexes_search
|
#@TestIssue TODO: look up the issue in issue tracker
|
#@TestPurpose harden the default indexes
|
#@TestPreamble none
|
#@TestStep iterate through file search.filters
|
#@TestPostamble none
|
#@TestResult Success if entry are indexed correctly
|
-->
|
<block name="'Modify'">
|
<sequence>
|
<try>
|
<sequence>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'before-modify' }
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'modifyIndex',
|
'functionException' : 'LDAP.ModifyException',
|
'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock ) ,
|
'functionMessage' : 'Adding substring index to attribute uid' ,
|
'functionArguments' : { 'operation' : 'add' ,
|
'indexAttribute' : 'uid' ,
|
'indexProperty' : 'index-type' ,
|
'indexPropertyValue' : 'substring'
|
}
|
}
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'StopDsWithScript' ,
|
'functionException' : 'CLI.stop-ds' ,
|
'functionFailureTC' : 'Indexes - Modify' ,
|
'functionArguments' : { 'location' : STAF_LOCAL_HOSTNAME ,
|
'dsHost' : DIRECTORY_INSTANCE_HOST,
|
'dsPort' : DIRECTORY_INSTANCE_PORT,
|
'dsBindDN' : DIRECTORY_INSTANCE_DN ,
|
'dsBindPwd' : DIRECTORY_INSTANCE_PSWD }
|
}
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'CLI_rebuild-index' ,
|
'functionException' : 'CLI.RebuildIndex' ,
|
'functionFailureTC' : 'Indexes - Modify' ,
|
'functionArguments' : { 'baseDN' : DIRECTORY_INSTANCE_SFX ,
|
'attributes' : [ 'uid' ] }
|
}
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'StartDsWithScript',
|
'functionException' : 'CLI.start-ds' ,
|
'functionFailureTC' : 'Indexes - Modify' ,
|
'functionArguments' : { 'location' : STAF_LOCAL_HOSTNAME }
|
}
|
</call>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'after-modify' }
|
</call>
|
</sequence>
|
<catch exception="'STAXException.LDAP.ModifyException'">
|
<message log="1" level="'fatal'">'Fatal Error: Failed to alter index for attribute uid'</message>
|
</catch>
|
<catch exception="'STAXException.CLI.RebuildIndex'">
|
<message log="1" level="'fatal'">'Fatal Error: Failed to rebuild index for attribute uid'</message>
|
</catch>
|
</try>
|
</sequence>
|
</block>
|
</function>
|
|
<function name="indexes_add" scope="local">
|
<!--
|
This test does a bunch of searches on the
|
and then verifies that it worked
|
#@TestMarker indexes
|
#@TestName indexes_add
|
#@TestIssue TODO: look up the issue in issue tracker
|
#@TestPurpose check if the user can add her own indexes
|
#@TestPreamble none
|
#@TestStep iterate through filters prior to adding indexes
|
#@TestStep add the indexes
|
#@TestStep iterate through filters after to adding indexes
|
#@TestPostamble none
|
#@TestResult Success if entry are indexed correctly
|
-->
|
<block name="'Add'">
|
<sequence>
|
<try>
|
<sequence>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'before-add' }
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'addIndex' ,
|
'functionException' : 'LDAP.AddIndexException' ,
|
'functionFailureTC' : 'Indexes - Add' ,
|
'functionMessage' : 'Adding presence and equality index to attribute st',
|
'functionArguments' : { 'indexAttribute' : 'l' ,
|
'indexTypes' : [ 'presence', 'equality' ]
|
}
|
}
|
</call>
|
|
<call function="'runFunction'">
|
{ 'functionName' : 'StopDsWithScript' ,
|
'functionException' : 'CLI.stop-ds' ,
|
'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock ) ,
|
'functionArguments' : { 'location' : STAF_LOCAL_HOSTNAME ,
|
'dsHost' : DIRECTORY_INSTANCE_HOST,
|
'dsPort' : DIRECTORY_INSTANCE_PORT,
|
'dsBindDN' : DIRECTORY_INSTANCE_DN ,
|
'dsBindPwd' : DIRECTORY_INSTANCE_PSWD
|
}
|
}
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'CLI_rebuild-index' ,
|
'functionException' : 'CLI.RebuildIndex' ,
|
'functionFailureTC' : 'Indexes - Modify' ,
|
'functionArguments' : { 'baseDN' : DIRECTORY_INSTANCE_SFX ,
|
'attributes' : [ 'l' ]
|
}
|
}
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'StartDsWithScript',
|
'functionException' : 'CLI.start-ds' ,
|
'functionFailureTC' : '%s: %s: ' ,
|
'functionArguments' : { 'location' : STAF_LOCAL_HOSTNAME }
|
}
|
</call>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'after-add' }
|
</call>
|
</sequence>
|
<catch exception="'STAXException.LDAP.AddIndexException'">
|
<message log="1" level="'fatal'">'Fatal Error: Failed to add index for attribute l'</message>
|
</catch>
|
<catch exception="'STAXException.CLI.RebuildIndex'">
|
<message log="1" level="'fatal'">'Fatal Error: Failed to rebuild index for attribute l'</message>
|
</catch>
|
</try>
|
</sequence>
|
</block>
|
</function>
|
|
|
<function name="indexes_remove" scope="local">
|
<!--
|
This test does a bunch of searches on the
|
and then verifies that it worked
|
#@TestMarker indexes
|
#@TestName indexes_remove
|
#@TestIssue TODO: look up the issue in issue tracker
|
#@TestPurpose Check if the user can remove indexes
|
#@TestPreamble none
|
#@TestStep iterate through filters prior to removing index
|
#@TestStep remove index
|
#@TestStep iterate through filters after to removing index
|
#@TestPostamble none
|
#@TestResult Success if entry are indexed as expected
|
-->
|
<block name="'Remove'">
|
<sequence>
|
<try>
|
<sequence>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'before-remove' }
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'removeIndex' ,
|
'functionException' : 'LDAP.RemoveIndexException' ,
|
'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock),
|
'functionMessage' : 'Removing index on attribute l' ,
|
'functionArguments' : { 'indexAttribute' : 'l' }
|
}
|
</call>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'after-remove' }
|
</call>
|
</sequence>
|
<catch exception="'STAXException.LDAP.RemoveIndexException'">
|
<message log="1" level="'fatal'">'Fatal Error: Failed to remove index for attribute l'</message>
|
</catch>
|
</try>
|
</sequence>
|
</block>
|
</function>
|
|
<function name="indexes_entry_limit">
|
<!--
|
This test does a bunch of searches on the
|
and then verifies that it worked
|
#@TestMarker indexes
|
#@TestName indexes_remove
|
#@TestIssue TODO: look up the issue in issue tracker
|
#@TestPurpose Check if the user can remove indexes
|
#@TestPreamble none
|
#@TestStep iterate through filters prior to removing index
|
#@TestStep remove index
|
#@TestStep iterate through filters after to removing index
|
#@TestPostamble none
|
#@TestResult Success if entry are indexed as expected
|
-->
|
<block name="'Entry_Limit'">
|
<sequence>
|
<try>
|
<sequence>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'before-entry-limit' }
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'modifyIndex' ,
|
'functionException' : 'LDAP.ModifyIndexException' ,
|
'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock),
|
'functionMessage' : 'Modify index entry limit on attribute uid' ,
|
'functionArguments' : { 'operation' : 'set' ,
|
'indexAttribute' : 'uid' ,
|
'indexProperty' : 'index-entry-limit' ,
|
'indexPropertyValue' : '3'
|
}
|
}
|
</call>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'after-entry-limit' }
|
</call>
|
</sequence>
|
<catch exception="'STAXException.LDAP.RemoveIndexException'">
|
<message log="1" level="'fatal'">'Fatal Error: Failed to remove index for attribute l'</message>
|
</catch>
|
</try>
|
</sequence>
|
</block>
|
</function>
|
|
<function name="indexes_vlv_add">
|
<!--
|
This test does a bunch of searches on the
|
and then verifies that it worked
|
#@TestMarker indexes
|
#@TestName indexes_remove
|
#@TestIssue TODO: look up the issue in issue tracker
|
#@TestPurpose Check if the user can remove indexes
|
#@TestPreamble none
|
#@TestStep iterate through filters prior to removing index
|
#@TestStep remove index
|
#@TestStep iterate through filters after to removing index
|
#@TestPostamble none
|
#@TestResult Success if entry are indexed as expected
|
-->
|
<block name="'Entry_Limit'">
|
<sequence>
|
<try>
|
<sequence>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'before-entry-limit' }
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'modifyIndex' ,
|
'functionException' : 'LDAP.ModifyIndexException' ,
|
'functionFailureTC' : '%s: %s: %s' % (CurrentTestPath['group'], CurrentTestPath['suite'], STAXCurrentBlock),
|
'functionMessage' : 'Modify index entry limit on attribute uid' ,
|
'functionArguments' : { 'operation' : 'set' ,
|
'indexAttribute' : 'uid' ,
|
'indexProperty' : 'index-entry-limit' ,
|
'indexPropertyValue' : '3'
|
}
|
}
|
</call>
|
<call function="'loopThroughFilters'">
|
{ 'filters' : 'after-entry-limit' }
|
</call>
|
</sequence>
|
<catch exception="'STAXException.LDAP.RemoveIndexException'">
|
<message log="1" level="'fatal'">'Fatal Error: Failed to remove index for attribute l'</message>
|
</catch>
|
</try>
|
</sequence>
|
</block>
|
</function>
|
|
|
<function name="loopThroughFilters" scope="local">
|
<function-map-args>
|
<function-arg-def name="filters" type="required" />
|
</function-map-args>
|
<sequence>
|
<script>
|
class indexTest:
|
"Describes an index test with indexed attribute, filter to test with and expected behaviour"
|
def __init__(self, attribute, testName, filter, expectedValue, isIndexed):
|
self.attribute = attribute
|
self.name = testName
|
self.filter = filter
|
self.rc = expectedValue
|
self.isIndexed=re.compile(r'[\r\n]').sub('',isIndexed)
|
self.status='fail'
|
|
def getAttribute(self):
|
return self.attribute
|
|
def getName(self):
|
return self.name
|
|
def getFilter(self):
|
return self.filter
|
|
def getRC(self):
|
return self.rc
|
|
def getSearchString(self):
|
if self.isIndexed.startswith('NOT'):
|
return 'NOT'
|
else:
|
return 'INDEX:%s' % (self.attribute)
|
|
def pass(self):
|
self.status='pass'
|
|
def getStatus(self):
|
return self.status
|
|
def desc(self):
|
description = 'test:: name=[%s]\n' % self.name
|
description += 'test:: attribute=[%s]\n' % self.attribute
|
description += 'test:: filter=[%s]\n' % self.filter
|
description += 'test:: rc=[%s]\n' % self.rc
|
description += 'test:: indexed=[%s]\n' % self.isIndexed
|
return description
|
|
indexTests = []
|
|
f = open('%s/testcases/indexes/%s.filters' % (TESTS_DIR,filters),'r')
|
for line in f.readlines():
|
if line.startswith('#'):
|
continue
|
else:
|
testLine = line.split(' ')
|
indexTests.append(indexTest(testLine[0], testLine[1], testLine[2], testLine[3], testLine[4]))
|
|
indexTestNumber=0
|
previousTestName=''
|
testNumber=0
|
</script>
|
<iterate var="test" in="indexTests">
|
<sequence>
|
<script>
|
indexTestNumber=indexTestNumber+1
|
if previousTestName != test.getName():
|
previousTestName=test.getName()
|
testNumber=0
|
|
</script>
|
<testcase name="'%s: %d.%s: %03d-%03d.%s: %s%02d' % ( CurrentTestPath['group'], len(_testSteps)-_testStepNumber, filters, len(indexTests)-indexTestNumber, indexTestNumber, test.getAttribute(), test.getName(), testNumber)" >
|
<sequence>
|
<call function="'testCase_Preamble'" />
|
<message log="1" level="'trace'">
|
'Searching attribute [%s] with filter[%s]' % (test.getAttribute(),test.getFilter())
|
</message>
|
<call function="'SearchObject'">
|
{ 'dsInstanceHost' : DIRECTORY_INSTANCE_HOST ,
|
'dsInstancePort' : DIRECTORY_INSTANCE_PORT ,
|
'dsInstanceDn' : DIRECTORY_INSTANCE_DN ,
|
'dsInstancePswd' : DIRECTORY_INSTANCE_PSWD ,
|
'dsBaseDN' : 'ou=People,dc=example,%s' % DIRECTORY_INSTANCE_SFX ,
|
'dsFilter' : '%s' % test.getFilter() ,
|
'attributes' : 'debugsearchindex' ,
|
'expectedRC' : 'noCheck' }
|
</call>
|
<script>
|
searchReturnCode, searchResultString = STAXResult[0]
|
# chop off the first line that contains the dn
|
searchResultString = re.compile(r'^dn:.*\n?').sub('',searchResultString)
|
# join multiple lines into a single one
|
searchResultString = re.compile(r'[ \t]*\r?\n[ \t]*').sub('',searchResultString)
|
srt=searchResultString.split('[')[1]
|
if (str(searchReturnCode) == str(test.getRC())) and srt.startswith(test.getSearchString()):
|
test.pass()
|
</script>
|
<message level="'trace'">'%s\nsearchReturnCode=[%s]\nldapsearch return string=[%s]\nchunk to parse=[%s]\nstring looked for=[%s]' % (test.desc(), searchReturnCode, searchResultString, srt, test.getSearchString())</message>
|
<tcstatus result="test.getStatus()" />
|
<call function="'testCase_Postamble'" />
|
<script>
|
testNumber=testNumber+1
|
</script>
|
</sequence>
|
</testcase>
|
</sequence>
|
</iterate>
|
</sequence>
|
</function>
|
|
<!-- Setup the instance for indexes tests -->
|
<function name="indexes_setup">
|
<sequence>
|
<call function="'runFunction'">
|
{ 'functionName' : 'createTopology' ,
|
'functionMessage' : 'Create DS topology as described in config.py',
|
'functionException' : 'Topology.CreationException' ,
|
'functionArguments' : { 'initialiseInstance' : True }
|
}
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'StartDsWithScript' ,
|
'functionMessage' : 'Start DS to run on port %s' % (DIRECTORY_INSTANCE_PORT) ,
|
'functionArguments' : { 'location' : STAF_REMOTE_HOSTNAME }
|
}
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'isAlive' ,
|
'functionMessage' : 'Checking if the server is available' ,
|
'functionException' : 'Topology.StartException' ,
|
'functionArguments' : { 'noOfLoops' : 5 ,
|
'noOfMilliSeconds' : 2000 }
|
}
|
</call>
|
</sequence>
|
</function>
|
|
<!-- cleanup after the tests -->
|
<function name="indexes_cleanup">
|
<sequence>
|
<call function="'runFunction'">
|
{ 'functionName' : 'StopDsWithScript' ,
|
'functionMessage' : 'Stop DS running on port %s' % (DIRECTORY_INSTANCE_PORT),
|
'functionArguments' : { 'location' : STAF_REMOTE_HOSTNAME ,
|
'dsHost' : DIRECTORY_INSTANCE_HOST ,
|
'dsPort' : DIRECTORY_INSTANCE_PORT ,
|
'dsBindDN' : DIRECTORY_INSTANCE_DN ,
|
'dsBindPwd' : DIRECTORY_INSTANCE_PSWD }
|
}
|
</call>
|
<call function="'runFunction'">
|
{ 'functionName' : 'removeTopology',
|
'functionMessage' : 'Remove DS topology created for the Test Suite'
|
}
|
</call>
|
</sequence>
|
</function>
|
</stax>
|