dsdb pytests: test the effect of reordering modify requests
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Fri, 12 Apr 2019 12:23:26 +0000 (00:23 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 1 May 2019 05:32:25 +0000 (05:32 +0000)
Do we interpret these the same way as Windows? In many cases, no.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
16 files changed:
selftest/knownfail.d/modify-order [new file with mode: 0644]
source4/dsdb/tests/python/ldap_modify_order.py [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_account_locality_device.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_container_flags.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_container_flags_multivalue.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_inapplicable.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_member.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_mixed.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_mixed2.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_objectclass.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_objectclass2.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_singlevalue.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_sometimes_inapplicable.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_telephone.expected [new file with mode: 0644]
source4/dsdb/tests/python/testdata/modify_order_telephone_delete_delete.expected [new file with mode: 0644]
source4/selftest/tests.py

diff --git a/selftest/knownfail.d/modify-order b/selftest/knownfail.d/modify-order
new file mode 100644 (file)
index 0000000..53822a6
--- /dev/null
@@ -0,0 +1,5 @@
+samba4.ldap_modify_order.python.+ModifyOrderTests.test_modify_order_account_locality_device
+samba4.ldap_modify_order.python.+ModifyOrderTests.test_modify_order_container_flags_multivalue
+samba4.ldap_modify_order.python.+ModifyOrderTests.test_modify_order_objectclass
+samba4.ldap_modify_order.python.+ModifyOrderTests.test_modify_order_objectclass2
+samba4.ldap_modify_order.python.+ModifyOrderTests.test_modify_order_singlevalue
diff --git a/source4/dsdb/tests/python/ldap_modify_order.py b/source4/dsdb/tests/python/ldap_modify_order.py
new file mode 100644 (file)
index 0000000..46b064a
--- /dev/null
@@ -0,0 +1,353 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008-2011
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import print_function
+import optparse
+import sys
+import os
+from itertools import permutations
+import traceback
+
+sys.path.insert(0, "bin/python")
+import samba
+from samba.tests.subunitrun import SubunitOptions, TestProgram
+import samba.getopt as options
+
+from samba.auth import system_session
+from ldb import SCOPE_BASE, LdbError
+from ldb import Message, MessageElement, Dn
+from ldb import FLAG_MOD_ADD, FLAG_MOD_REPLACE, FLAG_MOD_DELETE
+from samba.samdb import SamDB
+
+from samba.tests import delete_force
+
+TEST_DATA_DIR = os.path.join(
+    os.path.dirname(__file__),
+    'testdata')
+
+LDB_STRERR = {}
+def _build_ldb_strerr():
+    import ldb
+    for k, v in vars(ldb).items():
+        if k.startswith('ERR_') and isinstance(v, int):
+            LDB_STRERR[v] = k
+
+_build_ldb_strerr()
+
+
+class ModifyOrderTests(samba.tests.TestCase):
+
+    def setUp(self):
+        super().setUp()
+        self.dsdb = get_dsdb()
+        self.base_dn = self.dsdb.domain_dn()
+
+    def delete_object(self, dn):
+        delete_force(self.dsdb, dn)
+
+    def _test_modify_order(self,
+                           start_attrs,
+                           mod_attrs,
+                           extra_search_attrs=(),
+                           name=None):
+        # We are using Message objects here for add (rather than the
+        # more convenient dict) because we maybe care about the order
+        # in which attributes are added.
+        if name is None:
+            name = traceback.extract_stack()[-2][2][5:]
+
+        sig = []
+        op_lut = ['', 'add', 'replace', 'delete']
+
+        search_attrs = set(extra_search_attrs)
+        lines = [name, "initial attrs:"]
+        for k, v in start_attrs:
+            lines.append("%20s: %r" % (k, v))
+            search_attrs.add(k)
+
+        for k, v, op in mod_attrs:
+            search_attrs.add(k)
+
+        search_attrs = sorted(search_attrs)
+        header = "\n".join(lines)
+        sig.append(header)
+
+        clusters = {}
+        for i, attrs in enumerate(permutations(mod_attrs)):
+            # for each permuation we construct a string describing the
+            # requested operations, and a string describing the result
+            # (which may be an exception). The we cluster the
+            # attribute strings by their results.
+            dn = "cn=ldaptest_%s_%d,cn=users,%s" % (name, i, self.base_dn)
+            m = Message()
+            m.dn = Dn(self.dsdb, dn)
+
+            for k, v in start_attrs:
+                m[k] = MessageElement(v, 0, k)
+
+            self.dsdb.add(m)
+            self.addCleanup(self.delete_object, dn)
+
+            m = Message()
+            m.dn = Dn(self.dsdb, dn)
+
+            attr_lines = []
+            for k, v, op in attrs:
+                if v is None:
+                    v = dn
+                m[k] = MessageElement(v, op, k)
+                attr_lines.append("%16s %-8s %s" % (k, op_lut[op], v))
+
+            attr_str = '\n'.join(attr_lines)
+
+            try:
+                self.dsdb.modify(m)
+            except LdbError as e:
+                err, _ = e.args
+                s = LDB_STRERR.get(err, "unknown error")
+                result_str = "%s (%d)" % (s, err)
+            else:
+                res = self.dsdb.search(base=dn, scope=SCOPE_BASE,
+                                       attrs=search_attrs)
+
+                lines = []
+                for k, v in sorted(dict(res[0]).items()):
+                    if k != "dn" or k in extra_search_attrs:
+                        lines.append("%20s: %r" % (k, sorted(v)))
+
+                result_str = '\n'.join(lines)
+
+            clusters.setdefault(result_str, []).append(attr_str)
+
+        for s, attrs in sorted(clusters.items()):
+            sig.extend([
+                "== result ===[%3d]=======================" % len(attrs),
+                s,
+                "-- operations ---------------------------"])
+            for a in attrs:
+                sig.append(a)
+                sig.append("-" * 34)
+
+        sig = '\n'.join(sig).replace(self.base_dn, "{base dn}")
+
+        if opts.verbose:
+            print(sig)
+
+        if opts.rewrite_ground_truth:
+            f = open(os.path.join(TEST_DATA_DIR, name + '.expected'), 'w')
+            f.write(sig)
+            f.close()
+        f = open(os.path.join(TEST_DATA_DIR, name + '.expected'))
+        expected = f.read()
+        f.close()
+
+        self.assertStringsEqual(sig, expected)
+
+    def test_modify_order_mixed(self):
+        start_attrs = [("objectclass", "user"),
+                       ("carLicense", ["1", "2", "3"]),
+                       ("otherTelephone", "123")]
+
+        mod_attrs = [("carLicense", "3", FLAG_MOD_DELETE),
+                     ("carLicense", "4", FLAG_MOD_ADD),
+                     ("otherTelephone", "4", FLAG_MOD_REPLACE),
+                     ("otherTelephone", "123", FLAG_MOD_DELETE)]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_mixed2(self):
+        start_attrs = [("objectclass", "user"),
+                       ("carLicense", ["1", "2", "3"]),
+                       ("ipPhone", "123")]
+
+        mod_attrs = [("carLicense", "3", FLAG_MOD_DELETE),
+                     ("carLicense", "4", FLAG_MOD_ADD),
+                     ("ipPhone", "4", FLAG_MOD_REPLACE),
+                     ("ipPhone", "123", FLAG_MOD_DELETE)]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_telephone(self):
+        start_attrs = [("objectclass", "user"),
+                       ("otherTelephone", "123")]
+
+        mod_attrs = [("carLicense", "3", FLAG_MOD_REPLACE),
+                     ("carLicense", "4", FLAG_MOD_ADD),
+                     ("otherTelephone", "4", FLAG_MOD_REPLACE),
+                     ("otherTelephone", "4", FLAG_MOD_ADD),
+                     ("otherTelephone", "123", FLAG_MOD_DELETE)]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_telephone_delete_delete(self):
+        start_attrs = [("objectclass", "user"),
+                       ("otherTelephone", "123")]
+
+        mod_attrs = [("carLicense", "3", FLAG_MOD_REPLACE),
+                     ("carLicense", "4", FLAG_MOD_DELETE),
+                     ("otherTelephone", "4", FLAG_MOD_REPLACE),
+                     ("otherTelephone", "4", FLAG_MOD_DELETE),
+                     ("otherTelephone", "123", FLAG_MOD_DELETE)]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_objectclass(self):
+        start_attrs = [("objectclass", "user"),
+                       ("otherTelephone", "123")]
+
+        mod_attrs = [("objectclass", "computer", FLAG_MOD_REPLACE),
+                     ("objectclass", "user", FLAG_MOD_DELETE),
+                     ("objectclass", "person", FLAG_MOD_DELETE)]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_objectclass2(self):
+        start_attrs = [("objectclass", "user")]
+
+        mod_attrs = [("objectclass", "computer", FLAG_MOD_REPLACE),
+                     ("objectclass", "user", FLAG_MOD_ADD),
+                     ("objectclass", "attributeSchema", FLAG_MOD_REPLACE),
+                     ("objectclass", "inetOrgPerson", FLAG_MOD_ADD),
+                     ("objectclass", "person", FLAG_MOD_DELETE)]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_singlevalue(self):
+        start_attrs = [("objectclass", "user"),
+                       ("givenName", "a")]
+
+        mod_attrs = [("givenName", "a", FLAG_MOD_REPLACE),
+                     ("givenName", ["b", "a"], FLAG_MOD_REPLACE),
+                     ("givenName", "b", FLAG_MOD_DELETE),
+                     ("givenName", "a", FLAG_MOD_DELETE),
+                     ("givenName", "c", FLAG_MOD_ADD)]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_inapplicable(self):
+        #attrbutes that don't go on a user
+        start_attrs = [("objectclass", "user"),
+                       ("givenName", "a")]
+
+        mod_attrs = [("dhcpSites", "b", FLAG_MOD_REPLACE),
+                     ("dhcpSites", "b", FLAG_MOD_DELETE),
+                     ("dhcpSites", "c", FLAG_MOD_ADD)]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_sometimes_inapplicable(self):
+        # attributes that don't go on a user, but do on a computer,
+        # which we sometimes change into.
+        start_attrs = [("objectclass", "user"),
+                       ("givenName", "a")]
+
+        mod_attrs = [("objectclass", "computer", FLAG_MOD_REPLACE),
+                     ("objectclass", "person", FLAG_MOD_DELETE),
+                     ("dnsHostName", "b", FLAG_MOD_ADD),
+                     ("dnsHostName", "c", FLAG_MOD_REPLACE)]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_account_locality_device(self):
+        # account, locality, and device all take l (locality name) but
+        # only device takes owner. We shouldn't be able to change
+        # objectclass at all.
+        start_attrs = [("objectclass", "account"),
+                       ("l", "a")]
+
+        mod_attrs = [("objectclass", ["device", "top"], FLAG_MOD_REPLACE),
+                     ("l", "a", FLAG_MOD_DELETE),
+                     ("owner", "c", FLAG_MOD_ADD)
+        ]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_container_flags_multivalue(self):
+        # account, locality, and device all take l (locality name)
+        # but only device takes owner
+        start_attrs = [("objectclass", "container"),
+                       ("wWWHomePage", "a")]
+
+        mod_attrs = [("flags", ["0", "1"], FLAG_MOD_ADD),
+                     ("flags", "65355", FLAG_MOD_ADD),
+                     ("flags", "65355", FLAG_MOD_DELETE),
+                     ("flags", ["2", "101"], FLAG_MOD_REPLACE),
+        ]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_container_flags(self):
+        #flags should be an integer
+        start_attrs = [("objectclass", "container")]
+
+        mod_attrs = [("flags", "0x6", FLAG_MOD_ADD),
+                     ("flags", "5", FLAG_MOD_ADD),
+                     ("flags", "101", FLAG_MOD_REPLACE),
+                     ("flags", "c", FLAG_MOD_DELETE),
+        ]
+        self._test_modify_order(start_attrs, mod_attrs)
+
+    def test_modify_order_member(self):
+        name = "modify_order_member_other_group"
+
+        dn2 = "cn=%s,%s" % (name, self.base_dn)
+        m = Message()
+        m.dn = Dn(self.dsdb, dn2)
+        self.dsdb.add({"dn": dn2, "objectclass": "group"})
+        self.addCleanup(self.delete_object, dn2)
+
+        start_attrs = [("objectclass", "group"),
+                       ("member", dn2)]
+
+        mod_attrs = [("member", None, FLAG_MOD_DELETE),
+                     ("member", None, FLAG_MOD_REPLACE),
+                     ("member", dn2, FLAG_MOD_DELETE),
+                     ("member", None, FLAG_MOD_ADD),
+        ]
+        self._test_modify_order(start_attrs, mod_attrs, ["memberOf"])
+
+
+def get_dsdb():
+    dsdb = SamDB(host,
+                 credentials=creds,
+                 session_info=system_session(lp),
+                 lp=lp)
+    return dsdb
+
+
+parser = optparse.OptionParser("ldap_modify_order.py [options] <host>")
+sambaopts = options.SambaOptions(parser)
+parser.add_option_group(sambaopts)
+parser.add_option_group(options.VersionOptions(parser))
+credopts = options.CredentialsOptions(parser)
+parser.add_option_group(credopts)
+subunitopts = SubunitOptions(parser)
+parser.add_option_group(subunitopts)
+parser.add_option("--rewrite-ground-truth", action="store_true",
+                  help="write expected values")
+parser.add_option("-v", "--verbose", action="store_true")
+
+opts, args = parser.parse_args()
+
+if len(args) < 1:
+    parser.print_usage()
+    sys.exit(1)
+
+host = args[0]
+
+lp = sambaopts.get_loadparm()
+creds = credopts.get_credentials(lp)
+
+
+if "://" not in host:
+    if os.path.isfile(host):
+        host = "tdb://%s" % host
+    else:
+        host = "ldap://%s" % host
+
+
+TestProgram(module=__name__, opts=subunitopts)
diff --git a/source4/dsdb/tests/python/testdata/modify_order_account_locality_device.expected b/source4/dsdb/tests/python/testdata/modify_order_account_locality_device.expected
new file mode 100644 (file)
index 0000000..dc5e162
--- /dev/null
@@ -0,0 +1,34 @@
+modify_order_account_locality_device
+initial attrs:
+         objectclass: 'account'
+                   l: 'a'
+== result ===[  3]=======================
+ERR_CONSTRAINT_VIOLATION (19)
+-- operations ---------------------------
+               l delete   a
+           owner add      c
+     objectclass replace  ['device', 'top']
+----------------------------------
+           owner add      c
+     objectclass replace  ['device', 'top']
+               l delete   a
+----------------------------------
+           owner add      c
+               l delete   a
+     objectclass replace  ['device', 'top']
+----------------------------------
+== result ===[  3]=======================
+ERR_OBJECT_CLASS_VIOLATION (65)
+-- operations ---------------------------
+     objectclass replace  ['device', 'top']
+               l delete   a
+           owner add      c
+----------------------------------
+     objectclass replace  ['device', 'top']
+           owner add      c
+               l delete   a
+----------------------------------
+               l delete   a
+     objectclass replace  ['device', 'top']
+           owner add      c
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_container_flags.expected b/source4/dsdb/tests/python/testdata/modify_order_container_flags.expected
new file mode 100644 (file)
index 0000000..eee3c52
--- /dev/null
@@ -0,0 +1,134 @@
+modify_order_container_flags
+initial attrs:
+         objectclass: 'container'
+== result ===[  6]=======================
+               flags: [b'101']
+         objectClass: [b'container', b'top']
+-- operations ---------------------------
+           flags add      0x6
+           flags add      5
+           flags delete   c
+           flags replace  101
+----------------------------------
+           flags add      0x6
+           flags delete   c
+           flags add      5
+           flags replace  101
+----------------------------------
+           flags add      5
+           flags add      0x6
+           flags delete   c
+           flags replace  101
+----------------------------------
+           flags add      5
+           flags delete   c
+           flags add      0x6
+           flags replace  101
+----------------------------------
+           flags delete   c
+           flags add      0x6
+           flags add      5
+           flags replace  101
+----------------------------------
+           flags delete   c
+           flags add      5
+           flags add      0x6
+           flags replace  101
+----------------------------------
+== result ===[  6]=======================
+               flags: [b'5']
+         objectClass: [b'container', b'top']
+-- operations ---------------------------
+           flags add      0x6
+           flags replace  101
+           flags delete   c
+           flags add      5
+----------------------------------
+           flags add      0x6
+           flags delete   c
+           flags replace  101
+           flags add      5
+----------------------------------
+           flags replace  101
+           flags add      0x6
+           flags delete   c
+           flags add      5
+----------------------------------
+           flags replace  101
+           flags delete   c
+           flags add      0x6
+           flags add      5
+----------------------------------
+           flags delete   c
+           flags add      0x6
+           flags replace  101
+           flags add      5
+----------------------------------
+           flags delete   c
+           flags replace  101
+           flags add      0x6
+           flags add      5
+----------------------------------
+== result ===[ 12]=======================
+ERR_INVALID_ATTRIBUTE_SYNTAX (21)
+-- operations ---------------------------
+           flags add      0x6
+           flags add      5
+           flags replace  101
+           flags delete   c
+----------------------------------
+           flags add      0x6
+           flags replace  101
+           flags add      5
+           flags delete   c
+----------------------------------
+           flags add      5
+           flags add      0x6
+           flags replace  101
+           flags delete   c
+----------------------------------
+           flags add      5
+           flags replace  101
+           flags add      0x6
+           flags delete   c
+----------------------------------
+           flags add      5
+           flags replace  101
+           flags delete   c
+           flags add      0x6
+----------------------------------
+           flags add      5
+           flags delete   c
+           flags replace  101
+           flags add      0x6
+----------------------------------
+           flags replace  101
+           flags add      0x6
+           flags add      5
+           flags delete   c
+----------------------------------
+           flags replace  101
+           flags add      5
+           flags add      0x6
+           flags delete   c
+----------------------------------
+           flags replace  101
+           flags add      5
+           flags delete   c
+           flags add      0x6
+----------------------------------
+           flags replace  101
+           flags delete   c
+           flags add      5
+           flags add      0x6
+----------------------------------
+           flags delete   c
+           flags add      5
+           flags replace  101
+           flags add      0x6
+----------------------------------
+           flags delete   c
+           flags replace  101
+           flags add      5
+           flags add      0x6
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_container_flags_multivalue.expected b/source4/dsdb/tests/python/testdata/modify_order_container_flags_multivalue.expected
new file mode 100644 (file)
index 0000000..99ee5a7
--- /dev/null
@@ -0,0 +1,138 @@
+modify_order_container_flags_multivalue
+initial attrs:
+         objectclass: 'container'
+         wWWHomePage: 'a'
+== result ===[  6]=======================
+               flags: [b'65355']
+         objectClass: [b'container', b'top']
+         wWWHomePage: [b'a']
+-- operations ---------------------------
+           flags add      ['0', '1']
+           flags delete   65355
+           flags replace  ['2', '101']
+           flags add      65355
+----------------------------------
+           flags add      ['0', '1']
+           flags replace  ['2', '101']
+           flags delete   65355
+           flags add      65355
+----------------------------------
+           flags delete   65355
+           flags add      ['0', '1']
+           flags replace  ['2', '101']
+           flags add      65355
+----------------------------------
+           flags delete   65355
+           flags replace  ['2', '101']
+           flags add      ['0', '1']
+           flags add      65355
+----------------------------------
+           flags replace  ['2', '101']
+           flags add      ['0', '1']
+           flags delete   65355
+           flags add      65355
+----------------------------------
+           flags replace  ['2', '101']
+           flags delete   65355
+           flags add      ['0', '1']
+           flags add      65355
+----------------------------------
+== result ===[  6]=======================
+ERR_ATTRIBUTE_OR_VALUE_EXISTS (20)
+-- operations ---------------------------
+           flags add      65355
+           flags delete   65355
+           flags replace  ['2', '101']
+           flags add      ['0', '1']
+----------------------------------
+           flags add      65355
+           flags replace  ['2', '101']
+           flags delete   65355
+           flags add      ['0', '1']
+----------------------------------
+           flags delete   65355
+           flags add      65355
+           flags replace  ['2', '101']
+           flags add      ['0', '1']
+----------------------------------
+           flags delete   65355
+           flags replace  ['2', '101']
+           flags add      65355
+           flags add      ['0', '1']
+----------------------------------
+           flags replace  ['2', '101']
+           flags add      65355
+           flags delete   65355
+           flags add      ['0', '1']
+----------------------------------
+           flags replace  ['2', '101']
+           flags delete   65355
+           flags add      65355
+           flags add      ['0', '1']
+----------------------------------
+== result ===[  6]=======================
+ERR_CONSTRAINT_VIOLATION (19)
+-- operations ---------------------------
+           flags add      ['0', '1']
+           flags add      65355
+           flags delete   65355
+           flags replace  ['2', '101']
+----------------------------------
+           flags add      ['0', '1']
+           flags delete   65355
+           flags add      65355
+           flags replace  ['2', '101']
+----------------------------------
+           flags add      65355
+           flags add      ['0', '1']
+           flags delete   65355
+           flags replace  ['2', '101']
+----------------------------------
+           flags add      65355
+           flags delete   65355
+           flags add      ['0', '1']
+           flags replace  ['2', '101']
+----------------------------------
+           flags delete   65355
+           flags add      ['0', '1']
+           flags add      65355
+           flags replace  ['2', '101']
+----------------------------------
+           flags delete   65355
+           flags add      65355
+           flags add      ['0', '1']
+           flags replace  ['2', '101']
+----------------------------------
+== result ===[  6]=======================
+ERR_NO_SUCH_ATTRIBUTE (16)
+-- operations ---------------------------
+           flags add      ['0', '1']
+           flags add      65355
+           flags replace  ['2', '101']
+           flags delete   65355
+----------------------------------
+           flags add      ['0', '1']
+           flags replace  ['2', '101']
+           flags add      65355
+           flags delete   65355
+----------------------------------
+           flags add      65355
+           flags add      ['0', '1']
+           flags replace  ['2', '101']
+           flags delete   65355
+----------------------------------
+           flags add      65355
+           flags replace  ['2', '101']
+           flags add      ['0', '1']
+           flags delete   65355
+----------------------------------
+           flags replace  ['2', '101']
+           flags add      ['0', '1']
+           flags add      65355
+           flags delete   65355
+----------------------------------
+           flags replace  ['2', '101']
+           flags add      65355
+           flags add      ['0', '1']
+           flags delete   65355
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_inapplicable.expected b/source4/dsdb/tests/python/testdata/modify_order_inapplicable.expected
new file mode 100644 (file)
index 0000000..f16ef8c
--- /dev/null
@@ -0,0 +1,34 @@
+modify_order_inapplicable
+initial attrs:
+         objectclass: 'user'
+           givenName: 'a'
+== result ===[  2]=======================
+ERR_NO_SUCH_ATTRIBUTE (16)
+-- operations ---------------------------
+       dhcpSites replace  b
+       dhcpSites add      c
+       dhcpSites delete   b
+----------------------------------
+       dhcpSites add      c
+       dhcpSites replace  b
+       dhcpSites delete   b
+----------------------------------
+== result ===[  4]=======================
+ERR_OBJECT_CLASS_VIOLATION (65)
+-- operations ---------------------------
+       dhcpSites replace  b
+       dhcpSites delete   b
+       dhcpSites add      c
+----------------------------------
+       dhcpSites delete   b
+       dhcpSites replace  b
+       dhcpSites add      c
+----------------------------------
+       dhcpSites delete   b
+       dhcpSites add      c
+       dhcpSites replace  b
+----------------------------------
+       dhcpSites add      c
+       dhcpSites delete   b
+       dhcpSites replace  b
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_member.expected b/source4/dsdb/tests/python/testdata/modify_order_member.expected
new file mode 100644 (file)
index 0000000..1882c34
--- /dev/null
@@ -0,0 +1,190 @@
+modify_order_member
+initial attrs:
+         objectclass: 'group'
+              member: 'cn=modify_order_member_other_group,{base dn}'
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_0,CN=Users,{base dn}', b'CN=modify_order_member_other_group,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_0,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member delete   cn=ldaptest_modify_order_member_0,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_0,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member add      cn=ldaptest_modify_order_member_0,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_12,CN=Users,{base dn}', b'CN=modify_order_member_other_group,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_12,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member delete   cn=ldaptest_modify_order_member_12,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_12,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_12,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_13,CN=Users,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_13,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member delete   cn=ldaptest_modify_order_member_13,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_13,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_13,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_14,CN=Users,{base dn}', b'CN=modify_order_member_other_group,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_14,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member replace  cn=ldaptest_modify_order_member_14,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_14,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_14,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_16,CN=Users,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_16,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member add      cn=ldaptest_modify_order_member_16,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_16,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_16,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_19,CN=Users,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_19,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member add      cn=ldaptest_modify_order_member_19,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_19,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member replace  cn=ldaptest_modify_order_member_19,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_2,CN=Users,{base dn}', b'CN=modify_order_member_other_group,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_2,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member delete   cn=ldaptest_modify_order_member_2,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member replace  cn=ldaptest_modify_order_member_2,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_2,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_22,CN=Users,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_22,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member add      cn=ldaptest_modify_order_member_22,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member delete   cn=ldaptest_modify_order_member_22,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_22,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_3,CN=Users,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_3,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member delete   cn=ldaptest_modify_order_member_3,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member add      cn=ldaptest_modify_order_member_3,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_3,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_5,CN=Users,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_5,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member delete   cn=ldaptest_modify_order_member_5,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_5,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member replace  cn=ldaptest_modify_order_member_5,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_6,CN=Users,{base dn}', b'CN=modify_order_member_other_group,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_6,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member replace  cn=ldaptest_modify_order_member_6,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_6,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member add      cn=ldaptest_modify_order_member_6,cn=users,{base dn}
+----------------------------------
+== result ===[  1]=======================
+              member: [b'CN=ldaptest_modify_order_member_8,CN=Users,{base dn}', b'CN=modify_order_member_other_group,{base dn}']
+            memberOf: [b'CN=ldaptest_modify_order_member_8,CN=Users,{base dn}']
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member replace  cn=ldaptest_modify_order_member_8,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member delete   cn=ldaptest_modify_order_member_8,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_8,cn=users,{base dn}
+----------------------------------
+== result ===[  6]=======================
+         objectClass: [b'group', b'top']
+-- operations ---------------------------
+          member delete   cn=ldaptest_modify_order_member_1,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_1,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_1,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+----------------------------------
+          member delete   cn=ldaptest_modify_order_member_4,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_4,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_4,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+----------------------------------
+          member replace  cn=ldaptest_modify_order_member_7,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_7,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_7,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+----------------------------------
+          member replace  cn=ldaptest_modify_order_member_10,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_10,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_10,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+----------------------------------
+          member add      cn=ldaptest_modify_order_member_18,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_18,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_18,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+----------------------------------
+          member add      cn=ldaptest_modify_order_member_20,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_20,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_20,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+----------------------------------
+== result ===[  6]=======================
+ERR_UNWILLING_TO_PERFORM (53)
+-- operations ---------------------------
+          member replace  cn=ldaptest_modify_order_member_9,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member add      cn=ldaptest_modify_order_member_9,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_9,cn=users,{base dn}
+----------------------------------
+          member replace  cn=ldaptest_modify_order_member_11,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_11,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member delete   cn=ldaptest_modify_order_member_11,cn=users,{base dn}
+----------------------------------
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member replace  cn=ldaptest_modify_order_member_15,cn=users,{base dn}
+          member add      cn=ldaptest_modify_order_member_15,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_15,cn=users,{base dn}
+----------------------------------
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member add      cn=ldaptest_modify_order_member_17,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_17,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_17,cn=users,{base dn}
+----------------------------------
+          member add      cn=ldaptest_modify_order_member_21,cn=users,{base dn}
+          member replace  cn=ldaptest_modify_order_member_21,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member delete   cn=ldaptest_modify_order_member_21,cn=users,{base dn}
+----------------------------------
+          member add      cn=ldaptest_modify_order_member_23,cn=users,{base dn}
+          member delete   cn=modify_order_member_other_group,{base dn}
+          member replace  cn=ldaptest_modify_order_member_23,cn=users,{base dn}
+          member delete   cn=ldaptest_modify_order_member_23,cn=users,{base dn}
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_mixed.expected b/source4/dsdb/tests/python/testdata/modify_order_mixed.expected
new file mode 100644 (file)
index 0000000..d80f572
--- /dev/null
@@ -0,0 +1,143 @@
+modify_order_mixed
+initial attrs:
+         objectclass: 'user'
+          carLicense: ['1', '2', '3']
+      otherTelephone: '123'
+== result ===[  6]=======================
+          carLicense: [b'1', b'2', b'3', b'4']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+      carLicense delete   3
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense delete   3
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone delete   123
+----------------------------------
+      carLicense delete   3
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense add      4
+----------------------------------
+  otherTelephone replace  4
+      carLicense delete   3
+      carLicense add      4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense delete   3
+  otherTelephone delete   123
+      carLicense add      4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense delete   3
+      carLicense add      4
+----------------------------------
+== result ===[  6]=======================
+          carLicense: [b'1', b'2', b'3', b'4']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+      otherTelephone: [b'4']
+-- operations ---------------------------
+      carLicense delete   3
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense delete   3
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone replace  4
+----------------------------------
+      carLicense delete   3
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense add      4
+----------------------------------
+  otherTelephone delete   123
+      carLicense delete   3
+      carLicense add      4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense delete   3
+  otherTelephone replace  4
+      carLicense add      4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense delete   3
+      carLicense add      4
+----------------------------------
+== result ===[  6]=======================
+          carLicense: [b'1', b'2']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+      carLicense add      4
+      carLicense delete   3
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense add      4
+  otherTelephone replace  4
+      carLicense delete   3
+  otherTelephone delete   123
+----------------------------------
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense delete   3
+----------------------------------
+  otherTelephone replace  4
+      carLicense add      4
+      carLicense delete   3
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone delete   123
+      carLicense delete   3
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense add      4
+      carLicense delete   3
+----------------------------------
+== result ===[  6]=======================
+          carLicense: [b'1', b'2']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+      otherTelephone: [b'4']
+-- operations ---------------------------
+      carLicense add      4
+      carLicense delete   3
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense add      4
+  otherTelephone delete   123
+      carLicense delete   3
+  otherTelephone replace  4
+----------------------------------
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense delete   3
+----------------------------------
+  otherTelephone delete   123
+      carLicense add      4
+      carLicense delete   3
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone replace  4
+      carLicense delete   3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense add      4
+      carLicense delete   3
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_mixed2.expected b/source4/dsdb/tests/python/testdata/modify_order_mixed2.expected
new file mode 100644 (file)
index 0000000..3500a8c
--- /dev/null
@@ -0,0 +1,143 @@
+modify_order_mixed2
+initial attrs:
+         objectclass: 'user'
+          carLicense: ['1', '2', '3']
+             ipPhone: '123'
+== result ===[  6]=======================
+          carLicense: [b'1', b'2', b'3', b'4']
+             ipPhone: [b'4']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+      carLicense delete   3
+      carLicense add      4
+         ipPhone delete   123
+         ipPhone replace  4
+----------------------------------
+      carLicense delete   3
+         ipPhone delete   123
+      carLicense add      4
+         ipPhone replace  4
+----------------------------------
+      carLicense delete   3
+         ipPhone delete   123
+         ipPhone replace  4
+      carLicense add      4
+----------------------------------
+         ipPhone delete   123
+      carLicense delete   3
+      carLicense add      4
+         ipPhone replace  4
+----------------------------------
+         ipPhone delete   123
+      carLicense delete   3
+         ipPhone replace  4
+      carLicense add      4
+----------------------------------
+         ipPhone delete   123
+         ipPhone replace  4
+      carLicense delete   3
+      carLicense add      4
+----------------------------------
+== result ===[  6]=======================
+          carLicense: [b'1', b'2', b'3', b'4']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+      carLicense delete   3
+      carLicense add      4
+         ipPhone replace  4
+         ipPhone delete   123
+----------------------------------
+      carLicense delete   3
+         ipPhone replace  4
+      carLicense add      4
+         ipPhone delete   123
+----------------------------------
+      carLicense delete   3
+         ipPhone replace  4
+         ipPhone delete   123
+      carLicense add      4
+----------------------------------
+         ipPhone replace  4
+      carLicense delete   3
+      carLicense add      4
+         ipPhone delete   123
+----------------------------------
+         ipPhone replace  4
+      carLicense delete   3
+         ipPhone delete   123
+      carLicense add      4
+----------------------------------
+         ipPhone replace  4
+         ipPhone delete   123
+      carLicense delete   3
+      carLicense add      4
+----------------------------------
+== result ===[  6]=======================
+          carLicense: [b'1', b'2']
+             ipPhone: [b'4']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+      carLicense add      4
+      carLicense delete   3
+         ipPhone delete   123
+         ipPhone replace  4
+----------------------------------
+      carLicense add      4
+         ipPhone delete   123
+      carLicense delete   3
+         ipPhone replace  4
+----------------------------------
+      carLicense add      4
+         ipPhone delete   123
+         ipPhone replace  4
+      carLicense delete   3
+----------------------------------
+         ipPhone delete   123
+      carLicense add      4
+      carLicense delete   3
+         ipPhone replace  4
+----------------------------------
+         ipPhone delete   123
+      carLicense add      4
+         ipPhone replace  4
+      carLicense delete   3
+----------------------------------
+         ipPhone delete   123
+         ipPhone replace  4
+      carLicense add      4
+      carLicense delete   3
+----------------------------------
+== result ===[  6]=======================
+          carLicense: [b'1', b'2']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+      carLicense add      4
+      carLicense delete   3
+         ipPhone replace  4
+         ipPhone delete   123
+----------------------------------
+      carLicense add      4
+         ipPhone replace  4
+      carLicense delete   3
+         ipPhone delete   123
+----------------------------------
+      carLicense add      4
+         ipPhone replace  4
+         ipPhone delete   123
+      carLicense delete   3
+----------------------------------
+         ipPhone replace  4
+      carLicense add      4
+      carLicense delete   3
+         ipPhone delete   123
+----------------------------------
+         ipPhone replace  4
+      carLicense add      4
+         ipPhone delete   123
+      carLicense delete   3
+----------------------------------
+         ipPhone replace  4
+         ipPhone delete   123
+      carLicense add      4
+      carLicense delete   3
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_objectclass.expected b/source4/dsdb/tests/python/testdata/modify_order_objectclass.expected
new file mode 100644 (file)
index 0000000..0ec6d4a
--- /dev/null
@@ -0,0 +1,35 @@
+modify_order_objectclass
+initial attrs:
+         objectclass: 'user'
+      otherTelephone: '123'
+== result ===[  2]=======================
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+      otherTelephone: [b'123']
+-- operations ---------------------------
+     objectclass replace  computer
+     objectclass delete   user
+     objectclass delete   person
+----------------------------------
+     objectclass delete   user
+     objectclass replace  computer
+     objectclass delete   person
+----------------------------------
+== result ===[  4]=======================
+ERR_OBJECT_CLASS_VIOLATION (65)
+-- operations ---------------------------
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass delete   user
+----------------------------------
+     objectclass delete   user
+     objectclass delete   person
+     objectclass replace  computer
+----------------------------------
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass delete   user
+----------------------------------
+     objectclass delete   person
+     objectclass delete   user
+     objectclass replace  computer
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_objectclass2.expected b/source4/dsdb/tests/python/testdata/modify_order_objectclass2.expected
new file mode 100644 (file)
index 0000000..4f51708
--- /dev/null
@@ -0,0 +1,735 @@
+modify_order_objectclass2
+initial attrs:
+         objectclass: 'user'
+== result ===[ 24]=======================
+         objectClass: [b'inetOrgPerson', b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+     objectclass replace  computer
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  computer
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      user
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass add      user
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass add      user
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      user
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      user
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      user
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      user
+     objectclass add      inetOrgPerson
+----------------------------------
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+----------------------------------
+== result ===[ 24]=======================
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+     objectclass replace  computer
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+----------------------------------
+     objectclass replace  computer
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass delete   person
+----------------------------------
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+----------------------------------
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass delete   person
+----------------------------------
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass delete   person
+----------------------------------
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass delete   person
+----------------------------------
+     objectclass add      user
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+----------------------------------
+     objectclass add      user
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass delete   person
+----------------------------------
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+----------------------------------
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass delete   person
+----------------------------------
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass delete   person
+----------------------------------
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass delete   person
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass delete   person
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass delete   person
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass add      user
+     objectclass delete   person
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  computer
+     objectclass delete   person
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass delete   person
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass delete   person
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass delete   person
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass delete   person
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      user
+     objectclass delete   person
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass replace  computer
+     objectclass delete   person
+----------------------------------
+== result ===[ 24]=======================
+ERR_ATTRIBUTE_OR_VALUE_EXISTS (20)
+-- operations ---------------------------
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass add      user
+----------------------------------
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass add      user
+----------------------------------
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      user
+----------------------------------
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      user
+----------------------------------
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass add      user
+----------------------------------
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass add      user
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass add      user
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass add      user
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      user
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      user
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass add      user
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass add      user
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      user
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      user
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      user
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      user
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      user
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      user
+----------------------------------
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass add      user
+----------------------------------
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass add      user
+----------------------------------
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass add      user
+----------------------------------
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass add      user
+----------------------------------
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+     objectclass add      user
+----------------------------------
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+     objectclass add      user
+----------------------------------
+== result ===[ 48]=======================
+ERR_OBJECT_CLASS_VIOLATION (65)
+-- operations ---------------------------
+     objectclass replace  computer
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass replace  computer
+     objectclass add      user
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      user
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      user
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  computer
+----------------------------------
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+----------------------------------
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass replace  computer
+----------------------------------
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+----------------------------------
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+----------------------------------
+     objectclass add      user
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      user
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  computer
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  computer
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  computer
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+----------------------------------
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  computer
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  computer
+     objectclass delete   person
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass replace  computer
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass delete   person
+     objectclass replace  computer
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  computer
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      user
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+----------------------------------
+     objectclass add      inetOrgPerson
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass replace  computer
+----------------------------------
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass delete   person
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  computer
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass delete   person
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+----------------------------------
+     objectclass delete   person
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass delete   person
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+----------------------------------
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+----------------------------------
+     objectclass delete   person
+     objectclass replace  attributeSchema
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  computer
+----------------------------------
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  computer
+     objectclass add      user
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  computer
+     objectclass replace  attributeSchema
+----------------------------------
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass add      user
+     objectclass replace  attributeSchema
+     objectclass replace  computer
+----------------------------------
+     objectclass delete   person
+     objectclass add      inetOrgPerson
+     objectclass replace  attributeSchema
+     objectclass add      user
+     objectclass replace  computer
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_singlevalue.expected b/source4/dsdb/tests/python/testdata/modify_order_singlevalue.expected
new file mode 100644 (file)
index 0000000..9946165
--- /dev/null
@@ -0,0 +1,740 @@
+modify_order_singlevalue
+initial attrs:
+         objectclass: 'user'
+           givenName: 'a'
+== result ===[ 24]=======================
+           givenName: [b'a']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName delete   a
+       givenName add      c
+       givenName replace  a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName add      c
+       givenName delete   a
+       givenName replace  a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName delete   b
+       givenName add      c
+       givenName replace  a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName add      c
+       givenName delete   b
+       givenName replace  a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   b
+       givenName delete   a
+       givenName replace  a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   a
+       givenName delete   b
+       givenName replace  a
+----------------------------------
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName add      c
+       givenName replace  a
+----------------------------------
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   a
+       givenName replace  a
+----------------------------------
+       givenName delete   b
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName replace  a
+----------------------------------
+       givenName delete   b
+       givenName delete   a
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName replace  a
+----------------------------------
+       givenName delete   b
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName replace  a
+----------------------------------
+       givenName delete   b
+       givenName add      c
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName replace  a
+----------------------------------
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName add      c
+       givenName replace  a
+----------------------------------
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   b
+       givenName replace  a
+----------------------------------
+       givenName delete   a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName replace  a
+----------------------------------
+       givenName delete   a
+       givenName delete   b
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName replace  a
+----------------------------------
+       givenName delete   a
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName replace  a
+----------------------------------
+       givenName delete   a
+       givenName add      c
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName replace  a
+----------------------------------
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName delete   a
+       givenName replace  a
+----------------------------------
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName delete   b
+       givenName replace  a
+----------------------------------
+       givenName add      c
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName replace  a
+----------------------------------
+       givenName add      c
+       givenName delete   b
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName replace  a
+----------------------------------
+       givenName add      c
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName replace  a
+----------------------------------
+       givenName add      c
+       givenName delete   a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName replace  a
+----------------------------------
+== result ===[ 24]=======================
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName add      c
+       givenName delete   a
+----------------------------------
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   b
+       givenName delete   a
+----------------------------------
+       givenName replace  a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   a
+----------------------------------
+       givenName replace  a
+       givenName delete   b
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   a
+----------------------------------
+       givenName replace  a
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName delete   a
+----------------------------------
+       givenName replace  a
+       givenName add      c
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName delete   a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   b
+       givenName add      c
+       givenName delete   a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName add      c
+       givenName delete   b
+       givenName delete   a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName replace  a
+       givenName add      c
+       givenName delete   a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName add      c
+       givenName replace  a
+       givenName delete   a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName replace  a
+       givenName delete   b
+       givenName delete   a
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   b
+       givenName replace  a
+       givenName delete   a
+----------------------------------
+       givenName delete   b
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   a
+----------------------------------
+       givenName delete   b
+       givenName replace  a
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   a
+----------------------------------
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName add      c
+       givenName delete   a
+----------------------------------
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName replace  a
+       givenName delete   a
+----------------------------------
+       givenName delete   b
+       givenName add      c
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   a
+----------------------------------
+       givenName delete   b
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   a
+----------------------------------
+       givenName add      c
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName delete   a
+----------------------------------
+       givenName add      c
+       givenName replace  a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName delete   a
+----------------------------------
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   b
+       givenName delete   a
+----------------------------------
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName replace  a
+       givenName delete   a
+----------------------------------
+       givenName add      c
+       givenName delete   b
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   a
+----------------------------------
+       givenName add      c
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   a
+----------------------------------
+== result ===[ 24]=======================
+ERR_ATTRIBUTE_OR_VALUE_EXISTS (20)
+-- operations ---------------------------
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName delete   a
+       givenName add      c
+----------------------------------
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName delete   b
+       givenName add      c
+----------------------------------
+       givenName replace  a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName add      c
+----------------------------------
+       givenName replace  a
+       givenName delete   b
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName add      c
+----------------------------------
+       givenName replace  a
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName add      c
+----------------------------------
+       givenName replace  a
+       givenName delete   a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName add      c
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   b
+       givenName delete   a
+       givenName add      c
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   a
+       givenName delete   b
+       givenName add      c
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName replace  a
+       givenName delete   a
+       givenName add      c
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName delete   a
+       givenName replace  a
+       givenName add      c
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName replace  a
+       givenName delete   b
+       givenName add      c
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName delete   b
+       givenName replace  a
+       givenName add      c
+----------------------------------
+       givenName delete   b
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName add      c
+----------------------------------
+       givenName delete   b
+       givenName replace  a
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName add      c
+----------------------------------
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   a
+       givenName add      c
+----------------------------------
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName replace  a
+       givenName add      c
+----------------------------------
+       givenName delete   b
+       givenName delete   a
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName add      c
+----------------------------------
+       givenName delete   b
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName add      c
+----------------------------------
+       givenName delete   a
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName add      c
+----------------------------------
+       givenName delete   a
+       givenName replace  a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName add      c
+----------------------------------
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   b
+       givenName add      c
+----------------------------------
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+       givenName replace  a
+       givenName add      c
+----------------------------------
+       givenName delete   a
+       givenName delete   b
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName add      c
+----------------------------------
+       givenName delete   a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName add      c
+----------------------------------
+== result ===[ 24]=======================
+ERR_CONSTRAINT_VIOLATION (19)
+-- operations ---------------------------
+       givenName replace  a
+       givenName delete   b
+       givenName delete   a
+       givenName add      c
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName replace  a
+       givenName delete   b
+       givenName add      c
+       givenName delete   a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName replace  a
+       givenName delete   a
+       givenName delete   b
+       givenName add      c
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName replace  a
+       givenName delete   a
+       givenName add      c
+       givenName delete   b
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName replace  a
+       givenName add      c
+       givenName delete   b
+       givenName delete   a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName replace  a
+       givenName add      c
+       givenName delete   a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   b
+       givenName replace  a
+       givenName delete   a
+       givenName add      c
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   b
+       givenName replace  a
+       givenName add      c
+       givenName delete   a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   b
+       givenName delete   a
+       givenName replace  a
+       givenName add      c
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   b
+       givenName delete   a
+       givenName add      c
+       givenName replace  a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   b
+       givenName add      c
+       givenName replace  a
+       givenName delete   a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   b
+       givenName add      c
+       givenName delete   a
+       givenName replace  a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   a
+       givenName replace  a
+       givenName delete   b
+       givenName add      c
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   a
+       givenName replace  a
+       givenName add      c
+       givenName delete   b
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   a
+       givenName delete   b
+       givenName replace  a
+       givenName add      c
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   a
+       givenName delete   b
+       givenName add      c
+       givenName replace  a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   a
+       givenName add      c
+       givenName replace  a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName delete   a
+       givenName add      c
+       givenName delete   b
+       givenName replace  a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName add      c
+       givenName replace  a
+       givenName delete   b
+       givenName delete   a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName add      c
+       givenName replace  a
+       givenName delete   a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName add      c
+       givenName delete   b
+       givenName replace  a
+       givenName delete   a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName add      c
+       givenName delete   b
+       givenName delete   a
+       givenName replace  a
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName add      c
+       givenName delete   a
+       givenName replace  a
+       givenName delete   b
+       givenName replace  ['b', 'a']
+----------------------------------
+       givenName add      c
+       givenName delete   a
+       givenName delete   b
+       givenName replace  a
+       givenName replace  ['b', 'a']
+----------------------------------
+== result ===[ 24]=======================
+ERR_NO_SUCH_ATTRIBUTE (16)
+-- operations ---------------------------
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName add      c
+       givenName delete   b
+----------------------------------
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   a
+       givenName delete   b
+----------------------------------
+       givenName replace  a
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   b
+----------------------------------
+       givenName replace  a
+       givenName delete   a
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   b
+----------------------------------
+       givenName replace  a
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName delete   b
+----------------------------------
+       givenName replace  a
+       givenName add      c
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   a
+       givenName add      c
+       givenName delete   b
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName add      c
+       givenName delete   a
+       givenName delete   b
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName replace  a
+       givenName add      c
+       givenName delete   b
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName add      c
+       givenName replace  a
+       givenName delete   b
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName replace  a
+       givenName delete   a
+       givenName delete   b
+----------------------------------
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   a
+       givenName replace  a
+       givenName delete   b
+----------------------------------
+       givenName delete   a
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName delete   b
+----------------------------------
+       givenName delete   a
+       givenName replace  a
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   b
+----------------------------------
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName add      c
+       givenName delete   b
+----------------------------------
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName add      c
+       givenName replace  a
+       givenName delete   b
+----------------------------------
+       givenName delete   a
+       givenName add      c
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+----------------------------------
+       givenName delete   a
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   b
+----------------------------------
+       givenName add      c
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName delete   b
+----------------------------------
+       givenName add      c
+       givenName replace  a
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+----------------------------------
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   a
+       givenName delete   b
+----------------------------------
+       givenName add      c
+       givenName replace  ['b', 'a']
+       givenName delete   a
+       givenName replace  a
+       givenName delete   b
+----------------------------------
+       givenName add      c
+       givenName delete   a
+       givenName replace  a
+       givenName replace  ['b', 'a']
+       givenName delete   b
+----------------------------------
+       givenName add      c
+       givenName delete   a
+       givenName replace  ['b', 'a']
+       givenName replace  a
+       givenName delete   b
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_sometimes_inapplicable.expected b/source4/dsdb/tests/python/testdata/modify_order_sometimes_inapplicable.expected
new file mode 100644 (file)
index 0000000..a8af7f0
--- /dev/null
@@ -0,0 +1,127 @@
+modify_order_sometimes_inapplicable
+initial attrs:
+         objectclass: 'user'
+           givenName: 'a'
+== result ===[ 24]=======================
+ERR_OBJECT_CLASS_VIOLATION (65)
+-- operations ---------------------------
+     objectclass replace  computer
+     objectclass delete   person
+     dnsHostName add      b
+     dnsHostName replace  c
+----------------------------------
+     objectclass replace  computer
+     objectclass delete   person
+     dnsHostName replace  c
+     dnsHostName add      b
+----------------------------------
+     objectclass replace  computer
+     dnsHostName add      b
+     objectclass delete   person
+     dnsHostName replace  c
+----------------------------------
+     objectclass replace  computer
+     dnsHostName add      b
+     dnsHostName replace  c
+     objectclass delete   person
+----------------------------------
+     objectclass replace  computer
+     dnsHostName replace  c
+     objectclass delete   person
+     dnsHostName add      b
+----------------------------------
+     objectclass replace  computer
+     dnsHostName replace  c
+     dnsHostName add      b
+     objectclass delete   person
+----------------------------------
+     objectclass delete   person
+     objectclass replace  computer
+     dnsHostName add      b
+     dnsHostName replace  c
+----------------------------------
+     objectclass delete   person
+     objectclass replace  computer
+     dnsHostName replace  c
+     dnsHostName add      b
+----------------------------------
+     objectclass delete   person
+     dnsHostName add      b
+     objectclass replace  computer
+     dnsHostName replace  c
+----------------------------------
+     objectclass delete   person
+     dnsHostName add      b
+     dnsHostName replace  c
+     objectclass replace  computer
+----------------------------------
+     objectclass delete   person
+     dnsHostName replace  c
+     objectclass replace  computer
+     dnsHostName add      b
+----------------------------------
+     objectclass delete   person
+     dnsHostName replace  c
+     dnsHostName add      b
+     objectclass replace  computer
+----------------------------------
+     dnsHostName add      b
+     objectclass replace  computer
+     objectclass delete   person
+     dnsHostName replace  c
+----------------------------------
+     dnsHostName add      b
+     objectclass replace  computer
+     dnsHostName replace  c
+     objectclass delete   person
+----------------------------------
+     dnsHostName add      b
+     objectclass delete   person
+     objectclass replace  computer
+     dnsHostName replace  c
+----------------------------------
+     dnsHostName add      b
+     objectclass delete   person
+     dnsHostName replace  c
+     objectclass replace  computer
+----------------------------------
+     dnsHostName add      b
+     dnsHostName replace  c
+     objectclass replace  computer
+     objectclass delete   person
+----------------------------------
+     dnsHostName add      b
+     dnsHostName replace  c
+     objectclass delete   person
+     objectclass replace  computer
+----------------------------------
+     dnsHostName replace  c
+     objectclass replace  computer
+     objectclass delete   person
+     dnsHostName add      b
+----------------------------------
+     dnsHostName replace  c
+     objectclass replace  computer
+     dnsHostName add      b
+     objectclass delete   person
+----------------------------------
+     dnsHostName replace  c
+     objectclass delete   person
+     objectclass replace  computer
+     dnsHostName add      b
+----------------------------------
+     dnsHostName replace  c
+     objectclass delete   person
+     dnsHostName add      b
+     objectclass replace  computer
+----------------------------------
+     dnsHostName replace  c
+     dnsHostName add      b
+     objectclass replace  computer
+     objectclass delete   person
+----------------------------------
+     dnsHostName replace  c
+     dnsHostName add      b
+     objectclass delete   person
+     objectclass replace  computer
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_telephone.expected b/source4/dsdb/tests/python/testdata/modify_order_telephone.expected
new file mode 100644 (file)
index 0000000..d17de03
--- /dev/null
@@ -0,0 +1,752 @@
+modify_order_telephone
+initial attrs:
+         objectclass: 'user'
+      otherTelephone: '123'
+== result ===[ 20]=======================
+          carLicense: [b'3']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone add      4
+  otherTelephone delete   123
+----------------------------------
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense add      4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone delete   123
+----------------------------------
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+      carLicense add      4
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense add      4
+      carLicense replace  3
+----------------------------------
+  otherTelephone add      4
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense add      4
+      carLicense replace  3
+----------------------------------
+== result ===[ 20]=======================
+          carLicense: [b'3']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+      otherTelephone: [b'123', b'4']
+-- operations ---------------------------
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone add      4
+----------------------------------
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone add      4
+----------------------------------
+      carLicense add      4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone add      4
+----------------------------------
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone add      4
+----------------------------------
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense replace  3
+----------------------------------
+      carLicense add      4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone add      4
+----------------------------------
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone add      4
+----------------------------------
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone add      4
+----------------------------------
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone add      4
+----------------------------------
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone add      4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone add      4
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense add      4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone add      4
+----------------------------------
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone add      4
+----------------------------------
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone add      4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone add      4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense add      4
+      carLicense replace  3
+----------------------------------
+== result ===[ 20]=======================
+          carLicense: [b'3']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+      otherTelephone: [b'4']
+-- operations ---------------------------
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone add      4
+  otherTelephone replace  4
+----------------------------------
+      carLicense add      4
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+      carLicense add      4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone replace  4
+----------------------------------
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone add      4
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense add      4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense add      4
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense add      4
+      carLicense replace  3
+----------------------------------
+== result ===[ 20]=======================
+          carLicense: [b'4']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone add      4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense add      4
+----------------------------------
+      carLicense replace  3
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense add      4
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense add      4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense add      4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense add      4
+----------------------------------
+  otherTelephone add      4
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense add      4
+----------------------------------
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense add      4
+----------------------------------
+  otherTelephone add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense add      4
+----------------------------------
+== result ===[ 20]=======================
+          carLicense: [b'4']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+      otherTelephone: [b'123', b'4']
+-- operations ---------------------------
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone add      4
+----------------------------------
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone add      4
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone add      4
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone add      4
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense add      4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone add      4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone add      4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense add      4
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone add      4
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone add      4
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense add      4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone add      4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone add      4
+      carLicense add      4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense replace  3
+      carLicense add      4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone replace  4
+  otherTelephone add      4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense add      4
+  otherTelephone add      4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense add      4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone add      4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone add      4
+      carLicense add      4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone add      4
+      carLicense replace  3
+      carLicense add      4
+----------------------------------
+== result ===[ 20]=======================
+          carLicense: [b'4']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+      otherTelephone: [b'4']
+-- operations ---------------------------
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone add      4
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense add      4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense add      4
+----------------------------------
+  otherTelephone add      4
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense add      4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense add      4
+----------------------------------
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone add      4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense add      4
+----------------------------------
+  otherTelephone add      4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense add      4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone add      4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone add      4
+      carLicense add      4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense add      4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense replace  3
+      carLicense add      4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone add      4
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense add      4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone add      4
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense add      4
+----------------------------------
\ No newline at end of file
diff --git a/source4/dsdb/tests/python/testdata/modify_order_telephone_delete_delete.expected b/source4/dsdb/tests/python/testdata/modify_order_telephone_delete_delete.expected
new file mode 100644 (file)
index 0000000..14983ba
--- /dev/null
@@ -0,0 +1,736 @@
+modify_order_telephone_delete_delete
+initial attrs:
+         objectclass: 'user'
+      otherTelephone: '123'
+== result ===[ 20]=======================
+          carLicense: [b'3']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+-- operations ---------------------------
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   4
+  otherTelephone delete   123
+----------------------------------
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone delete   123
+----------------------------------
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense delete   4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   4
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense delete   4
+      carLicense replace  3
+----------------------------------
+== result ===[ 20]=======================
+          carLicense: [b'3']
+         objectClass: [b'organizationalPerson', b'person', b'top', b'user']
+      otherTelephone: [b'4']
+-- operations ---------------------------
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone delete   4
+  otherTelephone replace  4
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone replace  4
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   4
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense delete   4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense delete   4
+      carLicense replace  3
+----------------------------------
+== result ===[ 80]=======================
+ERR_NO_SUCH_ATTRIBUTE (16)
+-- operations ---------------------------
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone delete   4
+----------------------------------
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone delete   4
+----------------------------------
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone delete   4
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone delete   4
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense delete   4
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone delete   4
+----------------------------------
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense delete   4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   123
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense delete   4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense delete   4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense delete   4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone replace  4
+----------------------------------
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense delete   4
+----------------------------------
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone delete   4
+----------------------------------
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone delete   4
+----------------------------------
+      carLicense delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone delete   4
+----------------------------------
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone delete   4
+----------------------------------
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense replace  3
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   4
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   4
+----------------------------------
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense delete   4
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense delete   4
+----------------------------------
+  otherTelephone replace  4
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense delete   4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense delete   4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone delete   4
+      carLicense delete   4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone delete   4
+      carLicense replace  3
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense replace  3
+      carLicense delete   4
+----------------------------------
+  otherTelephone replace  4
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense delete   4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   4
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone delete   4
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   123
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   123
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone replace  4
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   4
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone delete   4
+      carLicense delete   4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+      carLicense replace  3
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   123
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone delete   123
+      carLicense delete   4
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense replace  3
+  otherTelephone delete   4
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense delete   4
+      carLicense replace  3
+  otherTelephone delete   4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+      carLicense delete   4
+  otherTelephone delete   4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense replace  3
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone replace  4
+  otherTelephone delete   4
+      carLicense delete   4
+      carLicense replace  3
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense replace  3
+      carLicense delete   4
+  otherTelephone replace  4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone delete   4
+      carLicense replace  3
+  otherTelephone replace  4
+      carLicense delete   4
+----------------------------------
+  otherTelephone delete   123
+  otherTelephone delete   4
+  otherTelephone replace  4
+      carLicense replace  3
+      carLicense delete   4
+----------------------------------
\ No newline at end of file
index 1d7c1a114b69d4d2e147f92e37f42d5013947bcd..7d879ff1bafe2c1ab9651014016da1dbbb4a6529 100755 (executable)
@@ -835,6 +835,18 @@ for env in ["ad_dc_ntvfs:local", "ad_dc:local",
     planoldpythontestsuite(env, "samba.tests.blackbox.smbcontrol")
 
 plantestsuite_loadlist("samba4.ldap.python(ad_dc_default)", "ad_dc_default", [python, os.path.join(DSDB_PYTEST_DIR, "ldap.py"), '$SERVER', '-U"$USERNAME%$PASSWORD"', '--workgroup=$DOMAIN', '$LOADLIST', '$LISTOPT'])
+
+plantestsuite_loadlist("samba4.ldap_modify_order.python(ad_dc_default)",
+                       "ad_dc_default",
+                       [python, os.path.join(samba4srcdir,
+                                             "dsdb/tests/python/"
+                                             "ldap_modify_order.py"),
+                        '$SERVER',
+                        '-U"$USERNAME%$PASSWORD"',
+                        '--workgroup=$DOMAIN',
+                        '$LOADLIST',
+                        '$LISTOPT'])
+
 plantestsuite_loadlist("samba4.tokengroups.krb5.python(ad_dc_default)", "ad_dc_default:local", [python, os.path.join(DSDB_PYTEST_DIR, "token_group.py"), '$SERVER', '-U"$USERNAME%$PASSWORD"', '--workgroup=$DOMAIN', '-k', 'yes', '$LOADLIST', '$LISTOPT'])
 plantestsuite_loadlist("samba4.tokengroups.ntlm.python(ad_dc_default)", "ad_dc_default:local", [python, os.path.join(DSDB_PYTEST_DIR, "token_group.py"), '$SERVER', '-U"$USERNAME%$PASSWORD"', '--workgroup=$DOMAIN', '-k', 'no', '$LOADLIST', '$LISTOPT'])
 plantestsuite("samba4.sam.python(fl2008r2dc)", "fl2008r2dc", [python, os.path.join(DSDB_PYTEST_DIR, "sam.py"), '$SERVER', '-U"$USERNAME%$PASSWORD"', '--workgroup=$DOMAIN'])