mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Christophe Sovant
21.44.2009 936802b266b33db53f92707e7b92f381e87ed290
Frontport of 2.2 tests to the trunk
2 files deleted
3 files added
18 files modified
3508 ■■■■■ changed files
opends/tests/staf-tests/functional-tests/shared/data/aci/global_acis/mod_entry3.ldif 29 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-master.ldif 1232 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-master.template 4 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterModify.ldif 61 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterModifyDN.ldif 81 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterModifyDN.template 3 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterOnlineImport.ldif 147 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterOnlineImport.template 3 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-replicaIncludeAdd.ldif 5 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/aci/global_acis.xml 42 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/clu/clu_rebuild-index_checkbehavior.xml 7 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/fractional-replication/basic.xml 12 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/fractional-replication/config.xml 1205 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/fractional-replication/utils.xml 67 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/groups/group_cleanup.xml 79 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/groups/group_setup.xml 95 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog.xml 114 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml 154 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/ant/build.properties 2 ●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/functions/utils.xml 2 ●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/python/common.py 66 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/python/schema.py 68 ●●●● patch | view | raw | blame | history
opends/tests/staf-tests/shared/tests/runTests.xml 30 ●●●●● patch | view | raw | blame | history
opends/tests/staf-tests/functional-tests/shared/data/aci/global_acis/mod_entry3.ldif
New file
@@ -0,0 +1,29 @@
# 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
#
#      Copyright 2009 Sun Microsystems, Inc.
#
dn: uid=auser, ou=People, o=ACI Tests, dc=example,dc=com
changetype: modify
replace: telephoneNumber
telephoneNumber: +33 01234567890
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-master.ldif
File was deleted
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-master.template
@@ -52,5 +52,9 @@
postalCode: <random:numeric:5>
postalAddress: {cn} - {street} - {l}, {st}  {postalCode}
description: This is the description for {cn}.
description: This is qnother description for {cn}.
description;lang-fr: Ceci est la description en Français pour {cn}
description;lang-es: Eso es la Descripción en Español para {cn}
description;lang-jp: {cn}の日本語の説明です。
jpegPhoto:: <random:base64:1000>
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterModify.ldif
@@ -21,7 +21,62 @@
#
dn: uid=user.0,ou=People,o=example
changetype: modify
replace: postalCode
postalCode: 70000
changeType: modify
replace: description
description: Yet another description added by ldapmodify.
dn: uid=user.1,ou=People,o=example
changeType: modify
replace: description
description: Yet another description added by ldapmodify.
dn: uid=user.2,ou=People,o=example
changeType: modify
replace: description
description: Yet another description added by ldapmodify.
dn: uid=user.0,ou=People,o=example
changeType: modify
replace: description;lang-fr
description;lang-fr:: VW5lIG5vdXZlbGxlIGRlc2NyaXB0aW9uIGVuIEZyYW7Dp2Fpcy4=
dn: uid=user.1,ou=People,o=example
changeType: modify
replace: description;lang-fr
description;lang-fr:: VW5lIG5vdXZlbGxlIGRlc2NyaXB0aW9uIGVuIEZyYW7Dp2Fpcy4=
dn: uid=user.2,ou=People,o=example
changeType: modify
replace: description;lang-fr
description;lang-fr:: VW5lIG5vdXZlbGxlIGRlc2NyaXB0aW9uIGVuIEZyYW7Dp2Fpcy4=
dn: uid=user.0,ou=People,o=example
changeType: modify
replace: description;lang-es
description;lang-es:: VW5hIG90cmEgZXMgbGEgRGVzY3JpcGNpw7NuIGVuIEVzcGHDsW9sLg==
dn: uid=user.1,ou=People,o=example
changeType: modify
replace: description;lang-es
description;lang-es:: VW5hIG90cmEgZXMgbGEgRGVzY3JpcGNpw7NuIGVuIEVzcGHDsW9sLg==
dn: uid=user.2,ou=People,o=example
changeType: modify
replace: description;lang-es
description;lang-es:: VW5hIG90cmEgZXMgbGEgRGVzY3JpcGNpw7NuIGVuIEVzcGHDsW9sLg==
dn: uid=user.0,ou=People,o=example
changeType: modify
replace: description;lang-jp
description;lang-jp:: MuaXpeacrOiqnuOBruiqrOaYjuOBp+OBmeOAgg==
dn: uid=user.1,ou=People,o=example
changeType: modify
replace: description;lang-jp
description;lang-jp:: MuaXpeacrOiqnuOBruiqrOaYjuOBp+OBmeOAgg==
dn: uid=user.2,ou=People,o=example
changeType: modify
replace: description;lang-jp
description;lang-jp:: MuaXpeacrOiqnuOBruiqrOaYjuOBp+OBmeOAgg==
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterModifyDN.ldif
@@ -38,23 +38,26 @@
givenName: Aaccf
sn: Amar
cn: Aaccf Amar
initials: AUA
initials: AFA
employeeNumber: 0
uid: user.0
mail: user.0@example.com
userPassword: password
telephoneNumber: +1 496 709 1644
pager: +1 542 068 5162
mobile: +1 830 626 1904
street: 25322 Hill Street
l: Parkersburg
st: ID
postalCode: 07186
postalAddress: Aaccf Amar - 25322 Hill Street - Parkersburg, ID  07186
telephoneNumber: +1 003 310 8190
pager: +1 940 190 8318
mobile: +1 099 164 8705
street: 06275 Main Street
l: Clarksburg
st: GA
postalCode: 25027
postalAddress: Aaccf Amar - 06275 Main Street - Clarksburg, GA  25027
description: This is the description for Aaccf Amar.
description: This is a seconde description  0548608245
jpegPhoto:: SJgn1C9SQgIxuCggSnAuaHJQ2lrVX05UUZLqcxORI6vmmmQqy0kX/kNYb8QoXTmfE6T+J9vAG+TLAIEqK6edJAkWU+Nsm4JG8TXY8UQO1qS4CxSGGThjPh5AgTJYOSKceYqwmTZRM1/Bpdwln8iMQOEXbDqIuuwOd3Cbz8nzpDSUfOd+fjiCF0oe7mGydRdQFYOlD708ziC4k95xwnos/xWE3tDoGokYmG8dufCDrCh0KOqkcDa14/N8Zw3wIH4pAikmv3FDtIky0qyZ7IPpcOYX5HwnW4M7fIeRj3PjLiwflYZ/UF5TWY05+vTzoeL72o9g4kgIJlZbv8IgOm4RfXzF17L+FwodSnzYdIP3I+foXRkzGoljxl3TQ0ZIJ/dMy6ZTeT27InYgRY7oaU9BcbAsPn0FCNJgVm1+ifp4ngg1eoc0u5gtvIGWH3v9TFc69cHr2NC6gJ74MG8/dZsG+emRQq7Ymq/7txbVBWKMSmpuzpaouR+QYWc1QPmTy0K4PiwjRqNPQOGCHhjTnDXGwuX99BIu6UYjdSa19F2j0MNxkMRjmv+fWcMvwNZuzXWzv68bzX9BpYfPNmS1wTzkaGw7mI24cQF2LTrhTZjHOa+m0Vu/f3Tt5ytolLuz65PijLNEu6LNYoE/JwoLiIwrCU3ECcr0M4YXJjN6m6K+nnVxQdqmZS8wy8rZT33+Ya7dRI7rbinF5qACoJhb1TozUh/z6bVTJrrV42SqJgIjLNhJutxYBp4Nem9dfc3MCd5osE6xy9d7Z81+QdQ0wdiCBcfwHJCHe5lSY6YWtCpuCiupuG20BCz6BKplaZ0di1pXYJYNL+BrLA7TBP7eF3FAA/Zn6VFpFNXpulYKjnKjZ1FccGP7p/4BPZ4BassmOxWSau9GuZSo1fy7boS0XxrLxXXxbrWHuUIHE1trMPpeNGK5LqNmCAQ2mzHgxpS5pvJ80qBAYof4NUsNyvREb0/zhsCO6LwQh4PkeCLgmOBw
jpegPhoto:: aBrvAyl0HWGpWm0Q7M2xMZ5xYuLjNZ2N8xsdHczaMgbInCOMAZ2XP4dO9tXKpxcwh3+09g1lpr8cf+w8YouZgej3K0dtYuCeU3dH+rWIe9qdrSU/ErWLtkZq+/YjmRwg0QAB4lzsD6nD+Lkx86pgY6/1OjoocY7cuJQI/Pydwx3SI0Lwlek087rA0bUCZEt7oVjqdh8nxu0tbhUViVI4AdPbHOxta3/PrRpFsJsusFdUPCwLTpCk1jcy0Q61JyiUJcPLJ045yf0Ejn49nBmF07Q1pgKbD0UODvoxMWk8QtSug/BPyp5CMNWNaW+8jzJojG8SNBqNH21EwdWP3gxKc6S0UeGi2ouWUTXG6H6QKxWA4deDY4k2QiLINdRyK3jDc3fVolZrdZKuoh1kmC2UF4sPST22YrrCuDH0VzcZ35AdONDnE+Dt+t3LoEvCEcFFuVUJHhaAXkj6l0lkdd6fa1IXjNQUNe1nSmIWnLX+BDm1XEtfF0xJaPCuw2YQ/VFXt5OQ9M/sGJ0aInuu3V7Hqqe0DGz6YyvFWFjjhMUPmqy4drZg9xuu+dIKiRhq7N5e+0uwQliL6EloyNo1z3ZsApB81wL1KiLvflTl4X0IQWGAZXe6JJSi+a0rpKzvX0h8Z8ChlnILtRecRbadCGPlpuWaCNdHtQHyy8+kjiIHaLV67Nvf8TkqqVItXaVM+2uF2sbIKh5rTGPFOHbmAsUi2HpNRAjArVC29Lwd4GzVzTGD0i/+U9/a4jAhWYofoHp2dBI+wObVRR1FoL3+MNkiBnVEj0aq2T16xkO3y+cPXLEY/R2Totz/L6V2tu4vKb9xUPrMvbTgDgE6kF0xz3WKAGqEdSbP930i2xX0BzT4wav/JSZtkMquWukclp0KmkTxh5362Gbl3QrGXi44J2qo38MvS+t3GatAR5YaXuFhexheyzFOyp3fpKhkZ2ALkPwLFwE+csVFzXe0i/szgFfISbWuOGnlrFJad3n700a/
description: This is a seconde description  5140681120
description;lang-fr:: Q2VjaSBlc3QgbGEgZGVzY3JpcHRpb24gZW4gRnJhbsOnYWlzIHBvdXIgQWFjY2YgQW1hcg==
description;lang-es:: RXNvIGVzIGxhIERlc2NyaXBjacOzbiBlbiBFc3Bhw7FvbCBwYXJhIEFhY2NmIEFtYXI=
description;lang-jp:: QWFjY2YgQW1hcuOBruaXpeacrOiqnuOBruiqrOaYjuOBp+OBmeOAgg==
jpegPhoto:: bmGNzx1l2/nHeLBc7vxIE6gEKt0XRSVnL2u1aWyWsScAU7PyQ2N8JOJk3pAQhXIpZIsJm+vp89ZgQQ04Zty3GvMpe5MxqqTnMhq238CpJ52Tnn0atnENTPYRIcwZVpjt6lrq7WCekR2hrw5Csw/9zHa2nzboL0HXqOzdvOHgeoYXHALkk/EdxHSWz0pqOjxMXzaTFWYa5n49z/ShWaB7/znDk8JQSSFnIXNEwOKINEknrtSkOianJ0eomqPmrnvIxE5A0cXoAleBNiipTVp2iBnalja0Ss+dI/fAMXo8Ik+ynvXd6593UzykGTZB6gw0aHdpzYPux0rR1UG090uZHijJWhdXdjlQMYlIBHE0ocvdcFxYA+AHhtbCEMy6JSz2aKJ9CXEcXer4EdN0mKRrhKL5jiVfG7hHb0aTLKyZK2jcuxIq12N7/6q0EXKbFC/UkFMSXUmlQozgrdJpjDxVW8zM8xXLo6yx69qCeKz7wON3oRDZzif6447QKo97I0MWsNZfv5eXlkku2/B5meAOfikm6IGSxZk60Zc+I6QYgCq60m/XSDow8GZraOh/8CFEmm2p095lL+y4BPGGCySowidLnGy3n04HsmEmlFk/wPj6Iw/q5VejcXHQYmnTdGE7c7D8OgD0AvZXKip3LZm+T2pzdwGcvXORSYxf/UzGDAM5PssnM+aw1fxW6/yzwlUOmp1WJBtlCvvrXtQ/brj5Y3MdTsvVUKUiaWYRLByQCNMzm/yb/biqrymReXzb4idfD4Otjrky5rbnRypSqTqBl8un+IMxUb3lqICy7mgFWGZD2wRIDnRRXuKoA59fqb2zarqE0d7jgIdMpR72ZMNGskDkTtQPXg8m55A+B9Id06hp/F2EgDWy9cdTN9wRo/LUIwtDBWA66DMEr7a1Q/lxE9wyyq3oLJKsrSQJp9pJAbA1oOKFavjg7cilWp8U7Nvmc4IMdnud7BcavBGv58GlQ90Lqpgmac8yiFW2S4oH
jpegPhoto:: uo1MJ5H1P+oNC7hKvmONDM/04l9C49xH2ybFnCQTtNi1ZyNfYxKv+KY+rP+DMy/JXTQPIdO7gUJPBnZcVugzy46E+iPwNuo9JU90IE6cp/quFFyt4jtz9z7e7Q4GSKxIakkpZU0gAsTxoFGQS7U5GOjC2OSHtDokHfNUobfa4zy4iYWK7E276sHAgbT8dGtx7h8vRC3Ow2wyArCZqyXk31XI6UYJkHvNxGISb8X3tSnxdR+RWkbHyFHtMTF3x+Xt03Lp0vNoC5ik+qXRtas68+s8Wd7KIX4OSn/wNxdmN/hRY7EWv3eGNnod5q/0oucXIjg7qH+cajxofIba77TNxXJ9IlSKpoj78G931rpBI1WzWQSeH9e9h0S90Nw2zb5FuLTvvKa2ttxCiXIHAhdyfOPyJj8ISURAm0nYUrmwe20ETTDaAUX827t1Gbg+0pYzr+GbM1HuBufc7laAI5IDm9fxWqNg+yLzw0bi2Z/0d+zS5lUMNl0NOk08DTzZA/VYi87nszrB99ycQSQs6NalAMNI7TdBdMTWt2dM2zhKEifwwW9aX1xq6G4UmOBKvYXOQzmz1Xk1JH+pULnMYl4/pjupYR3v9JXo3flFwd9ZL+jHN7odRQecCq4fkkdFdyWgfeJjcC278n67YSUsYDA9mr310nojhfBA+dbzTPIM0kuBxFP7PY10USZoU0nAEP75GrxG4fQxuLbdm7vBQLqRy9ee6voJcvkDLGf5MwOneB6UuUtDR4AdlKTa70Ur72XwhlhbACnFj+xKBE9ZTxcx4dv4Jiv8oOPGYLEPZ4jLYIctmLc4nrryTpVskpJ0HqR7aVP9vzA0vX4mR/XxklAXH8tg6VeiOP0NO+d0xI6Lup042mIt25LMhb2JGqYzoie23tDjC9ZoECqWhw1lBPu+WkuIy5P7wTjrq5qDdkUR9jzWNMHSgwmGEtksXCgVdZgREwiOX0iEykhBB+PVrsttp1ydWlE91Vk1yh52htd8
dn: uid=user.1,ou=A,ou=masterModifyDN,o=example
objectClass: top
@@ -64,23 +67,26 @@
givenName: Aaren
sn: Atp
cn: Aaren Atp
initials: APA
initials: AXA
employeeNumber: 1
uid: user.1
mail: user.1@example.com
userPassword: password
telephoneNumber: +1 099 123 0399
pager: +1 060 238 2392
mobile: +1 792 029 9403
street: 19012 Ninth Street
l: Jacksonville
st: KY
postalCode: 06553
postalAddress: Aaren Atp - 19012 Ninth Street - Jacksonville, KY  06553
telephoneNumber: +1 762 034 0810
pager: +1 083 168 7625
mobile: +1 222 086 9809
street: 03740 Laurel Street
l: Parkersburg
st: UT
postalCode: 42252
postalAddress: Aaren Atp - 03740 Laurel Street - Parkersburg, UT  42252
description: This is the description for Aaren Atp.
description: This is a seconde description  5540536681
jpegPhoto:: QviSbNRxrKCS6wN3AcXUyg+fE/xzh0eeuJlORDPEnnSlCy65IFPymAHoCQ46bI47FKW6G6sRpTpRJrU0816QRUMDp8UvRphiL0qTw4HK1VI/ID1CiqFtxgCZ2aMAQl3r1D9hxyTvJxkBwyBt5OpI3LQNtxlnZMTIX6EVjwvagRm1dko1eV820lu2zxLBKZMDDKZSMAjvsAiXpOD9k6CGDUOlCUbfRstBXipYk7Pec15yqRpOd7Y1THjODO9Kv6zBlqUq1bEsTotLdM+XZaPlR8ex9TJYn75zvhkLPhMXuoCP08tpEuSUaCIg2wbaraxq2hy3g5UM0O3BQ+M5NsYFe2cUiGSoSpPHFGs2WCUzN07JhFFtl0N+0JAbLSJMH83qwR1umhU7eQlhxKrkAiG+fnwJ4LazpmVd+EFBbIrX01RaQ3i2KVAcChNRRbnb8WXWGiODh8VyDQz69mxMrufS5btbdwI4Z+0a2Wcft0ZGJLm5X7eyuaeo4i4+QdJN8HhMW1HlGyx3CeqTbo5itTwYA9bBVW6M8aQV2FjRcR+YuFY7iEwXIZzWeOz1g+Uvijb0B01ZCqglaCIe6IZx84R7+OfcuV42FXIrifpa2K3tk/yPug0B5SHrjJItg43CqmfZr9XyIyMt317BtpXzZ1IWyvAU4j7SkPsqLv+Bdgzob48doKUcasRvI3wo097/b+Qx9YUn76Wd4YCAJdZtyjRCJILOw4O7ty6lFvFBBweQcZx9mGwLuII/e3OI1BE0N/254QVSw0mcA4yQ+uL/l47uzRYNEpi31DRfzPeN/yzgWOEcK9wT1vU+r60xdgk2Pm2v3aAKgHA6JJPFBerIYEtfLD4oygnJC99j3at5OJgaKGd29/0/Lkqjl+RWaVVlqV1/peYZwOLjYhVeSAfs8XRcvjvwKvpysMRnrHRIi0jYLHe2G4+GMP7se1cu4xQfFdJ30H5UR5j0g2Lv3iB/s8Woxeneb8f57wImYXmVkZus
jpegPhoto:: 85cvWkS03ZE55m8yTPHkupTngCrbUAfw0UQ35x3OvdPfeot4qpGrWzhMvm2bIH0aJukCTLfu+QPrTkbQzI8x7OBr1RsuQ9tQOp3Bcn09QG5GBaYLZzDusUrD5MHbECcQf67VizWO6E8I/1x86o4gRAg7rICon3U8vwACvpIbmCjglAXEwSs0B0vtXxAxzuSUwxav+Ubcvq3nwzYP6gjvNcX6Lo0Y01LYR6G8ty+Cpbr0KCOw6uqQ1i8hyo/xDpuzfB588eUSO5M5rI9amF/rBNHLbON0Pc/0Ak1ET5mk60ws0zcTGyQ2KGTv5D53SABIR20iYUk+xTlE5KASnyDphuDZ/WGdA0oMwbkJHYdn94Bi+0LjX8t+jPvhO1QPv/NVPKJLLjz6UbOxcrmcRRF9ApnvuO088FPbCLqGyvD+ZZYtbKMrQ4tvUUozQb9CihLOYs88T8hFlg0E3ll1v+jq+NP4+Qd9TipUhsr/ZW0Hd0K3b7f+yVs0VnIc3qb63hd7JafH2dk7tuxeIlr97MvgI8+kw6bW9EVevwfL9zzL1C6TNkiaLUKZho3DiySOL1X5reCCm/ollIMFVsnpzoSu93KoyDXs0M72vQ3B6uj1PcRBIbmcjBRydX1NFGjuMazjVohw0Y19gsGgdPHNKi4uxL+ViEoLzyKl70OKkNyQZjzSmEJi6D8t7XQPjKZrOKZTKO7i08J7gJK1IGM+7KyRcqTho5LA1zWNcDhHgqR0i9roFwMFvXcMiO2U8XOcHLYBNk896nHSAXI3fx0u48m6WMLBeFIUuLUhMR0hBCkFW0oRWuk0DjnLUdJbSJczlkpP9/SP0vQKH0o7zrBHDB1L7Fjq8Seowm85IrI0v71og0xcF3Tp8maKPG0ZVfpXJxfn8NaTj4jvQMXGZFSBnUbL328y60uiQGDBW+SB2pe6nROhZ0DXePG0xp42nJR+kP5/zT6IFlIwn9I8LvXP4MkjkSFR241aEN9UUtUItOQK
description: This is a seconde description  3783019910
description;lang-fr:: Q2VjaSBlc3QgbGEgZGVzY3JpcHRpb24gZW4gRnJhbsOnYWlzIHBvdXIgQWFyZW4gQXRw
description;lang-es:: RXNvIGVzIGxhIERlc2NyaXBjacOzbiBlbiBFc3Bhw7FvbCBwYXJhIEFhcmVuIEF0cA==
description;lang-jp:: QWFyZW4gQXRw44Gu5pel5pys6Kqe44Gu6Kqs5piO44Gn44GZ44CC
jpegPhoto:: csSPIvKkWHoVSX417JnA0tHqAoCijGVFiWMlT35MYknOv9KRKbUq7klpbAqj8hw/VwgemAi8ypos7ptfY62dva0QzIWHm8KW4uk/zF0dn5phy42sePKDF85AqQJkjOOMTowEU193D3Mv4jxUsHvqUGLncS3XNuTWP+ieHvPWO2w1CdUWJHCVR0La/9QRWbT4F7akpRlPU704c0HL8oiQd0QNaMAdYQiS82JLoMdCy6wM34OeVoV0wULkux9PuNg0cnPo3psYavj5C/avikZ+fRd/0Cmem83IhHQQ2Wbes26HNa7IhyxbAwDnSwK7ibCftKfaiOfQG+n0JangTRikucnPrMB+0fYLw/vF4cz6lkFsyzz2o6x3hNbeKaRgNu0ER8L5W8NV/ETTtBXUxGkwldQ4Fj0F7i1MNtUZe1k3kywYbOvNy7T52+/S1dtLp0RvLAOKP574xXPl9B1lDR3HuLmVaVb92IXTOtsOjFMwq85Hg6HLLKLgSLtwo1p3TjfzW9w6X/0nB+P8nvyrNp9XGHwJfuX3xRIFbdMLNl0q64O8OygK00/RJGQjzeyj6w00feNnPoz+p+Gf0qtKGoo9e7mfwc+wTkBPkpHkZoEE4mFK5Ah+JsOVN3bnVcnJ03GeRBlGmO6AgPMuCI3R8AsVCeP7bcOR8oN0VyUPtIA44JZMhAfAckV8DpYvGdntnwVZA1nqo68Z5tfXjtK96xw0HU1B7oBT50G9Fid+GqpnUR3bz2jPMA2WqlAsdRTIS34t/MGlzAkgNHJyGqgir8+h2n97pX0Atkq9eYsi6Co5CWyK2CDWKvXcd0h2iEWtIzEiPi5cF/dYaUa9OKiyVWQbwsVDnU0SISWIY47kOkZgh4QoJJsxff0gOVaV5y8n2iaar7We7qEtwEMypH5ZorhXjEeqP2nBter+jSb0NiwvUoAtSqDujQU4CNOxuuiaJrSXA9P2JBr7DPHFANGH6CI4m3Om87Qanr9rb4J1Udus
jpegPhoto:: VGoE8Wwf1Of0AcmHhpd0WxFL6MUJM0cEqq7Hdo7WiCMYy0Yy0j8JKx0lvkVklmHaCiX0jXvEwJPCa92rQhnzor8mpNIpCqRBpYpLPN5OvZy4/2XDVsP36wGwjJyE0AbPDZUwWdkxp+MxbiJ4HlDqj00gl/osHS/OjZ0aQL7G0BeR7+veRijO3+XHpCgviagGGjV9DF8ziee+JDJLuCtGwhKLz9/+v0HC78YawV7numfDjy9Y6jbesIoQmj+v5CWronL0zyjvFy7pZM8InL0LATUTOXIEnNCU7XnwvoKcFrJcEmunQxHcIX/rTY0zNeon6JQa0C4Pb0MC0o56xB5aNO4aqSshTlw6zSsA5eAKfTFTKsAhRzwI2KdN6D9q4n1FgDFRC3GiI1z0d4ii+mHtRDB8wEWf9WOPgVY/tYV0+/xJHkMO8L6tFtYlVie0cUgoflxeWhq+3BHWFfYgPYErG1QeBWC2oK9oRoWvnHOpacjFCRFqsK5EerU1ZeodFoaw0AkFJJXtiSr+tv0+VnTRvzYz0gIwBPTCLSk+BXQMgmR55aKyNTO6lVkpC5s03P0Akib+Fn2H/b8Jz++OD3OQFKbcUdkxvYRXm9U0gBd37Iay0wnjJT6K7xFBpZHu8zSTZzX6l9ufCSqo7TmA/LV2E/lbpbKgJHlK+VwA0vV2hqgqJDdYsS/NTu0eU4MM5SeIpCPVFN+mDG0991zCj2QHa3/6qpynqwo8Px+Q9J9FSSb4qspzY4zQ8ups00UeFY574g0eXGPHSXyQmdHJqbFv3z88M3miXqh5XqdKapHOwo2XmnOJycedzU3z34tC33ZL0YSEKtKcNDM/0BICLYUP78gE6fDkjM5F0BEaBaDTymPcIzVPBKHbpyH0fJfV09g4soHYD+eE/nZrGJlMUWL0/nrPU1fRV9PaAFpZbL6mEKsDGTgsvTjXkiwuK0kRCtyhuuNCTwqQvHHgDaCv/sktOyGOyJ678zbqFv8+tbdh
dn: uid=user.2,ou=A,ou=masterModifyDN,o=example
objectClass: top
@@ -90,23 +96,26 @@
givenName: Aarika
sn: Atpco
cn: Aarika Atpco
initials: AUA
initials: AFA
employeeNumber: 2
uid: user.2
mail: user.2@example.com
userPassword: password
telephoneNumber: +1 060 723 1059
pager: +1 440 777 5507
mobile: +1 734 805 0238
street: 04305 Ash Street
l: Presque Isle
st: MO
postalCode: 42519
postalAddress: Aarika Atpco - 04305 Ash Street - Presque Isle, MO  42519
telephoneNumber: +1 152 586 1075
pager: +1 533 854 0877
mobile: +1 475 007 5496
street: 97831 Cherry Street
l: Corpus Christi
st: RI
postalCode: 02334
postalAddress: Aarika Atpco - 97831 Cherry Street - Corpus Christi, RI  02334
description: This is the description for Aarika Atpco.
description: This is a seconde description  1046409666
jpegPhoto:: bm01wvP1qOQJeoZI7tpr02E9CqxwWcg7kEkVxJq/0YVVEC3qLU/ZqcEcmjuXMTbQGkB/23daAbruqBCQLKjr2k3wgTiPNyAsD/XweF0EjTOw/JYglJ8RSO4yZbbOtqRrab8RpmzUDkK7nmOcacY4ixb6c499F0ZDoE0XG2aKKpQBm05+O82bGtHGPW0D09AUQUYHqqq57ebae28TOxDO8j1X4Bk0jFxVUdswcd3PIuviMZs0vdq/egZAtA5OAKf82HDbpj2AnTdeRXkqzFYwq404MD3fnxONvegAXVqSPDijoGSt/7Aej68fuHwHQudf+nRdJZC3LBJGEoxTaKqpVzgbOJ2WFyz/r+OOeVTg5VyaSBZl8K1sNZ5X6xpFhh1kffpnrCKSKlNiayiIh1sRFTLV0JPQDR0aUiagaH03/sGZI8jr7W7bS70ybnI2lUIjMjwoA6AqmepDcfF5YIPUzurtIx/XMP26D2zLlBjMJie57y9mpIZbkMxwjJGRqg2IOg0YQBhSp843fdIKJhT4dmwSMXheb8IYn7rFgx5+hEOJBIO8WVUIK/0bb3E9Nu3YZSy7W8THej9tElkOc6cUw4XGEIHlKRTpxpVsUM6GCCGvwwNH3IWhUuT0fn/6fhvHE89MItJSCR5qgZ3EeL6sIz2br6SG5HA8sufRX4FwREH+MPn8su/24bMiexyBT+WOxxqWy2bx2M3D+CrLq+LgcaqDqZOab5qffUoPs/EappmehO+UClhrBaXLyh9+qc/8FSoYyUe8okV8D0TnoOG/LG4jR38DoyxIlGiKV2UeLeTvvUI6OBJa1WADPDHrg/9+JehNigNSVbjE0tTw88SA8L5occ6YhS/tV1uJOu0W8RIhERb0We6cA34E1854XZ0PqlzmLFguywYnVpxXG1SXpo59i4Hr/bgxUQq0RjxBpGdg3yBJpJ0oWnvMQHJ8HYAmOYINXEjoaEF257JWILCgFah9Rx0qHZv9/9jwKscS
jpegPhoto:: Aetnjx+7gLWcm2bKic6alq7hcFfQ83cEOg7/W6k7wJ+DTXTfrNc2nx9r9EYcubkJnYzv+IzYnSVivjru8svlUNnOWkT5v4soXj+AWXbH83rb1ggiBLWAQ+AdpKlwb/bI/eqARHeB8IKx+A0QN+jWIT1HZOlqZ0YyBB/Jy45O+ymXF4YGsR3cWt31rDV4++LwrPrn685/DuVyI3tLtzDc+37x6PW68BA8U01B/6aOJrBf94BpBzAdMPVbReNouX9qM7O07GB60yjLZwkjrjgjfPpp0ZaVtKpaw6jAPVPAw6022JxGWodqe9q81GJqI2GQD0HduWPaXdx82VvWJdMm42A9Gb7U9flqWC0atY/IqiEta07b0jPbpuLSbIaue9cyEuL1isg0rVPhM9oJbLLhO1cWBxOg0RjXT681MW+7iuPxkcGbVy1KkG6jFTorHcZ849h2/TxYKUsoSsUd5ns1slS0Q0V+vthgojQOIZFFYngCOQMWZUw0uEaGigY0HMI6dsTlp0DmDnFA48vShoGbsuAV/81IlEzcMwTdIR58ms+NXCi4J2rmyHBfVykFx2HG2k/Hs+8SmlEK+dHhy0K0FR94tjNuGg0HXgKP/KgJl6Nbqi0iMnHSD6/xw86Q/lwKdqB7TJoiF1kcBEMk4PzrZyR00DDi4GNCpDesfX0r4+MloHXrbjdy0bsH4gQC7qImw6FkZ2ZgO2Rjyqpp4Lu05pyo9GIx51tb0v7UFQQwsT7OPTD/IQj93niWRcIXaa41o961EEtG1XVtoxSaDvAD566FkWhgfiIbW9Qg1yFtFej0/fgiw82A7lbmXCBlcpg7KoWwRRjpQ0tCuynUq0sh6zhrq80D0uU8kvspRkK7gKxivTIB0cHI+ItiHn+szukl8hRqOWqiUs53+R3SiEeF2k5bPG7nZ0HG8CBd8RNz5iAueeLF1NYg0HWTHczVVzBuvyx0Km93eHSMUao45sHIK0gGyjueY4NAYOCMo4kk
description: This is a seconde description  8392364400
description;lang-fr:: Q2VjaSBlc3QgbGEgZGVzY3JpcHRpb24gZW4gRnJhbsOnYWlzIHBvdXIgQWFyaWthIEF0cGNv
description;lang-es:: RXNvIGVzIGxhIERlc2NyaXBjacOzbiBlbiBFc3Bhw7FvbCBwYXJhIEFhcmlrYSBBdHBjbw==
description;lang-jp:: QWFyaWthIEF0cGNv44Gu5pel5pys6Kqe44Gu6Kqs5piO44Gn44GZ44CC
jpegPhoto:: KaLFOE7CYVgvDMnJ2J3Qn8EZKLkzbMwnw5+B40lKXXAw8Ap08cUMmUr1G320tidylKJ9Tc2gEJH5om00VlZ000PlJJdlxO7OUZ3fTiV6FkL0RnQQ2OvwV8+INPmcccIWkMcf3LXh+bIsJJM7xpOhyr0WOFWXgLUQO354y0XtiJi41pJiObDQBufdgMqUQ8NJY0ZhtpTRYLLMQnjIl5DuvbDwMflYIwTRKF8jjGR8Qi2SgQIXM6zKzmADa41ls4UeDDDWMtuFpkX39QUxYlLyxE8Oxv22gzREY+mOzzN6KbNtQfeXwWt+Iuy1kVueSymlBDh7L05pFuJ43lLCmsDBRjjfQ8KEK6UqgC4Z+MASyPXsPfX85emslQ1J4z74/hJ9Sozuq3igQp1ftXtP+BFITp40LGWV6KS/MUVUkM06pyHdw3QYUkXEUqmnWssZEMjOXu9+swofvBWbVv9FgZH54c63DtF5NeL/EAZnXfucZinYciRrku0H5gK/J8frt8nmUGIf9Y6TT+nCeAX8l2d2lfA03IW1qYVTJcoUMO0KTs0ZSkrtdZzlwwB1WLWi46ikpjw2xnnmCCh7rwF8ClL+zWD3/FdOYn2K5pPTPKjYcSy0zvTEYk3B9dOfA4bPv+2aYqSPjAy0WtL85w6WdNKOIixIrEi2qrsWnIKUwX0YBIOW7XuS0blw2ONt9nkpsxlF7Mws/pKU1o53o9t60/bVzGx+45fdHcMDnwjtVWm9n0mUVAGfaa+nl79p9MxhzPFdSuT6Zoq/oAdbciUxrzNSEvCZs3sWczElhX/EzsNOsl0sWJEyw6C554kcM/npt7XRv2tdy30iM2I+JsAGlRVMlQ2LXlw0pM+eTo0MQTEIg0RFEEs4OXMar2zUu96CIUyjGLBuWoAEpZ9cP5QAxGGw2nLGpNHioYlG3yfxDCiP2nnOdXTX6+hFqKjB+6CR1LUVfWG9mZ6XZSmAIlTDb827ce5uo7FJnq/27V6C90Oc
jpegPhoto:: +Krza1bjbueP7oHE/tioCChMn6OFyQGgsJyPhb7QLxwtsS/ydNUrlE4oZ9j34belO0Rz4Hyj0BHDxt/HBltKXSn+SijO56ZDKeMmw0/j32Xpwwt54zz0qX0JuDFJUghFA3OZ4jFHX/v0LZAC1G2QY7WQ+2vML6LuZfudL0Qz80giV+487dUyzGHV/vc92YK1YCFPmw05c+F+heDrJkAbcXSOPog3T1TrdAl8RCzYahxJr6E40+oW662oHWS8tGskDZMQgb7KdmAPJRapOBa5MYk+PkR0qaeAZDWvT99+HoWqYX57QVqssZPhUjGeUKk4CKQIb/P0qouUNDSACs5ipBOZLfmXht+G5AK1WSsVmTlpduCgcS1dpYssAl8Jpvnjpbk0omyE/1Yg/wNZ09aTVK9k3S32hYOOvF9m4vg9euzWAtwjfkVo/9vjboGrALep+ynttYHB95Yg4NsckstMm0XqK8oSplarbbOT2y61R/4sQQ1NYsRpvmykeEIoNUxsB3LAGqI/fVBjvAX4RUmx1fzKYcim2f7pkvrPN7TY6sEjdS0LQKDGbM9pSjmQfJn8Q70kvWN91Rt0x20KmNnBifm//Cg15FLIvP5aKcP3Wti3qX9oi/dIUWxYLivMr41cpYyyU8Bbacfg0LwY+tZBsd9l46rJEyF4oatdgnobJpNyrt2TLGJzKOCmQRlU8pjREdCaU4a6m9hz6nwAYZXmzX//8eg2DEtT/5PR+Y4qQpMtAxQjs4osT3koLVXZFuG0sqFLUtURqXeoSsdygSACQY3KkM2WiFpf2IHOkv5eTy7vvLkfhYvRcJ/w0nyEaI8uHamKjd0WmV+lrFTXSBi9YnruH2GbHlCAUickvQgtjCRbVbDzBOwY5BjVO0aZ05aTyn2oopvbGsIEAluWSDWx4BnhXAF2+Mx932EvFfa+Sn3Uk1RGzfwyMc0pCf4wsjimRQYYGs4pLKuLbI82I6goqdCXI4T60dO1QapqPhgU
dn: ou=B,ou=masterModifyDN,o=example
objectClass: top
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterModifyDN.template
@@ -59,6 +59,9 @@
postalCode: <random:numeric:5>
postalAddress: {cn} - {street} - {l}, {st}  {postalCode}
description: This is the description for {cn}.
description;lang-fr: Ceci est la description en Français pour {cn}
description;lang-es: Eso es la Descripción en Español para {cn}
description;lang-jp: {cn}の日本語の説明です。
description: This is a seconde description  <random:numeric:10>
jpegPhoto:: <random:base64:1000>
jpegPhoto:: <random:base64:1000>
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterOnlineImport.ldif
File was deleted
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-masterOnlineImport.template
@@ -50,5 +50,8 @@
postalCode: <random:numeric:5>
postalAddress: {cn} - {street} - {l}, {st}  {postalCode}
description: This is the description for {cn}.
description;lang-fr: Ceci est la description en Français pour {cn}
description;lang-es: Eso es la Descripción en Español para {cn}
description;lang-jp: {cn}の日本語の説明です。
jpegPhoto:: <random:base64:1000>
opends/tests/staf-tests/functional-tests/shared/data/fractional-replication/basic-replicaIncludeAdd.ldif
@@ -24,8 +24,11 @@
objectClass: person
objectClass: inetorgperson
objectClass: organizationalperson
description: This is the description for Aaccf Amar blah.
description: This is the description for added-user.1
description: This is another description
description;lang-fr:: Q2VjaSBlc3QgbGEgZGVzY3JpcHRpb24gZW4gRnJhbsOnYWlzIHBvdXIgYWRkZWQtdXNlci4w
description;lang-es:: RXNvIGVzIGxhIERlc2NyaXBjacOzbiBlbiBFc3Bhw7FvbCBwYXJhIGFkZGVkLXVzZXIuMA==
description;lang-jp:: YWRkZWQtdXNlci4w44Gu5pel5pys6Kqe44Gu6Kqs5piO44Gn44GZ44CC
cn: added-user.1
sn: Amar
opends/tests/staf-tests/functional-tests/testcases/aci/global_acis.xml
@@ -865,16 +865,16 @@
                  #@TestIssue                 1402
                  #@TestPurpose               Modify self against default global acis
                  #@TestPreamble              none
                  #@TestStep                  Client modifies attribute in the user entry.
                  #@TestStep                  Client modifies allowed attribute in the user entry.
                  #@TestPostamble             none
                  #@TestResult                Success if OpenDS returns 0.
              -->
              <testcase name="getTestCaseName('Self Modify')">
              <testcase name="getTestCaseName('Self Modify Allow')">
                <sequence>
                  <call function="'testCase_Preamble'"/>
                            
                  <message>
                     'ACI: Global: Self Modify, user modifying itself'
                     'ACI: Global: Self Modify Allow, user modifying itself'
                  </message>
      
                  <call function="'modifyEntry'">
