From e8e660222e6ed25ea2c9e733b4395a575df74b12 Mon Sep 17 00:00:00 2001 From: Jerry Cheung Date: Mon, 6 Oct 2014 14:55:31 -0700 Subject: [PATCH 1/9] require minitest/mock --- test/common.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/common.rb b/test/common.rb index baa06884..e352a8f1 100644 --- a/test/common.rb +++ b/test/common.rb @@ -1,3 +1,4 @@ # Add 'lib' to load path. require 'test/unit' +require 'minitest/mock' require 'net/ldap' From d8f9f3714b2d3ee0f4efdfbd94d45aeaa265f1ad Mon Sep 17 00:00:00 2001 From: Jerry Cheung Date: Mon, 6 Oct 2014 14:56:08 -0700 Subject: [PATCH 2/9] dependency inject :socket allows us to mock out the actual connection for testing --- lib/net/ldap/connection.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/net/ldap/connection.rb b/lib/net/ldap/connection.rb index 00d21502..1d86d809 100644 --- a/lib/net/ldap/connection.rb +++ b/lib/net/ldap/connection.rb @@ -10,7 +10,7 @@ def initialize(server) @instrumentation_service = server[:instrumentation_service] begin - @conn = TCPSocket.new(server[:host], server[:port]) + @conn = server[:socket] || TCPSocket.new(server[:host], server[:port]) rescue SocketError raise Net::LDAP::LdapError, "No such address or other socket error." rescue Errno::ECONNREFUSED From d318ff4101adaebc5fbcb93e9a083d2fdb55ac3d Mon Sep 17 00:00:00 2001 From: Jerry Cheung Date: Mon, 6 Oct 2014 14:57:21 -0700 Subject: [PATCH 3/9] add Connection#write_request higher level abstraction to make testing easier and to DRY up existing socket IO --- lib/net/ldap/connection.rb | 6 ++++++ test/test_ldap_connection.rb | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lib/net/ldap/connection.rb b/lib/net/ldap/connection.rb index 1d86d809..e3b24d7d 100644 --- a/lib/net/ldap/connection.rb +++ b/lib/net/ldap/connection.rb @@ -141,6 +141,12 @@ def write(packet) end private :write + # Internal: Convert `request` and `controls` to a BER data packet with the + # next message id and call `#write` on it. + def write_request(request, controls = nil) + write([next_msgid, request, controls].compact.to_ber_sequence) + end + def next_msgid @msgid ||= 0 @msgid += 1 diff --git a/test/test_ldap_connection.rb b/test/test_ldap_connection.rb index a3643016..30d0979e 100644 --- a/test/test_ldap_connection.rb +++ b/test/test_ldap_connection.rb @@ -21,4 +21,27 @@ def test_modify_ops_replace expected = [ "0#\n\x01\x020\x1E\x04\x04mail1\x16\x04\x14testuser@example.com" ] assert_equal(expected, result) end + + def test_write_request + mock = Minitest::Mock.new + mock.expect(:write, true, [[1, "request"].to_ber_sequence]) + conn = Net::LDAP::Connection.new(:socket => mock) + conn.write_request("request") + end + + def test_write_request_with_controls + mock = Minitest::Mock.new + mock.expect(:write, true, [[1, "request", "controls"].to_ber_sequence]) + conn = Net::LDAP::Connection.new(:socket => mock) + conn.write_request("request", "controls") + end + + def test_write_request_increments_msgid + mock = Minitest::Mock.new + mock.expect(:write, true, [[1, "request1"].to_ber_sequence]) + mock.expect(:write, true, [[2, "request2"].to_ber_sequence]) + conn = Net::LDAP::Connection.new(:socket => mock) + conn.write_request("request1") + conn.write_request("request2") + end end From 262819ae9056125a51f788600468680a3f0dd56d Mon Sep 17 00:00:00 2001 From: Jerry Cheung Date: Mon, 6 Oct 2014 15:01:35 -0700 Subject: [PATCH 4/9] ber formatted next_msgid --- lib/net/ldap/connection.rb | 6 +++--- test/test_ldap_connection.rb | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/net/ldap/connection.rb b/lib/net/ldap/connection.rb index e3b24d7d..1afc1e2b 100644 --- a/lib/net/ldap/connection.rb +++ b/lib/net/ldap/connection.rb @@ -141,10 +141,10 @@ def write(packet) end private :write - # Internal: Convert `request` and `controls` to a BER data packet with the - # next message id and call `#write` on it. + # Internal: Convert BER formatted `request` and `controls` to a BER data + # packet with the next message id (`#next_msgid`) and call `#write` on it. def write_request(request, controls = nil) - write([next_msgid, request, controls].compact.to_ber_sequence) + write([next_msgid.to_ber, request, controls].compact.to_ber_sequence) end def next_msgid diff --git a/test/test_ldap_connection.rb b/test/test_ldap_connection.rb index 30d0979e..d4f5d763 100644 --- a/test/test_ldap_connection.rb +++ b/test/test_ldap_connection.rb @@ -24,22 +24,22 @@ def test_modify_ops_replace def test_write_request mock = Minitest::Mock.new - mock.expect(:write, true, [[1, "request"].to_ber_sequence]) + mock.expect(:write, true, [[1.to_ber, "request"].to_ber_sequence]) conn = Net::LDAP::Connection.new(:socket => mock) conn.write_request("request") end def test_write_request_with_controls mock = Minitest::Mock.new - mock.expect(:write, true, [[1, "request", "controls"].to_ber_sequence]) + mock.expect(:write, true, [[1.to_ber, "request", "controls"].to_ber_sequence]) conn = Net::LDAP::Connection.new(:socket => mock) conn.write_request("request", "controls") end def test_write_request_increments_msgid mock = Minitest::Mock.new - mock.expect(:write, true, [[1, "request1"].to_ber_sequence]) - mock.expect(:write, true, [[2, "request2"].to_ber_sequence]) + mock.expect(:write, true, [[1.to_ber, "request1"].to_ber_sequence]) + mock.expect(:write, true, [[2.to_ber, "request2"].to_ber_sequence]) conn = Net::LDAP::Connection.new(:socket => mock) conn.write_request("request1") conn.write_request("request2") From f52425dad68593371b8613512fe70edd1a346442 Mon Sep 17 00:00:00 2001 From: Jerry Cheung Date: Mon, 6 Oct 2014 15:01:55 -0700 Subject: [PATCH 5/9] make #write_request private --- lib/net/ldap/connection.rb | 1 + test/test_ldap_connection.rb | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/net/ldap/connection.rb b/lib/net/ldap/connection.rb index 1afc1e2b..4b26a1ba 100644 --- a/lib/net/ldap/connection.rb +++ b/lib/net/ldap/connection.rb @@ -146,6 +146,7 @@ def write(packet) def write_request(request, controls = nil) write([next_msgid.to_ber, request, controls].compact.to_ber_sequence) end + private :write_request def next_msgid @msgid ||= 0 diff --git a/test/test_ldap_connection.rb b/test/test_ldap_connection.rb index d4f5d763..055f17e2 100644 --- a/test/test_ldap_connection.rb +++ b/test/test_ldap_connection.rb @@ -26,14 +26,14 @@ def test_write_request mock = Minitest::Mock.new mock.expect(:write, true, [[1.to_ber, "request"].to_ber_sequence]) conn = Net::LDAP::Connection.new(:socket => mock) - conn.write_request("request") + conn.send(:write_request, "request") end def test_write_request_with_controls mock = Minitest::Mock.new mock.expect(:write, true, [[1.to_ber, "request", "controls"].to_ber_sequence]) conn = Net::LDAP::Connection.new(:socket => mock) - conn.write_request("request", "controls") + conn.send(:write_request, "request", "controls") end def test_write_request_increments_msgid @@ -41,7 +41,7 @@ def test_write_request_increments_msgid mock.expect(:write, true, [[1.to_ber, "request1"].to_ber_sequence]) mock.expect(:write, true, [[2.to_ber, "request2"].to_ber_sequence]) conn = Net::LDAP::Connection.new(:socket => mock) - conn.write_request("request1") - conn.write_request("request2") + conn.send(:write_request, "request1") + conn.send(:write_request, "request2") end end From f1b53e796219dfbf1b9090a118116a5ef034a6e3 Mon Sep 17 00:00:00 2001 From: Jerry Cheung Date: Mon, 6 Oct 2014 15:08:12 -0700 Subject: [PATCH 6/9] DRY up #write calls with #write_request --- lib/net/ldap/connection.rb | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/lib/net/ldap/connection.rb b/lib/net/ldap/connection.rb index 4b26a1ba..63e31fed 100644 --- a/lib/net/ldap/connection.rb +++ b/lib/net/ldap/connection.rb @@ -85,10 +85,8 @@ def setup_encryption(args) # additional branches requiring server validation and peer certs, etc. # go here. when :start_tls - msgid = next_msgid.to_ber request = [Net::LDAP::StartTlsOid.to_ber_contextspecific(0)].to_ber_appsequence(Net::LDAP::PDU::ExtendedRequest) - request_pkt = [msgid, request].to_ber_sequence - write request_pkt + write_request(request) be = read raise Net::LDAP::LdapError, "no start_tls result" if be.nil? pdu = Net::LDAP::PDU.new(be) @@ -181,11 +179,9 @@ def bind_simple(auth) raise Net::LDAP::LdapError, "Invalid binding information" unless (user && psw) - msgid = next_msgid.to_ber request = [LdapVersion.to_ber, user.to_ber, psw.to_ber_contextspecific(0)].to_ber_appsequence(0) - request_pkt = [msgid, request].to_ber_sequence - write request_pkt + write_request(request) (be = read and pdu = Net::LDAP::PDU.new(be)) or raise Net::LDAP::LdapError, "no bind result" @@ -220,11 +216,9 @@ def bind_sasl(auth) n = 0 loop { - msgid = next_msgid.to_ber sasl = [mech.to_ber, cred.to_ber].to_ber_contextspecific(3) request = [LdapVersion.to_ber, "".to_ber, sasl].to_ber_appsequence(0) - request_pkt = [msgid, request].to_ber_sequence - write request_pkt + write_request(request) (be = read and pdu = Net::LDAP::PDU.new(be)) or raise Net::LDAP::LdapError, "no bind result" return pdu unless pdu.result_code == 14 # saslBindInProgress @@ -398,8 +392,7 @@ def search(args = {}) controls << sort_control if sort_control controls = controls.empty? ? nil : controls.to_ber_contextspecific(0) - pkt = [next_msgid.to_ber, request, controls].compact.to_ber_sequence - write pkt + write_request(request, controls) result_pdu = nil controls = [] @@ -507,8 +500,7 @@ def modify(args) ops = self.class.modify_ops args[:operations] request = [ modify_dn.to_ber, ops.to_ber_sequence ].to_ber_appsequence(6) - pkt = [ next_msgid.to_ber, request ].to_ber_sequence - write pkt + write_request(request) (be = read) && (pdu = Net::LDAP::PDU.new(be)) && (pdu.app_tag == Net::LDAP::PDU::ModifyResponse) or raise Net::LDAP::LdapError, "response missing or invalid" @@ -530,8 +522,7 @@ def add(args) } request = [add_dn.to_ber, add_attrs.to_ber_sequence].to_ber_appsequence(8) - pkt = [next_msgid.to_ber, request].to_ber_sequence - write pkt + write_request(request) (be = read) && (pdu = Net::LDAP::PDU.new(be)) && @@ -553,8 +544,7 @@ def rename(args) request = [old_dn.to_ber, new_rdn.to_ber, delete_attrs.to_ber] request << new_superior.to_ber_contextspecific(0) unless new_superior == nil - pkt = [next_msgid.to_ber, request.to_ber_appsequence(12)].to_ber_sequence - write pkt + write_request(request.to_ber_appsequence(12)) (be = read) && (pdu = Net::LDAP::PDU.new( be )) && (pdu.app_tag == Net::LDAP::PDU::ModifyRDNResponse) or @@ -570,8 +560,7 @@ def delete(args) dn = args[:dn] or raise "Unable to delete empty DN" controls = args.include?(:control_codes) ? args[:control_codes].to_ber_control : nil #use nil so we can compact later request = dn.to_s.to_ber_application_string(10) - pkt = [next_msgid.to_ber, request, controls].compact.to_ber_sequence - write pkt + write_request(request, controls) (be = read) && (pdu = Net::LDAP::PDU.new(be)) && (pdu.app_tag == Net::LDAP::PDU::DeleteResponse) or raise Net::LDAP::LdapError, "response missing or invalid" From 7e3f4e7d33113bb7052509b2e4210dee35654744 Mon Sep 17 00:00:00 2001 From: Jerry Cheung Date: Tue, 7 Oct 2014 12:04:47 -0700 Subject: [PATCH 7/9] just use #write not adding another method call. Since it's a private method, not giving any deprecation warning. --- lib/net/ldap/connection.rb | 32 ++++++++++++++------------------ test/test_ldap_connection.rb | 14 +++++++------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/lib/net/ldap/connection.rb b/lib/net/ldap/connection.rb index 63e31fed..1e74464f 100644 --- a/lib/net/ldap/connection.rb +++ b/lib/net/ldap/connection.rb @@ -86,7 +86,7 @@ def setup_encryption(args) # go here. when :start_tls request = [Net::LDAP::StartTlsOid.to_ber_contextspecific(0)].to_ber_appsequence(Net::LDAP::PDU::ExtendedRequest) - write_request(request) + write(request) be = read raise Net::LDAP::LdapError, "no start_tls result" if be.nil? pdu = Net::LDAP::PDU.new(be) @@ -126,26 +126,22 @@ def read(syntax = Net::LDAP::AsnSyntax) end private :read - # Internal: Writes the given packet to the configured connection. + # Internal: Write a BER formatted packet with the next message id to the + # configured connection. # - # - packet: the BER data packet to write on the socket. + # - request: required BER formatted request + # - controls: optional BER formatted controls # # Returns the return value from writing to the connection, which in some # cases is the Integer number of bytes written to the socket. - def write(packet) + def write(request, controls = nil) instrument "write.net_ldap_connection" do |payload| + packet = [next_msgid.to_ber, request, controls].compact.to_ber_sequence payload[:content_length] = @conn.write(packet) end end private :write - # Internal: Convert BER formatted `request` and `controls` to a BER data - # packet with the next message id (`#next_msgid`) and call `#write` on it. - def write_request(request, controls = nil) - write([next_msgid.to_ber, request, controls].compact.to_ber_sequence) - end - private :write_request - def next_msgid @msgid ||= 0 @msgid += 1 @@ -181,7 +177,7 @@ def bind_simple(auth) request = [LdapVersion.to_ber, user.to_ber, psw.to_ber_contextspecific(0)].to_ber_appsequence(0) - write_request(request) + write(request) (be = read and pdu = Net::LDAP::PDU.new(be)) or raise Net::LDAP::LdapError, "no bind result" @@ -218,7 +214,7 @@ def bind_sasl(auth) loop { sasl = [mech.to_ber, cred.to_ber].to_ber_contextspecific(3) request = [LdapVersion.to_ber, "".to_ber, sasl].to_ber_appsequence(0) - write_request(request) + write(request) (be = read and pdu = Net::LDAP::PDU.new(be)) or raise Net::LDAP::LdapError, "no bind result" return pdu unless pdu.result_code == 14 # saslBindInProgress @@ -392,7 +388,7 @@ def search(args = {}) controls << sort_control if sort_control controls = controls.empty? ? nil : controls.to_ber_contextspecific(0) - write_request(request, controls) + write(request, controls) result_pdu = nil controls = [] @@ -500,7 +496,7 @@ def modify(args) ops = self.class.modify_ops args[:operations] request = [ modify_dn.to_ber, ops.to_ber_sequence ].to_ber_appsequence(6) - write_request(request) + write(request) (be = read) && (pdu = Net::LDAP::PDU.new(be)) && (pdu.app_tag == Net::LDAP::PDU::ModifyResponse) or raise Net::LDAP::LdapError, "response missing or invalid" @@ -522,7 +518,7 @@ def add(args) } request = [add_dn.to_ber, add_attrs.to_ber_sequence].to_ber_appsequence(8) - write_request(request) + write(request) (be = read) && (pdu = Net::LDAP::PDU.new(be)) && @@ -544,7 +540,7 @@ def rename(args) request = [old_dn.to_ber, new_rdn.to_ber, delete_attrs.to_ber] request << new_superior.to_ber_contextspecific(0) unless new_superior == nil - write_request(request.to_ber_appsequence(12)) + write(request.to_ber_appsequence(12)) (be = read) && (pdu = Net::LDAP::PDU.new( be )) && (pdu.app_tag == Net::LDAP::PDU::ModifyRDNResponse) or @@ -560,7 +556,7 @@ def delete(args) dn = args[:dn] or raise "Unable to delete empty DN" controls = args.include?(:control_codes) ? args[:control_codes].to_ber_control : nil #use nil so we can compact later request = dn.to_s.to_ber_application_string(10) - write_request(request, controls) + write(request, controls) (be = read) && (pdu = Net::LDAP::PDU.new(be)) && (pdu.app_tag == Net::LDAP::PDU::DeleteResponse) or raise Net::LDAP::LdapError, "response missing or invalid" diff --git a/test/test_ldap_connection.rb b/test/test_ldap_connection.rb index 055f17e2..2498ac8f 100644 --- a/test/test_ldap_connection.rb +++ b/test/test_ldap_connection.rb @@ -22,26 +22,26 @@ def test_modify_ops_replace assert_equal(expected, result) end - def test_write_request + def test_write mock = Minitest::Mock.new mock.expect(:write, true, [[1.to_ber, "request"].to_ber_sequence]) conn = Net::LDAP::Connection.new(:socket => mock) - conn.send(:write_request, "request") + conn.send(:write, "request") end - def test_write_request_with_controls + def test_write_with_controls mock = Minitest::Mock.new mock.expect(:write, true, [[1.to_ber, "request", "controls"].to_ber_sequence]) conn = Net::LDAP::Connection.new(:socket => mock) - conn.send(:write_request, "request", "controls") + conn.send(:write, "request", "controls") end - def test_write_request_increments_msgid + def test_write_increments_msgid mock = Minitest::Mock.new mock.expect(:write, true, [[1.to_ber, "request1"].to_ber_sequence]) mock.expect(:write, true, [[2.to_ber, "request2"].to_ber_sequence]) conn = Net::LDAP::Connection.new(:socket => mock) - conn.send(:write_request, "request1") - conn.send(:write_request, "request2") + conn.send(:write, "request1") + conn.send(:write, "request2") end end From 4f29d7dcbe7f7132c1bed78e5698fe507bf2d2f7 Mon Sep 17 00:00:00 2001 From: Jerry Cheung Date: Wed, 15 Oct 2014 20:45:20 -0700 Subject: [PATCH 8/9] use flexmock for now since we're not moving away from flexmock just yet, I updated my tests to use flexmock to be consistent. cc @mtodd --- test/test_helper.rb | 1 - test/test_ldap_connection.rb | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index d5b30bca..f208977d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,7 +2,6 @@ require 'test/unit' require 'net/ldap' require 'flexmock/test_unit' -require 'minitest/mock' # Whether integration tests should be run. INTEGRATION = ENV.fetch("INTEGRATION", "skip") != "skip" diff --git a/test/test_ldap_connection.rb b/test/test_ldap_connection.rb index a9d20d8c..fa620111 100644 --- a/test/test_ldap_connection.rb +++ b/test/test_ldap_connection.rb @@ -44,15 +44,15 @@ def test_modify_ops_replace end def test_write - mock = Minitest::Mock.new - mock.expect(:write, true, [[1.to_ber, "request"].to_ber_sequence]) + mock = flexmock("socket") + mock.should_receive(:write).with([1.to_ber, "request"].to_ber_sequence).and_return(true) conn = Net::LDAP::Connection.new(:socket => mock) conn.send(:write, "request") end def test_write_with_controls - mock = Minitest::Mock.new - mock.expect(:write, true, [[1.to_ber, "request", "controls"].to_ber_sequence]) + mock = flexmock("socket") + mock.should_receive(:write).with([1.to_ber, "request", "controls"].to_ber_sequence).and_return(true) conn = Net::LDAP::Connection.new(:socket => mock) conn.send(:write, "request", "controls") end From b8071135a848ff18ffe3e5c96c102aececcfdaac Mon Sep 17 00:00:00 2001 From: Jerry Cheung Date: Thu, 16 Oct 2014 10:58:27 -0700 Subject: [PATCH 9/9] missed a spot --- test/test_ldap_connection.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_ldap_connection.rb b/test/test_ldap_connection.rb index fa620111..3068e680 100644 --- a/test/test_ldap_connection.rb +++ b/test/test_ldap_connection.rb @@ -58,9 +58,9 @@ def test_write_with_controls end def test_write_increments_msgid - mock = Minitest::Mock.new - mock.expect(:write, true, [[1.to_ber, "request1"].to_ber_sequence]) - mock.expect(:write, true, [[2.to_ber, "request2"].to_ber_sequence]) + mock = flexmock("socket") + mock.should_receive(:write).with([1.to_ber, "request1"].to_ber_sequence).and_return(true) + mock.should_receive(:write).with([2.to_ber, "request2"].to_ber_sequence).and_return(true) conn = Net::LDAP::Connection.new(:socket => mock) conn.send(:write, "request1") conn.send(:write, "request2") pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy