deveo-ruby-ldapserver 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,323 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ Thread.abort_on_exception = true
4
+
5
+ # This test suite requires the ruby-ldap client library to be installed.
6
+ #
7
+ # Unfortunately, this library is not ruby thread-safe (it blocks until
8
+ # it gets a response). Hence we have to fork a child to perform the actual
9
+ # LDAP requests, which is nasty. However, it does give us a completely
10
+ # independent source of LDAP packets to try.
11
+
12
+ require 'ldap/server/operation'
13
+ require 'ldap/server/server'
14
+
15
+ require 'ldap'
16
+
17
+ # We subclass the Operation class, overriding the methods to do what we need
18
+
19
+ class MockOperation < LDAP::Server::Operation
20
+ def initialize(connection, messageId)
21
+ super(connection, messageId)
22
+ @@lastop = [:connect]
23
+ end
24
+
25
+ def simple_bind(version, user, pass)
26
+ @@lastop = [:simple_bind, version, user, pass]
27
+ end
28
+
29
+ def search(basedn, scope, deref, filter)
30
+ @@lastop = [:search, basedn, scope, deref, filter, @attributes]
31
+ send_SearchResultEntry("cn=foo", {"a"=>["1","2"], "b"=>"boing"})
32
+ send_SearchResultEntry("cn=bar", {"a"=>["3","4","5"], "b"=>"wibble"})
33
+ end
34
+
35
+ def add(dn, av)
36
+ @@lastop = [:add, dn, av]
37
+ end
38
+
39
+ def del(dn)
40
+ @@lastop = [:del, dn]
41
+ end
42
+
43
+ def modify(dn, ops)
44
+ @@lastop = [:modify, dn, ops]
45
+ end
46
+
47
+ def modifydn(dn, newrdn, deleteoldrdn, newSuperior)
48
+ @@lastop = [:modifydn, dn, newrdn, deleteoldrdn, newSuperior]
49
+ end
50
+
51
+ def compare(dn, attr, val)
52
+ @@lastop = [:compare, dn, attr, val]
53
+ return val != "false"
54
+ end
55
+
56
+ def self.lastop
57
+ @@lastop
58
+ end
59
+ end
60
+
61
+ class TestLdap < Test::Unit::TestCase
62
+ HOST = '127.0.0.1'
63
+ PORT = 1389
64
+
65
+ def setup
66
+ @ppid = $$
67
+ @io = IO.popen("-","w+") # this is a fork()
68
+ unless @io
69
+ do_child
70
+ exit!
71
+ end
72
+
73
+ # back to a single process (the parent). Now we start our
74
+ # listener thread
75
+ @serv = LDAP::Server.new(
76
+ :bindaddr => '127.0.0.1',
77
+ :port => PORT,
78
+ :nodelay => true,
79
+ :operation_class => MockOperation
80
+ )
81
+ @serv.run_tcpserver
82
+ end
83
+
84
+ def teardown
85
+ if @serv
86
+ @serv.stop
87
+ @serv = nil
88
+ end
89
+ if @io
90
+ @io.puts "quit"
91
+ @io.gets
92
+ @io.close
93
+ @io = nil
94
+ end
95
+ end
96
+
97
+ # Process commands on stdin in child
98
+
99
+ def do_child
100
+ while true
101
+ begin
102
+ a = gets.chomp
103
+ conn ||= LDAP::Conn.new(HOST,PORT)
104
+ case a
105
+ when "bind2"
106
+ conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 2)
107
+ conn.bind("foo","bar")
108
+ when "bind3"
109
+ conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, 3)
110
+ conn.bind("foo","bar")
111
+ # these examples taken from the ruby-ldap examples
112
+ when "add1"
113
+ entry1 = [
114
+ LDAP.mod(LDAP::LDAP_MOD_ADD, 'objectclass', ['top', 'domain']),
115
+ LDAP.mod(LDAP::LDAP_MOD_ADD, 'o', ['TTSKY.NET']),
116
+ LDAP.mod(LDAP::LDAP_MOD_ADD, 'dc', ['localhost']),
117
+ ]
118
+ conn.add("dc=localhost, dc=domain", entry1)
119
+ when "add2"
120
+ entry2 = [
121
+ LDAP.mod(LDAP::LDAP_MOD_ADD, 'objectclass', ['top', 'person']),
122
+ LDAP.mod(LDAP::LDAP_MOD_ADD, 'cn', ['Takaaki Tateishi']),
123
+ LDAP.mod(LDAP::LDAP_MOD_ADD | LDAP::LDAP_MOD_BVALUES, 'sn', ['ttate','Tateishi', "zero\000zero"]),
124
+ ]
125
+ conn.add("cn=Takaaki Tateishi, dc=localhost, dc=localdomain", entry2)
126
+ when "del"
127
+ conn.delete("cn=Takaaki-Tateishi, dc=localhost, dc=localdomain")
128
+ when /^compare (.*)/
129
+ begin
130
+ case conn.compare("cn=Takaaki Tateishi, dc=localhost, dc=localdomain",
131
+ "cn", $1)
132
+ when true; puts "OK true"; next
133
+ when false; puts "OK false"; next
134
+ end
135
+ rescue LDAP::ResultError => e
136
+ # For older versions of ruby-ldap
137
+ case e.message
138
+ when /Compare True/i; puts "OK true"; next
139
+ when /Compare False/i; puts "OK false"; next
140
+ end
141
+ raise
142
+ end
143
+ when "modrdn"
144
+ conn.modrdn("cn=Takaaki Tateishi, dc=localhost, dc=localdomain",
145
+ "cn=Takaaki-Tateishi",
146
+ true)
147
+ when "modify"
148
+ entry = [
149
+ LDAP.mod(LDAP::LDAP_MOD_ADD, 'objectclass', ['top', 'domain']),
150
+ LDAP.mod(LDAP::LDAP_MOD_DELETE, 'o', []),
151
+ LDAP.mod(LDAP::LDAP_MOD_REPLACE, 'dc', ['localhost']),
152
+ ]
153
+ conn.modify("dc=localhost, dc=domain", entry)
154
+ when "search"
155
+ res = {}
156
+ conn.search("dc=localhost, dc=localdomain",
157
+ LDAP::LDAP_SCOPE_SUBTREE,
158
+ "(objectclass=*)") do |e|
159
+ entry = e.to_hash
160
+ dn = entry.delete("dn").first
161
+ res[dn] = entry
162
+ end
163
+ exp = {
164
+ "cn=foo" => {"a"=>["1","2"], "b"=>["boing"]},
165
+ "cn=bar" => {"a"=>["3","4","5"], "b"=>["wibble"]},
166
+ }
167
+ if res != exp
168
+ raise "Bad Search Result, expected\n#{exp.inspect}\ngot\n#{res.inspect}"
169
+ end
170
+ when "search2"
171
+ # FIXME: ruby-ldap doesn't seem to allow DEREF options to be set
172
+ conn.search("dc=localhost, dc=localdomain",
173
+ LDAP::LDAP_SCOPE_BASE,
174
+ "(&(cn=foo)(objectclass=*)(|(!(sn=*))(ou>=baz)(o<=z)(cn~=brian)(cn=*and*er)))",
175
+ ["a","b"]) do |e|
176
+ entry = e.to_hash
177
+ dn = entry.delete("dn").first
178
+ res[dn] = entry
179
+ end
180
+ when "search_retrieve_attrs"
181
+ res = {}
182
+ conn.search("dc=localhost, dc=localdomain",
183
+ LDAP::LDAP_SCOPE_SUBTREE,
184
+ "(objectclass=*)",
185
+ ["B"]) do |e|
186
+ entry = e.to_hash
187
+ dn = entry.delete("dn").first
188
+ res[dn] = entry
189
+ end
190
+ exp = {
191
+ "cn=foo" => {"b"=>["boing"]},
192
+ "cn=bar" => {"b"=>["wibble"]},
193
+ }
194
+ if res != exp
195
+ raise "Bad Search Result, expected\n#{exp.inspect}\ngot\n#{res.inspect}"
196
+ end
197
+ when "search_timeout"
198
+ res = {}
199
+ conn.set_option(LDAP::LDAP_OPT_TIMELIMIT, 2)
200
+ conn.search("dc=localhost, dc=localdomain",
201
+ LDAP::LDAP_SCOPE_SUBTREE,
202
+ "(objectclass=*)") do |e|
203
+ entry = e.to_hash
204
+ dn = entry.delete("dn").first
205
+ res[dn] = entry
206
+ end
207
+ when "quit"
208
+ puts "OK"
209
+ break
210
+ else
211
+ raise "Bad command! #{a.inspect}"
212
+ end
213
+ puts "OK"
214
+ rescue Exception => e
215
+ $stderr.puts "Child exception: #{e}\n\t#{e.backtrace.join("\n\t")}"
216
+ puts "ERR #{e}"
217
+ end
218
+ end
219
+ end
220
+
221
+ def req(cmd)
222
+ @io.puts cmd
223
+ res = @io.gets.chomp
224
+ assert_match(/^OK/, res)
225
+ res
226
+ end
227
+
228
+ def test_bind2
229
+ req("bind2")
230
+ assert_equal([:simple_bind, 2, "foo", "bar"], MockOperation.lastop)
231
+ # cannot bind any more; ldap client library says "already binded." (sic)
232
+ end
233
+
234
+ def test_bind3
235
+ req("bind3")
236
+ assert_equal([:simple_bind, 3, "foo", "bar"], MockOperation.lastop)
237
+ # cannot bind any more; ldap client library says "already binded." (sic)
238
+ end
239
+
240
+ def test_add
241
+ req("add1")
242
+ assert_equal([:add, "dc=localhost, dc=domain", {
243
+ 'objectclass'=>['top', 'domain'],
244
+ 'o'=>['TTSKY.NET'],
245
+ 'dc'=>['localhost'],
246
+ }], MockOperation.lastop)
247
+ req("add2")
248
+ assert_equal([:add, "cn=Takaaki Tateishi, dc=localhost, dc=localdomain", {
249
+ 'objectclass'=>['top', 'person'],
250
+ 'cn'=>['Takaaki Tateishi'],
251
+ 'sn'=>['ttate','Tateishi',"zero\000zero"],
252
+ }], MockOperation.lastop)
253
+ end
254
+
255
+ def test_del
256
+ req("del")
257
+ assert_equal([:del, "cn=Takaaki-Tateishi, dc=localhost, dc=localdomain"], MockOperation.lastop)
258
+ end
259
+
260
+ def test_compare
261
+ r = req("compare Takaaki Tateishi")
262
+ assert_match(/OK true/, r)
263
+ assert_equal([:compare, "cn=Takaaki Tateishi, dc=localhost, dc=localdomain",
264
+ "cn", "Takaaki Tateishi"], MockOperation.lastop)
265
+ r = req("compare false")
266
+ assert_match(/OK false/, r)
267
+ assert_equal([:compare, "cn=Takaaki Tateishi, dc=localhost, dc=localdomain",
268
+ "cn", "false"], MockOperation.lastop)
269
+ end
270
+
271
+ def test_modrdn
272
+ req("modrdn")
273
+ assert_equal([:modifydn, "cn=Takaaki Tateishi, dc=localhost, dc=localdomain",
274
+ "cn=Takaaki-Tateishi", true, nil], MockOperation.lastop)
275
+ # FIXME: ruby-ldap doesn't support the four-argument form
276
+ end
277
+
278
+ def test_modify
279
+ req("modify")
280
+ assert_equal([:modify, "dc=localhost, dc=domain", {
281
+ 'objectclass' => [:add, 'top', 'domain'],
282
+ 'o' => [:delete],
283
+ 'dc' => [:replace, 'localhost'],
284
+ }], MockOperation.lastop)
285
+ end
286
+
287
+ def test_search
288
+ req("search")
289
+ assert_equal([:search, "dc=localhost, dc=localdomain",
290
+ LDAP::Server::WholeSubtree,
291
+ LDAP::Server::NeverDerefAliases,
292
+ [:true], []], MockOperation.lastop)
293
+ req("search2")
294
+ assert_equal([:search, "dc=localhost, dc=localdomain",
295
+ LDAP::Server::BaseObject,
296
+ LDAP::Server::NeverDerefAliases,
297
+ [:and, [:eq, "cn", nil, "foo"],
298
+ [:or, [:not, [:present, "sn"]],
299
+ [:ge, "ou", nil, "baz"],
300
+ [:le, "o", nil, "z"],
301
+ [:approx, "cn", nil, "brian"],
302
+ [:substrings, "cn", nil, nil, "and", "er"],
303
+ ],
304
+ ], ["a","b"]], MockOperation.lastop)
305
+ end
306
+
307
+ def test_retrieve_attributes_case_insensitive
308
+ req("search_retrieve_attrs")
309
+ assert_equal([:search, "dc=localhost, dc=localdomain",
310
+ LDAP::Server::WholeSubtree,
311
+ LDAP::Server::NeverDerefAliases,
312
+ [:true], ["B"]], MockOperation.lastop)
313
+ end
314
+
315
+ def test_search_client_timeout
316
+ # Should not raise errors
317
+ req("search_timeout")
318
+ assert_equal([:search, "dc=localhost, dc=localdomain",
319
+ LDAP::Server::WholeSubtree,
320
+ LDAP::Server::NeverDerefAliases,
321
+ [:true], []], MockOperation.lastop)
322
+ end
323
+ end
@@ -0,0 +1,107 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'ldap/server/filter'
3
+
4
+ class FilterTest < Test::Unit::TestCase
5
+
6
+ AV1 = {
7
+ "foo" => ["abc","def"],
8
+ "bar" => ["wibblespong"],
9
+ }
10
+
11
+ def test_bad
12
+ assert_raises(LDAP::ResultError::OperationsError) {
13
+ LDAP::Server::Filter.run([:wibbly], AV1)
14
+ }
15
+ end
16
+
17
+ def test_const
18
+ assert_equal(true, LDAP::Server::Filter.run([:true], AV1))
19
+ assert_equal(false, LDAP::Server::Filter.run([:false], AV1))
20
+ assert_equal(nil, LDAP::Server::Filter.run([:undef], AV1))
21
+ end
22
+
23
+ def test_present
24
+ assert_equal(true, LDAP::Server::Filter.run([:present,"foo"], AV1))
25
+ assert_equal(false, LDAP::Server::Filter.run([:present,"zog"], AV1))
26
+ end
27
+
28
+ def test_eq
29
+ assert_equal(true, LDAP::Server::Filter.run([:eq,"foo",nil,"abc"], AV1))
30
+ assert_equal(true, LDAP::Server::Filter.run([:eq,"foo",nil,"def"], AV1))
31
+ assert_equal(false, LDAP::Server::Filter.run([:eq,"foo",nil,"ghi"], AV1))
32
+ assert_equal(false, LDAP::Server::Filter.run([:eq,"xyz",nil,"abc"], AV1))
33
+ end
34
+
35
+ def test_eq_case
36
+ c = LDAP::Server::MatchingRule.find('2.5.13.2')
37
+ assert_equal(true, LDAP::Server::Filter.run([:eq,"foo",c,"ABC"], AV1))
38
+ assert_equal(true, LDAP::Server::Filter.run([:eq,"foo",c,"DeF"], AV1))
39
+ assert_equal(false, LDAP::Server::Filter.run([:eq,"foo",c,"ghi"], AV1))
40
+ assert_equal(false, LDAP::Server::Filter.run([:eq,"xyz",c,"abc"], AV1))
41
+ end
42
+
43
+ def test_not
44
+ assert_equal(false, LDAP::Server::Filter.run([:not,[:eq,"foo",nil,"abc"]], AV1))
45
+ assert_equal(false, LDAP::Server::Filter.run([:not,[:eq,"foo",nil,"def"]], AV1))
46
+ assert_equal(true, LDAP::Server::Filter.run([:not,[:eq,"foo",nil,"ghi"]], AV1))
47
+ assert_equal(true, LDAP::Server::Filter.run([:not,[:eq,"xyz",nil,"abc"]], AV1))
48
+ end
49
+
50
+ def test_ge
51
+ assert_equal(true, LDAP::Server::Filter.run([:ge,"foo",nil,"ccc"], AV1))
52
+ assert_equal(true, LDAP::Server::Filter.run([:ge,"foo",nil,"def"], AV1))
53
+ assert_equal(false, LDAP::Server::Filter.run([:ge,"foo",nil,"deg"], AV1))
54
+ assert_equal(false, LDAP::Server::Filter.run([:ge,"xyz",nil,"abc"], AV1))
55
+ end
56
+
57
+ def test_le
58
+ assert_equal(true, LDAP::Server::Filter.run([:le,"foo",nil,"ccc"], AV1))
59
+ assert_equal(true, LDAP::Server::Filter.run([:le,"foo",nil,"abc"], AV1))
60
+ assert_equal(false, LDAP::Server::Filter.run([:le,"foo",nil,"abb"], AV1))
61
+ assert_equal(false, LDAP::Server::Filter.run([:le,"xyz",nil,"abc"], AV1))
62
+ end
63
+
64
+ def test_substrings
65
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"foo",nil,"a",nil], AV1))
66
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"foo",nil,"def",nil], AV1))
67
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"foo",nil,"bc",nil], AV1))
68
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"foo",nil,"az",nil], AV1))
69
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"foo",nil,"",nil], AV1))
70
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"zzz",nil,"",nil], AV1))
71
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"foo",nil,nil,"a",nil], AV1))
72
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"foo",nil,nil,"e",nil], AV1))
73
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"foo",nil,nil,"ba",nil], AV1))
74
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"foo",nil,nil,"az",nil], AV1))
75
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"foo",nil,nil,"c"], AV1))
76
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"foo",nil,nil,"ef"], AV1))
77
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"foo",nil,nil,"ab"], AV1))
78
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"foo",nil,nil,"e"], AV1))
79
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"bar",nil,"wib","ong"], AV1))
80
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"bar",nil,"",""], AV1))
81
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"bar",nil,"wib","ble"], AV1))
82
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"bar",nil,"sp","ong"], AV1))
83
+ end
84
+
85
+ def test_substr_case
86
+ c = LDAP::Server::MatchingRule.find('1.3.6.1.4.1.1466.109.114.3')
87
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"bar",c,"WIB",nil], AV1))
88
+ assert_equal(true, LDAP::Server::Filter.run([:substrings,"bar",c,"WIB","lES","ong"], AV1))
89
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"bar",c,"SPONG",nil], AV1))
90
+ assert_equal(false, LDAP::Server::Filter.run([:substrings,"xyz",c,"wib",nil], AV1))
91
+ end
92
+
93
+ def test_and
94
+ assert_equal(true, LDAP::Server::Filter.run([:and,[:true],[:true]], AV1))
95
+ assert_equal(false, LDAP::Server::Filter.run([:and,[:false],[:true]], AV1))
96
+ assert_equal(false, LDAP::Server::Filter.run([:and,[:true],[:false]], AV1))
97
+ assert_equal(false, LDAP::Server::Filter.run([:and,[:false],[:false]], AV1))
98
+ end
99
+
100
+ def test_or
101
+ assert_equal(true, LDAP::Server::Filter.run([:or,[:true],[:true]], AV1))
102
+ assert_equal(true, LDAP::Server::Filter.run([:or,[:false],[:true]], AV1))
103
+ assert_equal(true, LDAP::Server::Filter.run([:or,[:true],[:false]], AV1))
104
+ assert_equal(false, LDAP::Server::Filter.run([:or,[:false],[:false]], AV1))
105
+ end
106
+
107
+ end
@@ -0,0 +1,59 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'ldap/server/match'
3
+
4
+ class MatchTest < Test::Unit::TestCase
5
+
6
+ def test_caseIgnoreOrderingMatch
7
+ s = LDAP::Server::MatchingRule.find("2.5.13.3")
8
+ assert_equal(LDAP::Server::MatchingRule, s.class)
9
+ assert_equal("caseIgnoreOrderingMatch", s.name)
10
+ assert_equal("( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )", s.to_def)
11
+ assert_equal(true, s.le(["foobar","wibble"], "ghi"))
12
+ assert_equal(true, s.le(["FOOBAR","WIBBLE"], "ghi"))
13
+ assert_equal(true, s.le(["foobar","wibble"], "GHI"))
14
+ assert_equal(true, s.le(["FOOBAR","WIBBLE"], "GHI"))
15
+ assert_equal(false, s.le(["foobar","wibble"], "fab"))
16
+ assert_equal(false, s.le(["FOOBAR","WIBBLE"], "fab"))
17
+ assert_equal(false, s.le(["foobar","wibble"], "FAB"))
18
+ assert_equal(false, s.le(["FOOBAR","WIBBLE"], "FAB"))
19
+ end
20
+
21
+ def test_caseIgnoreSubstringsMatch
22
+ s = LDAP::Server::MatchingRule.find("2.5.13.4")
23
+ assert_equal(LDAP::Server::MatchingRule, s.class)
24
+ assert_equal("caseIgnoreSubstringsMatch", s.name)
25
+ assert_equal(true, s.substrings(["foobar","wibble"], nil, "oob", nil))
26
+ assert_equal(true, s.substrings(["foobar","wibble"], nil, "foo", nil))
27
+ assert_equal(true, s.substrings(["foobar","wibble"], nil, "bar", nil))
28
+ assert_equal(true, s.substrings(["foobar","wibble"], "wib", nil))
29
+ assert_equal(true, s.substrings(["foobar","wibble"], nil, "ar"))
30
+ assert_equal(true, s.substrings(["foobar","wibble"], "wib", "ble"))
31
+ assert_equal(true, s.substrings(["foobar","wibble"], nil, "oo", "bar"))
32
+ assert_equal(false, s.substrings(["foobar","wibble"], nil, "ooz", nil))
33
+ assert_equal(false, s.substrings(["foobar","wibble"], nil, "foz", nil))
34
+ assert_equal(false, s.substrings(["foobar","wibble"], nil, "zar", nil))
35
+ assert_equal(false, s.substrings(["foobar","wibble"], "bar", nil))
36
+ assert_equal(false, s.substrings(["foobar","wibble"], nil, "oob"))
37
+ assert_equal(false, s.substrings(["foobar","wibble"], "foo", "ble"))
38
+ assert_equal(false, s.substrings(["foobar","wibble"], "foo", "obar"))
39
+ end
40
+
41
+ def test_unknown
42
+ s = LDAP::Server::MatchingRule.find("1.4.7.1")
43
+ assert_equal(nil, s) ## this may change to generate a default object
44
+ end
45
+
46
+ def test_nil
47
+ s = LDAP::Server::MatchingRule.find(nil)
48
+ assert_equal(nil, s)
49
+ end
50
+
51
+ def test_from_def
52
+ s = LDAP::Server::MatchingRule.from_def("( 1.2.3 NAME ( 'wibble' 'bibble' ) DESC 'foobar' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )")
53
+ assert_equal("1.2.3", s.oid)
54
+ assert_equal(['wibble','bibble'], s.names)
55
+ assert_equal('wibble', s.to_s)
56
+ assert_equal("foobar", s.desc)
57
+ assert_equal("IA5 String", s.syntax.desc)
58
+ end
59
+ end