@@ -882,7 +882,41 @@
                      'dsInstancePort'        : DIRECTORY_INSTANCE_PORT ,
                      'dsInstanceDn'          : 'uid=auser,ou=people,o=ACI Tests,dc=example,dc=com' ,
                      'dsInstancePswd'        : 'ACIRules' ,
                      'entryToBeModified'     : '%s/aci/global_acis/mod_entry2.ldif' % remote.data }
                      'entryToBeModified'     : '%s/aci/global_acis/mod_entry3.ldif' % remote.data }
                  </call>
                  <call function="'testCase_Postamble'"/>
                </sequence>
              </testcase>
              <!---
                  Place test-specific test information here.
                  The tag, TestMarker, must be the same as the tag, TestSuiteName.
                  #@TestMarker                ACI Global Tests
                  #@TestName                  Global ACI Modify Self
                  #@TestIssue                 1402
                  #@TestPurpose               Modify self against default global acis
                  #@TestPreamble              none
                  #@TestStep                  Client modifies denied attribute in the user entry.
                  #@TestPostamble             none
                  #@TestResult                Success if OpenDS returns 50.
              -->
              <testcase name="getTestCaseName('Self Modify Deny')">
                <sequence>
                  <call function="'testCase_Preamble'"/>
                  <message>
                     'ACI: Global: Self Modify Deny, user modifying itself'
                  </message>
                  <call function="'modifyEntry'">
                    { 'dsInstanceHost'        : DIRECTORY_INSTANCE_HOST ,
                      'dsInstancePort'        : DIRECTORY_INSTANCE_PORT ,
                      'dsInstanceDn'          : 'uid=auser,ou=people,o=ACI Tests,dc=example,dc=com' ,
                      'dsInstancePswd'        : 'ACIRules' ,
                      'entryToBeModified'     : '%s/aci/global_acis/mod_entry2.ldif' % remote.data ,
                      'expectedRC'            : 50 }
                  </call>
                
                  <call function="'testCase_Postamble'"/>
