summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNalin Dahyabhai <nalin@redhat.com>2012-01-10 14:51:26 -0500
committerNalin Dahyabhai <nalin@redhat.com>2012-01-10 14:51:26 -0500
commit6cc8311b8c73bc55635d0e7aedee530c66eaa04d (patch)
treec1cea5091dd296d8a6f4f8f77d430d4f649a582b
parent982244674489c01e3575409561b94337a75e2639 (diff)
downloadslapi-nis-6cc8311b8c73bc55635d0e7aedee530c66eaa04d.tar.gz
slapi-nis-6cc8311b8c73bc55635d0e7aedee530c66eaa04d.tar.xz
slapi-nis-6cc8311b8c73bc55635d0e7aedee530c66eaa04d.zip
- use an internal sequence number to disable the skip-boring-updates logic, and test that while our results don't change, we did actually do processing
-rw-r--r--src/format.c49
-rw-r--r--tests/slapd.sh.in6
-rwxr-xr-xtests/test28-schema-modify-entry/after.sh2
-rw-r--r--tests/test28-schema-modify-entry/after.txt13
-rwxr-xr-xtests/test28-schema-modify-entry/before.sh2
-rw-r--r--tests/test28-schema-modify-entry/before.txt13
-rwxr-xr-xtests/test28-schema-modify-entry/change.sh11
-rw-r--r--tests/test28-schema-modify-entry/change.txt2
-rw-r--r--tests/test28-schema-modify-entry/description.txt1
-rw-r--r--tests/test28-schema-modify-entry/dse.ldif14
-rw-r--r--tests/test28-schema-modify-entry/userRoot.ldif80
-rwxr-xr-xtests/test29-schema-modify-entry/after.sh2
-rw-r--r--tests/test29-schema-modify-entry/after.txt13
-rwxr-xr-xtests/test29-schema-modify-entry/before.sh2
-rw-r--r--tests/test29-schema-modify-entry/before.txt13
-rwxr-xr-xtests/test29-schema-modify-entry/change.sh11
-rw-r--r--tests/test29-schema-modify-entry/change.txt2
-rw-r--r--tests/test29-schema-modify-entry/description.txt1
-rw-r--r--tests/test29-schema-modify-entry/dse.ldif14
-rw-r--r--tests/test29-schema-modify-entry/plugin-process-all.txt1
-rw-r--r--tests/test29-schema-modify-entry/userRoot.ldif80
21 files changed, 331 insertions, 1 deletions
diff --git a/src/format.c b/src/format.c
index 9c25d4c..cb014eb 100644
--- a/src/format.c
+++ b/src/format.c
@@ -3006,6 +3006,53 @@ format_unique(struct plugin_state *state, Slapi_PBlock *pb, Slapi_Entry *e,
return ret;
}
+/* Produce an internal sequence number. */
+static int
+format_internal_sequence_number(struct plugin_state *state,
+ Slapi_PBlock *pb, Slapi_Entry *e,
+ const char *group, const char *set,
+ const char *args, const char *disallowed,
+ char *outbuf, int outbuf_len,
+ struct format_choice **outbuf_choices,
+ char ***rel_attrs,
+ char ***ref_attrs,
+ struct format_inref_attr ***inref_attrs,
+ struct format_ref_attr_list ***ref_attr_list,
+ struct format_ref_attr_list ***inref_attr_list)
+{
+ static int sequence;
+ char *buf;
+ int ret, i, j, argc;
+ char **argv, **values;
+ const char *value_format, *default_value;
+ unsigned int *lengths;
+ struct berval **choices, bv;
+
+ choices = NULL;
+ buf = malloc(3 * sizeof(sequence));
+ if (buf != NULL) {
+ sprintf(buf, "%d", ++sequence);
+ bv.bv_val = buf;
+ bv.bv_len = strlen(buf);
+ format_add_bv_list(&choices, &bv);
+ }
+ if (choices != NULL) {
+ format_add_choice(outbuf_choices, outbuf, &choices);
+ ret = 0;
+ } else {
+ ret = -ENOENT;
+ }
+ if (ret == 0) {
+ slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id,
+ "internal_sequence_number: ->%s<-\n", buf);
+ } else {
+ slapi_log_error(SLAPI_LOG_PLUGIN, state->plugin_desc->spd_id,
+ "internal_sequence_number: error building result\n");
+ }
+ free(buf);
+ return ret;
+}
+
/* Choose a formatting function by name. */
static void *
format_lookup_fn(const char *fnname)
@@ -3043,7 +3090,7 @@ format_lookup_fn(const char *fnname)
{"collect", format_collect},
{"link", format_link},
{"unique", format_unique},
- /* {"uuid", format_uuid}, */
+ {"internal_sequence_number", format_internal_sequence_number},
};
for (i = 0; i < sizeof(fns) / sizeof(fns[0]); i++) {
if ((fns[i].name != NULL) &&
diff --git a/tests/slapd.sh.in b/tests/slapd.sh.in
index 547f391..cbe9ef1 100644
--- a/tests/slapd.sh.in
+++ b/tests/slapd.sh.in
@@ -69,6 +69,10 @@ startslapd() {
if ! test -s $TESTDIR/$TEST/plugin-skip-memberof.txt ; then
cat $BTESTDIR/config/dse.ldif.memberof >> $BTESTDIR/config/dse.ldif
fi
+ process_all=0
+ if test -s $TESTDIR/$TEST/plugin-process-all.txt ; then
+ process_all=1
+ fi
if test -n "$1" && test -s "$1" ; then
cat "$1" >> $BTESTDIR/config/dse.ldif
fi
@@ -79,6 +83,8 @@ startslapd() {
fi
fi
@NIS_PLUGIN_CONTINUE_WITHOUT_PORTMAP_ENV@=1 \
+ @NIS_PLUGIN_PROCESS_UNINTERESTING_UPDATES_ENV@=$process_all \
+ @SCHEMA_COMPAT_PLUGIN_PROCESS_UNINTERESTING_UPDATES_ENV@=$process_all \
@TRACE_CMD@ \
$SLAPD -D $BTESTDIR/config -i $STATEDIR/pid -w $STATEDIR/pid
if ! add -f $BTESTDIR/config/userRoot.ldif > /dev/null 2> /dev/null ; then
diff --git a/tests/test28-schema-modify-entry/after.sh b/tests/test28-schema-modify-entry/after.sh
new file mode 100755
index 0000000..3b25499
--- /dev/null
+++ b/tests/test28-schema-modify-entry/after.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+search -b cn=compat,cn=accounts,dc=example,dc=com dn memberUid sequence | $LDIFSORT
diff --git a/tests/test28-schema-modify-entry/after.txt b/tests/test28-schema-modify-entry/after.txt
new file mode 100644
index 0000000..2b2f173
--- /dev/null
+++ b/tests/test28-schema-modify-entry/after.txt
@@ -0,0 +1,13 @@
+dn: cn=compat,cn=accounts,dc=example,dc=com
+
+dn: cn=g1,ou=group,cn=compat,cn=accounts,dc=example,dc=com
+memberUid: tuser1
+sequence: 1
+
+dn: cn=g2,ou=group,cn=compat,cn=accounts,dc=example,dc=com
+memberUid: tuser2
+memberUid: tuser1
+sequence: 2
+
+dn: ou=group,cn=compat,cn=accounts,dc=example,dc=com
+
diff --git a/tests/test28-schema-modify-entry/before.sh b/tests/test28-schema-modify-entry/before.sh
new file mode 100755
index 0000000..3b25499
--- /dev/null
+++ b/tests/test28-schema-modify-entry/before.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+search -b cn=compat,cn=accounts,dc=example,dc=com dn memberUid sequence | $LDIFSORT
diff --git a/tests/test28-schema-modify-entry/before.txt b/tests/test28-schema-modify-entry/before.txt
new file mode 100644
index 0000000..2b2f173
--- /dev/null
+++ b/tests/test28-schema-modify-entry/before.txt
@@ -0,0 +1,13 @@
+dn: cn=compat,cn=accounts,dc=example,dc=com
+
+dn: cn=g1,ou=group,cn=compat,cn=accounts,dc=example,dc=com
+memberUid: tuser1
+sequence: 1
+
+dn: cn=g2,ou=group,cn=compat,cn=accounts,dc=example,dc=com
+memberUid: tuser2
+memberUid: tuser1
+sequence: 2
+
+dn: ou=group,cn=compat,cn=accounts,dc=example,dc=com
+
diff --git a/tests/test28-schema-modify-entry/change.sh b/tests/test28-schema-modify-entry/change.sh
new file mode 100755
index 0000000..6a9264c
--- /dev/null
+++ b/tests/test28-schema-modify-entry/change.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+modify << EOF
+dn: cn=g2,cn=groups,cn=accounts,dc=example,dc=com
+changetype: modify
+replace: gidNumber
+gidNumber: 2002
+-
+
+EOF
+# give memberOf a few seconds to catch up
+sleep 5
diff --git a/tests/test28-schema-modify-entry/change.txt b/tests/test28-schema-modify-entry/change.txt
new file mode 100644
index 0000000..f8ae3a0
--- /dev/null
+++ b/tests/test28-schema-modify-entry/change.txt
@@ -0,0 +1,2 @@
+modifying entry "cn=g2,cn=groups,cn=accounts,dc=example,dc=com"
+
diff --git a/tests/test28-schema-modify-entry/description.txt b/tests/test28-schema-modify-entry/description.txt
new file mode 100644
index 0000000..2b7ff3f
--- /dev/null
+++ b/tests/test28-schema-modify-entry/description.txt
@@ -0,0 +1 @@
+skipping uninteresting changes
diff --git a/tests/test28-schema-modify-entry/dse.ldif b/tests/test28-schema-modify-entry/dse.ldif
new file mode 100644
index 0000000..c04bdbb
--- /dev/null
+++ b/tests/test28-schema-modify-entry/dse.ldif
@@ -0,0 +1,14 @@
+dn: cn=compat-group,cn=Schema Compatibility,cn=plugins,cn=config
+objectClass: top
+objectClass: extensibleObject
+cn: compat-group
+schema-compat-container-group: cn=compat,cn=accounts,dc=example,dc=com
+schema-compat-container-rdn: ou=group
+schema-compat-check-access: yes
+schema-compat-search-base: cn=groups,cn=Accounts,dc=example,dc=com
+schema-compat-search-filter: (objectClass=posixGroup)
+schema-compat-entry-rdn: cn=%{cn}
+schema-compat-entry-attribute: objectclass=extensibleObject
+schema-compat-entry-attribute: memberUid=%deref_r("member","uid")
+schema-compat-entry-attribute: sequence=%internal_sequence_number()
+
diff --git a/tests/test28-schema-modify-entry/userRoot.ldif b/tests/test28-schema-modify-entry/userRoot.ldif
new file mode 100644
index 0000000..59a1577
--- /dev/null
+++ b/tests/test28-schema-modify-entry/userRoot.ldif
@@ -0,0 +1,80 @@
+# users, accounts, example.com
+dn: cn=users,cn=accounts,dc=example,dc=com
+objectClass: top
+objectClass: nsContainer
+cn: users
+
+# groups, accounts, example.com
+dn: cn=groups,cn=accounts,dc=example,dc=com
+objectClass: top
+objectClass: nsContainer
+cn: groups
+
+# tuser1, users, accounts, example.com
+dn: uid=tuser1,cn=users,cn=accounts,dc=example,dc=com
+uid: tuser1
+objectClass: top
+objectClass: person
+objectClass: posixAccount
+objectClass: inetUser
+loginShell: /bin/sh
+gidNumber: 1003
+gecos: tuser1
+sn: User
+homeDirectory: /home/tuser1
+cn: Tim User
+uidNumber: 1101
+
+# tuser2, users, accounts, example.com
+dn: uid=tuser2,cn=users,cn=accounts,dc=example,dc=com
+uid: tuser2
+objectClass: top
+objectClass: person
+objectClass: posixAccount
+objectClass: inetUser
+loginShell: /bin/sh
+gidNumber: 1004
+gecos: tuser2
+sn: User
+homeDirectory: /home/tuser2
+cn: Timmy User
+uidNumber: 1102
+
+# tuser3, users, accounts, example.com
+dn: uid=tuser3,cn=users,cn=accounts,dc=example,dc=com
+uid: tuser3
+objectClass: top
+objectClass: person
+objectClass: posixAccount
+objectClass: inetUser
+loginShell: /bin/sh
+gidNumber: 1004
+gecos: tuser3
+sn: User
+homeDirectory: /home/tuser3
+cn: Timothy User
+uidNumber: 1103
+
+# g1, groups, accounts, example.com
+dn: cn=g1,cn=groups,cn=accounts,dc=example,dc=com
+objectClass: top
+objectClass: groupofnames
+objectClass: posixGroup
+objectClass: inetUser
+gidNumber: 1001
+cn: g1
+description: g1
+member: uid=tuser1,cn=users,cn=accounts,dc=example,dc=com
+
+# g2, groups, accounts, example.com
+dn: cn=g2,cn=groups,cn=accounts,dc=example,dc=com
+objectClass: top
+objectClass: groupofnames
+objectClass: posixGroup
+objectClass: inetUser
+gidNumber: 1002
+cn: g2
+description: g2
+member: cn=g1,cn=groups,cn=accounts,dc=example,dc=com
+member: uid=tuser2,cn=users,cn=accounts,dc=example,dc=com
+
diff --git a/tests/test29-schema-modify-entry/after.sh b/tests/test29-schema-modify-entry/after.sh
new file mode 100755
index 0000000..a8a0114
--- /dev/null
+++ b/tests/test29-schema-modify-entry/after.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+search -b cn=compat,cn=accounts,dc=example,dc=com dn memberUid sequence | $LDIFSORT | sed -e 's,^sequence: 1$,sequence: unchanged,g' -e 's,^sequence: 2$,sequence: unchanged,g' | sed -e 's,^sequence: [0-9].*$,sequence: CHANGED,g'
diff --git a/tests/test29-schema-modify-entry/after.txt b/tests/test29-schema-modify-entry/after.txt
new file mode 100644
index 0000000..68a7864
--- /dev/null
+++ b/tests/test29-schema-modify-entry/after.txt
@@ -0,0 +1,13 @@
+dn: cn=compat,cn=accounts,dc=example,dc=com
+
+dn: cn=g1,ou=group,cn=compat,cn=accounts,dc=example,dc=com
+memberUid: tuser1
+sequence: CHANGED
+
+dn: cn=g2,ou=group,cn=compat,cn=accounts,dc=example,dc=com
+memberUid: tuser2
+memberUid: tuser1
+sequence: CHANGED
+
+dn: ou=group,cn=compat,cn=accounts,dc=example,dc=com
+
diff --git a/tests/test29-schema-modify-entry/before.sh b/tests/test29-schema-modify-entry/before.sh
new file mode 100755
index 0000000..3b25499
--- /dev/null
+++ b/tests/test29-schema-modify-entry/before.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+search -b cn=compat,cn=accounts,dc=example,dc=com dn memberUid sequence | $LDIFSORT
diff --git a/tests/test29-schema-modify-entry/before.txt b/tests/test29-schema-modify-entry/before.txt
new file mode 100644
index 0000000..2b2f173
--- /dev/null
+++ b/tests/test29-schema-modify-entry/before.txt
@@ -0,0 +1,13 @@
+dn: cn=compat,cn=accounts,dc=example,dc=com
+
+dn: cn=g1,ou=group,cn=compat,cn=accounts,dc=example,dc=com
+memberUid: tuser1
+sequence: 1
+
+dn: cn=g2,ou=group,cn=compat,cn=accounts,dc=example,dc=com
+memberUid: tuser2
+memberUid: tuser1
+sequence: 2
+
+dn: ou=group,cn=compat,cn=accounts,dc=example,dc=com
+
diff --git a/tests/test29-schema-modify-entry/change.sh b/tests/test29-schema-modify-entry/change.sh
new file mode 100755
index 0000000..6a9264c
--- /dev/null
+++ b/tests/test29-schema-modify-entry/change.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+modify << EOF
+dn: cn=g2,cn=groups,cn=accounts,dc=example,dc=com
+changetype: modify
+replace: gidNumber
+gidNumber: 2002
+-
+
+EOF
+# give memberOf a few seconds to catch up
+sleep 5
diff --git a/tests/test29-schema-modify-entry/change.txt b/tests/test29-schema-modify-entry/change.txt
new file mode 100644
index 0000000..f8ae3a0
--- /dev/null
+++ b/tests/test29-schema-modify-entry/change.txt
@@ -0,0 +1,2 @@
+modifying entry "cn=g2,cn=groups,cn=accounts,dc=example,dc=com"
+
diff --git a/tests/test29-schema-modify-entry/description.txt b/tests/test29-schema-modify-entry/description.txt
new file mode 100644
index 0000000..b44991e
--- /dev/null
+++ b/tests/test29-schema-modify-entry/description.txt
@@ -0,0 +1 @@
+not skipping uninteresting changes
diff --git a/tests/test29-schema-modify-entry/dse.ldif b/tests/test29-schema-modify-entry/dse.ldif
new file mode 100644
index 0000000..c04bdbb
--- /dev/null
+++ b/tests/test29-schema-modify-entry/dse.ldif
@@ -0,0 +1,14 @@
+dn: cn=compat-group,cn=Schema Compatibility,cn=plugins,cn=config
+objectClass: top
+objectClass: extensibleObject
+cn: compat-group
+schema-compat-container-group: cn=compat,cn=accounts,dc=example,dc=com
+schema-compat-container-rdn: ou=group
+schema-compat-check-access: yes
+schema-compat-search-base: cn=groups,cn=Accounts,dc=example,dc=com
+schema-compat-search-filter: (objectClass=posixGroup)
+schema-compat-entry-rdn: cn=%{cn}
+schema-compat-entry-attribute: objectclass=extensibleObject
+schema-compat-entry-attribute: memberUid=%deref_r("member","uid")
+schema-compat-entry-attribute: sequence=%internal_sequence_number()
+
diff --git a/tests/test29-schema-modify-entry/plugin-process-all.txt b/tests/test29-schema-modify-entry/plugin-process-all.txt
new file mode 100644
index 0000000..fc7b80d
--- /dev/null
+++ b/tests/test29-schema-modify-entry/plugin-process-all.txt
@@ -0,0 +1 @@
+verifying that we get called
diff --git a/tests/test29-schema-modify-entry/userRoot.ldif b/tests/test29-schema-modify-entry/userRoot.ldif
new file mode 100644
index 0000000..59a1577
--- /dev/null
+++ b/tests/test29-schema-modify-entry/userRoot.ldif
@@ -0,0 +1,80 @@
+# users, accounts, example.com
+dn: cn=users,cn=accounts,dc=example,dc=com
+objectClass: top
+objectClass: nsContainer
+cn: users
+
+# groups, accounts, example.com
+dn: cn=groups,cn=accounts,dc=example,dc=com
+objectClass: top
+objectClass: nsContainer
+cn: groups
+
+# tuser1, users, accounts, example.com
+dn: uid=tuser1,cn=users,cn=accounts,dc=example,dc=com
+uid: tuser1
+objectClass: top
+objectClass: person
+objectClass: posixAccount
+objectClass: inetUser
+loginShell: /bin/sh
+gidNumber: 1003
+gecos: tuser1
+sn: User
+homeDirectory: /home/tuser1
+cn: Tim User
+uidNumber: 1101
+
+# tuser2, users, accounts, example.com
+dn: uid=tuser2,cn=users,cn=accounts,dc=example,dc=com
+uid: tuser2
+objectClass: top
+objectClass: person
+objectClass: posixAccount
+objectClass: inetUser
+loginShell: /bin/sh
+gidNumber: 1004
+gecos: tuser2
+sn: User
+homeDirectory: /home/tuser2
+cn: Timmy User
+uidNumber: 1102
+
+# tuser3, users, accounts, example.com
+dn: uid=tuser3,cn=users,cn=accounts,dc=example,dc=com
+uid: tuser3
+objectClass: top
+objectClass: person
+objectClass: posixAccount
+objectClass: inetUser
+loginShell: /bin/sh
+gidNumber: 1004
+gecos: tuser3
+sn: User
+homeDirectory: /home/tuser3
+cn: Timothy User
+uidNumber: 1103
+
+# g1, groups, accounts, example.com
+dn: cn=g1,cn=groups,cn=accounts,dc=example,dc=com
+objectClass: top
+objectClass: groupofnames
+objectClass: posixGroup
+objectClass: inetUser
+gidNumber: 1001
+cn: g1
+description: g1
+member: uid=tuser1,cn=users,cn=accounts,dc=example,dc=com
+
+# g2, groups, accounts, example.com
+dn: cn=g2,cn=groups,cn=accounts,dc=example,dc=com
+objectClass: top
+objectClass: groupofnames
+objectClass: posixGroup
+objectClass: inetUser
+gidNumber: 1002
+cn: g2
+description: g2
+member: cn=g1,cn=groups,cn=accounts,dc=example,dc=com
+member: uid=tuser2,cn=users,cn=accounts,dc=example,dc=com
+