rubinius-net-ldap 0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rubocop.yml +5 -0
  4. data/.rubocop_todo.yml +462 -0
  5. data/.travis.yml +19 -0
  6. data/CONTRIBUTING.md +54 -0
  7. data/Contributors.rdoc +24 -0
  8. data/Gemfile +2 -0
  9. data/Hacking.rdoc +63 -0
  10. data/History.rdoc +260 -0
  11. data/License.rdoc +29 -0
  12. data/README.rdoc +65 -0
  13. data/Rakefile +17 -0
  14. data/lib/net-ldap.rb +2 -0
  15. data/lib/net/ber.rb +320 -0
  16. data/lib/net/ber/ber_parser.rb +182 -0
  17. data/lib/net/ber/core_ext.rb +55 -0
  18. data/lib/net/ber/core_ext/array.rb +96 -0
  19. data/lib/net/ber/core_ext/false_class.rb +10 -0
  20. data/lib/net/ber/core_ext/integer.rb +74 -0
  21. data/lib/net/ber/core_ext/string.rb +66 -0
  22. data/lib/net/ber/core_ext/true_class.rb +11 -0
  23. data/lib/net/ldap.rb +1229 -0
  24. data/lib/net/ldap/connection.rb +702 -0
  25. data/lib/net/ldap/dataset.rb +168 -0
  26. data/lib/net/ldap/dn.rb +225 -0
  27. data/lib/net/ldap/entry.rb +193 -0
  28. data/lib/net/ldap/error.rb +38 -0
  29. data/lib/net/ldap/filter.rb +778 -0
  30. data/lib/net/ldap/instrumentation.rb +23 -0
  31. data/lib/net/ldap/password.rb +38 -0
  32. data/lib/net/ldap/pdu.rb +297 -0
  33. data/lib/net/ldap/version.rb +5 -0
  34. data/lib/net/snmp.rb +264 -0
  35. data/rubinius-net-ldap.gemspec +37 -0
  36. data/script/install-openldap +112 -0
  37. data/script/package +7 -0
  38. data/script/release +16 -0
  39. data/test/ber/core_ext/test_array.rb +22 -0
  40. data/test/ber/core_ext/test_string.rb +25 -0
  41. data/test/ber/test_ber.rb +99 -0
  42. data/test/fixtures/cacert.pem +20 -0
  43. data/test/fixtures/openldap/memberof.ldif +33 -0
  44. data/test/fixtures/openldap/retcode.ldif +76 -0
  45. data/test/fixtures/openldap/slapd.conf.ldif +67 -0
  46. data/test/fixtures/seed.ldif +374 -0
  47. data/test/integration/test_add.rb +28 -0
  48. data/test/integration/test_ber.rb +30 -0
  49. data/test/integration/test_bind.rb +34 -0
  50. data/test/integration/test_delete.rb +31 -0
  51. data/test/integration/test_open.rb +88 -0
  52. data/test/integration/test_return_codes.rb +38 -0
  53. data/test/integration/test_search.rb +77 -0
  54. data/test/support/vm/openldap/.gitignore +1 -0
  55. data/test/support/vm/openldap/README.md +32 -0
  56. data/test/support/vm/openldap/Vagrantfile +33 -0
  57. data/test/test_dn.rb +44 -0
  58. data/test/test_entry.rb +65 -0
  59. data/test/test_filter.rb +223 -0
  60. data/test/test_filter_parser.rb +20 -0
  61. data/test/test_helper.rb +66 -0
  62. data/test/test_ldap.rb +60 -0
  63. data/test/test_ldap_connection.rb +404 -0
  64. data/test/test_ldif.rb +104 -0
  65. data/test/test_password.rb +10 -0
  66. data/test/test_rename.rb +77 -0
  67. data/test/test_search.rb +39 -0
  68. data/test/test_snmp.rb +119 -0
  69. data/test/test_ssl_ber.rb +40 -0
  70. data/test/testdata.ldif +101 -0
  71. data/testserver/ldapserver.rb +210 -0
  72. data/testserver/testdata.ldif +101 -0
  73. metadata +204 -0