opends/tests/staf-tests/functional-tests/testcases/clu/clu_rebuild-index_checkbehavior.xml
@@ -424,8 +424,7 @@
                  {
                  'dsBaseDN'      : 'dc=com' ,
                  'dsIndexList'   : [ 'st' ] ,
                  'dsCountErrors' : 'TRUE' ,
                  'knownIssue'    : 4293
                  'dsCountErrors' : 'TRUE'
                  }
                </call>
@@ -446,7 +445,7 @@
                </call>
                <script>
                  msg1 = 'Statistics for entries that have'
                  msg1 = 'Statistics for records that have'
                  msg2 = 'exceeded the entry limit:'
                </script>
                <call function="'checktestString'">
@@ -457,7 +456,7 @@
                </call>
                <script>
                  msg1 = 'File dc_com_st.equality has 51 such entrie\(s\)'
                  msg1 = 'File dc_com_st.equality has 51 such record\(s\)'
                  msg2 = 'min=14 max=31 median=20'
                </script>
                <call function="'checktestString'">
opends/tests/staf-tests/functional-tests/testcases/fractional-replication/basic.xml
@@ -344,12 +344,12 @@
          <call function="'stopServers'">
            [ Pservers ]
          </call>
         <!-- server 1 import basic-master.ldif -->
          <!-- server 1 import basic-master.ldif -->
          <call function="'ImportLdifWithScript'">
            { "location"          : Pservers[0].getHostname(),
              "dsPath"            : '%s/%s' % (Pservers[0].getDir(),OPENDSNAME),
              "dsBackEnd"         : "userRoot",
              "dsLdifFile"        : "%s/%s/fractional-replication/basic-master.ldif" % \
              "dsTemplateFile"    : "%s/%s/fractional-replication/basic-master.template" % \
                                    (Pservers[0].getDir(),remote.reldatadir),
              "dsReplaceExisting" : True,
            }
