@@ -67,6 +67,86 @@ def test_write_increments_msgid
6767 end
6868end
6969
70+ class TestLDAPConnectionSocketReads < Test ::Unit ::TestCase
71+ def make_message ( message_id , app_tag : Net ::LDAP ::PDU ::SearchResult , code : Net ::LDAP ::ResultCodeSuccess , matched_dn : "" , error_message : "" )
72+ result = Net ::BER ::BerIdentifiedArray . new ( [ code , matched_dn , error_message ] )
73+ result . ber_identifier = app_tag
74+ [ message_id , result ]
75+ end
76+
77+ def test_queued_read_drains_queue_before_read
78+ result1a = make_message ( 1 , error_message : "one" )
79+ result1b = make_message ( 1 , error_message : "two" )
80+
81+ mock = flexmock ( "socket" )
82+ mock . should_receive ( :read_ber ) . and_return ( result1b )
83+ conn = Net ::LDAP ::Connection . new ( :socket => mock )
84+
85+ conn . message_queue [ 1 ] . push Net ::LDAP ::PDU . new ( result1a )
86+
87+ assert msg1 = conn . queued_read ( 1 )
88+ assert msg2 = conn . queued_read ( 1 )
89+
90+ assert_equal 1 , msg1 . message_id
91+ assert_equal "one" , msg1 . error_message
92+ assert_equal 1 , msg2 . message_id
93+ assert_equal "two" , msg2 . error_message
94+ end
95+
96+ def test_queued_read_reads_until_message_id_match
97+ result1 = make_message ( 1 )
98+ result2 = make_message ( 2 )
99+
100+ mock = flexmock ( "socket" )
101+ mock . should_receive ( :read_ber ) .
102+ and_return ( result1 ) .
103+ and_return ( result2 )
104+ conn = Net ::LDAP ::Connection . new ( :socket => mock )
105+
106+ assert result = conn . queued_read ( 2 )
107+ assert_equal 2 , result . message_id
108+ assert_equal 1 , conn . queued_read ( 1 ) . message_id
109+ end
110+
111+ def test_queued_read_modify
112+ result1 = make_message ( 1 , app_tag : Net ::LDAP ::PDU ::SearchResult )
113+ result2 = make_message ( 2 , app_tag : Net ::LDAP ::PDU ::ModifyResponse )
114+
115+ mock = flexmock ( "socket" )
116+ mock . should_receive ( :read_ber ) .
117+ and_return ( result1 ) .
118+ and_return ( result2 )
119+ mock . should_receive ( :write )
120+ conn = Net ::LDAP ::Connection . new ( :socket => mock )
121+
122+ conn . next_msgid # simulates ongoing query
123+
124+ conn . instance_variable_get ( "@msgid" )
125+
126+ assert result = conn . modify ( dn : "uid=modified-user1,ou=People,dc=rubyldap,dc=com" ,
127+ operations : [ [ :add , :mail , "modified-user1@example.com" ] ] )
128+ assert result . success?
129+ assert_equal 2 , result . message_id
130+ end
131+
132+ def test_queued_read_add
133+ result1 = make_message ( 1 , app_tag : Net ::LDAP ::PDU ::SearchResult )
134+ result2 = make_message ( 2 , app_tag : Net ::LDAP ::PDU ::AddResponse )
135+
136+ mock = flexmock ( "socket" )
137+ mock . should_receive ( :read_ber ) .
138+ and_return ( result1 ) .
139+ and_return ( result2 )
140+ mock . should_receive ( :write )
141+ conn = Net ::LDAP ::Connection . new ( :socket => mock )
142+
143+ conn . next_msgid # simulates ongoing query
144+
145+ assert result = conn . add ( dn : "uid=added-user1,ou=People,dc=rubyldap,dc=com" )
146+ assert result . success?
147+ assert_equal 2 , result . message_id
148+ end
149+ end
70150
71151class TestLDAPConnectionErrors < Test ::Unit ::TestCase
72152 def setup
@@ -79,7 +159,7 @@ def setup
79159 def test_error_failed_operation
80160 ber = Net ::BER ::BerIdentifiedArray . new ( [ Net ::LDAP ::ResultCodeUnwillingToPerform , "" , "The provided password value was rejected by a password validator: The provided password did not contain enough characters from the character set 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. The minimum number of characters from that set that must be present in user passwords is 1" ] )
81161 ber . ber_identifier = Net ::LDAP ::PDU ::ModifyResponse
82- @tcp_socket . should_receive ( :read_ber ) . and_return ( [ 2 , ber ] )
162+ @tcp_socket . should_receive ( :read_ber ) . and_return ( [ 1 , ber ] )
83163
84164 result = @connection . modify ( :dn => "1" , :operations => [ [ :replace , "mail" , "something@sothsdkf.com" ] ] )
85165 assert result . failure? , "should be failure"
@@ -89,7 +169,7 @@ def test_error_failed_operation
89169 def test_no_error_on_success
90170 ber = Net ::BER ::BerIdentifiedArray . new ( [ Net ::LDAP ::ResultCodeSuccess , "" , "" ] )
91171 ber . ber_identifier = Net ::LDAP ::PDU ::ModifyResponse
92- @tcp_socket . should_receive ( :read_ber ) . and_return ( [ 2 , ber ] )
172+ @tcp_socket . should_receive ( :read_ber ) . and_return ( [ 1 , ber ] )
93173
94174 result = @connection . modify ( :dn => "1" , :operations => [ [ :replace , "mail" , "something@sothsdkf.com" ] ] )
95175 assert result . success? , "should be success"
0 commit comments