@@ -67,6 +67,86 @@ def test_write_increments_msgid
67
67
end
68
68
end
69
69
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
70
150
71
151
class TestLDAPConnectionErrors < Test ::Unit ::TestCase
72
152
def setup
@@ -79,7 +159,7 @@ def setup
79
159
def test_error_failed_operation
80
160
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" ] )
81
161
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 ] )
83
163
84
164
result = @connection . modify ( :dn => "1" , :operations => [ [ :replace , "mail" , "something@sothsdkf.com" ] ] )
85
165
assert result . failure? , "should be failure"
@@ -89,7 +169,7 @@ def test_error_failed_operation
89
169
def test_no_error_on_success
90
170
ber = Net ::BER ::BerIdentifiedArray . new ( [ Net ::LDAP ::ResultCodeSuccess , "" , "" ] )
91
171
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 ] )
93
173
94
174
result = @connection . modify ( :dn => "1" , :operations => [ [ :replace , "mail" , "something@sothsdkf.com" ] ] )
95
175
assert result . success? , "should be success"
0 commit comments