@@ -448,7 +448,7 @@
            }
          </call>
         <call function="'ImportLdifWithScript'">
          <call function="'ImportLdifWithScript'">
            { 'location'            : Pservers[0].getHostname(),
              'dsPath'              : '%s/%s' % (Pservers[0].getDir(),OPENDSNAME),
              'dsInstanceHost'      : Pservers[0].getHostname(),
@@ -459,11 +459,11 @@
              'dsAppend'            : True,
              'dsRejectFile'        : '%s/basic-masterOnlineImport.rejected' % remote.temp,
              'dsOverWriteRejects'  : True,
              'dsLdifFile'          : '%s/%s/fractional-replication/basic-masterOnlineImport.ldif' % \
              'dsTemplateFile'          : '%s/%s/fractional-replication/basic-masterOnlineImport.template' % \
                                      (Pservers[0].getDir(),remote.reldatadir)
            }
          </call>
         <call function="'ImportLdifWithScript'">
          <call function="'ImportLdifWithScript'">
            { 'location'            : Pservers[1].getHostname(),
              'dsPath'              : '%s/%s' % (Pservers[1].getDir(),OPENDSNAME),
              'dsInstanceHost'      : Pservers[1].getHostname(),
@@ -474,7 +474,7 @@
              'dsAppend'            : True,
              'dsRejectFile'        : '%s/basic-masterOnlineImport.rejected' % remote.temp,
              'dsOverWriteRejects'  : True,
              'dsLdifFile'          : '%s/%s/fractional-replication/basic-masterOnlineImport.ldif' % \
              'dsTemplateFile'          : '%s/%s/fractional-replication/basic-masterOnlineImport.template' % \
                                      (Pservers[1].getDir(),remote.reldatadir)
            }
          </call>