@@ -0,0 +1,30 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class TestBERIntegration < LDAPIntegrationTestCase
4
+ # Test whether the TRUE boolean value is encoded correctly by performing a
5
+ # search operation.
6
+ def test_true_ber_encoding
7
+ # request these attrs to simplify test; use symbols to match Entry#attribute_names
8
+ attrs = [:dn, :uid, :cn, :mail]
9
+
10
+ assert types_entry = @ldap.search(
11
+ :base => "dc=rubyldap,dc=com",
12
+ :filter => "(uid=user1)",
13
+ :size => 1,
14
+ :attributes => attrs,
15
+ :attributes_only => true
16
+ ).first
17
+
18
+ # matches attributes we requested
19
+ assert_equal attrs, types_entry.attribute_names
20
+
21
+ # assert values are empty
22
+ types_entry.each do |name, values|
23
+ next if name == :dn
24
+ assert values.empty?
25
+ end
26
+
27
+ assert_includes Net::LDAP::ResultCodesSearchSuccess,
28
+ @ldap.get_operation_result.code, "should be a successful search operation"
29
+ end
30
+ end
@@ -0,0 +1,34 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class TestBindIntegration < LDAPIntegrationTestCase
4
+ def test_bind_success
5
+ assert @ldap.bind(:method => :simple, :username => "uid=user1,ou=People,dc=rubyldap,dc=com", :password => "passworD1"), @ldap.get_operation_result.inspect
6
+ end
7
+
8
+ def test_bind_anonymous_fail
9
+ assert !@ldap.bind(:method => :simple, :username => "uid=user1,ou=People,dc=rubyldap,dc=com", :password => ""), @ldap.get_operation_result.inspect
10
+
11
+ result = @ldap.get_operation_result
12
+ assert_equal Net::LDAP::ResultCodeUnwillingToPerform, result.code
13
+ assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeUnwillingToPerform], result.message
14
+ assert_equal "unauthenticated bind (DN with no password) disallowed",
15
+ result.error_message
16
+ assert_equal "", result.matched_dn
17
+ end
18
+
19
+ def test_bind_fail
20
+ assert !@ldap.bind(:method => :simple, :username => "uid=user1,ou=People,dc=rubyldap,dc=com", :password => "not my password"), @ldap.get_operation_result.inspect
21
+ end
22
+
23
+ def test_bind_tls_with_cafile
24
+ tls_options = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.merge(:ca_file => CA_FILE)
25
+ @ldap.encryption(:method => :start_tls, :tls_options => tls_options)
26
+ assert @ldap.bind(:method => :simple, :username => "uid=user1,ou=People,dc=rubyldap,dc=com", :password => "passworD1"), @ldap.get_operation_result.inspect
27
+ end
28
+
29
+ def test_bind_tls_with_verify_none
30
+ tls_options = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.merge(:verify_mode => OpenSSL::SSL::VERIFY_NONE)
31
+ @ldap.encryption(:method => :start_tls, :tls_options => tls_options)
32
+ assert @ldap.bind(:method => :simple, :username => "uid=user1,ou=People,dc=rubyldap,dc=com", :password => "passworD1"), @ldap.get_operation_result.inspect
33
+ end
34
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class TestDeleteIntegration < LDAPIntegrationTestCase
4
+ def setup
5
+ super
6
+ @ldap.authenticate "cn=admin,dc=rubyldap,dc=com", "passworD1"
7
+
8
+ @dn = "uid=delete-user1,ou=People,dc=rubyldap,dc=com"
9
+
10
+ attrs = {
11
+ :objectclass => %w(top inetOrgPerson organizationalPerson person),
12
+ :uid => "delete-user1",
13
+ :cn => "delete-user1",
14
+ :sn => "delete-user1",
15
+ :mail => "delete-user1@rubyldap.com"
16
+ }
17
+ unless @ldap.search(:base => @dn, :scope => Net::LDAP::SearchScope_BaseObject)
18
+ assert @ldap.add(:dn => @dn, :attributes => attrs), @ldap.get_operation_result.inspect
19
+ end
20
+ assert @ldap.search(:base => @dn, :scope => Net::LDAP::SearchScope_BaseObject)
21
+ end
22
+
23
+ def test_delete
24
+ assert @ldap.delete(:dn => @dn), @ldap.get_operation_result.inspect
25
+ assert !@ldap.search(:base => @dn, :scope => Net::LDAP::SearchScope_BaseObject)
26
+
27
+ result = @ldap.get_operation_result
28
+ assert_equal Net::LDAP::ResultCodeNoSuchObject, result.code
29
+ assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeNoSuchObject], result.message
30
+ end
31
+ end
@@ -0,0 +1,88 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class TestBindIntegration < LDAPIntegrationTestCase
4
+ def test_binds_without_open
5
+ events = @service.subscribe "bind.net_ldap_connection"
6
+
7
+ @ldap.search(:filter => "uid=user1", :base => "ou=People,dc=rubyldap,dc=com", :ignore_server_caps => true)
8
+ @ldap.search(:filter => "uid=user1", :base => "ou=People,dc=rubyldap,dc=com", :ignore_server_caps => true)
9
+
10
+ assert_equal 2, events.size
11
+ end
12
+
13
+ def test_binds_with_open
14
+ events = @service.subscribe "bind.net_ldap_connection"
15
+
16
+ @ldap.open do
17
+ @ldap.search(:filter => "uid=user1", :base => "ou=People,dc=rubyldap,dc=com", :ignore_server_caps => true)
18
+ @ldap.search(:filter => "uid=user1", :base => "ou=People,dc=rubyldap,dc=com", :ignore_server_caps => true)
19
+ end
20
+
21
+ assert_equal 1, events.size
22
+ end
23
+
24
+ # NOTE: query for two or more entries so that the socket must be read
25
+ # multiple times.
26
+ # See The Problem: https://github.com/ruby-ldap/ruby-net-ldap/issues/136
27
+
28
+ def test_nested_search_without_open
29
+ entries = []
30
+ nested_entry = nil
31
+
32
+ @ldap.search(:filter => "(|(uid=user1)(uid=user2))", :base => "ou=People,dc=rubyldap,dc=com") do |entry|
33
+ entries << entry.uid.first
34
+ nested_entry ||= @ldap.search(:filter => "uid=user3", :base => "ou=People,dc=rubyldap,dc=com").first
35
+ end
36
+
37
+ assert_equal "user3", nested_entry.uid.first
38
+ assert_equal %w(user1 user2), entries
39
+ end
40
+
41
+ def test_nested_search_with_open
42
+ entries = []
43
+ nested_entry = nil
44
+
45
+ @ldap.open do
46
+ @ldap.search(:filter => "(|(uid=user1)(uid=user2))", :base => "ou=People,dc=rubyldap,dc=com") do |entry|
47
+ entries << entry.uid.first
48
+ nested_entry ||= @ldap.search(:filter => "uid=user3", :base => "ou=People,dc=rubyldap,dc=com").first
49
+ end
50
+ end
51
+
52
+ assert_equal "user3", nested_entry.uid.first
53
+ assert_equal %w(user1 user2), entries
54
+ end
55
+
56
+ def test_nested_add_with_open
57
+ entries = []
58
+ nested_entry = nil
59
+
60
+ dn = "uid=nested-open-added-user1,ou=People,dc=rubyldap,dc=com"
61
+ attrs = {
62
+ :objectclass => %w(top inetOrgPerson organizationalPerson person),
63
+ :uid => "nested-open-added-user1",
64
+ :cn => "nested-open-added-user1",
65
+ :sn => "nested-open-added-user1",
66
+ :mail => "nested-open-added-user1@rubyldap.com"
67
+ }
68
+
69
+ @ldap.authenticate "cn=admin,dc=rubyldap,dc=com", "passworD1"
70
+ @ldap.delete :dn => dn
71
+
72
+ @ldap.open do
73
+ @ldap.search(:filter => "(|(uid=user1)(uid=user2))", :base => "ou=People,dc=rubyldap,dc=com") do |entry|
74
+ entries << entry.uid.first
75
+
76
+ nested_entry ||= begin
77
+ assert @ldap.add(:dn => dn, :attributes => attrs), @ldap.get_operation_result.inspect
78
+ @ldap.search(:base => dn, :scope => Net::LDAP::SearchScope_BaseObject).first
79
+ end
80
+ end
81
+ end
82
+
83
+ assert_equal %w(user1 user2), entries
84
+ assert_equal "nested-open-added-user1", nested_entry.uid.first
85
+ ensure
86
+ @ldap.delete :dn => dn
87
+ end
88
+ end
@@ -0,0 +1,38 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ # NOTE: These tests depend on the OpenLDAP retcode overlay.
4
+ # See: section 12.12 http://www.openldap.org/doc/admin24/overlays.html
5
+
6
+ class TestReturnCodeIntegration < LDAPIntegrationTestCase
7
+ def test_operations_error
8
+ assert !@ldap.search(:filter => "cn=operationsError", :base => "ou=Retcodes,dc=rubyldap,dc=com")
9
+ assert result = @ldap.get_operation_result
10
+
11
+ assert_equal Net::LDAP::ResultCodeOperationsError, result.code
12
+ assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeOperationsError], result.message
13
+ end
14
+
15
+ def test_protocol_error
16
+ assert !@ldap.search(:filter => "cn=protocolError", :base => "ou=Retcodes,dc=rubyldap,dc=com")
17
+ assert result = @ldap.get_operation_result
18
+
19
+ assert_equal Net::LDAP::ResultCodeProtocolError, result.code
20
+ assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeProtocolError], result.message
21
+ end
22
+
23
+ def test_time_limit_exceeded
24
+ assert @ldap.search(:filter => "cn=timeLimitExceeded", :base => "ou=Retcodes,dc=rubyldap,dc=com")
25
+ assert result = @ldap.get_operation_result
26
+
27
+ assert_equal Net::LDAP::ResultCodeTimeLimitExceeded, result.code
28
+ assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeTimeLimitExceeded], result.message
29
+ end
30
+
31
+ def test_size_limit_exceeded
32
+ assert @ldap.search(:filter => "cn=sizeLimitExceeded", :base => "ou=Retcodes,dc=rubyldap,dc=com")
33
+ assert result = @ldap.get_operation_result
34
+
35
+ assert_equal Net::LDAP::ResultCodeSizeLimitExceeded, result.code
36
+ assert_equal Net::LDAP::ResultStrings[Net::LDAP::ResultCodeSizeLimitExceeded], result.message
37
+ end
38
+ end
@@ -0,0 +1,77 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ class TestSearchIntegration < LDAPIntegrationTestCase
4
+ def test_search
5
+ entries = []
6
+
7
+ result = @ldap.search(:base => "dc=rubyldap,dc=com") do |entry|
8
+ assert_kind_of Net::LDAP::Entry, entry
9
+ entries << entry
10
+ end
11
+
12
+ assert !entries.empty?
13
+ assert_equal entries, result
14
+ end
15
+
16
+ def test_search_without_result
17
+ entries = []
18
+
19
+ result = @ldap.search(:base => "dc=rubyldap,dc=com", :return_result => false) do |entry|
20
+ assert_kind_of Net::LDAP::Entry, entry
21
+ entries << entry
22
+ end
23
+
24
+ assert result
25
+ assert_not_equal entries, result
26
+ end
27
+
28
+ def test_search_filter_string
29
+ entries = @ldap.search(:base => "dc=rubyldap,dc=com", :filter => "(uid=user1)")
30
+ assert_equal 1, entries.size
31
+ end
32
+
33
+ def test_search_filter_object
34
+ filter = Net::LDAP::Filter.eq("uid", "user1") | Net::LDAP::Filter.eq("uid", "user2")
35
+ entries = @ldap.search(:base => "dc=rubyldap,dc=com", :filter => filter)
36
+ assert_equal 2, entries.size
37
+ end
38
+
39
+ def test_search_constrained_attributes
40
+ entry = @ldap.search(:base => "uid=user1,ou=People,dc=rubyldap,dc=com", :attributes => ["cn", "sn"]).first
41
+ assert_equal [:cn, :dn, :sn], entry.attribute_names.sort # :dn is always included
42
+ assert_empty entry[:mail]
43
+ end
44
+
45
+ def test_search_attributes_only
46
+ entry = @ldap.search(:base => "uid=user1,ou=People,dc=rubyldap,dc=com", :attributes_only => true).first
47
+
48
+ assert_empty entry[:cn], "unexpected attribute value: #{entry[:cn]}"
49
+ end
50
+
51
+ def test_search_timeout
52
+ entries = []
53
+ events = @service.subscribe "search.net_ldap_connection"
54
+
55
+ result = @ldap.search(:base => "dc=rubyldap,dc=com", :time => 5) do |entry|
56
+ assert_kind_of Net::LDAP::Entry, entry
57
+ entries << entry
58
+ end
59
+
60
+ payload, _ = events.pop
61
+ assert_equal 5, payload[:time]
62
+ assert_equal entries, result
63
+ end
64
+
65
+ # http://tools.ietf.org/html/rfc4511#section-4.5.1.4
66
+ def test_search_with_size
67
+ entries = []
68
+
69
+ result = @ldap.search(:base => "dc=rubyldap,dc=com", :size => 1) do |entry|
70
+ assert_kind_of Net::LDAP::Entry, entry
71
+ entries << entry
72
+ end
73
+
74
+ assert_equal 1, result.size
75
+ assert_equal entries, result
76
+ end
77
+ end
@@ -0,0 +1 @@
1
+ /.vagrant
@@ -0,0 +1,32 @@
1
+ # Local OpenLDAP Integration Testing
2
+
3
+ Set up a [Vagrant](http://www.vagrantup.com/) VM to run integration tests against OpenLDAP locally.
4
+
5
+ To run integration tests locally:
6
+
7
+ ``` bash
8
+ # start VM (from the correct directory)
9
+ $ cd test/support/vm/openldap/
10
+ $ vagrant up
11
+
12
+ # get the IP address of the VM
13
+ $ ip=$(vagrant ssh -- "ifconfig eth1 | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -n1")
14
+
15
+ # change back to root project directory
16
+ $ cd ../../../..
17
+
18
+ # run all tests, including integration tests
19
+ $ time INTEGRATION=openldap INTEGRATION_HOST=$ip bundle exec rake
20
+
21
+ # run a specific integration test file
22
+ $ time INTEGRATION=openldap INTEGRATION_HOST=$ip bundle exec ruby test/integration/test_search.rb
23
+
24
+ # run integration tests by default
25
+ $ export INTEGRATION=openldap
26
+ $ export INTEGRATION_HOST=$ip
27
+
28
+ # now run tests without having to set ENV variables
29
+ $ time bundle exec rake
30
+ ```
31
+
32
+ You may need to `gem install vagrant` first in order to provision the VM.
@@ -0,0 +1,33 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
5
+ VAGRANTFILE_API_VERSION = "2"
6
+
7
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
8
+ config.vm.hostname = "rubyldap.com"
9
+
10
+ config.vm.box = "hashicorp/precise64"
11
+
12
+ config.vm.network "private_network", type: :dhcp
13
+
14
+ config.ssh.forward_agent = true
15
+
16
+ config.vm.provision "shell", inline: "apt-get update; exec env /vagrant_data/script/install-openldap"
17
+
18
+ config.vm.synced_folder "../../../..", "/vagrant_data"
19
+
20
+ config.vm.provider "vmware_fusion" do |vb, override|
21
+ override.vm.box = "hashicorp/precise64"
22
+ vb.memory = 4596
23
+ vb.vmx["displayname"] = "integration tests vm"
24
+ vb.vmx["numvcpus"] = "2"
25
+ end
26
+
27
+ config.vm.provider "virtualbox" do |vb, override|
28
+ vb.memory = 4096
29
+ vb.customize ["modifyvm", :id, "--nicpromisc2", "allow-all"]
30
+ vb.customize ["modifyvm", :id, "--chipset", "ich9"]
31
+ vb.customize ["modifyvm", :id, "--vram", "16"]
32
+ end
33
+ end
data/test/test_dn.rb ADDED
@@ -0,0 +1,44 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+ require 'net/ldap/dn'
3
+
4
+ class TestDN < Test::Unit::TestCase
5
+ def test_escape
6
+ assert_equal '\\,\\+\\"\\\\\\<\\>\\;', Net::LDAP::DN.escape(',+"\\<>;')
7
+ end
8
+
9
+ def test_escape_on_initialize
10
+ dn = Net::LDAP::DN.new('cn', ',+"\\<>;', 'ou=company')
11
+ assert_equal 'cn=\\,\\+\\"\\\\\\<\\>\\;,ou=company', dn.to_s
12
+ end
13
+
14
+ def test_to_a
15
+ dn = Net::LDAP::DN.new('cn=James, ou=Company\\,\\20LLC')
16
+ assert_equal ['cn','James','ou','Company, LLC'], dn.to_a
17
+ end
18
+
19
+ def test_to_a_parenthesis
20
+ dn = Net::LDAP::DN.new('cn = \ James , ou = "Comp\28ny" ')
21
+ assert_equal ['cn',' James','ou','Comp(ny'], dn.to_a
22
+ end
23
+
24
+ def test_to_a_hash_symbol
25
+ dn = Net::LDAP::DN.new('1.23.4= #A3B4D5 ,ou=Company')
26
+ assert_equal ['1.23.4','#A3B4D5','ou','Company'], dn.to_a
27
+ end
28
+
29
+ # TODO: raise a more specific exception than RuntimeError
30
+ def test_bad_input_raises_error
31
+ [
32
+ 'cn=James,',
33
+ 'cn=#aa aa',
34
+ 'cn="James',
35
+ 'cn=J\ames',
36
+ 'cn=\\',
37
+ '1.2.d=Value',
38
+ 'd1.2=Value',
39
+ ].each do |input|
40
+ dn = Net::LDAP::DN.new(input)
41
+ assert_raises(RuntimeError) { dn.to_a }
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,65 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class TestEntry < Test::Unit::TestCase
4
+ def setup
5
+ @entry = Net::LDAP::Entry.new 'cn=Barbara,o=corp'
6
+ end
7
+
8
+ def test_dn
9
+ assert_equal 'cn=Barbara,o=corp', @entry.dn
10
+ end
11
+
12
+ def test_empty_array_when_accessing_nonexistent_attribute
13
+ assert_equal [], @entry['sn']
14
+ end
15
+
16
+ def test_attribute_assignment
17
+ @entry['sn'] = 'Jensen'
18
+ assert_equal ['Jensen'], @entry['sn']
19
+ assert_equal ['Jensen'], @entry.sn
20
+ assert_equal ['Jensen'], @entry[:sn]
21
+
22
+ @entry[:sn] = 'Jensen'
23
+ assert_equal ['Jensen'], @entry['sn']
24
+ assert_equal ['Jensen'], @entry.sn
25
+ assert_equal ['Jensen'], @entry[:sn]
26
+
27
+ @entry.sn = 'Jensen'
28
+ assert_equal ['Jensen'], @entry['sn']
29
+ assert_equal ['Jensen'], @entry.sn
30
+ assert_equal ['Jensen'], @entry[:sn]
31
+ end
32
+
33
+ def test_case_insensitive_attribute_names
34
+ @entry['sn'] = 'Jensen'
35
+ assert_equal ['Jensen'], @entry.sn
36
+ assert_equal ['Jensen'], @entry.Sn
37
+ assert_equal ['Jensen'], @entry.SN
38
+ assert_equal ['Jensen'], @entry['sn']
39
+ assert_equal ['Jensen'], @entry['Sn']
40
+ assert_equal ['Jensen'], @entry['SN']
41
+ end
42
+ end
43
+
44
+ class TestEntryLDIF < Test::Unit::TestCase
45
+ def setup
46
+ @entry = Net::LDAP::Entry.from_single_ldif_string(
47
+ %Q{dn: something
48
+ foo: foo
49
+ barAttribute: bar
50
+ })
51
+ end
52
+
53
+ def test_attribute
54
+ assert_equal ['foo'], @entry.foo
55
+ assert_equal ['foo'], @entry.Foo
56
+ end
57
+
58
+ def test_modify_attribute
59
+ @entry.foo = 'bar'
60
+ assert_equal ['bar'], @entry.foo
61
+
62
+ @entry.fOo= 'baz'
63
+ assert_equal ['baz'], @entry.foo
64
+ end
65
+ end