# $Id: tc_search.rb,v 1.4 2006/02/12 19:55:59 ianmacd Exp $
#
# A suite of unit tests for testing Ruby/LDAP search functionality.
require 'ldap'
require 'ldap/control'
require 'test/unit'
require './setup'
class TC_SearchTest < TC_LDAPTest
# Ensure that giving an incorrect attribute argument raises an exception
# and that passing a string instead of an array is treated as a single
# element array.
#
def test_attrs
assert_raise( TypeError ) do
@@conn.search( @@naming_context, LDAP::LDAP_SCOPE_ONELEVEL,
'(objectClass=*)', false )
end
@@conn.search( @@naming_context, LDAP::LDAP_SCOPE_ONELEVEL,
'(objectClass=*)', [], true ) do |x|
assert_nil( x['objectClass'] )
break
end
@@conn.search( @@naming_context, LDAP::LDAP_SCOPE_ONELEVEL,
'(objectClass=*)', 'objectClass' ) do |x|
x = x.to_hash
x.delete( 'dn' )
assert( x.to_hash.keys == [ 'objectClass' ] )
break
end
end
# Ensure that we can sort on a given attribute.
#
def test_sort_attr
ou = []
@@conn.search( @@naming_context, LDAP::LDAP_SCOPE_ONELEVEL,
'(ou=*)' ) do |x|
ou << x['ou']
end
ou.flatten!
sorted_ou = []
@@conn.search( @@naming_context, LDAP::LDAP_SCOPE_ONELEVEL,
'(ou=*)', nil, nil, 0, 0, 'ou' ) do |x|
sorted_ou << x['ou']
end
sorted_ou.flatten!
assert_not_equal( ou, sorted_ou )
assert_equal( ou.sort, sorted_ou )
end
# Ensure that we can pass a proc object to use for sorting.
#
def test_sort_proc
ct = []
@@conn.search( @@naming_context, LDAP::LDAP_SCOPE_ONELEVEL,
'(objectClass=*)', [ 'createTimestamp' ] ) do |x|
ct << x['createTimestamp']
end
ct.flatten!
sorted_ct = []
s_proc = proc { |a,b| b <=> a }
@@conn.search( @@naming_context, LDAP::LDAP_SCOPE_ONELEVEL,
'(objectClass=*)', [ 'createTimestamp' ], nil, 0, 0,
'createTimestamp', s_proc ) do |x|
sorted_ct << x['createTimestamp']
end
sorted_ct.flatten!
assert_not_equal( ct, sorted_ct )
assert_equal( ct.sort( &s_proc ), sorted_ct )
end
# Ensure that the paged results control works properly.
#
def test_paged_results
total = 0
page_size = 1
cookie = ''
loop do
ber_string = LDAP::Control.encode( page_size, cookie )
ctrl = LDAP::Control.new( LDAP::LDAP_CONTROL_PAGEDRESULTS,
ber_string,
true )
@@conn.set_option( LDAP::LDAP_OPT_SERVER_CONTROLS, [ ctrl ] )
this_page = nil
assert_nothing_raised do
begin
this_page = @@conn.search2( @@naming_context,
LDAP::LDAP_SCOPE_ONELEVEL,
'(objectclass=*)' )
rescue LDAP::ResultError
@@conn = nil
raise
end
end
total += this_page.size
assert_equal( page_size, this_page.size )
@@conn.controls.each do |c|
if c.oid == LDAP::LDAP_CONTROL_PAGEDRESULTS
ctrl = c
break
end
end
assert_equal( ctrl.oid, LDAP::LDAP_CONTROL_PAGEDRESULTS )
fetched_size, cookie = ctrl.decode
page_size = fetched_size if fetched_size.to_i > 0
break if cookie.empty?
end
# Reset connection.
@@conn = nil
setup
unpaged = @@conn.search2( @@naming_context, LDAP::LDAP_SCOPE_ONELEVEL,
'(objectclass=*)' )
# Does the total number of results match the equivalent unpaged search?
# This has a race condition, but we assume the number of top-level OUs is
# more or less static. :-)
assert_equal( total, unpaged.size )
end
end
syntax highlighted by Code2HTML, v. 0.9.1