opends/tests/staf-tests/functional-tests/testcases/fractional-replication/config.xml
@@ -29,558 +29,683 @@
  <defaultcall function="fractional-replication_config"/>
  <function name="fractional-replication_config">
    <sequence>
      <block name="'config'">
        <try>
          <sequence>
            <!--- Test Suite information
              #@TestSuiteName       fractional-replication config
              #@TestSuitePurpose    Verify various configuration fractional replication
              #@TestSuiteID         config tests
              #@TestSuiteGroup      config
              #@TestMarker          fractional-replication config
              #@TestGroup           fractional-replication
              #@TestScript          config.xml
              #@TestHTMLLink        http://opends.dev.java.net/
            -->
            <script>
              if not CurrentTestPath.has_key('group'):
                CurrentTestPath['group']='fractional-replication'
              CurrentTestPath['suite']=STAXCurrentBlock
            </script>
        <sequence>
          <!--- Test Suite information
            #@TestSuiteName       fractional-replication config
            #@TestSuitePurpose    Verify various configuration fractional replication
            #@TestSuiteID         config tests
            #@TestSuiteGroup      config
            #@TestMarker          fractional-replication config
            #@TestGroup           fractional-replication
            #@TestScript          config.xml
            #@TestHTMLLink        http://opends.dev.java.net/
          -->
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='fractional-replication'
            CurrentTestPath['suite']=STAXCurrentBlock
          </script>
            <call function="'testSuite_Preamble'"/>
          <call function="'testSuite_Preamble'"/>
            <try>
              <sequence>
                <!-- fractional-replication setup -->
                <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/fractional-replication/fractional-replication_setup.xml'
                    % (TESTS_DIR)"/>
                <call function="'fractional-replication_setup'" />
                <script>
                  server = _topologyServerList[0]
                  ldapServer = '%s:%s' % (server.getHostname(),
                                          server.getPort())
                  fractionalTypes = ['fractional-include','fractional-exclude']
                </script>
                <message level="'debug'">'ldapServer=%s' % ldapServer</message>
          <!-- fractional-replication setup -->
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/fractional-replication/fractional-replication_setup.xml'
              % (TESTS_DIR)"/>
          <call function="'fractional-replication_setup'" />
                <!-- Retrieve replication-domain name -->
                <call function="'dsconfig'">
                  { 'location'            : server.getHostname(),
                    'dsPath'              : '%s/%s' \
                                            % (server.getDir(),OPENDSNAME),
                    'dsInstanceHost'      : server.getHostname(),
                    'dsInstanceAdminPort' : server.getAdminPort(),
                    'dsInstanceDn'        : server.getRootDn(),
                    'dsInstancePswd'      : server.getRootPwd(),
                    'subcommand'          : 'list-replication-domains',
                    'objectType'          : 'provider-name',
                    'objectName'          : 'Multimaster Synchronization',
                  }
                </call>
                <if expr='RC == 0'>
                  <sequence>
                    <script>
                      replicationDomains = STAXResult[0][1]
                      for line in replicationDomains.splitlines():
                        if line.startswith(synchroSuffix):
                          colSplit = line.split(':')
                          domain = colSplit[0].strip()
                          serverId = colSplit[2]
                          domainMap[ldapServer] = (domain,serverId)
                          break
                    </script>
                    <message level="'debug'">'domainMap=%s' % domainMap</message>
                  </sequence>
                </if>
                <script>
                  testsList=[]
                  testsList.append('mutual_exclusiv')
                  testsList.append('only_optional')
                  testsList.append('alias_attributes')
                  testsList.append('mixing_add_set_reset_remove')
                  testsList.append('mixing_literal_OID')
                  testsList.append('exclude_scalability')
                </script>
          <script>
            server = _topologyServerList[0]
            ldapServer = '%s:%s' % (server.getHostname(),
                                    server.getPort())
            fractionalTypes = ['fractional-include','fractional-exclude']
          </script>
          <message level="'debug'">'ldapServer=%s' % ldapServer</message>
                <!-- Execute the Tests -->
                <iterate var="__test" in="testsList">
                  <sequence>
                    <call function="'%s' % (__test)" />
                  </sequence>
                </iterate>
              </sequence>
          <!-- Retrieve replication-domain name -->
          <call function="'dsconfig'">
            { 'location'            : server.getHostname(),
              'dsPath'              : '%s/%s' \
                                      % (server.getDir(),OPENDSNAME),
              'dsInstanceHost'      : server.getHostname(),
              'dsInstanceAdminPort' : server.getAdminPort(),
              'dsInstanceDn'        : server.getRootDn(),
              'dsInstancePswd'      : server.getRootPwd(),
              'subcommand'          : 'list-replication-domains',
              'objectType'          : 'provider-name',
              'objectName'          : 'Multimaster Synchronization',
            }
          </call>
          <if expr='RC == 0'>
              <finally>
                <message>'Test Cases Completed.'</message>
              </finally>
            </try>
          </sequence>
          <finally>
            <sequence>
              <script>
                replicationDomains = STAXResult[0][1]
                for line in replicationDomains.splitlines():
                  if line.startswith(synchroSuffix):
                    colSplit = line.split(':')
                    domain = colSplit[0].strip()
                    serverId = colSplit[2]
                    domainMap[ldapServer] = (domain,serverId)
                    break
              </script>
              <message level="'debug'">'domainMap=%s' % domainMap</message>
              <!-- Test Suite Cleanup -->
              <message>'Finally: Global Schema Cleanup.'</message>
              <try>
                <sequence>
                  <!-- fractional-replication cleanup -->
                  <import machine="STAF_LOCAL_HOSTNAME"
                    file="'%s/testcases/fractional-replication/fractional-replication_cleanup.xml'
                          % (TESTS_DIR)"/>
                  <call function="'fractional-replication_cleanup'" />
                </sequence>
                <catch exception="'STAFException'">
                  <sequence>
                    <message log="1" level="'fatal'">'Cleanup of test suite failed.'</message>
                  </sequence>
                </catch>
                <finally>
                  <call function="'testSuite_Postamble'"/>
                </finally>
              </try>
            </sequence>
          </if>
          <!--- Test Case information
          #@TestMarker          fractional-replication config
          #@TestName            Mutual Exclusiv
          #@TestID              Mutual Exclusiv
          #@TestPurpose         Check that fractional-include is mutual exclusiv
                                against fractional-exclude.
          #@TestPreamble
          #@TestSteps           test setting include and exclude to empty
          #@TestSteps           test setting together include and exclude
          #@TestSteps           test setting include after setting exclude
          #@TestPostamble
          #@TestResult          Success if conflict is detected for both steps
          -->
          <testcase name="getTestCaseName('mutual exclusiv config')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'test setting include and exclude to empty'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('set','')],
                  "exclude"           : [('reset',None)],
                  "expectedRC"        : 1
                }
              </call>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('reset',None)],
                  "exclude"           : [('set','')],
                  "expectedRC"        : 1
                }
              </call>
              <message>
                'test setting together include and exclude'
              </message>
              <call function="'reset-fractional-replication-attributes'">
                {
                  "replicationDomain" : domainMap[ldapServer][0],
                  "server"            : server,
                }
              </call>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "replicationDomain" : domainMap[ldapServer][0],
                  "server"            : server,
                  "include"           : [('set','inetOrgPerson:description,audio')],
                  "exclude"           : [('set','*:mail')],
                  "expectedRC"        : 1
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  "server"            : server,
                }
              </call>
              <message>
                'test setting include after setting exclude'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('reset',None)],
                  "exclude"           : [('set','*:mail')],
                  "expectedRC"        : 0
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('set','inetOrgPerson:description,audio')],
                  "expectedRC"        : 1
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          fractional-replication config
          #@TestName            only optional attributes
          #@TestID              only optional attributes
          #@TestPurpose         Check that we can only refer to optionals
                                attributes
          #@TestPreamble
          #@TestSteps           reject fractional-exclude: inetOrgPerson:sn
          #@TestSteps           reject fractional-include: inetOrgPerson:surnAme
          #@TestSteps           test we get error when making opt attribute mandatory
          #@TestPostamble
          #@TestResult          Success if conflict is detected for both steps
          -->
          <testcase name="getTestCaseName('only optional attributes allowed')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <message>
                'reject fractional-exclude: inetOrgPerson:sn'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('reset',None)],
                  "exclude"           : [('set','inetOrgPerson:sn')],
                  "expectedRC"        : 1
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <message>
                'reject fractional-exclude: inetOrgPerson:surnAme'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('reset',None)],
                  "exclude"           : [('set','inetOrgPerson:surnAme')],
                  "expectedRC"        : 1
                }
              </call>
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          fractional-replication config
          #@TestName            alias attributes
          #@TestID              alias attributes
          #@TestPurpose         Check that alias opt/mandatory attributes
                                are treated equaly to non alias counterpart
          #@TestPreamble
          #@TestSteps           fractional-exclude rejects inetOrgPerson:surname (aka 'sn')
          #@TestSteps           fractional-exclude accepts inetOrgPerson:homeTelephoneNumber (aka 'homePhone')
          #@TestSteps           test we get error when making opt attribute mandatory
          #@TestPostamble
          #@TestResult          Success if conflict is detected for both steps
          -->
          <testcase name="getTestCaseName('alias attributes')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <call function="'reset-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <message>
                'fractional-exclude rejects *:surname (aka "sn")'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('reset',None)],
                  "exclude"           : [('set','inetOrgPerson:surname')],
                  "expectedRC"        : 1
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <!-- TODO verify we can add a entries for which schema make
              surname : optional -> surname attribute is removed from entry
              surname : mandatory -> surname attribute is left in entry
              -->
              <message>
                'fractional-exclude accepts inetOrgPerson:homeTelephoneNumber (aka "homePhone")'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('add','inetOrgPerson:homeTelephoneNumber,mail')],
                  "exclude"           : [('reset',None)],
                  "expectedRC"        : 0
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <!-- TODO verify we can add a entry without homeTelephoneNumber
                   and reject entry with homeTelephoneNumber
              -->
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          fractional-replication config
          #@TestName            mixing add/set/reset/remove
          #@TestID              mixing add/set/reset/remove
          #@TestPurpose         Check that we can mix set/reset/add/remove
          #@TestPreamble
          #@TestSteps           test removing exclude and adding include
          #@TestSteps           test partially removing include + adding exclude and include
          #@TestPostamble
          #@TestResult          Success if conflict is detected for both steps
          -->
          <testcase name="getTestCaseName('mixing add/set/reset/remove')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <call function="'reset-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <message>
                'test removing include and adding include'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('add','inetOrgPerson:description,audio')],
                  "exclude"           : [('remove','inetOrgPerson:mail')],
                  "expectedRC"        : 1
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('add','inetOrgPerson:description,audio')],
                  "expectedRC"        : 0
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <message>
                'test partially removing include + adding exclude and include'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('remove','inetOrgPerson:audio'),
                                         ('add','netOrgPerson:jpegPhoto,initials')
                                        ],
                  "exclude"           : [('add','*:mail')],
                  "expectedRC"        : 1
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('add','inetOrgPerson:jpegPhoto,employeeNumber'),
                                         ('remove','inetOrgPerson:jpegPhoto')
                                        ],
                  "expectedRC"        : 1
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <!-- TODO verify that the inetOrgPerson:audio was removed -->
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!--- Test Case information
          #@TestMarker          fractional-replication config
          #@TestName            mixing literal/OID
          #@TestID              mixing literal/OID
          #@TestPurpose         Check that we can mix literal/OID
          #@TestPreamble
          #@TestSteps           reset fractional-replication settings
          #@TestSteps           try to exclude mandatory literal attribute
          #@TestSteps           try to exclude mandatory OID attribute
          #@TestSteps           try to include mandatory literal attribute
          #@TestSteps           try to include mandatory OID attribute
          #@TestSteps           reset fractional-replication settings
          #@TestSteps           test setting OID for class
          #@TestSteps           test setting OID for attribute
          #@TestSteps           test setting OID for class and attribute
          #@TestSteps           test setting mix OID and literal for class and
                                attribute
          #@TestPostamble
          #@TestResult          Success if mixing in all context
          -->
          <testcase name="getTestCaseName('mixing literal/OIDs')">
            <sequence>
              <call function="'testCase_Preamble'"/>
              <message>
                'reset fractional-replication settings'
              </message>
              <call function="'reset-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <message level="'user1'">
                'try to exclude mandatory literal attribute'
              </message>
              <message level="'user1'">
                'try to exclude mandatory OID attribute'
              </message>
              <message level="'user1'">
                'try to include mandatory literal attribute'
              </message>
              <message level="'user1'">
                'try to include mandatory OID attribute'
              </message>
              <message>
                'reset fractional-replication settings'
              </message>
              <call function="'reset-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <message level="'user1'">
                'test setting OID for class'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('reset',None)],
                  "exclude"           : [('add','2.16.840.1.113730.3.2.2:jpegPhoto')],
                  "expectedRC"        : 0
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <message level="'user1'">
                'test setting OID for attribute'
              </message>
              <message level="'user1'">
                'test setting OID for class and attribute'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('reset',None)],
                  "exclude"           : [('add','*:0.9.2342.19200300.100.1.60'),
                                         ('add','inetOrgPerson:0.9.2342.19200300.100.1.60'),
                                         ('add','2.16.840.1.113730.3.2.2:0.9.2342.19200300.100.1.60')
                                        ],
                  "expectedRC"        : 0
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <message level="'user1'">
                'test setting mix OID and literal for class and attribute'
              </message>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('reset',None)],
                  "exclude"           : [('add','*:mail,jpegPhoto,0.9.2342.19200300.100.1.60'),
                                         ('add','inetOrgPerson:jpegPhoto,0.9.2342.19200300.100.1.60'),
                                         ('add','2.16.840.1.113730.3.2.2:jpegPhoto,0.9.2342.19200300.100.1.60')
                                        ],
                  "expectedRC"        : 0
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <call function="'set-ops-fractional-replication-attributes'">
                {
                  "server"            : server,
                  "replicationDomain" : domainMap[ldapServer][0],
                  "include"           : [('reset',None)],
                  "exclude"           : [('remove','*:mail,jpegPhoto'),
                                         ('remove','*:0.9.2342.19200300.100.1.60'),
                                         ('remove','InetOrgPerson:0.9.2342.19200300.100.1.60')
                                        ],
                  "expectedRC"        : 0,
                  "knownIssue"        : '0000',
                }
              </call>
              <call function="'get-fractional-replication-attributes'">
                {
                  'replicationDomain' : domainMap[ldapServer][0],
                  'server'            : server,
                }
              </call>
              <!--
                # TODO - verify
                # should be removed
                #    *:jpegPhoto
                #    *:0.9.2342.19200300.100.1.60
                #    InetOrgPerso:jpegPhoto
                #    InetOrgPerson:0.9.2342.19200300.100.1.60
                #    2.16.840.1.113730.3.2.2:jpegPhoto,0.9.2342.19200300.100.1.60
                -->
              <call function="'testCase_Postamble'"/>
            </sequence>
          </testcase>
          <!-- fractional-replication cleanup -->
          <import machine="STAF_LOCAL_HOSTNAME"
            file="'%s/testcases/fractional-replication/fractional-replication_cleanup.xml'
                  % (TESTS_DIR)"/>
          <call function="'fractional-replication_cleanup'" />
          <call function="'testSuite_Postamble'"/>
        </sequence>
          </finally>
        </try>
      </block>
    </sequence>
  </function>
  <function name="mutual_exclusiv">
    <!--- Test Case information
    #@TestMarker          fractional-replication config
    #@TestName            Mutual Exclusiv
    #@TestID              Mutual Exclusiv
    #@TestPurpose         Check that fractional-include is mutual exclusiv
                          against fractional-exclude.
    #@TestPreamble
    #@TestSteps           test setting include and exclude to empty
    #@TestSteps           test setting together include and exclude
    #@TestSteps           test setting include after setting exclude
    #@TestPostamble
    #@TestResult          Success if conflict is detected for both steps
    -->
    <testcase name="getTestCaseName('mutual exclusiv config')">
      <sequence>
        <call function="'testCase_Preamble'"/>
        <message>
          'test setting include and exclude to empty'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('set','')],
            "exclude"           : [('reset',None)],
            "expectedRC"        : 1
          }
        </call>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('set','')],
            "expectedRC"        : 1
          }
        </call>
        <message>
          'test setting together include and exclude'
        </message>
        <call function="'reset-fractional-replication-attributes'">
          {
            "replicationDomain" : domainMap[ldapServer][0],
            "server"            : server,
          }
        </call>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "replicationDomain" : domainMap[ldapServer][0],
            "server"            : server,
            "include"           : [('set','inetOrgPerson:description,audio')],
            "exclude"           : [('set','*:mail')],
            "expectedRC"        : 1
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            "server"            : server,
          }
        </call>
        <message>
          'test setting include after setting exclude'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('set','*:mail')],
            "expectedRC"        : 0
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('set','inetOrgPerson:description,audio')],
            "expectedRC"        : 1
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <call function="'testCase_Postamble'"/>
      </sequence>
    </testcase>
  </function>
  <function name="only_optional">
    <!--- Test Case information
    #@TestMarker          fractional-replication config
    #@TestName            only optional attributes
    #@TestID              only optional attributes
    #@TestPurpose         Check that we can only refer to optionals
                          attributes
    #@TestPreamble
    #@TestSteps           reject fractional-exclude: inetOrgPerson:sn
    #@TestSteps           reject fractional-include: inetOrgPerson:surnAme
    #@TestSteps           test we get error when making opt attribute mandatory
    #@TestPostamble
    #@TestResult          Success if conflict is detected for both steps
    -->
    <testcase name="getTestCaseName('only optional attributes allowed')">
      <sequence>
        <call function="'testCase_Preamble'"/>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <message>
          'reject fractional-exclude: inetOrgPerson:sn'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('set','inetOrgPerson:sn')],
            "expectedRC"        : 1
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <message>
          'reject fractional-exclude: inetOrgPerson:surnAme'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('set','inetOrgPerson:surnAme')],
            "expectedRC"        : 1
          }
        </call>
        <call function="'testCase_Postamble'"/>
      </sequence>
    </testcase>
  </function>
  <function name="alias_attributes">
    <!--- Test Case information
    #@TestMarker          fractional-replication config
    #@TestName            alias attributes
    #@TestID              alias attributes
    #@TestPurpose         Check that alias opt/mandatory attributes
                          are treated equaly to non alias counterpart
    #@TestPreamble
    #@TestSteps           fractional-exclude rejects inetOrgPerson:surname (aka 'sn')
    #@TestSteps           fractional-exclude accepts inetOrgPerson:homeTelephoneNumber (aka 'homePhone')
    #@TestSteps           test we get error when making opt attribute mandatory
    #@TestPostamble
    #@TestResult          Success if conflict is detected for both steps
    -->
    <testcase name="getTestCaseName('alias attributes')">
      <sequence>
        <call function="'testCase_Preamble'"/>
        <call function="'reset-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <message>
          'fractional-exclude rejects *:surname (aka "sn")'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('set','inetOrgPerson:surname')],
            "expectedRC"        : 1
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <!-- TODO verify we can add a entries for which schema make
        surname : optional -> surname attribute is removed from entry
        surname : mandatory -> surname attribute is left in entry
        -->
        <message>
          'fractional-exclude accepts inetOrgPerson:homeTelephoneNumber (aka "homePhone")'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('add','inetOrgPerson:homeTelephoneNumber,mail')],
            "exclude"           : [('reset',None)],
            "expectedRC"        : 0
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <!-- TODO verify we can add a entry without homeTelephoneNumber
             and reject entry with homeTelephoneNumber
        -->
        <call function="'testCase_Postamble'"/>
      </sequence>
    </testcase>
  </function>
  <function name="mixing_add_set_reset_remove">
    <!--- Test Case information
    #@TestMarker          fractional-replication config
    #@TestName            mixing add/set/reset/remove
    #@TestID              mixing add/set/reset/remove
    #@TestPurpose         Check that we can mix set/reset/add/remove
    #@TestPreamble
    #@TestSteps           test removing exclude and adding include
    #@TestSteps           test partially removing include + adding exclude and include
    #@TestPostamble
    #@TestResult          Success if conflict is detected for both steps
    -->
    <testcase name="getTestCaseName('mixing add/set/reset/remove')">
      <sequence>
        <call function="'testCase_Preamble'"/>
        <call function="'reset-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <message>
          'test removing include and adding include'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('add','inetOrgPerson:description,audio')],
            "exclude"           : [('remove','inetOrgPerson:mail')],
            "expectedRC"        : 1
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('add','inetOrgPerson:description,audio')],
            "expectedRC"        : 0
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <message>
          'test partially removing include + adding exclude and include'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('remove','inetOrgPerson:audio'),
                                   ('add','netOrgPerson:jpegPhoto,initials')
                                  ],
            "exclude"           : [('add','*:mail')],
            "expectedRC"        : 1
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('add','inetOrgPerson:jpegPhoto,employeeNumber'),
                                   ('remove','inetOrgPerson:jpegPhoto')
                                  ],
            "expectedRC"        : 1
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <!-- TODO verify that the inetOrgPerson:audio was removed -->
        <call function="'testCase_Postamble'"/>
      </sequence>
    </testcase>
  </function>
  <function name="mixing_literal_OID">
    <!--- Test Case information
    #@TestMarker          fractional-replication config
    #@TestName            mixing literal/OID
    #@TestID              mixing literal/OID
    #@TestPurpose         Check that we can mix literal/OID
    #@TestPreamble
    #@TestSteps           reset fractional-replication settings
    #@TestSteps           try to exclude mandatory literal attribute
    #@TestSteps           try to exclude mandatory OID attribute
    #@TestSteps           try to include mandatory literal attribute
    #@TestSteps           try to include mandatory OID attribute
    #@TestSteps           reset fractional-replication settings
    #@TestSteps           test setting OID for class
    #@TestSteps           test setting OID for attribute
    #@TestSteps           test setting OID for class and attribute
    #@TestSteps           test setting mix OID and literal for class and
                          attribute
    #@TestPostamble
    #@TestResult          Success if mixing in all context
    -->
    <testcase name="getTestCaseName('mixing literal/OIDs')">
      <sequence>
        <call function="'testCase_Preamble'"/>
        <message>
          'reset fractional-replication settings'
        </message>
        <call function="'reset-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <message level="'user1'">
          'try to exclude mandatory literal attribute'
        </message>
        <message level="'user1'">
          'try to exclude mandatory OID attribute'
        </message>
        <message level="'user1'">
          'try to include mandatory literal attribute'
        </message>
        <message level="'user1'">
          'try to include mandatory OID attribute'
        </message>
        <message>
          'reset fractional-replication settings'
        </message>
        <call function="'reset-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <message level="'user1'">
          'test setting OID for class'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('add','2.16.840.1.113730.3.2.2:jpegPhoto')],
            "expectedRC"        : 0
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <message level="'user1'">
          'test setting OID for attribute'
        </message>
        <message level="'user1'">
          'test setting OID for class and attribute'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('add','*:0.9.2342.19200300.100.1.60'),
                                   ('add','inetOrgPerson:0.9.2342.19200300.100.1.60'),
                                   ('add','2.16.840.1.113730.3.2.2:0.9.2342.19200300.100.1.60')
                                  ],
            "expectedRC"        : 0
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <message level="'user1'">
          'test setting mix OID and literal for class and attribute'
        </message>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('add','*:mail,jpegPhoto,0.9.2342.19200300.100.1.60'),
                                   ('add','inetOrgPerson:jpegPhoto,0.9.2342.19200300.100.1.60'),
                                   ('add','2.16.840.1.113730.3.2.2:jpegPhoto,0.9.2342.19200300.100.1.60')
                                  ],
            "expectedRC"        : 0
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('remove','*:mail,jpegPhoto'),
                                   ('remove','*:0.9.2342.19200300.100.1.60'),
                                   ('remove','InetOrgPerson:0.9.2342.19200300.100.1.60')
                                  ],
            "expectedRC"        : 0,
            "knownIssue"        : '0000',
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <!--
          # TODO - verify
          # should be removed
          #    *:jpegPhoto
          #    *:0.9.2342.19200300.100.1.60
          #    InetOrgPerso:jpegPhoto
          #    InetOrgPerson:0.9.2342.19200300.100.1.60
          #    2.16.840.1.113730.3.2.2:jpegPhoto,0.9.2342.19200300.100.1.60
          -->
        <call function="'testCase_Postamble'"/>
      </sequence>
    </testcase>
  </function>
  <function name="exclude_scalability">
    <!--- Test Case information
    #@TestMarker          fractional-replication config
    #@TestName            exclude scalability
    #@TestID              exclude scalability
    #@TestPurpose         Check that we can exclude all optional attribute
    #@TestPreamble
    #@TestSteps           reset fractional-replication settings
    #@TestSteps           exclude all optional attributes
    #@TestSteps           test setting mix OID and literal for class and
                          attribute
    #@TestPostamble
    #@TestResult          Success if mixing in all context
    -->
    <testcase name="getTestCaseName('exclude scalability')">
      <sequence>
        <call function="'testCase_Preamble'"/>
        <call function="'reset-fractional-replication-attributes'">
          {
            'replicationDomain' : domainMap[ldapServer][0],
            'server'            : server,
          }
        </call>
        <script>
          # generating fractional-exclude option for all optional regardless of objectClass
          excludeAllOptional = '*:'+','.join(schemaMap[ldapServer].allmay)
        </script>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('set',excludeAllOptional)],
            "expectedRC"        : 0
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            "replicationDomain" : domainMap[ldapServer][0],
            "server"            : server,
          }
        </call>
        <script>
          # generating fractional-exclude option for all optional regardless of objectClass
          from java.util import Random
          from java.lang import System
          rnd = Random(System.nanoTime())
          objClassesMay = []
          for objClass, mayAttrs in schemaMap[ldapServer].may.items():
            objClassesMay.append(objClass + ':' + ','.join(mayAttrs))
            mixMayAttrs = []
            for ma in mayAttrs:
              if rnd.nextBoolean() and ma in schemaMap[ldapServer].attrDict.keys():
                # replacing literal with OID value of the attribute
                mixMayAttrs.append(schemaMap[ldapServer].attrDict[ma])
              else:
                mixMayAttrs.append(ma)
            if rnd.nextBoolean():
              objClassesMay.append(schemaMap[ldapServer].objDict[objClass] + ':' + ','.join(mixMayAttrs))
            else:
              objClassesMay.append(objClass + ':' + ','.join(mixMayAttrs))
          excludeAllObjClassesMay = ','.join(objClassesMay)
        </script>
        <call function="'set-ops-fractional-replication-attributes'">
          {
            "server"            : server,
            "replicationDomain" : domainMap[ldapServer][0],
            "include"           : [('reset',None)],
            "exclude"           : [('add','%s' % oc) for oc in objClassesMay],
            "expectedRC"        : 0
          }
        </call>
        <call function="'get-fractional-replication-attributes'">
          {
            "replicationDomain" : domainMap[ldapServer][0],
            "server"            : server,
          }
        </call>
        <call function="'testCase_Postamble'"/>
      </sequence>
    </testcase>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/fractional-replication/utils.xml
