blob: c02732906c5bb2ba9ec5eab3563cbf0ea192c4a8 [file] [log] [blame]
/* HEADER Testing duplicate handling in binary OID array */
/* Much copied from T012 */
static const char test_name[] = "binary-array-of-OIDs-duplicate-test";
oid o1 = 1;
oid o2 = 2;
oid o3 = 6;
oid o4 = 8;
oid o5 = 9;
oid ox = 7;
oid oy = 10;
netsnmp_index i1, i2, i3, i4, i5, ix, iy, *ip;
netsnmp_index *b[] = { &i4, &i2, &i3, &i1, &i5 };
netsnmp_container *c;
int i;
init_snmp(test_name);
c = netsnmp_container_get_binary_array();
c->compare = netsnmp_compare_netsnmp_index;
netsnmp_binary_array_options_set(c, 1,
CONTAINER_KEY_ALLOW_DUPLICATES);
i1.oids = &o1;
i2.oids = &o2;
i3.oids = &o3;
i4.oids = &o4;
i5.oids = &o5;
ix.oids = &ox;
iy.oids = &oy;
i1.len = i2.len = i3.len = i4.len = i5.len = ix.len = iy.len = 1;
for (i = 0; i < sizeof(b)/sizeof(b[0]); ++i)
CONTAINER_INSERT(c, b[i]);
#define MAX_ROUNDS 6
/* Insert some duplicates of i4; also insert a duplicate of
* i1 to move the contents of the array around. */
for (i = 0; i < MAX_ROUNDS; ++i) {
switch (i) {
case 0:
/* First round: no insert */
break;
case 1:
case 2:
case 4:
case 5:
/* Insert another duplicate of our target object */
CONTAINER_INSERT(c, &i4);
break;
case 3:
/* Insert a dulicate of an earlier OID, so that it
* changes the binary search behavior */
CONTAINER_INSERT(c, &i1);
break;
}
/* Primary requirement: getnext returns the next value! */
ip = CONTAINER_FIND(c, &i4);
OKF(ip, ("FIND returned a value"));
OKF(c->compare(&i4, ip) == 0,
("FIND returned oid %" NETSNMP_PRIo "d", ip->oids[0]));
ip = CONTAINER_NEXT(c, &i4);
OKF(ip, ("NEXT returned a value"));
OKF(c->compare(&i5, ip) == 0,
("NEXT returned index 5 = %" NETSNMP_PRIo "d", i5.oids[0]));
}
while ((ip = CONTAINER_FIRST(c)))
CONTAINER_REMOVE(c, ip);
CONTAINER_FREE(c);
snmp_shutdown(test_name);