opends/tests/functional-tests/shared/data/replication/photo1.uu
New file @@ -0,0 +1,361 @@ /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQ QEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQ kFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB T/wAARCAF6AScDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtR AAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFh cYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJip KTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8v P09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBA QAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKj U2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoq OkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADA MBAAIRAxEAPwD9MV/zxT1/zxQtDdR/KuWwC05e/Wk/zij7xzzzVAO9OlKnSlHTtS/5xQOwUUf5xR QMKUfl70LS0BYP09qKKKACnLTactOwWFopD1FOPQUWFYFoagDNKBijYY3OOP0pVGD/AEp1FFxiL0 paKKQBSH64paKdwEH0xSNTqKLgMpD+NSU1qNwGH8KSnnoaQ9BSAbRRRQAjUm3NK1JQAhSkJzTqa1 K4DWopaKYEa0tA6UHv9KSIFHWnnoKSimOwq07/AD0pF5yPWl6celBQq/eH+FB+9SDoaVvvCgB3ak pe1JQAUUU5aABfx/Cl/P8AGiiqQCj/AOvSj/69NopgK1Opq06pYBRRRSAKO4oooARe1Kf89aB+NB /GgAooooAKa1Oop3AZ+GaPwxTj+XvQPy9qNwGNSdqdSNSAjPWinUjUAJRRRSsA1qKGoo2AiH/16U df1pFp3+etCFYcOlFIv+eaXGRTAVadSZyaWgYo7/Sl7mkHQ0o4AoAc1NoooAKctNpy/wBRQAtKtJ 6/WlWqQDqatOoouAUUnenHoKncBvfnpTj0HrSUUCCilWhqAEoo/wA9KVev/wBegYlFOHKgetI3HH pQAlA60D9KD+tOwAOlFFIeoo2ARqa3T68U49aa1G4Cfwj35po6mlopAI1JStSUANainr1opWArrS /xCm06PvQgH96OO9HcUq/0pgIcdqeaKKVwFH5e9OGe3Ht2pq0tMBTnvj8KSiigBy0HGRSDr6+1PP Qd/egBRnFLTVp1O4BRRTZHWKN5ZHWKKMF3kcgBVHUkmgBw657Vl+KPF2ieCNLk1LxDrNlounqCTc X06xLwM4G4jJwOg5r5i+Nf7d+keHmu9G+Hiwa5fxbopfEE3zWMDDg+UAczsOehC5HVulfEPjr4ga l8RNdOq+KNVu/EOpcok942ViBOSscYwkY5PCgVzTrRhujenRlN6n3Z41/4KJfDfQXlh8OabrXjKc H5ZLSAW9s/qfMlKn8lIrz2f/gptfi5Ai+FaPDngN4gXfj6CDAr4z+0oVAijEYwdoDdT3696pzRZk ZQAoHVQRnp1+tcbxN3udiwMrXP0L8Ef8FIvAetSRweKNA1nwfKSA04VL21QerPH84H/bOvprwf42 8P+PtITVfDOt2Wuae//LeymWQA+jY5U+xwfavxRhVg+d56/KenOO9dt8MvGOufD7X49W8Ka7caBq gI3GE5iuP9mVD8rjPYg10Qr231OeeHlHofslnJor5w/Z+/bJ0j4lzweG/F6QeGvF7DbE5fbaX54x 5bH7rn+4fwJ6D6PIIOCMfSuqElNXRytWCigUVQhGpKdRTuA2inUjUgGt9cU3G7vmlakp3ARlxSGn f56Ujdv8KQDGpKcW2//qo3bgf8KAG0Ug6milcCFaWm0o+uKVwHrTlpi9+c09aoB3/66P8A9dA7fW lXpSsAD6ZFL+ORSj8PxoOffb29KYCUUU5aABcc5zTlxzjFC06gAooo5BzQIiu7qCwtJ7u7mjtrS3 RpZp5nCRxxqCWZieAAAck9K/NH9qX9se8+Nmqz+F/CdxNY/DmIkS3CKY5daZTwSeqwZHCnBbgt2A 9E/wCCi3x2uJr21+EOjTNHbtBHqPiG4ibnYxJhtDjpux5jDuNg6Ma+GpLhYVCqqpj5VXHNc9aVlZ HTShzO5fuNUHlhUOYwRsUAAKO2B+FQW11JcTfMx+Y4wf6VlSzM7sB8wbqQ2P8A9daelASyIhGVVu g4PpmvMq7Hu4emrm9ZoSomYjawwuM5B4NOu7XfvYLsPXgc5q3p0ReI5iKgknAJOBV25tQo3KDgEg MD1xntXDd3PV5VbQ5S4IixkMQRgAg59ulQ/bWim3MdjKQ2c4xn/wDXVrU3/esfc+/8unWsaZyJjw ygE53HJJrqje9zhqpWaOsi1CPU7NYZiPNT54pT/CwPHI7195fsY/tR3Hiu4X4eeM7wtrkKE6Tf3B w92igZhYn70ijkH+IZ7ivzntb8ExjdkkYJPrW/Fq97p9zZX9hfS2Gq2UqXNpeISHilUgqwI64I5r si2ndHiVYRtY/bPoSPTrRXlX7Mvxwtfj78K7PXsJDrNq5stVtVI/d3KYywH91xhh7HHavVe1ejGS krnnNW0CjntRRVAI2O1JTj0Pf2pD0Hf3oASmtTqKAGHpSN19fbNOftjrTD7dKAEft39802n9qYet ABRRRUsCsM96cvWmj/AOv0pf8A9dICZOlOqNactO4DqBR05o6cU7gOHeikWlouA5aWkWlpgKDjml AxxSD8aUfj+NAC0eYkIaWRgkcal2ZugA6miuF+PWuHwz8DPiHqiyeVLbaBetE+ekhgcJ/49tpMR+ Q3i/xld/ELxb4j8YXm5r3xBfTXxydxSJmIhjHskYRB7LXJTPJLcOo+ZjzgjJ59/rWzDbmG3jQDGx FyCDnOOprkL7VpTM6WKSKgOGmQElh3wPzrjneWx6FO0bNm5a6WC4XPQjuPy4rrdK0kO42vwCPujg +p55rzOz1K/t2WR1uH6YyjM2d3T0BrsPDvimSOeWG5QrJFnIYfMffgY7jgf41xVaU5K9z2aGIpxs mj0DTrFlVgWy4OBwemBiprixkiSaNTgDoM8H3/AM+lJoeoR3E4RGWaPgBwMDoOnT9a00mC3cplP7 pBuBx398fhXA4tHpqSautjgtSszKC2Oey4HOK5vUbKRdpZcR5wSvze557V1Gtal9mn3x+WpYEYbj BznHWuRvfFDLEd1sDGMM7q4weSD24//V61vThU3SOKrUpO92Uo5TE69SxO4ALz171uWcwmEeWOGy CWHNcy3iCynlaN0kjyMNORuAOOmB75rorVyI2k3CRSu7J5H1yK7kmtWeLVtfQ+pv8Agnv8RG8JfH C98MTSeXp3imzYqCxC/aYQWVueMlPMGPcV+lJGGNfjD8NPET+FPif4M19MRtYaxbzs2doKeYAyn2 2lvzr9oZPvGuqk9Wjz5paMZRRRXUzIKRqWkagYlMxn8KfTW6UANJ3cUhOeadtyaRlxQA2inLTd2K AEaihmzRUsCr3/AAFOWmLT1pAPWlpo+92/E089e3TsaABaevWmLT1oAUdvpSjHekooAXnuePT1pR 9fw9KQe3WlGPwqkA5adTVx2p1MBrV4j+21qA0/9l3xuTJ5f2hbS1yOpEl3ChH5Ma9vK7u2favk/w D4KT682n/ALSbOB0cXvimytLhVYHaBHNMA3p80SUnsNK7PzxnBtNCadyQ0nyr5h5IJwT+Wa5fT0g Vx57JEgycuDgDHWtvxvJKrWumW3yiCPzJGI/j9D7YNcbpVhct4mtrjWrAavo6TDz9OtL82s0qY6C XB29McD6150o83Wx6tJ+z6XPSLc6ONO3y3fB4J8tipP1xjNVvsNteWTTaddRzSKcmM7eRnr/Oud8 G+Dbm/81LvTkHh9fFFvqcpfUGTVxp6pIHtUmMoj2EOuRtDFlBzgYrb8VXOi6X4huZfDGhahb2kgf y7fUNQiuJbck/KA6AEgDPD5+tS6agrc1zphVc3rG1iz4b8RJayR/aAqsuVIIyd39BW5r/iowwHB2 eaufL7c45FecWkFwWKzuzzSuTJ8nTJ6D0/+vWx4uDGVGR3VUTAUngZx7da4rR5rdT0Yp8vNYrybv EErRwxySbOC/KqB/P1q1a/DYXUZZWR++0OSqn6GsvSdYeOz/su4aSz8yQKtwIyEKnq7sMng9cDNX vFcOjeAr67ij8YxeIbI+G59Rhn0vRZ7iN9UEuyOzk3So0aEcmXJxj7prtpxc/dTseZVnGPvSRXv9 Bgs8wSQjC/Kxz979exq14aQxxtb7nZEBKE5OB3HWuZ1q9uvDum6Dd3+pWF02p2S3TW2m3JuntGPV J15KHHPU/hXU+CNZt7ySMqoInATCtnrjkZoUZR+LUwnKE/hVjRimaJ3mBbCfvB83I2kH17AZ/Cv2 /trlL21guYzujmjWRfoRkV+IF2qxX17bqpJPmDywcHG3uf1r9qfBMElt4L8PQzZMsenW6OW65Eag 5/Guij8TPPqLQ2qKKRq7rGItMk7UUjVICU1qdRQA1aSTtT6a1AEdFOak7UrgNaikPWikBWH4/nxT lpi09aQC96kTpUfenjpQA8Uopg696kHTtQAUUh6inDp/8AWoAVqFpPr0+lKPfrVIBaB1464P5UUc 9qYEV5qVro2n3WoXs6W1jaQvcTzSHCxxqpLMT6AAmvwvv7C71nxNqGpXs9xcXWraj/AGncvcSlst JI0qEjuVRwPxxX7H/tJu0X7OXxUkj/ANYnhXU2HOOlrIe1fkprOjXtpbx6tqErSTX9sAqBcCMlBs TPchQCa4q8+VqPc9LC004SmY0wk1XVp7w5bzJCzKwBCjoFP4Y59hUk+ktJtRLaMZAYu2eeOvHWn6 W0cTqhw+BlmDZ5x1P5V0LXtrHb4DIr4zuyTzx/TNeZOUuayPcoUoOF5HHv4U+zh5WdZVQHJ+6vA7 c81RnRRKYrdy6BuqKeuOf8+9dHqz3E6qZd/kbSijHy9MZx3NYGkeI9P0qBY71vLeN/KkijBJJ55z kd6fvSV9y24QaT0Rt+FtAee9jYY3FsklcE5GP6Vs+KtERnuPkXBPJK8sQOMDtVPw5410m41u2SZJ 7S380Bx0faMZxg4PBroPiJ4u8MW/lNpVxM8BXcwnI3g56DHtj864pU6vPex6NKpQdK1zy91e3DR7 vMSMYKkEEdxjH41qNqet/YRAt+13aE7VilUMfp+v61PB4o0O9QrvhV2LZV+vA7elVtJvPIe2KklH fcRyecnBAPtXcnNLseTKFKT01KMNkX3RtCsCjIYJDsz61YtbA6ddQ3EePlfc4QYBweeldpcWkSsg ba6HI5X0Jxj8MVlTwDawwAT0Y9ufrUqrK/KyZ4ZKHNczNb1F4fFE88EYlSPLvGzFd+5eASO3Ir9P P2P/2qNV+PE2q6D4j8OWuh6tplpHdRy2DsYJ4SQuQrcrgkdz17V+ZfkmfVWCxyTFrcFouvAB96+w /+Ce+uxp8YptPEJVZfDBQPnOWSWEnPp1P5V1xm1UVjyp0E6Ln2P0JooxwOMe1FeujyhGptPpGpMB h45PSmtxwetOakpAMpR0NOprUAMPWjtStSdqlgMPWig9aKQFVaetC0p9utAB3H9Kf1GP5Uwe3SnL QAq8nPP41L2qMdf6U89B/KgBw459KDzz601adQAlOXv+VJ9elKPfqeadwF/wD1UUjU2qA83/adt7 +6/Zs+KcOmJ5l9J4a1BEQDJINu+4AdztzgetfkPquv6tqVjpkF1eC4sbaGQ28ajhWYAliOmfQ+1f uDhGVlkVXjYFXRgCGB6g5r83/jp/wTy1n4ZeHfEnivwb4rt9W8MaTZ3Ooto+qQGO8hgjVnaOOZTt kIQHG5VJxjJNc1Wm5NSR2UaypwlBvc+Of7YaKQBEdsDk9OK0vD1497fnz94UBj6gED2rEjUCMzI5 MbKDx9OCf5VoaBMbZr1ok2zxwyudueTt/z+Nc06Vzto1mjS8R+Klmh+wKwlfYAT93aDyevXj+dca kJmLSTKwj3fKpH6/QdabpMV1rdy89ppl/qpRz5iWsTOAxH3Tt+hP0rrdF0Lxbd6fe3+meD9WlsrS Pz5p0sixjTO3cS3bIxx70uVUtjR1lV+NlHQtI0uOCK4vLc3KyP+5gwTnjO4nsKk1/StH8u3uLCHy Z3jLbeXHuQT2zjjrXb6BrGreFNSjg8Q+HdYtpdoje3vLBwxBGQeVI5HT8aqeNvFmkXF3LLpdubS1 ZgsNutvlh22kY5Oc8YqVUdi1GEnpLQ8ra1W0nRniEm8KzbsAqD0zx1rrfD2qwsqSux3RFgIz3HXn 86oam4dml1LTry2CSgedJZSQgPjgH5QDkHpWJNPaQypLb3SPKHXKgYB9iPxof7xWFGoqUrxd0ela 1qCWiLNEwkEigjnOOKyG1lJH8ssQvQBfqD/OslJ59QtLY5fZllCE5x9PemxQlLoKrDhgM5zgeuPp 2pRpWd2KriG1odp4c8UWWh+Kbq4uFVjHAqrIGJaN1CMMjoQckEHsa+vP8Agm3oSal8RvGniKKMx2 trZC3hUjOzz5Q4x+EJH518caLc6emn30d1oeoLrF5fI9pekPHCiK7CRWBXD5UpgjpjHev07/YX+D k/wr+ET6lqAkTVvEki3jxyAqY4FBEKlSODhmb/AIGPSiEFKtdGFWtagqZ9Hckc9frR/nrRRXsI8g KQ9RS0jUmAw/ePOKT8c0rUlIAprf5NK3KkUh5waAGt/k02nH8enakPbr071LAa1FDUUgK60tItLQ AU+PvTR3+lO7mgBx6in9hzj8ajWnUAO/MfQ9aB9CPrSD8fpil/IZ7YoAKKKUDPFOwCUUpOeaSqAK peJNBi8VeGtZ0ScKYdSsZ7N1cZUrIhQ59sE1dqRG2tmgXkfgNptpNp9ilpcxGO7tGe1njYnKyRsU YH3DKa1NInVNSg4KMxMcmSCHVhggjvkV7H+3V8LW+Ff7T/AIkkh2HSvE6DxDaMvLRvKzLOh44/fK 7/AEkX3rweK58tkAICj5cZ6AdP51zzj0OuEndM2NIutc+FPiz+2vB+oNZSxD7iyYSVcYIdehH+Nf R3gP8Aa987SpBf6DN/wkEtv9kmZWQ2csbPksWJ3DAZuMHnvXzst20sDIxAYHKORkEdweafpaC31D NvKFGDlXYjHPpmvOnHmVpnswhTck3sz9OfhX8R7TxteS6pJarcW8zx2UaadqEcsvmhflDrIF2gjd 78DFc54Z8Lal4c+HNjp2taLotzrFm1/epqF5exsWX7S0kfzNGCNitGp57elfHvg3UreyEVxeG+hu 45A9veaXerHNGQOoOfc961PGuvx6xbwQfbtf1YW4KJ/aVyGCbiGcYDY5PJrGzSSsdKwtNy+PQ9Q8 fftZ2U9lNZ6noYurs3n2loNLkjvE/1f8crYBIIAAAOMmvkD4r+Ob/4ha3f3/2CLS47xwsdlEijyV HAHyj7xBFbWtMftALARhfu5c/kexOKwHW3iuBNIxwpJTBwS1dNJKGqOWvCnGVoE0cC2unafHIQ1y Y1dxwoIwMdPxqO3k33MbJjahLM2TgAHJPvVfVb77VfPIfkYjah5zjHWl0+RRFcOUx+7kJyAeiHj8 cCuq1lc8yT1sj9mv2YfCJ8Nfs7eBNN1CCKWc2IvmWQB9rzO0w69x5nWvWHbd3zzVXSmjbSrHykEc X2eMogGAq7RgD2q1XVCNoo4W7u4p6/0pP84o57UYzwPxrUkKRqXJPJoqWMjamn261K1MakA36dOu cUh7fzNKc84OOPWkOe5/DHSlcBPyqNqe1MakAlFFFICEdKctMWloAfRSLS0AKKUHGelItOoAM5PI yPen9uQQaZSrTsApz0FHPQ8470fp70c9uPaqAKO1HPeigBvenj15wOaSlBxQI/Nv8A4Ku6aYPiZ8 NNRC8XGjX9sAMZJjlgbGPbzT+dfEJlM8ErRylGxgNnJXH/AOrt6V+gv/BWawJsfhLqIxtjudTtTk Z+/HA//tGvzvubYuBJEz+ZjcCwxng/Ke//AOulNq6OqOqvE1tC1P7RAiiTJzkZz83vWxJEvnKXQM FOd/OV968/i1CWz1Aja0aLxgrn5SR0/Wu1tNVW7KMz5yo2ls8jH+FcNaDTvE9DDV425ZnWadp+n3 FvG0sjRoD1Ugle44+tVZ7OG0lQLPJ90ICHOMc5PJzk8VWs7qyV4HQKMM292OVPG0D9ag1G5LiaMN AJlDONhLdyME56nPH0rPlm0aSnC+hSktUjJ/eOw55bnb7n61mXzjzwmEyfu7jgdeTSXmprFM8ahh GAQ5Y496wNT1iM3QWKJgUcgEvnIPbB75I6VpRhK+pjXqweiNq7mRHAJ3SMcKSQePY+1aGnFjBeM4 BLW8mFUDHCkfX/APXXPWab5/OmZZJG4LDkKMZ2j0rpbHaLC7LkoGhZTkZCk8Gt59jjSSV2fvbAnl Wtsny4WNQNo46Cps4ArL8Pa9p3inw9pesaRcJd6XfW0c9tPGcq8bDKn646jt0rSTv2966Y6JHIOB zS89vxoB5xnGe1Gc5GMYJ7YqgDnv8AhRRRUsBGptP7f/Xph7/4UgEamNS96RqlgNamNTycd8U1zn HOaQDCdvNFLRQBAtOHWkFOWgBx6ChaSj/9VAD6a3UcZpACfoODS7h2oAd26YoHWkBBI+tO52c1SA d2pKB90UUwCj8KKKAEPUc079Pemld5wOSegrx39or9q7wL+zNpUL+IpbjVNduR/onh/Sgsl3KOzs CQI0yMb2IHpmqjGUnZIT7nzV/wVa8UWL2/wz8IARtqRnvNZZ2P+riSNYQMf7bTflGa/PsspbaNpz x1zyO/+fSvYP2q/jbqX7SXinR/Hk+gf8InNaab9gt9L+1/aSIxM7lmk2qNzbugHG0da8YRjMFeJQ jlssCQBn1xWWIpum0dWHcZrQzNS0yNol2lihBYtjByTz2rGjmvdPISF2dWBCOT93ORXXSTA5jwQC DgqcY5/qKxngZG2lVcA7S/AIOf/rmlTndWZrUpJ6ooxavqLOqrC+0IWKluQ34e+ae+taiIZN0M3n ucs5wVQcHOe56/StyC1tpY1YxKE2buV6Y69DVe40YgjCbI2UAYJAx9Pwqm0tWjnUW9DCl1G7ugCM 7v4mZsgc+n0rR0bTGi3OwBkwWMu7jr29+lSJZRoRujBLfxdMHAz/IVuWsTiIRsRg4Py8jGB+VROo rWRrCk76kS2hVVUMCM8jGc4pNSvfskMNqrGMXM0Ktx23jP6Cp538vcVRRnnDDvn29qr6HYtqPiW0 dhmG0Yyux5Vj0A5+tKinOaiXWSjBs/Vb/gnv8AE+11TwPqXgC5uWGqaPO99YwyfxWcu1yEPfZK8g PoHWvrVQQOf51+M3hP4h638OfFWl+JPC92lnrVkgETzJviPBUo6gjcjA4Iz06EGvsf4K/8FKtD8R 232P4maK3hbUY32nVNKR7mwcc/My8yxduPn+or0alGUbyS0PJhVTVpbn2tnAPGfpQDkdc/SsPwl4 28OeP9NW/8N69p2v2eBmbT7pJgpIyA20nB9jg1uHrjnI9a5nodAHHemnHalJxTWbpUgFIW280mc0 h/CgQpPbv9Kafbp9KD9T/u+tNapGBzjjrUZznnrTqRqQCUU1qKAIxn/IpeO9JTl/zxQADHal/z0o /z1ooAUd+n4mg0hppoAeven4yx4/H0pkSsSWHCryxJwB714/8AEL9r74UfDaea0ufEa69qsfDad4 fj+2SA+hdf3akejOpq4xlLZA9Nz2UEdT82PemTzR21vLc3EsdtbRKXeaVgiIMckknGK+EPGf8AwU v1ppHXwn4BstPhBIW58Q3vmSMOcHyosAdP+ehr5T+K/wAevHHxlufO8YeK7zU7JX3JpFqDb2UbZ+ XEC4DYB6vuPvXXDDTb97QxdWPQ/Qr4v/t+fDX4biez0KWTx7rkZKCDSnAtEfP8dyfkwM/wb6+QfE P/AAUL+N17qYvodV0jQLFjgaZYaUk0cQ5+9JLucnpzwPavnS4vYUQ7QQoICk4I/pTJ7pdkyEs8ZG AO355ruhhoRW1zCU23oex+I/2uPiv4kxLe/EfX4i3Ij06SGxj6f9MEU/rXj+u63deJ/FUmp6tqF5 qGpzfvJ7y+uXmmkwMLukYkn2Bqmk235eCuSCAO35/rVJjnUbdmyTIdoK4PAI/xraMIx2Ju2tWb19 IsttHE5Yx4GCw5U965NLM2N20O1Qpzgjnryfwrpp71J71S+0qAFKdRz/8ArrK1toi2xmIlx8hXsM /yrnr0lWg49TXD1PYzUunUQW/2iH7nybAPQAe2T1qvcaducAj911JIGD/jitXSYzKJFYq7x8EEYH PQ/j61bv8ATGjYOsfIGeDjP+NfKScqcnFn1UeWpHmQui+E91uJ1XcOi7WI5x6ntVvUfBTwWpmkb5 slsO2Cw9CenY1Y0DXn0yWPzjvgVsyKQSeRjgU/xL4o/tZ47exkf7MuAsjjBJAP/wBeo9pU2LVKmv eOOlsxbkBYwu37205z69auJZl0yx3Mx5Htgdc9P/rVpQad82SGcE5DZzjBzjpj/wDXSXMTxP5edx xhgBg9qXNzdQ5FbY5+9iZQQuGJ6LnO70FaGjWS2ELTvGS7MzNwOWPA6HP/AOqpYrLzrgHaBGn8TE deccH8aV75rmcoFMcEByQrZHt+FfR4Cg0ueXU+ex1a79nHY2Le681LdGY7+gBOM8+wqtp1zNFcyH +Ek5BJ4Ge9Zq3atbbtpZuiAjnJJ/8A10W0r2kW5WZ5NxBckkKPXPf6V7Kj3PHvY6PTNVn0fUk1TR 5ZdH1BQGS/0+V7adD2O5CDXq2n/tlfHLTNOhs7f4l3DQxqAJLrTbOeXn+9JJCWY/U5rxT7SCVWYg +rqMH0/H60S3aqETcGJJyMcjHTmsJU431Rqm+jPpfw/wD8FEvjL4ZYPqFx4f8AF9sNpeK+0/7NMc ns0LKoP1Q/Svof4c/8FK/A3iLyofGvh/VPBNy2AbqP/T7P6l41Dj/v3xnrX5wC5LoWVQxxjceSBn qOPSpkneOGM78KTuXY2NvHoD/nNc0qEJbI1U2up+3Pg34g+F/iPZC98LeItM1+22hmbT7lJSn+8o OVPsQDW4V2k5r8M9N1GfT7+LUbPUb7SNQjYsl5YztDKpGDkOhGOn619B/Db9u34qfD8QQ32rQeON MHW21xP9I29OLhMMT05cNXLLDyj8OpsqqP1JpD9OPWvmn4X/8ABQX4ZeO5I7PXXuvBGqNgbNSG+2 Zs4wsy8Dnu4UV9H2GoWusael7p95b39nINyXFrKssbD1DDg1yuElujZNPUlbOPu456UjZzyMU88k nPFIy5HXNSAyim+XmikBCDinA5pFpScUAOWlpqnOaeqFztHU8DPana4AqliAAT9BXg/wC0J+2b4C /Z7vRo9wZ/Ffi6RNy6HpbpmD0NxKTiIH3y3+yRzXy3+2P+254tu/iZr/w7+H2r/wBg+GtH3WGpar ZoPtV7dgjzkjkPMaR/cyuGLB/mxivjchI5pZAWeWbLyyudzSMTyzMeSfrXoU8M95mEqnRHsvxk/a 5+JnxpkltdX1ddJ0JiSuhaMTFABwQsjgh5uP7xC/7PNeTwazc+WYGIUFQAkfHGegx3xWe5EhYDjk jPX9Ka7rEMD5AWGeevFehGEYqxzttu5cldZJAQCUPTnkcVWmnJfKklsA7tv+femhNoUbiCCM5GeM 9qRpAqEnnB4H8sVoo2JvYjWVioIbYO3OPbtTtxmBULgvztbkg1G8TRTdAvHOc/0qRUQAsV2qTjHY j6cUIQso2SyBVIjJ6qBx1qBnCBJgMSIQwAHKj/AD/On4LKBkBgeAVz/nijAKPwQW5yD3/L6UNCT1 JBdebMsykrKyhmDDqcVmeY73d48sgYpKqLjqAFBH4ck0Q74N27lQe7YJ/CnSOsd8H5CygGQgnGVw B+JGPyq1ZO5nK7J7WSS3tjeQgu1oGSSEfeeIkEnnqev0rttLSPWLUOu5EkQFdzYPTI4B+lcNDdtb ksxLowKMAOx7Hj3/lXReFLuS2nez8vzrVgZoJFH3RkZBb09q8LNMLePtY7nvZZiFf2U+poz+E5Jv MaOZiM5Gzt/te/FFr4SlVtzOQFbOMcdR1/I1svc3NpNuQIYsDBVx09MU2TxBOIyghWN2BO914Of8 K+Y55WsfTuEE7iGwFpG67SfvKAGGe47dK5fU7+KwE0sxYRxAs4AH4D6kgCti+v2WLzXKliC6xocH bz154H1riNTuI76dCrP5QdmCtwJ2/vHPO0dBmvYy/BSqvnmtEeLj8bGnHkg9WP0jWmksb43KAqMG MqvIyemcYJB/lUhBitiisDK/DMTkN35/Wq0GZ44IAhgEv7xs4AAXkDHQkkE/gKtzXDK42g7sk5LA 49/wBK+tUVHY+XcriySLFEqIcMOMjkr1HP6inLIFCKAASOOeOnP8hVRLJpJyZGwWO4Bu3tx71MsA TATP8AwEnAyc1PNy7D5bltpCgAwTIeBnPA65JpUhUHJJYlQRnJz/getQCOOI7Gww6ZIz296nLh1A Zh8wDDPGPYVPK3uW2ugm4LL+7bB556Z6ipWmLESHAyNuDwMZ61WG4NzhcgkHd7fWkVy5Z2OdpxnP BNNpIi7LsEzAl2BwzdCe/p/n1qQX0r4JjUqB95gM4+v59apQy7htJx1Gc9u1PSQybSMNkDGTnnr6 VDVyrF5LlJY1UxtgYXLEN39fyrv/hR8Z/Fnwk1U3fhHXJtMXcHlsg/mWtx7PE3B+oAIzwRXmccu3 dGBuPdV+uakF4XJ2MqnOC6jsOaicFJWkVdrVM/Vf8AZ7/bR8M/GQQaNrwi8LeLn4WCR8W10cf8sn J4J/utz6E19ESKUcq3UV+GdldttQKSHHO5Dg5B65z1r7b/AGWv24ZtJ/s7wl8R7w3umSERWXiB2L S2+fupcH+Jf9vqO+R08qtQcPeWx0QqKWh93n64ooVkkRJInWWGRQ8csZBV1PIII7UVx3NyClWkPS g9aoQ8cHPp2rxz9q79oKH9nX4Wy6nbjzvFOrlrDQ7bYHXzyuTK4PGyMfMfU7RjmvXrm7tNOtLi9v 7iK0sLaNpp7idwkcSKMlmY8AD3r8hv2mfjXd/Hv4p3viBnkj0e2LWukQk4WKzVjtbH9+Qje3cZA6 AV14el7R3exjUmoqx4sIWRC8kr3N00hmlmY5aR2YszH1ySST71IzBsAp5gxzkcCp7yDZbtLuJkfo C2FC/5P6VUV+IzuBwBjPA4Feza5x3EGc5JO5uep6+1N6ALv42d+h6/1qQAIoJBK5455ppYxA4+UD JO41VribEeRtqhTvAzxnjr/jSPtdWDAOM9WXmo4SJC5LDaGI4HvU+N0WMff68dfer6Bd9QcK6HYP MJ6bfpUUYJTDliSMZPanRuFPylgR0OajmQJcBuFwDnjjke/tUNdRp9B8zbWGFGM5ODSxqQnHzEA5 OOnOKYzgMGZhgHJI5H+FOjY+WCu1ecbh3B/Gq0uD2KsyZliZcEOPLwTyOeoqGRLd38uE+dJHCkxI bKgMWAIPfOKtuC8JRXKFFIQ5zj8M0y3tooS7IrK86AybmUhSOFQcdAM8D1pbSsS9iPBaEtj96pyp PJY+547fyq7b3kmmyx3dszRq6bgQ+dh5BBHp14/wAahuCFkVQdkh42Zz064Peq6zG1fPW2P3l2j5 eece3SrlGM4uMkEZOElJbo72PxDZ6tpy3CbUZBsZVXhWxkNnOMGsTU/EcU8hitI2VWGDMSST1+6M 8fX9KwobRLdZnhb93IeFYZ2n04/OnJDuJbaMAD7o+XGOa8illdKE3N6nrVc0rVIKK0HhXn5lDmPA IRiSZM9ycZ9sfpUUm+Wc4GCxCAg8Yz2/w9qlmJFuwR23nHyjqxJOAOPc/hTY4I2uonmLs8TZ2hj1 9TzXtKPLGy6HjNubuy2bOeMQSyp5PnRmaEEcMhJUE4/wB30qmWJdyFAGTgKc+pH41FZQzWWnQ2cs sjNGoiKs2ckE4bPpgjirKqIizEkvjAC4HOMZHFZ2bQ1oyXACBCCF6EsBjp3/WleTb8p4LdMHAHv/ OoFMk+/AMY6cDkdP8A69SC3SM5clixzgjgH/8AVTSsUnd2HByWCkfKcncTgd6lZjDFgEE44A5Bpk cmxFZ+TjHXIz3/AK0xpWfdhAVUjDYwfwqG+xoo3Jt5ZD8oXcTjmo/MEqhkBJZd3PIpY4OcyduMY6 05kGdy4wD09PTHapuw21GlC0gUsA2QMZPofSo5LlowYoiQzZGTzzjp/PmnMzWqMQwZ84AUDGcZOK ZbxCIKGfbIz8E88Y6/j0ppJaicuhPFvWNjkFyc5zyPTp+FSuAqtsTqcAnqR60yEh5wx2hduT6+36 VIdx+/xg4yeg9qHq7kIlt2EZDAkYOS3OT+H4Vr2jefvzIieWu5wwxx61mWuDCCxG4cjBOGB7VDfF jMJB8qpjAGMFhzz7f4VDXMyr9T70/Yr/a703S7ZPh74yvZ1tY1MulapMjFIkClmhdvTg7Tjvj0or 4ahuPtFlZuzPGwBIdDjPX/ABNFeTUwz5vc2OuNVW1P3IGcDPWgjPHX2z1oQ4PHU8V5P+0z+0Jpn7 NvwvuPEdwIbzXrsm00PS5Xwbq5IOC2OfLT7zEdAOxIrlhFzdkbPRXPnP8A4KEfGqW51S1+Fmk3xi sraJLzxCYTjzHIDxW7n+6FxIV77k9K+F7zUFvctF8sW4DBHIHb+Qq7res6lq1jNqOrX0uo65q8zX t9fyYJmmkYs7ew5AA7AAdq5qaQxPhSAuRkL0x+de9TpqEVE8+U3J3LVxMJUWIKNirwMe/+fzqrb4 3MhyecgY6U9QUAOTwT8wx/P8KhiLLfyDGzcMgMxxn/ACB+db2JZZfbtbII4xVeWQuSpJyfUegqwC GzjOG7Yzjn/E1XljL7HDFjyvXPBp2sAqRY+/8ALyQCDwfenwEyBfk5Y9hx6ZqOMFJBn5nPOSM9qk AVyARzg4A659qqxLdiFsJITjah5yR157VIw27ucfMCM9T6Y9qZIowARuyWPXjHTpT0QBVUZbqoyO fpRYd7oibIhwQSx7c9++afjhVHQdlbIPrTQDsOAAM5BbtipH5KZ79CB056fr+tQlYCt/qpxhs7Tk ZXpxxSlGj3GPDbunHT1/nU00ZWTcwDEAn5T7EA0+L5DkqGyMHnJ/nxVOI7lee3ju4droc8hXViCp 9R+VVoi6SpHIHYErkFeJPXAzWsAclSRtIwDxmq96puFO4EOcBGxls5HNCTiKWpBsIKxQxHbywJIA C56n071OLfjaAFQcnBzu+lULlLm4s5mt1LhwVkQyqu1CVG7nG4gZ/OtO4uYGmuBbLILUyERb/vKg 4APJyRVKVnZmdtNGRSoUwijaewbnaOn+frTC4T58OwJJODkntmoXuiQXfcrtyoIwQDjioJL+U/ND ExXOwcYH0J/HFPm6go9C1K7zSliSoIA3/ebv8A5/H2qRYdjDGH2jJFUoBdXALORGpG35Rz05x9Ke LNiHDOxzwzN0IzUSnfRGiiXRcKodSwJfACJ1b0FRC6dzkbVjXq38QOefanRwryVQYPU9zgfrU8IG NowMAg4HtUNN7miehBHbAY65JxySe3X/PrVhMGNQF5VeRjp1pANwcjKg5wx54x+lSbfl4bJyQM4H FNIlyewivgoMkncQCO1MB3O3yqm75SfU/5OaGlUMFTKDPIY5yR34pvl5VmUEgDC5GBn1/KqaJ6DJ GJmO4lVGBgcZweakid0GWyhx/e6cfhUDZICj5SByQec+3tUmRhypwCccE8dqLaC2JllEHmZz2DE9 T0/M/406KV5XJQ7Imwcgc45qrMslzKsCsdoXcfckY5rRLCIKsZBUEquMBiRjLGhR01Jb1sOkYpA8 ZOD3AXp+BqBiWXYWOW/hI45Gf61KArRlS74B4yeTwD+vSoQnmDnadqbsgnBOOBnPtWbt0L20Lius axoTlRkBVNFQxydAMoQM4bGR+n8vWisLGmiP3E8SeJdK8E+GtV8R67dpY6LpVs93d3DnGxFGTj1J xgAcknA5r8bfjx8ctY/aP+J174v1JXstPRWtdH0t24sLUHgHsZHPzOfU4HCivsT/gp78Vf7L8M+G fhpbuUbV2/tjVSrEA20TEQxn1Dy5OPWEV+e+lTrMyNlnJIOMY+Xrj61z4SHIuZ7m1aTTaNnW5F32 8HGFiB3D7ueO3eslguJE2YTocdfqKv6iZJ7kCTLLhSMjGR6/pVNX2NjcM4JAOOK9KPkcZAzM1mxI D+XjeCcHHqaezpJ5TAjbkd+ueev4ikg+S4KYVTIvO7n8KghVjabZASyMUBGeB2NN36iT0NGQv94r kYyTx61XDJI0gLnax5wAcU9T+4wfm2cjjnpUYOCRuBxkqDkHr7UM1Fj5YNgKwyDk4p5ZQwxhD1Yd M9KhJZC6EEZ6DjrUzHGCGKnnAK1ROm4kqZB+ULxjPJqIszO2MnJJOcj0qQIpYcBSoBXnkDr/SmHC sw6+nHOf8AP86BEgUNuJQAAg4H86kwSy7fmBz2JoiYFQ2Spxjkcn8jSu4j2qpGScHIPPemhMrXQM TqMYCjB5yc+341PEwPyZ2kAAlRgmoZwDyQME8biMY6VNArSqp35JGBkZ49KkaHn5WZflLJ2P4VBK S8hHPyhjkdMdufxqWRixLNkcdzjJ/znvRFyudmCRyPxHPWmJvoOSFUUAktjGR0qN7RQHEjPlACCB nPPoPr1qYhGZVAxu+X58dPSpG4jdVJYyY4U8diOfwpit2MiNJQwEkgOCSr9sdv6VOLePBGNw4z82 PQntSwZIVCzYU7sqckn/Dip0h8zcMBVPcpyDUl7kbkE7TgDBO3d2yf0oODEpwc9Dz1OOaWRVMgGW UnPfJB/OlGRk8gH5cN1zmjR7Axm7lc45GQuKf8ibhkk54Ge9Bj3oGyCuMgHPUGnOmAduTg7S2CGo 0FuJxI2CQDjpjPf0p/CjP3sEknFIrDc24BsH7ueeuc8U0EDjfzjPI6frS66AIU3ZUEHjKtnj/PWo 7kcxoMAZ6Z6sRipIiJCQ2OQc9/pzVW7cSyoWfcf4cnr/8AqqyW+xI4CuAhB3L93IGPwpS6BS0pUI uWwenT61M5AjOduQepbkZP8qpyfLCxBbBZVyASTk470+gFi1hWOPdLy0i7pCDjn0Bz3Jxj61byZJ j5m7zeeSBgADpVZf38xBLFomyxcH5Tzjoe1SEKQeMDnKj0wR+eKmXYEtbseku1RtAVnGAQc4pkxS NFQDAxkn3+n0P6UqEOCx5VeBgduM/riq7MIizt2OSpHAz2/nWW7Kv2L0IXEXQEfIWJI7Z/woqlBN 5AQryB/DyaKXKDZ6T+078Sx8Y/jZ4z8VxSeZp8t0bHTSOcWkH7uNl9A+1nx/t15hpEavCDkspyCS 2Dz9KvXNqYo1hiGQi7SAQM++RWbph8kzINx2SBcYycHofy/Os4R5bLoaSd4mjO5Fw7HcHAHGOeOc CopQwyMqQeAp5INC7i7nB4zxxSFCrEcKQMYJzx/nFdCSRj5le+BXbKoYFTwVB3Hnp/OmPmO5ZlJC TL5m8jK5GAQPwOadcfMoGQVDduP896rxMZrXyl/wBfbtnGRnH/AOo1bEpWZes2dY3HLcZJz39f8+ tNk3eeSBtAyCNowOlR2zqxV1wwIwD14/z/ACp07FSx5AYbVcjj6fqallp3H8ghgMH+6e3rU7IJAw b727Izyf8APNVgM8ZDAg8Hr61ZUjbu84nJwOQcdcj68U46g2RSbQcucADt17iogqOuS3y9Mk568V YYkZOF2sPeo0QbeEJHXjpTaFqWkdZMYBLdwTk//Wpu4sGAOce1MjG0KMlc5OQcYzzTkCgAnnJJwR 7mlsK9yC6JMXcMeFz0zntT7b5VXOFP3ipHqelR3DGOHk4GcjBH0OfyqS2+7kEkrxz09qRVySYcdC ecEHqT/TtU0LbwxUBuwIPHJ5qN8llIYjjbz3+uD/nipCuIHDLndj5h82OD3zVJEvUcMseAAT2I6D 8PxpwUlW+98ozhe/IyP0prHC/MGUYPOOtSb9pwSOBwQe2T/hTFdmW67D8xAycgZJAwOmcVZDmReR yASWL8Yz0A/wA9aikDLGfl3MQPXpTYCyOF+U/Nzn/Cm0rFFhkL/MDg5HA9KRVIQEr1PYd6eGBHHz Lk/MenfmmBt4zjClcYVvas7D8xpXysjPXJwB0NL5gU/MCV7gjvRjO4biVB6AfoPc0MSxLDGCPWqu S2MYZLKowSen+FOQl15HLHqTUTqXxkenQfr71MjbCcNuj3YOQcf/WoB6ICmxAchTg4x0PpVIANcB Wx2ySMfjVy5crGRnacHacdBxVS0QiYD+HAzn+HHXNFg6k0vPDnfuyc7fY0zCr9kR8SCJzK65IyoH 5dqdK5kYHOfU5988frVXVpXa4jtoXAkeM/MgyVGVyfrxj8aTGlYksGM5aZyR5js7A98kntVx3Y4X ywSV+cZxgfX1qvAv2W0iEeX2ADDHBz9KdbsFheSQEydAx7ipbKTuyW5ZSI0UZ9ehJHP/1qgcdsY+ XhgO/1+maa0q8O7MQSAMdCPr24ptuwcjB3E8jBNTbqQ9dES7WdD8uVzgLjNFWIcbgoT5RknBJOaK q6LsSX4YagnJYMB93gDI7evNUJf3V0k275XHkycHnpjHuOmferFy3nRxswIIHJYnI+n5VEQr70kY hZPlY7RnPT8+lSkrEruSIcb8qFYnB+mf50oRC3IOP4jgYBqCF2UnzCQwyG29QcZwPrxUzt1bHz9v 5dPzqidyJV8r5Q3Hf5qz/OFleoSQI3Gxiucr36+taRIDlxyrcnaMY46kVR1KJWt32ljKvzdR8xzx VvbQTViZIVtL8hAWilO5ct90+nuP8ACrMyjcM5IJAxn1NUra4N1p6yh3ZUYMQrDOAcE/rV4MZNuQ AQee3fqaVrlxd9Ssc+cD2XgYPY4q4rrsbacDJY7uOgIrOlfypnO3c23JGOvXv1q/auoVGQ55475q UU9tCKYkyKoORjse3rUg2ktjaR2PUjoeacyvswTkEcnGOM+31FJGCQcgFhgHP/ANerIQ8cx5GDzy ik/TP6U5snICn6DnI70Ruu8YBA3HucUyVwo3MRvHO7pz6UxLQq3IBKseHB5KgYP1qe1YBVdcLjOQ p7VBcHJX5gnzZJUD09amj2IFHQH5iQQBgUDZZTcGAyC/p0z2/rUyoPKH8IyOgOMY9apyStg9MD1I 5Pt7VciIFkrFQzZyST047U7iewKwKnBUrxjg075kEi5AxwXz7f15q20MtvpUcnlIs7RpcMyv8AOs Z4G4E8DjI47dqzZcFGwScNjtjPPFJWlsw2Wo2Ml4tuACcDaBux2/rVbYVlyfpj8etSLzbkbhzjnG cH0xSSqGJUjj3HFNJ2sN6ExbAbgMN3frSJgBjncDk8LxVm5UTxkq7HHGS/QdzVZP3jEkEMdxxjOR jH9O9FrEp9R7I2eFLDphTkY4JP5ZqGVDtB9uhxjmpCrGPgAjHT06UZ3qnzDuPlx+fFKxTve5GPlb 5lY4wflHbp6UuzzBtClcjBJOPXv9KTzAQxCMSeOCPwP55pJZFBwgcL656/5/rSFuRyy9AASqkEc5 B9ARTLcFORkpjnAznjrUUsi7SpDZUg8dTj/OKlXBt/mOfl3H+dO+ghqtlwCQ5ABJByPx96idt+pz tuAKIEK4yf7x/mB+FWre3CsFEZ3biNobHQDtn1JqjGCjTScM7y9ATz2AH5+tIvcssFa7kJ4iHzDa M/Nzn6UkrgJsUYxgkEc/5xUmAkQABRyu3d1xkfzqrduBG7Ekc4HAPB7YFJhew5n+Yr5gBxkDocVJ bRFBz87AY4HXnj+tRAeWAXPIGC+3PXsPenedIrq8ed3zblHCsM9D78VnKaRUYuWxpRqA+Rlh3HcU VHayLdBT91tucHn+XHpRU3TKs0MjGY2jAGGyB0wPX+RqJrZblANw8xMHgk/pTiCm5Rhvl5xyP5VX z5cyMo8vjG7bxt/wD18VotUZtWY4yl42nTLvn96jHJPuPenpeQMMFth67SMGlaEH95GinIBK5xng f4U8LHI25o8jnPODyO9JbjKkt1EC2H3YGeCSMf40vmM83kyOHLAMp24xx0+nX61PJapFD8oHQHaR jmqWGhlG4nK9SDx71V2txWTGaZbmO8uLYHKsDMqheR3P8A+qte0O6AD7/GT781m3I8u4tbrbuHKM A3UHjv+FXLU4nKYJAJHQgEA+uelaWJW9iG6G1t2SiY5OeP8/4U60ZkMYbH3eMevPvT71PlwgXbnO MnPsTUMOV35YscgDPPfnn8qzehpui/IBICTn04OKYmJPvLg9ie/wDnigHcuB+ePam7QzABQDn+lW mZpXJFAGGLHbwvHAA75pGGPm4GDzx1pyFnAJY8cgYxTZQyKCvzcY+opsaRWdcSEAE9xtPp6/571Y hbHI+QMMYLY/Cq8gLOCqZZ+/btmp0+6x4OAQME4P8AkVBWzGsAqZxtPJ6YNXoY3SzGfmORjuF459 6pRybFCfez8oCjBIxjA/DitMeYiQCRiM55IAIH9f8A69UkZzZJ9oZ7JI/Kg81YjbvcMB5hg3bgmT 9SPpgVWY77ZiTtUsQB0wSOgOP84p6MpC7csQSQi45qNmZLZVBYnczAEH04GaailsiblZgDAmSWQk AYPWlZFDoWyRkMcDnGRz1pDnypCMMQNxx2pbYeelurfLu+X5vc9M9hQtWW9i7P5YVvkG1mcAMvTn pj+tU3jeMnIZe28cfN3Gfz/WrbXbSxgTs8vPDk/vACMde/SquVeIFW3xhiWP8AEvJHIrRxMk2Oiw w80YfBOQT/AE/EVveAdC0bxJ8RPDWk6/erp2iXl6sd3MZCoC4JVSw6BmCqT2zXPq42KxADZyAQOB 9Ka6JOXD4YHqCBj8azkm1ZGuh9cXnwv8K6t4N1TSm+Hp0m9eCZXvfD+k2t20KBiVNvI7bxJ8nDs/ RuleBfGz4YaT8L9Q8Kw6NrV9rkGs6SdRkbUbdYmtn80p5WVxl1xhsgYI4J7cGI1gsTZwyz29uzCV 7a3neOJm/vFVIBIHciop7uWaVRNcXF08SbFe5leUog/hUsTgcniuGjQq0m+ad0UmrNFabzMrvHRi oXPU4z/n6VPG6rbBmyAxx85+9wO1VoVWT5m2gEkA54NXJRtEalcrE2Qrciu3chu7sJHl5gMqclic jgZPr9BWfayKsckkpHlLI3ztgL1yO+Oma14pzNJKxIHGCq8dST346Vzmkkalax3lyoeOTJghY/Jg AjeR6nt/Kk9GX6mkblJiiRMWjAOWRsrjrnPTPHamtmeUu7YVeWBIJbnjH4VXMoRg+NiZxtCgA+/w CH+RUkSiVVDOgjAPGeSe/8qhlJJ7jjdOwCLIquGySpw3XPNSggq7/IEIw2T1BPNV5dRt7Ybflkdm +XI6dxk8+1NgnnUb5hGrOF+VSSdp7H3rLlb3G5JF20YwM0fA5+o6fzoomXZGrF/kYFgzD3HH86Kw 1Rto9R0ku3GQpIHAC+tVrjMxI2ggnt1OfTFSlfmBdgTnHAOR9KcqoqBQg2f3eCSeK6kmzC6W+5KS u35iysowWGe1NIKO0nChsb1wS2MdR7013CMoIG3JB4/KlLhenfkkjHTj8ela2IUhiShiWVsAjduH Htmh4hOHZT+9yMOBznqDz9TTJi0ZMqRnZJzIucY9wKCh3II8bBnOOvU9qNyX7ruhqAB2t5lOxlJG 7GQw9KmhJYrH94NwTkZzx/nNME275ZEDk4AycGm27lrjcUUZPygnj3osw5rtF65BeJQVUs3PpxVC RvLn3nL5YnDHGPT+dagbMDO6Mw288fgPrWVcjy3RWACgZORgYpSRpHXc0hnAXBLMMMVO7Bye2fSo gpM3QhQ3oOn/16dAytHsGMv2HccU9lG0kHAHbH04pogcjDAyT0546cZB/WopZWVXw25+uMDrjr+t SAYcksd2OwOBVaTfyPy468/WqEhkchkkz8uAuMjuatbWWEptYKM5Xnr/nFV4EVwy4bbk57c1PKuz c5CjZ90kZ575/ShrqU2R26kxIMbsdB/n860XYosSq3qODkjJPT/PeqVqoYwqcYGPTg/wCTWgEZ1y 23JI5A45+n4UIT0EOChAJ+bJ5GcZP8qbJH5VkDjg7ht688de3NKqeUADlgc7SM/KBzxjjvSzjNkp JJGT8vbJI9/TFO5BUiLGQjOzOSeDgUmlPvZFZORI3DZPf/APXTU+WQkjqwGAe3PNOgARwWUbQeSu eKL2L6WJg6oV4wQBx2P4VWm/dTbhhM4BO4jHOeP14qyWyxULwB1AwKhuI1dNqsPlH/AOrj6VSZnt oWY5kkALxiFg2RJF97r1I7057WQqfIxKqKwZ054J7g4I65rPLgM4Yhn7BTjqRxntxmrWxfMBwSQS xKjOG6A5+lD0AhWbKnaRkcAHPPt+uaqsGbkDywSQCR6ZGevrirc08iBvm3MF68AlvXNVcFEdW+bL Egg555z9alvsVZkCOMLHuy5PG4fl/9erdxuIALllHAIO7HrUNspWTPygjGAF4Ipb0FxhDkjoFOOK TY1uSuQbO6eVd5ELkkng4Un8CDXPeH3/4pvS+F4tY/vcfwj2461qa5IIPDOsSYYgWsm0ZBwdv/AO s1nadGtno2mRDbn7NGAq/Lk7RyfesXqynoh09woI2xFmyRuB4HXP8ALGKqzyF7raVAbLcIPl9j/n 0qULJLIQTjA3ZYE/gD9aakQgGAu1vvMcYI+o/Gqv0FfW4qwqD8kYkkxk4PTsa0I7d5XHm4aQkk4z kAAVDpsHmPcTbfl5SP68Vo7Y7dm2geaTj5iM9Bnikosdkndlho1mUJI2RnPAGPbHSiokmUBSSOck Nnr+f40U3Ed7DdhbYApdiecHFOFszOFChCp2gM45OP8P502aZy6xKCo+6No5IP/wCum4Yvx5jDnB ACgfXJqUtAe4rwXBBz9nChcklz1z1/X9KYy3HnEbrZQTwW5B9zzzSKm7JQSFAcFlHpycmlEiKo+Z tzHjuvbB45qlZ63DXexMAsgwoG4sTtAIH51GVNvJgZ2SHj5uFJI4+lOSbMpRSmQcDgZ/8A1VOY45 0mSRAysdpYAH+fp1/Cm1poQn3KWGdyu3Y4wCFPf1/pSAAzjO0hugz19qYkZjlkjYMZIyMNgjcnPP vTbh8NCWK4DKpLHB54H86pO6uTaxqQYxjj+8DnpVW+j/0hSqCQYII3cY/yasW5GQAmAuFOT0PpSX kXmoCAQvQcnNJ6l7MS1m3Q7ZEQZ4ALZH6VadgoUgHOew68VQtm2uyAqRgHIHQemf61oEF1JBzzj1 /D3pxHJdyPqvLEEYJBOCahuHbaVYBw3BI6+vP5VP5aqCAWPB5yeD6frUZ5BBG3kAN26jp60xLUih fBI6AjIUjtUsy7InBYFs8ng/N/+o1CA0cm4ZG4n+XXP6VNdrmJdpyGxnPue34UDSsSwxgkksA2By BnA9/SrjMAMLz9CahMSpCvCscde57/AJ1PtxIwGVPPBO40LYVkwHy7VUEtyACM9s5xTZWbyUf7oz 09PalYDyxMQyRuCQ38JIwDTJEO1FBZlJJyGOT9aHoBT3bZlZWyGzz6jn1/KpdoVgvTfj5VU/T6dv 1qC1ddslu5H7tyVIbnkDse1SKWAJGMAHjv39qW6E9GSRsrIdrd+Cw3c9+akdQ6YXGew5Pb69agjd yvH3cYI5FWFG35hjHTBPJ5/wA/lVXJerM+4QxSMVXayYOQPz/lVjd5kCsRuIX+Lge/FMmhZlYcSE gchsce3HvUUZycHIXGee3+c9KpitbYJX85jztHGCTj0qG4UJIAS+0HkE/h+XFTuCGkbd5gJxgN0+ gz7dqJIWYkgAMRjO3pz71HWxVrCWyExtlQQOSx5/Co3jZ3bso5IA49+n+eat2wXEi/fUhi2wY4xj I9+RVcEgF+cZwvPWm9gW5j+L38jwlrZX7pix8wz1wO3FOuE8kqjKGKgKApIGcencDpTPGCG68M38 YU+ZLLHEM84JdRj8c1JfyCSZm5zuIw0eCR/kfpWL+Mp2khsR3Agkh8L8uOvrg/0qFLb7VcsMPHDu Cq56nn/wDXVtHWNM+WysfvELk4Ppjn0qWBQXLRsccAjGCf/rcHrQ7Xsh8rWo90aOFI4skcZ3HkcH j9ajSzjhG4RfaCSRk8nr1PNS+cXfarBgpxgDinxXWSrIT3yQ2B3zVJNE6NjrcpEAu0IcltrDB7ev XrRUqSFMiRN3quNox1/nRTuytCCaVFjIV/nb5sZ7/5FSRW/nj97/qx16dO39KSVIzGUCsM9SVwcn I4NOLFQFQMu4Zzk8/nWW+5d9NAnvIYFVBgydgenTpj86zFtkjJ8ssAT8sRbp34z0q35icKFBfdjd I3Pf8ACq7yyJuy25QCcFe/bGBV3iQ4ysN8yQHa+4ODkeaB+pqZbqWPepchsdFIyPzpiol4rxSkBw CAGOcfTPQ8/rVe8Eli5YgNEud0qk9/Uf1p76ke8tWGpXjb7a7ZTtjBSU4xlWPPTHOefwNZ+uF7u9 0u1QEhpDdyEYwEjwQMZ7sVH51rbo7yGRSrEOCSWXPUHt261gaNcpf6pfPIoY21slmG/vMG3Pj9Py qHddSoyvqdpBIdxY52543e44/GppEBRc53dM44P/16y9Nk82GM7GLJ8rFTuHHGfzrWUuAMeacLu3 Ag8+nP41r0HexQjjKSYIUHp/8ArPrzV2NiQDhZCy8hTnB/Kq+zcpCN3yDnA9+R1PFS28xljypDh+ d31pLRjfclZAQcDHyjlTgmqzSnLEbjk5wPWrDjardRgkEnpVXZh1w2d3zDjgjNNuxEWOAJVcHkYO SDn1PpUl1H+7UBmRQPXoc9alRC5IXAwCcgdPbH+etNbDEouA47k8Dv61Qr3ZZTEyZCgOy55H3f07 1KUMnzMSUL4BKnK89PzqBBvTMhJBG0qen5VOkYyoICkEnBOce570C8yBriRSsbxyxRGMjayFkMu4 7gDjHIwevQCnAssbMOSSRtxnt+lXWLtbqA7mEE/LnPsTz3xVWZiQw+d/mHUcYx9fSko8vUbl0My6 3QyRXOQFBPmfQj+dWVXbMdmAWCkHvk/wD6qbNEt3bXFuQNrHcBjJyPSm6fI80SQuWaSL+/j5h6HP elsVuiQHy5iGJKt6kEcc0/AAO0ZUfMCDnA98UkyFJlbkA8H1x69aTbvLbSoycDJ/KqBb3IQGAaI7 QQdoJOATjt7VFewFP3ig4XPyZwvHfNLOGA8zOUU5II7dM8f4VIGWVTtDFM8Y5Hbr7U76ikr6gzBw GDllYZz6e3X60rpgYx8xPIJ/OoRvR8Dlem0nirLKkpCAYyfXP9OKTXUVyO3d4svGQ20NgOOD3z/O q0+E2vtY+b83DA7f1qxE2FdXYL24HPtx61AIS0uCgTAztx0HfvT3QLUo60hmtohKy/PdK+08EkEs B09QKqx+YbgymMuRyxRl9evP8AKrOrjyo7HL4P2knJJLE7SQMYpkdlcOpaMxxGYklmViW6jjBrCT LSsSeVNOrzmNkY4bDOOOf/AK1Kp8olWDYPBwOCOp5/Gs+60zUNyFbmOTIyAoK49jn8ePXFRR6Fq0 m9PtkKZwcpJkdBnjHH5/hU3HqavnRKAxmZV5Gcctx2pPtcIYfvGzyB+8655/pWdH4WfeWmmMztxj cygY4yPyq1b+HIokQkxiTvgZwc8nNMaZcaYDhFGe5HPeilj0YRQjJcjGPlUAduvFFNRuDn3LnlLl uh+rcj86Te6FiGGPRue3b8qZa8zYPIwx5pif6mM9yMk/nWyimiNyYyRMQWj3YGfXnHb88fjTWtkX JAJLAEBzkE+me1Lb/Pu3fNgOeeedtMmdvLI3HACY5+tQ4qw03cqPCjTFZkEcqt3zn8D3FWRE7El2 wWbr1B/DH1o1QllkzztUbc9uO1Zlm7edGNxx1xn2FYvQ6GtLD7tIdKuECxsFl+bbnA+o9M1gaUIx 4g1gj7hKXK8bcblwe/qAK0y7SCYsxY7cZJz60zQYkEkrBFDfYYBnHP3pf8BUbtGMkkamlykNPASd 0bBsDGBnr78YrYVmMY+YM3QYGS3PvWBZsTqdxkk/uV6/hXQWHMbA8jHT8a6UZLUhYhQygnI5GOe+ f8/SlgkxKeFwWBwxPQ8kUPyzf73+NLF0B77etD2HHsSzHcn9wMe/bjp1qDT2zu3KWA6HGc/l+FTk /6PN/n1qvaKBcNgAcA8VS2FfUvws4znG0EHCLwDz2+maYxY4wDjPT0+tWCBvfimsAYpMjorEe3Ap 8zYWtqV3fCMR8oI4BGTxVyIkIMDkjIINMABBJAJweT9KltADCmeflP8hRbqN7akoX5Dj5MqM445q F08wcAKSeo55P8qtAkLGQcHfjI9OeKqXLFUkAJAx0H4VViIxuVMmJwzKVYnOGXIHPFR3sAwXhQxu pyqjP0/lVic4CEcE5yfX5RT7IloJXJy+37x69alq6KTs7lSK7W6PknJKHhMcjp0/Kp1jWVQYmxI3 VZcHnvz0xWRfE/2gvPViDWtfxJ5u3Yu3Ypxjipi76FzW1hv+r+Vg4cEhkUcY5qnaKIbhkYhUYbwA OQD2FW0YtZPkk7ZVVc9hk8CoioW7BAA+V+g9xQ9yfIMKzoHZh/eXow46j3pVRiyjPAycHrTYXb7P ccngcc+4qRQPPXj1P6U0KxGBuaRip3MCuSQcnHb2qtLIX3EKuXIA7cHr1FSwsWuIlJJGTwf+BUzp dMo4Xjjt1q3sEVdlbUB9ogtFCcqzFVxjB6Z/AZ7VOFLbdqblUbeuMH/OaLpFa4jyoO3zCMjodpqN CRApyckDn8KxtqUnoPj/eFtpBwvB6/56VIeAQNqydSTk4yP8cUdIEA4GOn4VFckpIwUlQcZA49KE 1bRFWuLKSE/eEsuMj1yMdfxx+dMnUhFO4sVYNjHOMcdveqrndLIDyMnr/uiiFj9oXk8OR196lVGy lC5oRvJsCkncxyCB3xyDRURJKNk55orRO6uUon/9k= opends/tests/functional-tests/shared/data/replication/photo2.uu
New file @@ -0,0 +1,348 @@ /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQ QEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQ kFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB T/wAARCAF6AScDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtR AAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFh cYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJip KTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8v P09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBA QAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKj U2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoq OkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADA MBAAIRAxEAPwD2BTk//Xp45wTz70wAgU8dOBkVzghyZKj9OKDxQOKXHB+vrVliqDux3paQDnPtTs joBQADrS5pMGgDBoAdQOtGKUA56UCsBz06r1pSORxR1pxPIoCw3g5p3JYZI4HFM5U596eoJYDPSg T3FQZzgYoUYUlgfalU5Zj3H607cC2Ax9B6UhieWF6ckACkYhXYAYzz39KUnbyB8vYikY5Xdg9OaV xXFT15xSgdR346ijnGT1B6etJGuw44yPemIccA5/Q9qQcNxyPc0pOGHel3E9f51I7hjPOcUf54oI 9RS7TkjBJHpQJCDg5pMfNkcU7BAzQy468UFajCCz8ZyOnvSsBg54z6inAZOPWm5GQDj60DGEZXgA 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 8YPqKhCZoXBxnDHPdetFOuPlJxxwOlFa3IP//Z opends/tests/functional-tests/shared/functions/environment.xml
@@ -62,6 +62,8 @@ <import machine="'%s' % (STAF_LOCAL_HOSTNAME)" file="'%s/signals.xml' % (TESTS_FUNCTIONS_DIR)" /> <import machine="'%s' % (STAF_LOCAL_HOSTNAME)" file="'%s/tools.xml' % (TESTS_FUNCTIONS_DIR)" /> </sequence> opends/tests/functional-tests/shared/functions/ldap.xml
@@ -929,6 +929,12 @@ </function-arg-description> <function-arg-property name="type" value="string"/> </function-arg-def> <function-arg-def name="outputFile" type="optional"> <function-arg-description> Output file containing the search result in ldif format. </function-arg-description> <function-arg-property name="type" value="filepath"/> </function-arg-def> <function-arg-def name="expectedRC" type="optional" default="0"> <function-arg-description> Expected return code value. Default value is 0 @@ -1103,9 +1109,11 @@ <envs> ['PATH=/bin:/usr/bin:%s' % dsBinPath, 'JAVA_HOME=%s' % JAVA_HOME] </envs> <stdout if="outputFile != None" mode="'replace'">'%s/../%s' % (dsPath,outputFile)</stdout> <stderr mode="'stdout'"/> <returnstdout/> </process> <script> STAXCode=RC STAXReason=STAXResult @@ -2796,7 +2804,7 @@ STAFCmdParamsList.append('-a "%s"' % attributeName) if newAttributeValue: STAFCmdParamsList.append('-v "%s"' % newAttributeValue) STAFCmdParamsList.append('-v "%s"' % newAttributeValue) if changetype: STAFCmdParamsList.append('-t "%s"' % changetype) opends/tests/functional-tests/shared/functions/tools.xml
New file @@ -0,0 +1,431 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE stax SYSTEM "../stax.dtd"> <!-- ! CDDL HEADER START ! ! The contents of this file are subject to the terms of the ! Common Development and Distribution License, Version 1.0 only ! (the "License"). You may not use this file except in compliance ! with the License. ! ! You can obtain a copy of the license at ! trunk/opends/resource/legal-notices/OpenDS.LICENSE ! or https://OpenDS.dev.java.net/OpenDS.LICENSE. ! See the License for the specific language governing permissions ! and limitations under the License. ! ! When distributing Covered Code, include this CDDL HEADER in each ! file and include the License file at ! trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, ! add the following below this CDDL HEADER, with the fields enclosed ! by brackets "[]" replaced with your own identifying information: ! Portions Copyright [yyyy] [name of copyright owner] ! ! CDDL HEADER END ! ! Portions Copyright 2006-2007 Sun Microsystems, Inc. ! --> <stax> <!-- This function uses make ldif to generate LDIF data files --> <function name="MakeLdif"> <function-prolog> This function uses make ldif to generate LDIF data files </function-prolog> <function-map-args> <function-arg-def name="location" type="optional" default="'%s' % STAXServiceMachine"> <function-arg-description> Location of target host </function-arg-description> <function-arg-property name="type" value="hostname"/> </function-arg-def> <function-arg-def name="dsPath" type="optional" default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)"> <function-arg-description> Pathname to installation root </function-arg-description> <function-arg-property name="type" value="filepath"/> </function-arg-def> <function-arg-def name="version" type="optional"> <function-arg-description> Display Directory Server version information </function-arg-description> <function-arg-property name="type" value="string"/> </function-arg-def> <function-arg-def name="templateFile" type="optional"> <function-arg-description> Path to the template file </function-arg-description> <function-arg-property name="type" value="filename"/> </function-arg-def> <function-arg-def name="ldifFile" type="optional"> <function-arg-description> Path to the LDIF file </function-arg-description> <function-arg-property name="type" value="filename"/> </function-arg-def> <function-arg-def name="randomSeed " type="optional"> <function-arg-description> The seed to use to initialize the random number generator </function-arg-description> <function-arg-property name="type" value="integer"/> </function-arg-def> <function-arg-def name="Help" type="optional"> <function-arg-description> Help option </function-arg-description> <function-arg-property name="help" value="option"/> </function-arg-def> </function-map-args> <sequence> <!-- Build the Command --> <script> STAFCmdParamsList=[] STAFCmdParams='' if dsPath: dsBinPath='%s/%s' % (dsPath,fileFolder) STAFCmd='%s/make-ldif%s' % (dsBinPath,fileExt) if version: STAFCmdParamsList.append('-V') if templateFile: STAFCmdParamsList.append('-t %s' % templateFile) if ldifFile: STAFCmdParamsList.append('-o "%s"' % ldifFile) if randomSeed: STAFCmdParamsList.append('-s "%s"' % randomSeed) if Help: STAFCmdParamsList.append('-H') STAFCmdParams=' '.join(STAFCmdParamsList) </script> <message> '%s %s' % (STAFCmd, STAFCmdParams) </message> <process name="'Make Ldif Script'"> <location>'%s' % location</location> <command>'%s' % STAFCmd</command> <parms>'%s' % STAFCmdParams</parms> <workdir>'%s' % dsBinPath</workdir> <envs> ['PATH=/bin:/usr/bin:%s' % dsBinPath, 'JAVA_HOME=%s' % JAVA_HOME] </envs> <console use="'same'"/> <stderr mode="'stdout'"/> <returnstdout/> </process> <script> STAXCode, STAXReason=STAXResult </script> <if expr="STAXCode != 0"> <sequence> <message level="'error'"> 'make-ldif failed (Code=%s,Reason=%s).' % (STAXCode,STAXReason) </message> </sequence> </if> <return>[STAXCode, STAXReason]</return> </sequence> </function> <!-- This function starts DS using the start-ds script --> <function name="LdifDiffWithScript"> <function-prolog> This function compares two LDIF files and reports the differences in LDIF format </function-prolog> <function-map-args> <function-arg-def name="location" type="optional" default="'%s' % STAXServiceMachine"> <function-arg-description> Location of target host </function-arg-description> <function-arg-property name="type" value="hostname"/> </function-arg-def> <function-arg-def name="dsPath" type="optional" default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)"> <function-arg-description> Pathname to installation root </function-arg-description> <function-arg-property name="type" value="filepath"/> </function-arg-def> <function-arg-def name="version" type="optional"> <function-arg-description> Display Directory Server version information </function-arg-description> <function-arg-property name="type" value="string"/> </function-arg-def> <function-arg-def name="sourceLdif" type="required"> <function-arg-description> LDIF file to use as the source data </function-arg-description> <function-arg-property name="type" value="filepath"/> </function-arg-def> <function-arg-def name="targetLdif" type="required"> <function-arg-description> LDIF file to use as the target data </function-arg-description> <function-arg-property name="type" value="filepath"/> </function-arg-def> <function-arg-def name="outputLdif" type="required"> <function-arg-description> File to which the diffs should be written </function-arg-description> <function-arg-property name="type" value="filepath"/> </function-arg-def> <function-arg-def name="overwriteExisting" type="optional" default="True"> <function-arg-description> Overwrite existing output file rather than append to it </function-arg-description> <function-arg-property name="type" value="option"/> </function-arg-def> <function-arg-def name="singleValueChanges" type="optional"> <function-arg-description> Write each attribute-level change as a separate modification per attribute value rather than one modification per entry </function-arg-description> <function-arg-property name="type" value="option"/> </function-arg-def> <function-arg-def name="Help" type="optional"> <function-arg-description> Help option </function-arg-description> <function-arg-property name="help" value="option"/> </function-arg-def> </function-map-args> <sequence> <!-- Build the Command --> <script> STAFCmdParamsList=[] STAFCmdParams='' if dsPath: dsBinPath='%s/%s' % (dsPath,fileFolder) STAFCmd='%s/ldif-diff%s' % (dsBinPath,fileExt) if version: STAFCmdParamsList.append('-V') if sourceLdif: STAFCmdParamsList.append('-s %s' % sourceLdif) if targetLdif: STAFCmdParamsList.append('-t %s' % targetLdif) if outputLdif: STAFCmdParamsList.append('-o %s' % outputLdif) if overwriteExisting: STAFCmdParamsList.append('-O') if singleValueChanges: STAFCmdParamsList.append('-S') if Help: STAFCmdParamsList.append('-H') STAFCmdParams=' '.join(STAFCmdParamsList) </script> <message> '%s %s' % (STAFCmd, STAFCmdParams) </message> <process name="'LDIF Diff Script'"> <location>'%s' % location</location> <command>'%s' % STAFCmd</command> <parms>'%s' % STAFCmdParams</parms> <workdir>'%s' % dsBinPath</workdir> <envs> ['PATH=/bin:/usr/bin:%s' % dsBinPath, 'JAVA_HOME=%s' % JAVA_HOME] </envs> <console use="'same'"/> <stderr mode="'stdout'"/> <returnstdout/> <returnfile>outputLdif</returnfile> </process> <script> STAXCode=RC STAXReason=STAXResult </script> <script> diffsInfo = STAXReason[1] diffs = diffsInfo[1] if (diffsInfo[0] == 0) and (diffs.startswith("# No differences were detected between the source and target LDIF files")) : diffRC = 0 else: diffRC = 1 </script> <return> diffRC </return> </sequence> </function> <function name="verifyTrees"> <function-prolog> This function verifies that the trees in a group of ldap servers are synchronized. </function-prolog> <function-list-args> <function-arg-def name="location" type="optional" default="'%s' % STAXServiceMachine"> <function-arg-description> Location of target host </function-arg-description> <function-arg-property name="type" value="hostname"/> </function-arg-def> <function-arg-def name="dsPath" type="optional" default="'%s/%s' % (DIRECTORY_INSTANCE_DIR,OPENDSNAME)"> <function-arg-description> Pathname to installation root </function-arg-description> <function-arg-property name="type" value="filepath"/> </function-arg-def> <function-arg-def name="referenceServer" type="required"> <function-arg-description> Server that should be taken as reference. </function-arg-description> <function-arg-property name="type" value="Server"/> </function-arg-def> <function-arg-def name="serverList" type="required"> <function-arg-description> List of the servers to verify against the referenceServer. </function-arg-description> <function-arg-property name="type" value="Server-list"/> </function-arg-def> <function-arg-def name="treeSuffix" type="required"> <function-arg-description> Suffix of the tree to verify. </function-arg-description> <function-arg-property name="type" value="DN"/> </function-arg-def> </function-list-args> <sequence> <script> myRC = 0 failedServers = [] failingServerList = '' referenceTree = 'referenceTree.ldif' sampleTree = 'sampleTree.ldif' treeDiffs = 'treeDiffs.ldif' </script> <!-- Retrieve the tree from the reference server --> <call function="'ldapSearchWithScript'"> { 'location' : location, 'dsPath' : dsPath, 'dsInstanceHost' : referenceServer.getHostname() , 'dsInstancePort' : referenceServer.getPort() , 'dsInstanceDn' : referenceServer.getRootDn() , 'dsInstancePswd' : referenceServer.getRootPwd() , 'dsBaseDN' : treeSuffix, 'dsFilter' : 'objectclass=*', 'outputFile' : referenceTree } </call> <if expr="RC != 0"> <!-- If the reference tree could not be retrieved, return an error --> <return> [1, None] </return> </if> <iterate var="server" in="serverList"> <sequence> <!-- Retrieve the same tree for every other server in the list --> <call function="'ldapSearchWithScript'"> { 'location' : location, 'dsPath' : dsPath, 'dsInstanceHost' : server.getHostname() , 'dsInstancePort' : server.getPort() , 'dsInstanceDn' : server.getRootDn() , 'dsInstancePswd' : server.getRootPwd() , 'dsBaseDN' : treeSuffix, 'dsFilter' : 'objectclass=*', 'outputFile' : sampleTree } </call> <if expr="RC == 0"> <sequence> <!-- Compare this tree to the reference one --> <call function="'LdifDiffWithScript'"> { 'location' : location, 'dsPath' : dsPath, 'sourceLdif' : '%s/../%s' % (dsPath, sampleTree), 'targetLdif' : '%s/../%s' % (dsPath, referenceTree), 'outputLdif' : '%s/../%s' % (dsPath, treeDiffs) } </call> <script> if STAXResult != 0 : failedServers.append('%s:%s' % (server.getHostname(), server.getPort())) </script> </sequence> <else> <script> failedServers.append('%s:%s' % (server.getHostname(), server.getPort())) </script> </else> </if> </sequence> </iterate> <if expr="len(failedServers) > 0"> <!-- If at least one server failed to successfully compare to the reference tree, ! return an error, along with the list of the servers that failed to do so --> <script> myRC = 1 comma = ',' failingServerList = 'List of non-synchronized servers (tree verify FAILED): %s ' % comma.join(failedServers) </script> <else> <script> failingServerList = 'All servers synchronized (tree verify SUCCEEDED).' </script> </else> </if> <call function="'checktestRC'"> { 'returncode' : myRC, 'result' : failingServerList , 'expected' : 0 } </call> <return> [myRC, failedServers] </return> </sequence> </function> </stax> opends/tests/functional-tests/shared/python/replication.py
@@ -365,7 +365,35 @@ ldifLines.append('dn: %s' % dn) ldifLines.append('changetype: modify') ldifLines.append('%s: %s' % (mod_type,attr_type)) ldifLines.append('%s: %s' % (attr_type,attr_value)) if attr_value != None : ldifLines.append('%s: %s' % (attr_type,attr_value)) # write out the ldif file outfile = open(path,"w") for line in ldifLines: outfile.write("%s\n" % line) outfile.close() # Define the function that writes a ldif file with the modify to operate # on an entry in a given suffix. def write_replication_mod_binary_ldif_file(path, dn, mod_type, attr_type, binary_value_path): # open file and read the binary value (which is encoded in base64) binaryValueFile = open(binary_value_path, "r") binaryValue = binaryValueFile.read() binaryValueFile.close() ldifLines = [] ldifLines.append('dn: %s' % dn) ldifLines.append('changetype: modify') ldifLines.append('%s: %s' % (mod_type,attr_type)) ldifLines.append('%s:: %s' % (attr_type,binaryValue)) # write out the ldif file @@ -377,3 +405,28 @@ outfile.close() # Define the function that writes a ldif file with the modDN to operate # on an entry in a given suffix. def write_replication_moddn_ldif_file(path, dn, newrdn, newsuperior, deleteoldrdn): ldifLines = [] ldifLines.append('dn: %s' % dn) ldifLines.append('changetype: moddn') ldifLines.append('newRDN: %s' % newrdn) ldifLines.append('deleteOldRDN: %s' % deleteoldrdn) if newsuperior != None: ldifLines.append('newSuperior: %s' % newsuperior) # write out the ldif file outfile = open(path,"w") for line in ldifLines: outfile.write("%s\n" % line) outfile.close() opends/tests/functional-tests/testcases/replication/basic/replication_basic.xml
@@ -33,7 +33,7 @@ <sequence> <block name="'basic'"> <block name="'basic'"> <sequence> @@ -69,7 +69,8 @@ <message> 'Replication: Basic: Add Entry. Check that an added entry is well propagated by replication.' </message> <!-- Modify "master" server --> <call function="'addEntry'"> { 'location' : clientHost, 'dsPath' : clientPath, @@ -79,29 +80,25 @@ 'dsInstancePswd' : server1.getRootPwd(), 'entryToBeAdded' : '%s/replication_add_root_suffix.ldif' % clientDataDir } </call> <call function="'checkRC'"> { 'returncode' : RC, 'result' : STAXResult } </call> <call function="'SearchObject'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server2.getHostname() , 'dsInstancePort' : server2.getPort() , 'dsInstanceDn' : server2.getRootDn() , 'dsInstancePswd' : server2.getRootPwd() , <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : synchroSuffix , 'dsFilter' : 'objectclass=*' } </call> <call function="'checktestRC'"> { 'returncode' : RC, 'result' : STAXResult, 'expected' : 0 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> @@ -124,7 +121,9 @@ <message> 'Replication: Basic: Modify Entry. Check that an entry modify is well propagated by replication.' </message> <!-- Modify "master" server --> <call function="'addEntry'"> { 'location' : clientHost, 'dsPath' : clientPath, @@ -134,45 +133,44 @@ 'dsInstancePswd' : server1.getRootPwd() , 'entryToBeAdded' : '%s/replication_add_single.ldif' % clientDataDir } </call> <call function="'checkRC'"> { 'returncode' : RC , 'result' : STAXResult } </call> <call function="'modifyEntry'"> <call function="'ldapModifyWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'entryToBeModified' : '%s/replication_mod.ldif' % clientDataDir } 'dsFilename' : '%s/replication_mod.ldif' % clientDataDir } </call> <call function="'checkRC'"> { 'returncode' : RC , 'result' : STAXResult } </call> <call function="'SearchObject'"> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server2.getHostname() , 'dsInstancePort' : server2.getPort() , 'dsInstanceDn' : server2.getRootDn() , 'dsInstancePswd' : server2.getRootPwd() , 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : entryDn, 'dsFilter' : '%s=%s' % (attr_type,attr_value) } 'dsFilter' : '%s=%s' % (attr_type,attr_value) } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : RC , 'result' : STAXResult , 'expected' : 0 } </call> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> @@ -194,7 +192,9 @@ <message> 'Replication: Basic: Delete Entry. Check that an entry delete is well propagated by replication.' </message> <!-- Modify "master" server --> <call function="'DeleteEntry'"> { 'location' : clientHost, 'dsPath' : clientPath, @@ -204,30 +204,1372 @@ 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : entryDn } </call> <call function="'checkRC'"> { 'returncode' : RC , 'result' : STAXResult } </call> <call function="'SearchObject'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server2.getHostname() , 'dsInstancePort' : server2.getPort() , 'dsInstanceDn' : server2.getRootDn() , 'dsInstancePswd' : server2.getRootPwd() , <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : entryDn, 'dsFilter' : 'objectclass=*' , 'expectedRC' : 32 } </call> 'expectedRC' : 32 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Add Multiple Entries #@TestID Add Multiple Entries #@TestPurpose Check that a multiple-entry add is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Add Multiple Entries'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Add Multiple Entries. Check that a multiple-entry add is well propagated by replication.' </message> <!-- Delete the root entry, as it is already present in Example.ldif file --> <call function="'DeleteEntry'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : synchroSuffix } </call> <!-- Modify "master" server --> <call function="'addEntry'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname(), 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'entryToBeAdded' : '%s/replication/Example.ldif' % clientDataDir } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=scarter,ou=People,%s' % synchroSuffix, 'dsFilter' : 'objectclass=*' } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - add single attribute #@TestID Modify Entry - add single attribute #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - add single attribute'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - add single attribute. Check that an entry modify is well propagated by replication.' </message> <!-- Modify "master" server --> <call function="'modifyAnAttribute'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToModify' : 'uid=tmorris, ou=People,%s' % synchroSuffix, 'attributeName' : 'description', 'newAttributeValue' : ' ', 'changetype' : 'add' } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=tmorris, ou=People,%s' % synchroSuffix, 'dsFilter' : 'description=*' } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - add single value #@TestID Modify Entry - add single value #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - add single value'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - add single value. Check that an entry modify is well propagated by replication.' </message> <!-- Modify "master" server --> <call function="'modifyAnAttribute'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToModify' : 'uid=tmorris, ou=People,%s' % synchroSuffix, 'attributeName' : 'departmentnumber', 'newAttributeValue' : '5203214400', 'changetype' : 'add' } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=tmorris, ou=People,%s' % synchroSuffix, 'dsFilter' : 'departmentnumber=5203214400' } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - delete single attribute #@TestID Modify Entry - delete single attribute #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - delete single attribute'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - delete single attribute. Check that an entry modify is well propagated by replication.' </message> <script> filename = 'replication_mod_delete.ldif' filePath = '%s/%s' % (logsTestDataDir,filename) dn = 'uid=smason, ou=People,%s' % synchroSuffix modif = 'delete' attrType = 'roomNumber' attrValue = None write_replication_mod_ldif_file(filePath, dn, modif, attrType, attrValue) </script> <!-- Copy the replication_mod ldif to client host --> <message> 'Copy %s file from %s to %s' % (filename,logsTestDataDir,clientDataDir) </message> <call function="'copyFile'"> { 'srcfile' : filePath, 'destfile' : '%s/%s' % (clientDataDir,filename), 'remotehost' : client.getHostname() } </call> <!-- Modify "master" server --> <call function="'ldapModifyWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsFilename' : '%s/%s' % (clientDataDir, filename) } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=smason, ou=People,%s' % synchroSuffix, 'dsFilter' : 'roomNumber=*', 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 0 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - delete single value #@TestID Modify Entry - delete single value #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - delete single value'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - delete single value. Check that an entry modify is well propagated by replication.' </message> <!-- Modify "master" server --> <call function="'modifyAnAttribute'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToModify' : 'uid=jwalker, ou=People,%s' % synchroSuffix, 'attributeName' : 'roomNumber', 'newAttributeValue' : '3915', 'changetype' : 'delete' } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=jwalker, ou=People,%s' % synchroSuffix, 'dsFilter' : 'roomNumber=3915' , 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 0 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - add multiple values #@TestID Modify Entry - add multiple values #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - add multiple values'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - add multiple values. Check that an entry modify is well propagated by replication.' </message> <script> valuesToAdd = [] valuesToAdd.append('postaladdress:Residence Parc Europe') valuesToAdd.append('postaladdress:Appartement #6') valuesToAdd.append('postaladdress:31 Rue General Mangin') valuesToAdd.append('postaladdress:38100 Grenoble') </script> <!-- Modify "master" server --> <call function="'modifyAnAttribute'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToModify' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'listAttributes' : valuesToAdd, 'changetype' : 'add' } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'dsFilter' : '&(postaladdress=Residence Parc Europe)(postaladdress=Appartement #6)(postaladdress=31 Rue General Mangin)(postaladdress=38100 Grenoble)' } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - delete multiple values #@TestID Modify Entry - delete multiple values #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - delete multiple values'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - delete multiple values. Check that an entry modify is well propagated by replication.' </message> <script> valuesToDelete = [] valuesToDelete.append('postaladdress:Appartement #6') valuesToDelete.append('postaladdress:38100 Grenoble') </script> <!-- Modify "master" server --> <call function="'modifyAnAttribute'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToModify' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'listAttributes' : valuesToDelete, 'changetype' : 'delete' } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'dsFilter' : '|(postaladdress=Appartement #6)(postaladdress=38100 Grenoble)', 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 0 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - replace multiple values #@TestID Modify Entry - replace multiple values #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - replace multiple values'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - replace multiple values. Check that an entry modify is well propagated by replication.' </message> <script> valuesToReplace = [] valuesToReplace.append('postaladdress: Residence Letilleuil') valuesToReplace.append('postaladdress: 18 rue Nicolas Chorier') </script> <!-- Modify "master" server --> <call function="'modifyAnAttribute'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToModify' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'listAttributes' : valuesToReplace, 'changetype' : 'replace' } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'dsFilter' : '&(postaladdress=Residence Letilleuil)(postaladdress=18 rue Nicolas Chorier)', 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - add single value to multiple valued attribute #@TestID Modify Entry - add single value to multiple valued attribute #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - add single value to multiple valued attribute'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - add single value to multiple valued attribute. Check that an entry modify is well propagated by replication.' </message> <script> valuesToAdd = [] valuesToAdd.append('postaladdress:38000 Grenoble') </script> <!-- Modify "master" server --> <call function="'modifyAnAttribute'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToModify' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'listAttributes' : valuesToAdd, 'changetype' : 'add' } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'dsFilter' : 'postaladdress=38000 Grenoble', 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - delete single value from multiple valued attribute #@TestID Modify Entry - delete single value from multiple valued attribute #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - delete single value from multiple valued attribute'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - delete single value from multiple valued attribute. Check that an entry modify is well propagated by replication.' </message> <script> valuesToDelete = [] valuesToDelete.append('postaladdress: Residence Letilleuil') </script> <!-- Modify "master" server --> <call function="'modifyAnAttribute'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToModify' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'listAttributes' : valuesToDelete, 'changetype' : 'delete' } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'dsFilter' : 'postaladdress=Residence Letilleuil', 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 0 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - replace case sensitive attribute #@TestID Modify Entry - replace case sensitive attribute #@TestPurpose Check that case sensitive attribute modifications are replicated. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - replace case sensitive attribute'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - replace case sensitive attribute. Check that case sensitive attribute modifications are replicated.' </message> <script> entryAttributes = [] entryAttributes.append('cn: Tom Fitter') entryAttributes.append('sn: Fitter') entryAttributes.append('givenname: Tom') entryAttributes.append('objectclass: top') entryAttributes.append('objectclass: person') entryAttributes.append('objectclass: organizationalPerson') entryAttributes.append('objectclass: inetOrgPerson') entryAttributes.append('ou: Accounting') entryAttributes.append('ou: People') entryAttributes.append('l: Sunnyvale') entryAttributes.append('uid: tfitter') entryAttributes.append('mail: tfitter@example.com') entryAttributes.append('telephonenumber: +1 804 555 8974') entryAttributes.append('facsimiletelephonenumber: +1 804 555 1579') entryAttributes.append('roomnumber: 2164') entryAttributes.append('userpassword: hamstring') entryAttributes.append('description: PROFESSION Tap Fitter and PLUMBER') valuesToReplace = [] valuesToReplace.append('description: Profession Tap Fitter and Plumber') </script> <!-- Modify "master" server --> <call function="'addAnEntry'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToAdd' : 'uid=tfitter, ou=People,%s' % synchroSuffix, 'listAttributes' : entryAttributes } </call> <call function="'modifyAnAttribute'"> { 'dsPath' : server1Path, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort(), 'dsInstanceDn' : server1.getRootDn(), 'dsInstancePswd' : server1.getRootPwd(), 'DNToModify' : 'uid=tfitter, ou=People,%s' % synchroSuffix, 'listAttributes' : valuesToReplace, 'changetype' : 'replace' } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=tfitter, ou=People,%s' % synchroSuffix, 'dsFilter' : 'description=Profession Tap Fitter and Plumber', 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - add binary attribute #@TestID Modify Entry - add binary attribute #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - add binary attribute'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - add binary attribute. Check that an entry modify is well propagated by replication.' </message> <script> filename = 'replication_mod_add_binary.ldif' filePath = '%s/%s' % (logsTestDataDir,filename) binaryFilePath = '%s/photo1.uu' % testsGroupDir dn = 'uid=hmiller, ou=People,%s' % synchroSuffix modif = 'add' attrType = 'jpegPhoto' write_replication_mod_binary_ldif_file(filePath, dn, modif, attrType, binaryFilePath) </script> <!-- Copy the replication_mod ldif to client host --> <message> 'Copy %s file from %s to %s' % (filename,logsTestDataDir,clientDataDir) </message> <call function="'copyFile'"> { 'srcfile' : filePath, 'destfile' : '%s/%s' % (clientDataDir,filename), 'remotehost' : client.getHostname() } </call> <!-- Modify "master" server --> <call function="'ldapModifyWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsFilename' : '%s/%s' % (clientDataDir, filename) } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=hmiller, ou=People,%s' % synchroSuffix, 'dsFilter' : 'jpegPhoto=*', 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - replace binary attribute #@TestID Modify Entry - replace binary attribute #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - replace binary attribute'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - replace binary attribute. Check that an entry modify is well propagated by replication.' </message> <script> filename = 'replication_mod_replace_binary.ldif' filePath = '%s/%s' % (logsTestDataDir,filename) binaryFilePath = '%s/photo2.uu' % testsGroupDir dn = 'uid=hmiller, ou=People,%s' % synchroSuffix modif = 'replace' attrType = 'jpegPhoto' write_replication_mod_binary_ldif_file(filePath, dn, modif, attrType, binaryFilePath) </script> <!-- Copy the replication_mod ldif to client host --> <message> 'Copy %s file from %s to %s' % (filename,logsTestDataDir,clientDataDir) </message> <call function="'copyFile'"> { 'srcfile' : filePath, 'destfile' : '%s/%s' % (clientDataDir,filename), 'remotehost' : client.getHostname() } </call> <!-- Modify "master" server --> <call function="'ldapModifyWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsFilename' : '%s/%s' % (clientDataDir, filename) } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=hmiller, ou=People,%s' % synchroSuffix, 'dsFilter' : 'jpegPhoto=*', 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Modify Entry - delete binary attribute #@TestID Modify Entry - delete binary attribute #@TestPurpose Check that an entry modify is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Modify Entry - delete binary attribute'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Modify Entry - delete binary attribute. Check that an entry modify is well propagated by replication.' </message> <script> filename = 'replication_mod_delete_binary.ldif' filePath = '%s/%s' % (logsTestDataDir,filename) dn = 'uid=hmiller, ou=People,%s' % synchroSuffix modif = 'delete' attrType = 'jpegPhoto' attrValue = None write_replication_mod_ldif_file(filePath, dn, modif, attrType, attrValue) </script> <!-- Copy the replication_mod ldif to client host --> <message> 'Copy %s file from %s to %s' % (filename,logsTestDataDir,clientDataDir) </message> <call function="'copyFile'"> { 'srcfile' : filePath, 'destfile' : '%s/%s' % (clientDataDir,filename), 'remotehost' : client.getHostname() } </call> <!-- Modify "master" server --> <call function="'ldapModifyWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsFilename' : '%s/%s' % (clientDataDir, filename) } </call> <!-- Check modify worked on "master" server --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=hmiller, ou=People,%s' % synchroSuffix, 'dsFilter' : 'jpegPhoto=*', 'expectedRC' : 0 } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 0 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Rename Entry #@TestID Rename Entry #@TestPurpose Check that a rename (modrdn) operation is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Rename Entry'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Rename Entry. Check that a rename (modrdn) operation is well propagated by replication.' </message> <script> filename = 'replication_modrdn.ldif' filePath = '%s/%s' % (logsTestDataDir,filename) dn = 'uid=kvaughan, ou=People,%s' % synchroSuffix newrdn = 'uid=kvaughan2' newsuperior = None deleteoldrdn = 1 write_replication_moddn_ldif_file(filePath, dn, newrdn, newsuperior, deleteoldrdn) </script> <!-- Copy the replication_mod ldif to client host --> <message> 'Copy %s file from %s to %s' % (filename,logsTestDataDir,clientDataDir) </message> <call function="'copyFile'"> { 'srcfile' : filePath, 'destfile' : '%s/%s' % (clientDataDir,filename), 'remotehost' : client.getHostname() } </call> <!-- Modify "master" server --> <call function="'ldapModifyWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsFilename' : '%s/%s' % (clientDataDir, filename) } </call> <!-- Check modify worked on "master" server --> <!-- check that "uid=kvaughan, ou=People, ${DIRECTORY_BASE}" does NOT exist anymore --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=kvaughan, ou=People,%s' % synchroSuffix, 'dsFilter' : 'objectclass=*', 'expectedRC' : 32 } </call> <!-- check that new entry "uid=kvaughan2, ou=People, ${DIRECTORY_BASE}" exists --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=kvaughan2, ou=People,%s' % synchroSuffix, 'dsFilter' : 'objectclass=*' } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Rename Entry (preserving old rdn) #@TestID Rename Entry (preserving old rdn) #@TestPurpose Check that a rename (modrdn) operation is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Rename Entry (preserving old rdn)'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Rename Entry (preserving old rdn). Check that a rename (modrdn) operation is well propagated by replication.' </message> <script> filename = 'replication_modrdn_preserve.ldif' filePath = '%s/%s' % (logsTestDataDir,filename) dn = 'uid=jwallace, ou=People,%s' % synchroSuffix newrdn = 'uid=igueye' newsuperior = None deleteoldrdn = 0 write_replication_moddn_ldif_file(filePath, dn, newrdn, newsuperior, deleteoldrdn) </script> <!-- Copy the replication_mod ldif to client host --> <message> 'Copy %s file from %s to %s' % (filename,logsTestDataDir,clientDataDir) </message> <call function="'copyFile'"> { 'srcfile' : filePath, 'destfile' : '%s/%s' % (clientDataDir,filename), 'remotehost' : client.getHostname() } </call> <!-- Modify "master" server --> <call function="'ldapModifyWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsFilename' : '%s/%s' % (clientDataDir, filename) } </call> <!-- Check modify worked on "master" server --> <!-- check that "uid=jwallace, ou=People, ${DIRECTORY_BASE}" does NOT exist anymore --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=jwallace, ou=People,%s' % synchroSuffix, 'dsFilter' : 'objectclass=*', 'expectedRC' : 32 } </call> <!-- check that new entry "uid=igueye, ou=People, ${DIRECTORY_BASE}" exists --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=igueye, ou=People,%s' % synchroSuffix, 'dsFilter' : 'uid=jwallace' } </call> <script> searchRC = STAXResult[0][0] searchResult = STAXResult[0][1] resultLength = len(searchResult) > 0 </script> <call function="'checktestRC'"> { 'returncode' : resultLength , 'result' : searchResult , 'expected' : 1 } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <!--- Test Case information #@TestMarker Replication Basic Tests #@TestName Replication: Basic: Rename Subtree #@TestID Rename Subtree #@TestPurpose Check that a subtree rename (moddn) operation is well propagated by replication. #@TestPreamble #@TestSteps #@TestPostamble #@TestResult --> <testcase name="'Replication: Basic: Rename Subtree'"> <sequence> <call function="'testCase_Preamble'"/> <message> 'Replication: Basic: Rename Subtree. Check that a subtree rename (moddn) operation is well propagated by replication.' </message> <script> filename = 'replication_moddn.ldif' filePath = '%s/%s' % (logsTestDataDir,filename) dn = 'ou=People,%s' % synchroSuffix newrdn = 'ou=Special People' newsuperior = 'ou=Special Users,%s' % synchroSuffix deleteoldrdn = 0 write_replication_moddn_ldif_file(filePath, dn, newrdn, newsuperior, deleteoldrdn) </script> <!-- Copy the replication_mod ldif to client host --> <message> 'Copy %s file from %s to %s' % (filename,logsTestDataDir,clientDataDir) </message> <call function="'copyFile'"> { 'srcfile' : filePath, 'destfile' : '%s/%s' % (clientDataDir,filename), 'remotehost' : client.getHostname() } </call> <!-- Modify "master" server --> <call function="'ldapModifyWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsFilename' : '%s/%s' % (clientDataDir, filename) } </call> <!-- Check modify worked on "master" server --> <!-- check that "uid=gfarmer, ou=People, ${DIRECTORY_BASE}" does NOT exist anymore --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=gfarmer, ou=People,%s' % synchroSuffix, 'dsFilter' : 'objectclass=*', 'expectedRC' : 32 } </call> <!-- check that new entry "uid=gfarmer, ou=Special People, ou=Special Users, ${DIRECTORY_BASE}" exists --> <call function="'ldapSearchWithScript'"> { 'location' : clientHost, 'dsPath' : clientPath, 'dsInstanceHost' : server1.getHostname() , 'dsInstancePort' : server1.getPort() , 'dsInstanceDn' : server1.getRootDn() , 'dsInstancePswd' : server1.getRootPwd() , 'dsBaseDN' : 'uid=gfarmer, ou=Special People, ou=Special Users,%s' % synchroSuffix, 'dsFilter' : 'objectclass=*' } </call> <!-- Verify the synchronization of the trees among the servers in the topology --> <call function="'verifyTrees'"> [ clientHost, clientPath, server1, [server2], synchroSuffix ] </call> <call function="'testCase_Postamble'"/> </sequence> </testcase> <import machine="'%s' % (STAF_LOCAL_HOSTNAME)" file="'%s/testcases/replication/replication_cleanup.xml' % (TESTS_DIR)"/> <call function="'replication_cleanup'" /> opends/tests/functional-tests/testcases/replication/basic/replication_basic_setup.xml
@@ -39,8 +39,10 @@ </message> <script> server1Path = '%s/%s' % (server1.getDir(),OPENDSNAME) synchroSuffix = server1.getSynchronizedSuffixList()[0].getSuffixDn() entryDn = 'uid=scarter,%s' % synchroSuffix grandchildEntryDn = 'uid=scarter,ou=People,o=replication tests,%s' % synchroSuffix mod_type = 'replace' attr_type = 'roomnumber' attr_value = '1111' @@ -109,7 +111,8 @@ 'destfile' : '%s/%s' % (clientDataDir,filename), 'remotehost' : client.getHostname() } </call> <call function="'checkRC'"> { 'returncode' : RC , 'result' : STAXResult } opends/tests/functional-tests/testcases/replication/replication_cleanup.xml
@@ -35,11 +35,7 @@ <block name="'replication-cleanup'"> <sequence> <script> basicTopologyFile = '%s/config/replication/basic_topology.txt' % TESTS_DIR </script> <sequence> <!-- Stop the servers in the topology --> <iterate var="server" in="_topologyServerList"> opends/tests/functional-tests/testcases/replication/replication_setup.xml
@@ -30,23 +30,27 @@ <defaultcall function="replication_setup"/> <function name="replication_setup"> <function-map-args> <function-arg-def name="topologyFile" type="optional" default="'%s/config/replication/basic_topology.txt' % TESTS_DIR"> <function-arg-description> Pathname to file describing the topology. </function-arg-description> <function-arg-property name="type" value="filepath"/> </function-arg-def> </function-map-args> <sequence> <block name="'replication-setup'"> <sequence> <script> basicTopologyFile = '%s/config/replication/basic_topology.txt' % TESTS_DIR </script> <message> 'Create DS topology as described in %s' % basicTopologyFile 'Create DS topology as described in %s' % topologyFile </message> <call function="'createTopology'"> { 'topologyDescFile' : basicTopologyFile, { 'topologyDescFile' : topologyFile, 'sharedDataFolder' : 'replication' } </call>