@@ -373,7 +373,7 @@
    </sequence>
  </function>
  <function name="getSchemaDict">
  <function name="getSchemaDict" scope="local">
    <function-prolog>
      check the schema for the equivalent of a given argument
      if argument is OID then returns literal
@@ -400,8 +400,9 @@
        }
      </call>
      <script>
         oidDict = OIDDict()
         oidDict.parseSchema(STAXResult[0][1])
        schemaContent = STAXResult[0][1]
        oidDict = OIDDict()
        oidDict.parseSchema(schemaContent)
      </script>
      <return>oidDict</return>
    </sequence>
@@ -515,7 +516,7 @@
      </if>
      <if expr="RC == 0">
        <sequence>
          <call function="'LdifDiffWithScript'">
          <call function="'LdifDiffWithScript-new'">
            { 'location'            : dsMaster.getHostname(),
              'dsPath'              : dsMasterPath,
              'sourceLdif' : '%s/%s' % (remote.temp, filteredRefTree),
@@ -523,36 +524,38 @@
              'outputLdif' : '%s/%s' % (remote.temp,treeDiffs)
            }
          </call>
          <if expr="STAXResult == 0">
            <sequence>
              <return>0, None</return>
            </sequence>
            <else>
              <sequence>
                <script>
                  import time
                  tmstamp = time.time()
                </script>
                <call function="'copyFile'">
                  { 'location' : dsMaster.getHostname(),
                    'srcfile'  : '%s/%s' % (remote.temp,treeDiffs),
                    'destfile' : '%s/%s.%s' % (remote.temp,treeDiffs,tmstamp)
                  }
                </call>
                <call function="'getFile'">
                  { 'location' : dsMaster.getHostname(),
                    'filename' : '%s/%s' % (remote.temp,treeDiffs)
                  }
                </call>
                <if expr="RC == 0">
                  <return>1, STAXResult[1]</return>
                  <else>
                    <return>1, None</return>
                  </else>
                </if>
              </sequence>
            </else>
          </if>
        </sequence>
      </if>
      <if expr="RC == 0">
        <return>0, None</return>
        <else>
          <sequence>
            <script>
              import time
              tmstamp = time.time()
            </script>
            <call function="'copyFile'">
              { 'location' : dsMaster.getHostname(),
                'srcfile'  : '%s/%s' % (remote.temp,treeDiffs),
                'destfile' : '%s/%s.%s' % (remote.temp,treeDiffs,tmstamp)
              }
            </call>
            <call function="'getFile'">
              { 'location' : dsMaster.getHostname(),
                'filename' : '%s/%s' % (remote.temp,treeDiffs)
              }
            </call>
            <if expr="RC == 0">
              <return>1, STAXResult[1]</return>
              <else>
                <return>1, None</return>
              </else>
            </if>
          </sequence>
        </else>
      </if>
    </sequence>
  </function>
opends/tests/staf-tests/functional-tests/testcases/groups/group_cleanup.xml
New file
@@ -0,0 +1,79 @@
<?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
 !
 !      Copyright 2008-2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="group_cleanup"/>
  <function name="group_cleanup">
    <function-map-args>
      <function-arg-def name="stopDS" type="optional" default="True">
        <function-arg-description>
          Optional stop the Directory Server
        </function-arg-description>
        <function-arg-property name="type" value="boolean"/>
      </function-arg-def>
  </function-map-args>
    <sequence>
      <block name="'cleanup'">
        <sequence>
          <if expr="stopDS == True">
            <sequence>
              <message>
                 'Stop DS running on port %s' % (DIRECTORY_INSTANCE_PORT)
              </message>
              <call function="'StopDsWithScript'">
                { 'location'    : STAF_REMOTE_HOSTNAME,
                  'dsHost'      : DIRECTORY_INSTANCE_HOST,
                  'dsAdminPort' : DIRECTORY_INSTANCE_ADMIN_PORT,
                  'dsBindDN'    : DIRECTORY_INSTANCE_DN,
                  'dsBindPwd'   : DIRECTORY_INSTANCE_PSWD }
              </call>
            </sequence>
          </if>
          <message>
             'Remove DS topology created for the Test Suite'
          </message>
          <call function="'removeTopology'"/>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/groups/group_setup.xml
New file
@@ -0,0 +1,95 @@
<?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
 !
 !      Copyright 2009 Sun Microsystems, Inc.
 ! -->
<stax>
  <defaultcall function="group_setup"/>
  <function name="group_setup">
    <function-map-args>
      <function-arg-def name="startDS" type="optional" default="True">
        <function-arg-description>
          Optional start the Directory Server
        </function-arg-description>
        <function-arg-property name="type" value="boolean"/>
      </function-arg-def>
      <function-arg-def name="loadBackend" type="optional" default="True">
        <function-arg-description>
          Specifies whether the backend should be loaded with some data.
        </function-arg-description>
        <function-arg-property name="type" value="boolean"/>
      </function-arg-def>
      <function-arg-def name="globalAcis" type="optional" default="True">
        <function-arg-description>
          Specifies whether the test should use global acis.
        </function-arg-description>
        <function-arg-property name="type" value="boolean"/>
      </function-arg-def>
    </function-map-args>
    <sequence>
      <block name="'setup'">
        <sequence>
          <if expr="globalAcis == True">
            <sequence>
              <message>'Adding global ACIs.'</message>
              <call function="'ldapModifyWithScript'">
                {
                'dsInstanceHost'   : DIRECTORY_INSTANCE_HOST ,
                'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                'dsInstanceDn'     : DIRECTORY_INSTANCE_DN ,
                'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
                'dsFilename'       : '%s/groups/global_acis.ldif' % remote.data
                }
              </call>
            </sequence>
          <else>
            <sequence>
              <message>'Adding entry ACIs.'</message>
              <call function="'ldapModifyWithScript'">
                {
                'dsInstanceHost'   : DIRECTORY_INSTANCE_HOST ,
                'dsInstancePort'   : DIRECTORY_INSTANCE_PORT ,
                'dsInstanceDn'     : DIRECTORY_INSTANCE_DN ,
                'dsInstancePswd'   : DIRECTORY_INSTANCE_PSWD ,
                'dsFilename'       : '%s/groups/entry_acis.ldif' % remote.data
                }
              </call>
            </sequence>
          </else>
          </if>
        </sequence>
      </block>
    </sequence>
  </function>
</stax>
opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog.xml
@@ -33,61 +33,71 @@
    <sequence>
      <block name="'externalchangelog'">
        <sequence>
          <script>
            if not CurrentTestPath.has_key('group'):
              CurrentTestPath['group']='replication'
            CurrentTestPath['suite']=STAXCurrentBlock
            _group = 'replication'
            _suite = 'externalchangelog'
          </script>
          <call function="'testSuite_Preamble'"/>
          <!--- Test Suite information
          #@TestSuiteName       Replication External Changelog Tests
          #@TestSuitePurpose    Test the event notification system provided by
                                the External Changelog.
          #@TestSuiteID         External Changelog Tests
          #@TestSuiteGroup      External Changelog
          #@TestGroup           Replication
          #@TestScript          replication_externalchangelog.xml
          #@TestHTMLLink        http://opends.dev.java.net/
          -->
          
          <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/replication/replication_setup.xml'
                        % (TESTS_DIR)"/>
          <call function="'replication_setup'"/>
          <!-- Do not run the tests if servers are split, as it is not supported
           !   by External Changelog to have RS separated from DS -->
          <if expr="globalSplitServers != True">
            <sequence>
              <script>
                if not CurrentTestPath.has_key('group'):
                  CurrentTestPath['group']='replication'
                CurrentTestPath['suite']=STAXCurrentBlock
                _group = 'replication'
                _suite = 'externalchangelog'
              </script>
              <call function="'testSuite_Preamble'"/>
              <!--- Test Suite information
              #@TestSuiteName       Replication External Changelog Tests
              #@TestSuitePurpose    Test the event notification system provided by
                                    the External Changelog.
              #@TestSuiteID         External Changelog Tests
              #@TestSuiteGroup      External Changelog
              #@TestGroup           Replication
              #@TestScript          replication_externalchangelog.xml
              #@TestHTMLLink        http://opends.dev.java.net/
              -->
              <import machine="STAF_LOCAL_HOSTNAME"
                      file="'%s/testcases/replication/replication_setup.xml'
                            % (TESTS_DIR)"/>
              <call function="'replication_setup'"/>
              <!-- Run common set of ECL tests in opends proprietary mode -->
              <import machine="STAF_LOCAL_HOSTNAME"
                      file="'%s/testcases/%s/%s/%s_common_ecl_tests.xml'
                            % (TESTS_DIR, _group, _suite, _suite)"/>
              <call function="'common_ecl_tests'">
                { 'ecl_mode' : 'opends' }
              </call>
              <!-- Run common set of ECL tests in changelog draft-compatible
               !   mode -->
              <import machine="STAF_LOCAL_HOSTNAME"
                      file="'%s/testcases/%s/%s/%s_common_ecl_tests.xml'
                            % (TESTS_DIR, _group, _suite, _suite)"/>
              <call function="'common_ecl_tests'">
                { 'ecl_mode' : 'draft' }
              </call>
              <import machine="STAF_LOCAL_HOSTNAME"
                      file="'%s/testcases/replication/replication_cleanup.xml'
                            % (TESTS_DIR)"/>
              <call function="'replication_cleanup'" />
          <!-- Run common set of ECL tests in opends proprietary mode -->
          <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/%s/%s/%s_common_ecl_tests.xml'
                        % (TESTS_DIR, _group, _suite, _suite)"/>
          <call function="'common_ecl_tests'">
            { 'ecl_mode' : 'opends' }
          </call>
          <!-- Run common set of ECL tests in changelog draft-compatible
           !   mode -->
          <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/%s/%s/%s_common_ecl_tests.xml'
                        % (TESTS_DIR, _group, _suite, _suite)"/>
          <call function="'common_ecl_tests'">
            { 'ecl_mode' : 'draft' }
          </call>
          <import machine="STAF_LOCAL_HOSTNAME"
                  file="'%s/testcases/replication/replication_cleanup.xml'
                        % (TESTS_DIR)"/>
          <call function="'replication_cleanup'" />
          <call function="'testSuite_Postamble'"/>
              <call function="'testSuite_Postamble'"/>
            </sequence>
          </if>
        </sequence>
      </block>
    </sequence>
opends/tests/staf-tests/functional-tests/testcases/replication/externalchangelog/externalchangelog_common_ecl_tests.xml
@@ -2362,15 +2362,20 @@
                else:
                  lastIndexAttr = 'lastchangenumber'
                
                serverPath = '%s/%s' % (server.getDir(), OPENDSNAME)
                if globalSplitServers:
                  replServer = _topologyReplServerList[indx]
                else:
                  replServer = server
                replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
              </script>
              <call function="'ldapSearchWithScript'">
                { 'location'       : server.getHostname(),
                  'dsPath'         : serverPath,
                  'dsInstanceHost' : server.getHostname(),
                  'dsInstancePort' : server.getPort(),
                  'dsInstanceDn'   : server.getRootDn(),
                  'dsInstancePswd' : server.getRootPwd(),
                { 'location'       : replServer.getHostname(),
                  'dsPath'         : replServerPath,
                  'dsInstanceHost' : replServer.getHostname(),
                  'dsInstancePort' : replServer.getPort(),
                  'dsInstanceDn'   : replServer.getRootDn(),
                  'dsInstancePswd' : replServer.getRootPwd(),
                  'dsScope'        : 'base',
                  'dsBaseDN'       : ' ',
                  'dsFilter'       : 'objectclass=*',
@@ -4815,9 +4820,69 @@
                  </call>
                </sequence>
              </if>
              <if expr="globalSplitServers">
                <sequence>
                  <script>
                    if master.isOnlyLdapServer():
                      masterReplPort = None
                    else:
                      masterReplPort = masterReplicationServer.getPort()
                    replServer = _topologyReplServerList[indx]
                    replServerReplPort = replServer.getChangelogServer().getPort()
                    replicatedDnList = [newReplSuffix]
                  </script>
                  <message>
                    'Enable replication for server:\nHost: %s\nLdap port: %s\n\
                    Replication port: %s\nReplicated DN list: %s' \
                      % (replServer.getHostname(), replServer.getPort(),
                         replServerReplPort, replicatedDnList)
                  </message>
                  <call function="'enableReplication'">
                    { 'location'             : clientHost,
                      'dsPath'               : clientPath,
                      'refInstanceHost'      : masterHost,
                      'refInstanceAdminPort' : master.getAdminPort(),
                      'refInstanceDn'        : master.getRootDn(),
                      'refInstancePswd'      : master.getRootPwd(),
                      'refReplicationPort'   : masterReplPort,
                      'refSecureReplication' : secureReplication,
                      'refOnlyLdapServer'    : master.isOnlyLdapServer(),
                      'refOnlyReplServer'    : master.isOnlyReplServer(),
                      'dsInstanceHost'       : replServer.getHostname(),
                      'dsInstanceAdminPort'  : replServer.getAdminPort(),
                      'dsInstanceDn'         : replServer.getRootDn(),
                      'dsInstancePswd'       : replServer.getRootPwd(),
                      'dsReplicationPort'    : replServerReplPort,
                      'dsSecureReplication'  : secureReplication,
                      'dsOnlyLdapServer'     : replServer.isOnlyLdapServer(),
                      'dsOnlyReplServer'     : replServer.isOnlyReplServer(),
                      'replicationDnList'    : replicatedDnList
                    }
                  </call>
                </sequence>
              </if>
            </sequence>
          </iterate>
          <!-- Add new entries -->
          <call function="'addAnEntry'">
            { 'location'       : masterHost,
              'dsPath'         : masterPath,
              'dsInstanceHost' : masterHost,
              'dsInstancePort' : master.getPort(),
              'dsInstanceDn'   : master.getRootDn(),
              'dsInstancePswd' : master.getRootPwd(),
              'DNToAdd'        : newReplSuffix,
              'listAttributes' : newRootEntryAttrs
            }
          </call>
          <script>
            firstSearchIndex  = searchIndex
            
@@ -4895,13 +4960,21 @@
              <!-- New replicated suffix added => resync required => 
               !   Retrieve lastExternalChangelogCookie from root DSE -->
              <script>
                if globalSplitServers:
                  replServer = _topologyReplServerList[0]
                else:
                  replServer = master
                replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
              </script>
              <call function="'ldapSearchWithScript'">
                { 'location'       : masterHost,
                  'dsPath'         : masterPath,
                  'dsInstanceHost' : masterHost,
                  'dsInstancePort' : master.getPort(),
                  'dsInstanceDn'   : master.getRootDn(),
                  'dsInstancePswd' : master.getRootPwd(),
                { 'location'       : replServer.getHostname(),
                  'dsPath'         : replServerPath,
                  'dsInstanceHost' : replServer.getHostname(),
                  'dsInstancePort' : replServer.getPort(),
                  'dsInstanceDn'   : replServer.getRootDn(),
                  'dsInstancePswd' : replServer.getRootPwd(),
                  'dsScope'        : 'base',
                  'dsBaseDN'       : ' ',
                  'dsFilter'       : 'objectclass=*',
@@ -4947,18 +5020,6 @@
            </sequence>
          </if>
          
          <!-- Add new entries -->
          <call function="'addAnEntry'">
            { 'location'       : masterHost,
              'dsPath'         : masterPath,
              'dsInstanceHost' : masterHost,
              'dsInstancePort' : master.getPort(),
              'dsInstanceDn'   : master.getRootDn(),
              'dsInstancePswd' : master.getRootPwd(),
              'DNToAdd'        : newReplSuffix,
              'listAttributes' : newRootEntryAttrs
            }
          </call>
          <call function="'addAnEntry'">
            { 'location'       : masterHost,
              'dsPath'         : masterPath,
@@ -5017,7 +5078,12 @@
                { 'ldifEntries' : searchResult }
              </call>
              <script>
                addedEntries += STAXResult
                if ecl_mode == 'opends':
                  # because of the resync, the first add will be missed when
                  # searching the ECL
                  addedEntries += STAXResult[1:]
                else:
                  addedEntries += STAXResult
              </script>
            </sequence>
            <else>
@@ -5059,6 +5125,9 @@
              </message>
                
              <!-- Search for entry add -->
              <!-- In draft-mode, this may fail because of issue #4329:
               !   draft mode: after adding new suffix, can not search ECL
               !   because of invalid cookie! -->
              <call function="'SearchExternalChangelog'">
                { 'location'           : replServer.getHostname(),
                  'dsPath'             : replServerPath,
@@ -5070,7 +5139,8 @@
                  'dsBaseDN'           : 'cn=changelog',
                  'dsFilter'           : '(objectclass=*)',
                  'changeNumberFilter' : chgNumberFilter,
                  'changelogCookie'    : lastCookie
                  'changelogCookie'    : lastCookie,
                  'knownIssue'         : '4329'
                }                
              </call>
              <script>
@@ -5386,6 +5456,9 @@
              </message>
                
              <!-- Search for entry adds in synchroSuffix -->
              <!-- In draft-mode, this may fail because of issue #4329:
               !   draft mode: after adding new suffix, can not search ECL
               !   because of invalid cookie! -->
              <call function="'SearchExternalChangelog'">
                { 'location'           : replServer.getHostname(),
                  'dsPath'             : replServerPath,
@@ -5397,7 +5470,8 @@
                  'dsBaseDN'           : eclSearchBaseDn,
                  'dsFilter'           : eclSearchFilter,
                  'changeNumberFilter' : chgNumberFilter,
                  'changelogCookie'    : lastCookie
                  'changelogCookie'    : lastCookie,
                  'knownIssue'         : '4329'
                }                
              </call>
              <script>
@@ -5594,6 +5668,9 @@
              </message>
                
              <!-- Search for entry adds in newReplSuffix -->
              <!-- In draft-mode, this may fail because of issue #4329:
               !   draft mode: after adding new suffix, can not search ECL
               !   because of invalid cookie! -->
              <call function="'SearchExternalChangelog'">
                { 'location'           : replServer.getHostname(),
                  'dsPath'             : replServerPath,
@@ -5605,7 +5682,8 @@
                  'dsBaseDN'           : eclSearchBaseDn,
                  'dsFilter'           : eclSearchFilter,
                  'changeNumberFilter' : chgNumberFilter,
                  'changelogCookie'    : lastCookie
                  'changelogCookie'    : lastCookie,
                  'knownIssue'         : '4329'
                }                
              </call>
              <script>
@@ -5787,6 +5865,24 @@
              'replicationDnList'   : [newReplSuffix]
            }
          </call>
          <if expr="globalSplitServers">
            <sequence>
              <script>
                replServer     = _topologyReplServerList[indx]
                replServerPath = '%s/%s' % (replServer.getDir(), OPENDSNAME)
              </script>
              <call function="'disableReplication'">
                { 'location'            : replServer.getHostname(),
                  'dsPath'              : replServerPath,
                  'dsInstanceHost'      : replServer.getHostname(),
                  'dsInstanceAdminPort' : replServer.getAdminPort(),
                  'replicationDnList'   : [newReplSuffix]
                }
              </call>
            </sequence>
          </if>
          
          <!-- Remove newReplSuffix -->
          <message>
opends/tests/staf-tests/shared/ant/build.properties
@@ -33,7 +33,7 @@
# Archives section
staf.default=true
staf.url=http://superb-east.dl.sourceforge.net/sourceforge/staf
staf.url=http://prdownloads.sourceforge.net/sourceforge/staf
staf.version=334
staf.port=6500
stax.version=337
opends/tests/staf-tests/shared/functions/utils.xml
@@ -1105,7 +1105,7 @@
        
        qa = doc.getDocumentElement()
        ft = qa.getChildNodes().item(1)
        results = ft.getChildNodes().item(1)
        results = ft.getChildNodes().item(3)
        
        #Create testgroup element
        xml.testgroup = doc.createElement("testgroup")
opends/tests/staf-tests/shared/python/common.py
@@ -47,7 +47,9 @@
            "list2dn",
            "dn2rfcmailaddr",
            "java_properties",
            "xmldoc_service" ]
            "xmldoc_service" ,
            "xml_create_report" ,
            "group_to_run" ]
class format_testcase:
  'Format the Test name objects'
@@ -681,4 +683,66 @@
      tag.setAttributeNode(newAttribute)
    except:
      print "exception: %s" % traceback.format_exception(*sys.exc_info())
def xml_add_text_node(doc,parent,name,ntext):
  node = doc.createElement(name)
  text = doc.createTextNode('%s' % ntext)
  node.appendChild(text)
  parent.appendChild(node)
def xml_create_report(pname,type,path,info,misc,testdir,report):
  xml=xmldoc_service()
  builder = xml.createBlankDocument()
  doc = builder.newDocument()
  root = doc.createElement("qa")
  doc.appendChild(root)
  ft = doc.createElement("%s" % type)
  root.appendChild(ft);
  # Identification
  id = doc.createElement("identification")
  ft.appendChild(id)
  sut = doc.createElement("sut")
  xml.createAttr(doc,sut,"product","opends")
  id.appendChild(sut)
  xml_add_text_node(doc,sut,'name',pname)
  xml_add_text_node(doc,sut,'path',path)
  xml_add_text_node(doc,sut,'version',info['server version'])
  xml_add_text_node(doc,sut,'buildid',info['server buildid'])
  xml_add_text_node(doc,sut,'revision',info['svn revision'])
  xml_add_text_node(doc,sut,'hostname',info['system name'])
  xml_add_text_node(doc,sut,'platform',info['system os'])
  xml_add_text_node(doc,sut,'jvm-version',info['jvm version'])
  xml_add_text_node(doc,sut,'jvm-label',misc['jvm label'])
  xml_add_text_node(doc,sut,'jvm-vendor',info['jvm vendor'])
  xml_add_text_node(doc,sut,'jvm-arch',info['jvm architecture'])
  xml_add_text_node(doc,sut,'jvm-args','TBD')
  xml_add_text_node(doc,sut,'jvm-home','TBD')
  xml_add_text_node(doc,sut,'jvm-bin','TDB')
  xml_add_text_node(doc,sut,'os-label',misc['os label'])
  xml_add_text_node(doc,sut,'server-package',misc['server package'])
  xml_add_text_node(doc,sut,'snmp-jarfile',misc['snmp jarfile'])
  xml_add_text_node(doc,sut,'md5-sum','TBD')
  xml_add_text_node(doc,id,'tests-dir',testdir)
  # Test Results
  results = doc.createElement("results")
  ft.appendChild(results)
  xml.writeXMLfile(doc,report)
class group_to_run:
  def __init__(self, name):
    self.name = name
  def getName(self):
    return self.name
                                                         
opends/tests/staf-tests/shared/python/schema.py
@@ -39,10 +39,13 @@
  of both objeclasses, and attributtypes"""
  
  def __init__(self, schema=None):
    self.dict = {}
    self.attrDict = {}
    self.objDict = {}
    self.sup = {}
    self.may = {}
    self.must = {}
    self.allmay = []
    self.allmust = []
  def _getOID(self, line):
    """given a schema entry definition for objectclass/attributtype
@@ -50,6 +53,7 @@
    the List of aliases starts from list of names[1:] when exist. for ex :
       attributeTypes: ( 2.5.4.4 NAME ( 'sn' 'surname' ) SUP name X-ORIGIN 'RFC 4519' )
       (2.5.4.4,['sn','surname']
    More details : https://www.opends.org/wiki/page/AttributeTypeDescriptionFormat
    """
    pNdx = line.find('(')
    nNdx = line.find('NAME',pNdx)
@@ -58,11 +62,17 @@
    # populate the NAME to OID : "dict" dictionary
    NAMES = self._getStr(line,'NAME')
    if NAMES:
      # TODO encoded schema is not handled for now
      self.dict.update({OID:NAMES})
      for name in NAMES:
        self.dict.update({name:OID})
    # populate SUP and MUST / MAY, : "sup", "may", "must" dictionaries
      if line.startswith('objectClasses:'):
        # TODO encoded schema is not handled for now
        self.objDict.update({OID:NAMES})
        for name in NAMES:
          self.objDict.update({name:OID})
      elif line.startswith('attributeTypes:'):
         # TODO encoded schema is not handled for now
        self.attrDict.update({OID:NAMES})
        for name in NAMES:
          self.attrDict.update({name:OID})
   # populate SUP and MUST / MAY, : "sup", "may", "must" dictionaries
    if line.startswith('objectClasses:'):
      r = self._getStr(line,'SUP')
      if r:
@@ -70,9 +80,15 @@
      r = self._getStr(line,'MUST')
      if r:
        self.must.update({NAMES[0]:r})
        for m in r:
          if not m in self.allmust:
            self.allmust.append(m)
      r = self._getStr(line,'MAY')
      if r:
        self.may.update({NAMES[0]:r})
        for m in r:
          if not m in self.allmay:
            self.allmay.append(m)
    return OID, NAMES
@@ -111,7 +127,7 @@
          elif s[0] != '$' and s[0] != '|':
            if s[0] == '\'' and s[-1] == '\'':
              s = s[1:-1]
            realStrs.append(s)
            realStrs.append(s.lower())
    return realStrs
  def getMust(self, objectclassname):
@@ -160,38 +176,46 @@
    and attributetypes only."""
    lines=[]
    line=''
    for f in ref_content:
    for f in ref_content.splitlines():
      if len(line) == 0 and \
         not (f.startswith("objectClasses") or \
              f.startswith("attributeTypes")):
        # not handled for now
        continue
      elif len(line) > 0 and f[0].isspace():
      elif len(line) > 0 and len(f) > 0 and f[0].isspace():
          # line continuation aggregated into 'line'
          line += f[1:-1]
          line += f[1:]
      elif f.startswith("objectClasses") or f.startswith("attributeTypes"):
        if len(line) > 0:
          lines.append(line)
          # populate the OID <-> Names dictionary
          self._getOID(line)
        line =f[:-1]
        line = f.strip()
        line = f[:-1]
        line = f
    if len(line) > 0:
      # parsing the last line
      self._getOID(line)
      lines.append(line)
    f=open('/tmp/lines.ldif','w')
    f.write('\n'.join(lines))
    f.close()
if __name__ == '__main__':
   """get example schema.ldif file with :
      ldapsearch -b 'cn=schema' -Dcn=directory\ manager -s base -wpassword objectclass=* objectClasses attributeTypes
      ldapsearch -b 'cn=schema' -Dcn=directory\ manager -s base -wpassword objectclass=* objectClasses attributeTypes > /tmp/schema.ldif
   """
   objectClassesFileName='/tmp/schema.ldif'
   f = open(objectClassesFileName)
   fc = f.readlines()
   f.close()
   oidDict = OIDDict()
   oidDict.parseSchema(fc)
   print '[ dictionary ]'.center(80, '-')
   for k,v in oidDict.dict.items():
   oidDict.parseSchema(''.join(fc))
   print '[ Objectclasses dictionary ]'.center(80, '-')
   for k,v in oidDict.objDict.items():
     print "%s\t%s"%(k,v)
   print '[ AttributeTypes dictionary ]'.center(80, '-')
   for k,v in oidDict.attrDict.items():
     print "%s\t%s"%(k,v)
   print '[ must ]'.center(80, '-')
   for k,v in oidDict.must.items():
@@ -214,3 +238,15 @@
       print 'MAY',oidDict.getMay(cn)
     except Exception, e:
       print e.message
   print '[ all must ]'.center(80,'-')
   mustSize = 0
   for m in oidDict.allmust:
     mustSize += len(m)
   print 'got %s MUSTs size = %sKb' % (len(oidDict.allmust),mustSize/1024.0)
   print oidDict.allmust
   print '[ all may ]'.center(80,'-')
   maySize = 0
   for m in oidDict.allmay:
     maySize += len(m)
   print 'got %s MAYs size = %sKb' % (len(oidDict.allmay),maySize/1024.0)
   print oidDict.allmay
opends/tests/staf-tests/shared/tests/runTests.xml
@@ -39,30 +39,20 @@
      <script>
        listOfChildren=[]
        xml=xmldoc_service()
        builder = xml.createBlankDocument()
        doc = builder.newDocument()
        root = doc.createElement("qa")
        doc.appendChild(root)
        ft = doc.createElement("%s" % TESTS_TYPE)
        root.appendChild(ft);
        results = doc.createElement("results")
        ft.appendChild(results);
        xml.writeXMLfile(doc,"%s/results2.xml" % logs.reports)
        my_path='%s/%s' % (DIRECTORY_INSTANCE_BIN,OPENDSNAME)
        my_report='%s/results2.xml' % logs.reports
        my_info={}
        my_info['jvm label']=TEST_JVM_STRING
        my_info['os label']=TEST_OS_STRING
        my_info['server package']='%s/%s' % (ZIPPATH,ZIPNAME)
        my_info['snmp jarfile']=SNMP_OPENDMK_JARFILE
        class groupToRun:
          def __init__(self, name):
            self.name = name
          def getName(self):
            return self.name
        xml_create_report(PRODUCTNAME,TESTS_TYPE,my_path, \
          DSInfo.ServerDict,my_info,local.directory,my_report)
        groupsToRun = []
        for line in TEST_PLAN_CUSTOM.split(","):
          groupsToRun.append(groupToRun(line.rstrip()))
          groupsToRun.append(group_to_run(line.rstrip()))
      </script>
      <!-- TODO: If no groupsToRun then iterate will throw exception -->