pio 0.3.0 → 0.4.0
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.
- checksums.yaml +4 -4
 - data/CONTRIBUTING.md +46 -12
 - data/README.md +131 -116
 - data/Rakefile +7 -92
 - data/examples/arp_new.rb +16 -0
 - data/examples/arp_read.rb +4 -0
 - data/examples/dhcp_new.rb +30 -0
 - data/examples/dhcp_read.rb +4 -0
 - data/examples/icmp_new.rb +21 -0
 - data/examples/icmp_read.rb +4 -0
 - data/examples/lldp_new.rb +4 -0
 - data/examples/lldp_read.rb +4 -0
 - data/lib/pio.rb +6 -12
 - data/lib/pio/arp.rb +7 -19
 - data/lib/pio/arp/frame.rb +8 -12
 - data/lib/pio/arp/message.rb +12 -25
 - data/lib/pio/arp/reply.rb +30 -30
 - data/lib/pio/arp/request.rb +30 -29
 - data/lib/pio/dhcp.rb +58 -0
 - data/lib/pio/dhcp/ack.rb +12 -0
 - data/lib/pio/dhcp/boot_reply.rb +16 -0
 - data/lib/pio/dhcp/boot_reply_options.rb +75 -0
 - data/lib/pio/dhcp/boot_request.rb +16 -0
 - data/lib/pio/dhcp/boot_request_options.rb +69 -0
 - data/lib/pio/dhcp/common_options.rb +71 -0
 - data/lib/pio/dhcp/csum_util.rb +83 -0
 - data/lib/pio/dhcp/dhcp_field.rb +48 -0
 - data/lib/pio/dhcp/dhcp_tlv_options.rb +84 -0
 - data/lib/pio/dhcp/discover.rb +12 -0
 - data/lib/pio/dhcp/field_util.rb +102 -0
 - data/lib/pio/dhcp/frame.rb +95 -0
 - data/lib/pio/dhcp/message.rb +79 -0
 - data/lib/pio/dhcp/offer.rb +12 -0
 - data/lib/pio/dhcp/optional_tlv.rb +74 -0
 - data/lib/pio/dhcp/request.rb +12 -0
 - data/lib/pio/dhcp/type/dhcp_client_id.rb +21 -0
 - data/lib/pio/dhcp/type/dhcp_param_list.rb +22 -0
 - data/lib/pio/dhcp/type/dhcp_string.rb +21 -0
 - data/lib/pio/icmp.rb +7 -18
 - data/lib/pio/icmp/frame.rb +38 -40
 - data/lib/pio/icmp/message.rb +10 -61
 - data/lib/pio/icmp/options.rb +25 -0
 - data/lib/pio/icmp/reply.rb +34 -7
 - data/lib/pio/icmp/request.rb +43 -7
 - data/lib/pio/ipv4_address.rb +5 -8
 - data/lib/pio/lldp.rb +22 -62
 - data/lib/pio/lldp/chassis_id_tlv.rb +7 -13
 - data/lib/pio/lldp/end_of_lldpdu_value.rb +3 -9
 - data/lib/pio/lldp/frame.rb +6 -12
 - data/lib/pio/lldp/management_address_value.rb +4 -10
 - data/lib/pio/lldp/optional_tlv.rb +5 -10
 - data/lib/pio/lldp/options.rb +37 -0
 - data/lib/pio/lldp/organizationally_specific_value.rb +2 -8
 - data/lib/pio/lldp/port_description_value.rb +2 -8
 - data/lib/pio/lldp/port_id_tlv.rb +6 -12
 - data/lib/pio/lldp/system_capabilities_value.rb +2 -8
 - data/lib/pio/lldp/system_description_value.rb +2 -8
 - data/lib/pio/lldp/system_name_value.rb +2 -8
 - data/lib/pio/lldp/ttl_tlv.rb +5 -11
 - data/lib/pio/mac.rb +4 -9
 - data/lib/pio/message_type_selector.rb +22 -0
 - data/lib/pio/options.rb +65 -0
 - data/lib/pio/parse_error.rb +6 -0
 - data/lib/pio/type/ethernet_header.rb +3 -2
 - data/lib/pio/type/ip_address.rb +4 -9
 - data/lib/pio/type/ipv4_header.rb +12 -17
 - data/lib/pio/type/mac_address.rb +5 -10
 - data/lib/pio/type/udp_header.rb +18 -0
 - data/lib/pio/version.rb +3 -8
 - data/pio.gemspec +12 -10
 - data/spec/pio/arp/reply/options_spec.rb +145 -0
 - data/spec/pio/arp/reply_spec.rb +77 -113
 - data/spec/pio/arp/request/options_spec.rb +115 -0
 - data/spec/pio/arp/request_spec.rb +74 -96
 - data/spec/pio/arp_spec.rb +71 -105
 - data/spec/pio/dhcp/ack_spec.rb +189 -0
 - data/spec/pio/dhcp/discover_spec.rb +165 -0
 - data/spec/pio/dhcp/offer_spec.rb +189 -0
 - data/spec/pio/dhcp/request_spec.rb +173 -0
 - data/spec/pio/dhcp_spec.rb +609 -0
 - data/spec/pio/icmp/reply_spec.rb +102 -95
 - data/spec/pio/icmp/request_spec.rb +86 -78
 - data/spec/pio/icmp_spec.rb +153 -146
 - data/spec/pio/ipv4_address_spec.rb +2 -7
 - data/spec/pio/lldp/options_spec.rb +188 -0
 - data/spec/pio/lldp_spec.rb +181 -208
 - data/spec/pio/mac_spec.rb +3 -8
 - data/spec/spec_helper.rb +4 -10
 - metadata +69 -17
 - data/.gitignore +0 -20
 - data/.rspec +0 -3
 - data/.rubocop.yml +0 -1
 - data/.travis.yml +0 -13
 - data/Gemfile +0 -37
 - data/Guardfile +0 -24
 - data/lib/pio/message_util.rb +0 -19
 - data/lib/pio/type/config.reek +0 -4
 - data/lib/pio/util.rb +0 -21
 - data/pio.org +0 -668
 - data/pio.org_archive +0 -943
 - data/rubocop-todo.yml +0 -9
 
| 
         @@ -1,4 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #  
     | 
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       2 
3 
     | 
    
         
             
            require 'pio/type/mac_address'
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
            module Pio
         
     | 
| 
         @@ -11,7 +12,7 @@ module Pio 
     | 
|
| 
       11 
12 
     | 
    
         
             
                    class_eval do
         
     | 
| 
       12 
13 
     | 
    
         
             
                      mac_address :destination_mac
         
     | 
| 
       13 
14 
     | 
    
         
             
                      mac_address :source_mac
         
     | 
| 
       14 
     | 
    
         
            -
                      uint16 :ether_type, : 
     | 
| 
      
 15 
     | 
    
         
            +
                      uint16 :ether_type, value: options[:ether_type]
         
     | 
| 
       15 
16 
     | 
    
         
             
                    end
         
     | 
| 
       16 
17 
     | 
    
         
             
                  end
         
     | 
| 
       17 
18 
     | 
    
         
             
                end
         
     | 
    
        data/lib/pio/type/ip_address.rb
    CHANGED
    
    | 
         @@ -1,4 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #  
     | 
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       2 
3 
     | 
    
         
             
            require 'bindata'
         
     | 
| 
       3 
4 
     | 
    
         
             
            require 'pio/ipv4_address'
         
     | 
| 
       4 
5 
     | 
    
         | 
| 
         @@ -6,21 +7,15 @@ module Pio 
     | 
|
| 
       6 
7 
     | 
    
         
             
              module Type
         
     | 
| 
       7 
8 
     | 
    
         
             
                # IP address
         
     | 
| 
       8 
9 
     | 
    
         
             
                class IpAddress < BinData::Primitive
         
     | 
| 
       9 
     | 
    
         
            -
                  array :octets, : 
     | 
| 
      
 10 
     | 
    
         
            +
                  array :octets, type: :uint8, initial_length: 4
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
12 
     | 
    
         
             
                  def set(value)
         
     | 
| 
       12 
13 
     | 
    
         
             
                    self.octets = value
         
     | 
| 
       13 
14 
     | 
    
         
             
                  end
         
     | 
| 
       14 
15 
     | 
    
         | 
| 
       15 
16 
     | 
    
         
             
                  def get
         
     | 
| 
       16 
     | 
    
         
            -
                    IPv4Address.new octets.map { | each |  
     | 
| 
      
 17 
     | 
    
         
            +
                    IPv4Address.new octets.map { | each | format('%d', each) }.join('.')
         
     | 
| 
       17 
18 
     | 
    
         
             
                  end
         
     | 
| 
       18 
19 
     | 
    
         
             
                end
         
     | 
| 
       19 
20 
     | 
    
         
             
              end
         
     | 
| 
       20 
21 
     | 
    
         
             
            end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
            ### Local variables:
         
     | 
| 
       23 
     | 
    
         
            -
            ### mode: Ruby
         
     | 
| 
       24 
     | 
    
         
            -
            ### coding: utf-8-unix
         
     | 
| 
       25 
     | 
    
         
            -
            ### indent-tabs-mode: nil
         
     | 
| 
       26 
     | 
    
         
            -
            ### End:
         
     | 
    
        data/lib/pio/type/ipv4_header.rb
    CHANGED
    
    | 
         @@ -1,4 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #  
     | 
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       2 
3 
     | 
    
         
             
            require 'pio/type/ip_address'
         
     | 
| 
       3 
4 
     | 
    
         | 
| 
       4 
5 
     | 
    
         
             
            module Pio
         
     | 
| 
         @@ -9,18 +10,18 @@ module Pio 
     | 
|
| 
       9 
10 
     | 
    
         
             
                  def ipv4_header(options)
         
     | 
| 
       10 
11 
     | 
    
         
             
                    endian :big
         
     | 
| 
       11 
12 
     | 
    
         
             
                    class_eval do
         
     | 
| 
       12 
     | 
    
         
            -
                      bit4 :ip_version, : 
     | 
| 
       13 
     | 
    
         
            -
                      bit4 :ip_header_length, : 
     | 
| 
       14 
     | 
    
         
            -
                      uint8 :ip_type_of_service, : 
     | 
| 
      
 13 
     | 
    
         
            +
                      bit4 :ip_version, initial_value: 0x4
         
     | 
| 
      
 14 
     | 
    
         
            +
                      bit4 :ip_header_length, initial_value: 0x5
         
     | 
| 
      
 15 
     | 
    
         
            +
                      uint8 :ip_type_of_service, initial_value: 0
         
     | 
| 
       15 
16 
     | 
    
         
             
                      uint16be :ip_total_length,
         
     | 
| 
       16 
     | 
    
         
            -
                               : 
     | 
| 
       17 
     | 
    
         
            -
                      uint16be :ip_identifier, : 
     | 
| 
       18 
     | 
    
         
            -
                      bit3 :ip_flag, : 
     | 
| 
       19 
     | 
    
         
            -
                      bit13 :ip_fragment, : 
     | 
| 
       20 
     | 
    
         
            -
                      uint8 :ip_ttl, : 
     | 
| 
       21 
     | 
    
         
            -
                      uint8 :ip_protocol, : 
     | 
| 
      
 17 
     | 
    
         
            +
                               initial_value: options[:ip_total_length]
         
     | 
| 
      
 18 
     | 
    
         
            +
                      uint16be :ip_identifier, initial_value: 0
         
     | 
| 
      
 19 
     | 
    
         
            +
                      bit3 :ip_flag, initial_value: 0
         
     | 
| 
      
 20 
     | 
    
         
            +
                      bit13 :ip_fragment, initial_value: 0
         
     | 
| 
      
 21 
     | 
    
         
            +
                      uint8 :ip_ttl, initial_value: 128
         
     | 
| 
      
 22 
     | 
    
         
            +
                      uint8 :ip_protocol, value: options[:ip_protocol]
         
     | 
| 
       22 
23 
     | 
    
         
             
                      uint16be :ip_header_checksum,
         
     | 
| 
       23 
     | 
    
         
            -
                               : 
     | 
| 
      
 24 
     | 
    
         
            +
                               initial_value: options[:ip_header_checksum]
         
     | 
| 
       24 
25 
     | 
    
         
             
                      ip_address :ip_source_address
         
     | 
| 
       25 
26 
     | 
    
         
             
                      ip_address :ip_destination_address
         
     | 
| 
       26 
27 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -29,9 +30,3 @@ module Pio 
     | 
|
| 
       29 
30 
     | 
    
         
             
                end
         
     | 
| 
       30 
31 
     | 
    
         
             
              end
         
     | 
| 
       31 
32 
     | 
    
         
             
            end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
            ### Local variables:
         
     | 
| 
       34 
     | 
    
         
            -
            ### mode: Ruby
         
     | 
| 
       35 
     | 
    
         
            -
            ### coding: utf-8-unix
         
     | 
| 
       36 
     | 
    
         
            -
            ### indent-tabs-mode: nil
         
     | 
| 
       37 
     | 
    
         
            -
            ### End:
         
     | 
    
        data/lib/pio/type/mac_address.rb
    CHANGED
    
    | 
         @@ -1,4 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #  
     | 
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       2 
3 
     | 
    
         
             
            require 'bindata'
         
     | 
| 
       3 
4 
     | 
    
         
             
            require 'pio/mac'
         
     | 
| 
       4 
5 
     | 
    
         | 
| 
         @@ -6,23 +7,17 @@ module Pio 
     | 
|
| 
       6 
7 
     | 
    
         
             
              module Type
         
     | 
| 
       7 
8 
     | 
    
         
             
                # MAC address
         
     | 
| 
       8 
9 
     | 
    
         
             
                class MacAddress < BinData::Primitive
         
     | 
| 
       9 
     | 
    
         
            -
                  array :octets, : 
     | 
| 
      
 10 
     | 
    
         
            +
                  array :octets, type: :uint8, initial_length: 6
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
12 
     | 
    
         
             
                  def set(value)
         
     | 
| 
       12 
     | 
    
         
            -
                    self.octets = value
         
     | 
| 
      
 13 
     | 
    
         
            +
                    self.octets = value.to_a
         
     | 
| 
       13 
14 
     | 
    
         
             
                  end
         
     | 
| 
       14 
15 
     | 
    
         | 
| 
       15 
16 
     | 
    
         
             
                  def get
         
     | 
| 
       16 
17 
     | 
    
         
             
                    Mac.new(octets.reduce('') do |str, each|
         
     | 
| 
       17 
     | 
    
         
            -
                              str +  
     | 
| 
      
 18 
     | 
    
         
            +
                              str + format('%02x', each)
         
     | 
| 
       18 
19 
     | 
    
         
             
                            end.hex)
         
     | 
| 
       19 
20 
     | 
    
         
             
                  end
         
     | 
| 
       20 
21 
     | 
    
         
             
                end
         
     | 
| 
       21 
22 
     | 
    
         
             
              end
         
     | 
| 
       22 
23 
     | 
    
         
             
            end
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
            ### Local variables:
         
     | 
| 
       25 
     | 
    
         
            -
            ### mode: Ruby
         
     | 
| 
       26 
     | 
    
         
            -
            ### coding: utf-8-unix
         
     | 
| 
       27 
     | 
    
         
            -
            ### indent-tabs-mode: nil
         
     | 
| 
       28 
     | 
    
         
            -
            ### End:
         
     | 
| 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Pio
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Type
         
     | 
| 
      
 5 
     | 
    
         
            +
                # UDP Header Format.
         
     | 
| 
      
 6 
     | 
    
         
            +
                module UdpHeader
         
     | 
| 
      
 7 
     | 
    
         
            +
                  def udp_header(options)
         
     | 
| 
      
 8 
     | 
    
         
            +
                    endian :big
         
     | 
| 
      
 9 
     | 
    
         
            +
                    class_eval do
         
     | 
| 
      
 10 
     | 
    
         
            +
                      uint16be :udp_src_port
         
     | 
| 
      
 11 
     | 
    
         
            +
                      uint16be :udp_dst_port
         
     | 
| 
      
 12 
     | 
    
         
            +
                      uint16be :udp_length, initial_value: options[:udp_length]
         
     | 
| 
      
 13 
     | 
    
         
            +
                      uint16be :udp_checksum, initial_value: options[:udp_checksum]
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/pio/version.rb
    CHANGED
    
    
    
        data/pio.gemspec
    CHANGED
    
    | 
         @@ -1,8 +1,10 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
       1 
3 
     | 
    
         
             
            lib = File.expand_path('../lib', __FILE__)
         
     | 
| 
       2 
4 
     | 
    
         
             
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         
     | 
| 
       3 
5 
     | 
    
         
             
            require 'pio/version'
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
            Gem::Specification.new do | 
     | 
| 
      
 7 
     | 
    
         
            +
            Gem::Specification.new do |gem|
         
     | 
| 
       6 
8 
     | 
    
         
             
              gem.name = 'pio'
         
     | 
| 
       7 
9 
     | 
    
         
             
              gem.version = Pio::VERSION
         
     | 
| 
       8 
10 
     | 
    
         
             
              gem.summary = 'Packet parser and generator.'
         
     | 
| 
         @@ -14,18 +16,18 @@ Gem::Specification.new do | gem | 
     | 
|
| 
       14 
16 
     | 
    
         
             
              gem.email = ['yasuhito@gmail.com']
         
     | 
| 
       15 
17 
     | 
    
         
             
              gem.homepage = 'http://github.com/trema/pio'
         
     | 
| 
       16 
18 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
              gem.files =  
     | 
| 
      
 19 
     | 
    
         
            +
              gem.files = %w(CONTRIBUTING.md LICENSE Rakefile pio.gemspec)
         
     | 
| 
      
 20 
     | 
    
         
            +
              gem.files += Dir.glob('lib/**/*.rb')
         
     | 
| 
      
 21 
     | 
    
         
            +
              gem.files += Dir.glob('bin/**/*')
         
     | 
| 
      
 22 
     | 
    
         
            +
              gem.files += Dir.glob('spec/**/*')
         
     | 
| 
      
 23 
     | 
    
         
            +
              gem.files += Dir.glob('examples/**/*')
         
     | 
| 
       18 
24 
     | 
    
         | 
| 
       19 
25 
     | 
    
         
             
              gem.require_paths = ['lib']
         
     | 
| 
       20 
26 
     | 
    
         | 
| 
       21 
27 
     | 
    
         
             
              gem.extra_rdoc_files = ['README.md']
         
     | 
| 
       22 
     | 
    
         
            -
              gem.test_files =  
     | 
| 
      
 28 
     | 
    
         
            +
              gem.test_files = Dir.glob('spec/**/*')
         
     | 
| 
       23 
29 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
              gem. 
     | 
| 
      
 30 
     | 
    
         
            +
              gem.required_ruby_version = '>= 1.9.3'
         
     | 
| 
      
 31 
     | 
    
         
            +
              gem.add_dependency 'bindata', '~> 2.0.0'
         
     | 
| 
      
 32 
     | 
    
         
            +
              gem.add_development_dependency 'bundler', '~> 1.6.0'
         
     | 
| 
       25 
33 
     | 
    
         
             
            end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
            ### Local variables:
         
     | 
| 
       28 
     | 
    
         
            -
            ### mode: Ruby
         
     | 
| 
       29 
     | 
    
         
            -
            ### coding: utf-8-unix
         
     | 
| 
       30 
     | 
    
         
            -
            ### indent-tabs-mode: nil
         
     | 
| 
       31 
     | 
    
         
            -
            ### End:
         
     | 
| 
         @@ -0,0 +1,145 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'pio'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            describe Pio::Arp::Reply::Options, '.new' do
         
     | 
| 
      
 6 
     | 
    
         
            +
              Given(:mandatory_options) do
         
     | 
| 
      
 7 
     | 
    
         
            +
                {
         
     | 
| 
      
 8 
     | 
    
         
            +
                  source_mac: 0x00169d1d9cc4,
         
     | 
| 
      
 9 
     | 
    
         
            +
                  destination_mac: 0x002682ebead1,
         
     | 
| 
      
 10 
     | 
    
         
            +
                  sender_protocol_address: 0xc0a85303,
         
     | 
| 
      
 11 
     | 
    
         
            +
                  target_protocol_address: 0xc0a853fe
         
     | 
| 
      
 12 
     | 
    
         
            +
                }
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              context 'with all mandatory options' do
         
     | 
| 
      
 16 
     | 
    
         
            +
                Given(:options) do
         
     | 
| 
      
 17 
     | 
    
         
            +
                  Pio::Arp::Reply::Options.new(mandatory_options)
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                describe '#to_hash' do
         
     | 
| 
      
 21 
     | 
    
         
            +
                  When(:result) { options.to_hash }
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  Then { result[:source_mac] == Pio::Mac.new(0x00169d1d9cc4) }
         
     | 
| 
      
 24 
     | 
    
         
            +
                  Then { result[:destination_mac] == Pio::Mac.new(0x002682ebead1) }
         
     | 
| 
      
 25 
     | 
    
         
            +
                  Then do
         
     | 
| 
      
 26 
     | 
    
         
            +
                    result[:sender_protocol_address] == Pio::IPv4Address.new(0xc0a85303)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                  Then do
         
     | 
| 
      
 29 
     | 
    
         
            +
                    result[:target_protocol_address] == Pio::IPv4Address.new(0xc0a853fe)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              context 'when source_mac is not passed' do
         
     | 
| 
      
 35 
     | 
    
         
            +
                Given(:user_options) do
         
     | 
| 
      
 36 
     | 
    
         
            +
                  mandatory_options.delete(:source_mac)
         
     | 
| 
      
 37 
     | 
    
         
            +
                  mandatory_options
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                When(:result) { Pio::Arp::Reply::Options.new(user_options) }
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                Then do
         
     | 
| 
      
 43 
     | 
    
         
            +
                  result ==
         
     | 
| 
      
 44 
     | 
    
         
            +
                    Failure(ArgumentError, 'The source_mac option should be passed.')
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              context 'with source_mac = nil' do
         
     | 
| 
      
 49 
     | 
    
         
            +
                Given(:user_options) do
         
     | 
| 
      
 50 
     | 
    
         
            +
                  mandatory_options.update(source_mac: nil)
         
     | 
| 
      
 51 
     | 
    
         
            +
                  mandatory_options
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                When(:result) { Pio::Arp::Reply::Options.new(user_options) }
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                Then do
         
     | 
| 
      
 57 
     | 
    
         
            +
                  result ==
         
     | 
| 
      
 58 
     | 
    
         
            +
                    Failure(ArgumentError, "The source_mac option shouldn't be nil.")
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
              end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
              context 'when destination_mac is not passed' do
         
     | 
| 
      
 63 
     | 
    
         
            +
                Given(:user_options) do
         
     | 
| 
      
 64 
     | 
    
         
            +
                  mandatory_options.delete(:destination_mac)
         
     | 
| 
      
 65 
     | 
    
         
            +
                  mandatory_options
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                When(:result) { Pio::Arp::Reply::Options.new(user_options) }
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                Then do
         
     | 
| 
      
 71 
     | 
    
         
            +
                  result ==
         
     | 
| 
      
 72 
     | 
    
         
            +
                    Failure(ArgumentError, 'The destination_mac option should be passed.')
         
     | 
| 
      
 73 
     | 
    
         
            +
                end
         
     | 
| 
      
 74 
     | 
    
         
            +
              end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
              context 'with destination_mac = nil' do
         
     | 
| 
      
 77 
     | 
    
         
            +
                Given(:user_options) do
         
     | 
| 
      
 78 
     | 
    
         
            +
                  mandatory_options.update(destination_mac: nil)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  mandatory_options
         
     | 
| 
      
 80 
     | 
    
         
            +
                end
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                When(:result) { Pio::Arp::Reply::Options.new(user_options) }
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                Then do
         
     | 
| 
      
 85 
     | 
    
         
            +
                  result ==
         
     | 
| 
      
 86 
     | 
    
         
            +
                    Failure(ArgumentError, "The destination_mac option shouldn't be nil.")
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
              end
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
              context 'when sender_protocol_address is not passed' do
         
     | 
| 
      
 91 
     | 
    
         
            +
                Given(:user_options) do
         
     | 
| 
      
 92 
     | 
    
         
            +
                  mandatory_options.delete(:sender_protocol_address)
         
     | 
| 
      
 93 
     | 
    
         
            +
                  mandatory_options
         
     | 
| 
      
 94 
     | 
    
         
            +
                end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                When(:result) { Pio::Arp::Reply::Options.new(user_options) }
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                Then do
         
     | 
| 
      
 99 
     | 
    
         
            +
                  result == Failure(ArgumentError,
         
     | 
| 
      
 100 
     | 
    
         
            +
                                    'The sender_protocol_address option should be passed.')
         
     | 
| 
      
 101 
     | 
    
         
            +
                end
         
     | 
| 
      
 102 
     | 
    
         
            +
              end
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
              context 'with sender_protocol_address = nil' do
         
     | 
| 
      
 105 
     | 
    
         
            +
                Given(:user_options) do
         
     | 
| 
      
 106 
     | 
    
         
            +
                  mandatory_options.update(sender_protocol_address: nil)
         
     | 
| 
      
 107 
     | 
    
         
            +
                  mandatory_options
         
     | 
| 
      
 108 
     | 
    
         
            +
                end
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                When(:result) { Pio::Arp::Reply::Options.new(user_options) }
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
                Then do
         
     | 
| 
      
 113 
     | 
    
         
            +
                  result == Failure(ArgumentError,
         
     | 
| 
      
 114 
     | 
    
         
            +
                                    "The sender_protocol_address option shouldn't be nil.")
         
     | 
| 
      
 115 
     | 
    
         
            +
                end
         
     | 
| 
      
 116 
     | 
    
         
            +
              end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
              context 'when target_protocol_address is not passed' do
         
     | 
| 
      
 119 
     | 
    
         
            +
                Given(:user_options) do
         
     | 
| 
      
 120 
     | 
    
         
            +
                  mandatory_options.delete(:target_protocol_address)
         
     | 
| 
      
 121 
     | 
    
         
            +
                  mandatory_options
         
     | 
| 
      
 122 
     | 
    
         
            +
                end
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                When(:result) { Pio::Arp::Reply::Options.new(user_options) }
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
                Then do
         
     | 
| 
      
 127 
     | 
    
         
            +
                  result == Failure(ArgumentError,
         
     | 
| 
      
 128 
     | 
    
         
            +
                                    'The target_protocol_address option should be passed.')
         
     | 
| 
      
 129 
     | 
    
         
            +
                end
         
     | 
| 
      
 130 
     | 
    
         
            +
              end
         
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
      
 132 
     | 
    
         
            +
              context 'with target_protocol_address = nil' do
         
     | 
| 
      
 133 
     | 
    
         
            +
                Given(:user_options) do
         
     | 
| 
      
 134 
     | 
    
         
            +
                  mandatory_options.update(target_protocol_address: nil)
         
     | 
| 
      
 135 
     | 
    
         
            +
                  mandatory_options
         
     | 
| 
      
 136 
     | 
    
         
            +
                end
         
     | 
| 
      
 137 
     | 
    
         
            +
             
     | 
| 
      
 138 
     | 
    
         
            +
                When(:result) { Pio::Arp::Reply::Options.new(user_options) }
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
                Then do
         
     | 
| 
      
 141 
     | 
    
         
            +
                  result == Failure(ArgumentError,
         
     | 
| 
      
 142 
     | 
    
         
            +
                                    "The target_protocol_address option shouldn't be nil.")
         
     | 
| 
      
 143 
     | 
    
         
            +
                end
         
     | 
| 
      
 144 
     | 
    
         
            +
              end
         
     | 
| 
      
 145 
     | 
    
         
            +
            end
         
     | 
    
        data/spec/pio/arp/reply_spec.rb
    CHANGED
    
    | 
         @@ -1,137 +1,101 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #  
     | 
| 
       2 
     | 
    
         
            -
            require 'pio/arp/reply'
         
     | 
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
       3 
2 
     | 
    
         | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'pio'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            describe Pio::ARP::Reply do
         
     | 
| 
      
 6 
     | 
    
         
            +
              Then { Pio::ARP::Reply == Pio::Arp::Reply }
         
     | 
| 
      
 7 
     | 
    
         
            +
            end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            describe Pio::Arp::Reply, '.new' do
         
     | 
| 
      
 10 
     | 
    
         
            +
              ARP_REPLY_DUMP =
         
     | 
| 
      
 11 
     | 
    
         
            +
                [
         
     | 
| 
      
 12 
     | 
    
         
            +
                  0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # destination mac address
         
     | 
| 
      
 13 
     | 
    
         
            +
                  0x00, 0x16, 0x9d, 0x1d, 0x9c, 0xc4, # source mac address
         
     | 
| 
      
 14 
     | 
    
         
            +
                  0x08, 0x06,                         # ethernet type
         
     | 
| 
      
 15 
     | 
    
         
            +
                  0x00, 0x01,                         # arp hardware type
         
     | 
| 
      
 16 
     | 
    
         
            +
                  0x08, 0x00,                         # arp protocol type
         
     | 
| 
      
 17 
     | 
    
         
            +
                  0x06,                               # hardware address size
         
     | 
| 
      
 18 
     | 
    
         
            +
                  0x04,                               # protocol address size
         
     | 
| 
      
 19 
     | 
    
         
            +
                  0x00, 0x02,                         # operational code
         
     | 
| 
      
 20 
     | 
    
         
            +
                  0x00, 0x16, 0x9d, 0x1d, 0x9c, 0xc4, # sender hardware address
         
     | 
| 
      
 21 
     | 
    
         
            +
                  0xc0, 0xa8, 0x53, 0xfe,             # sender protocol address
         
     | 
| 
      
 22 
     | 
    
         
            +
                  0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # target hardware address
         
     | 
| 
      
 23 
     | 
    
         
            +
                  0xc0, 0xa8, 0x53, 0x03,             # target protocol address
         
     | 
| 
      
 24 
     | 
    
         
            +
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # padding
         
     | 
| 
      
 25 
     | 
    
         
            +
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         
     | 
| 
      
 26 
     | 
    
         
            +
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         
     | 
| 
      
 27 
     | 
    
         
            +
                  0x00, 0x00, 0x00, 0x00
         
     | 
| 
      
 28 
     | 
    
         
            +
                ].pack('C*')
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              context 'with String MAC and IP address' do
         
     | 
| 
      
 31 
     | 
    
         
            +
                Given(:arp_reply) do
         
     | 
| 
       7 
32 
     | 
    
         
             
                  Pio::Arp::Reply.new(
         
     | 
| 
       8 
     | 
    
         
            -
                    : 
     | 
| 
       9 
     | 
    
         
            -
                    : 
     | 
| 
       10 
     | 
    
         
            -
                    : 
     | 
| 
       11 
     | 
    
         
            -
                    : 
     | 
| 
      
 33 
     | 
    
         
            +
                    source_mac: '00:16:9d:1d:9c:c4',
         
     | 
| 
      
 34 
     | 
    
         
            +
                    destination_mac: '00:26:82:eb:ea:d1',
         
     | 
| 
      
 35 
     | 
    
         
            +
                    sender_protocol_address: '192.168.83.254',
         
     | 
| 
      
 36 
     | 
    
         
            +
                    target_protocol_address: '192.168.83.3'
         
     | 
| 
       12 
37 
     | 
    
         
             
                  )
         
     | 
| 
       13 
38 
     | 
    
         
             
                end
         
     | 
| 
       14 
39 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                 
     | 
| 
       16 
     | 
    
         
            -
                   
     | 
| 
       17 
     | 
    
         
            -
                   0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # destination mac address
         
     | 
| 
       18 
     | 
    
         
            -
                   0x00, 0x16, 0x9d, 0x1d, 0x9c, 0xc4, # source mac address
         
     | 
| 
       19 
     | 
    
         
            -
                   0x08, 0x06,                         # ethernet type
         
     | 
| 
       20 
     | 
    
         
            -
                   0x00, 0x01,                         # arp hardware type
         
     | 
| 
       21 
     | 
    
         
            -
                   0x08, 0x00,                         # arp protocol type
         
     | 
| 
       22 
     | 
    
         
            -
                   0x06,                               # hardware address size
         
     | 
| 
       23 
     | 
    
         
            -
                   0x04,                               # protocol address size
         
     | 
| 
       24 
     | 
    
         
            -
                   0x00, 0x02,                         # operational code
         
     | 
| 
       25 
     | 
    
         
            -
                   0x00, 0x16, 0x9d, 0x1d, 0x9c, 0xc4, # sender hardware address
         
     | 
| 
       26 
     | 
    
         
            -
                   0xc0, 0xa8, 0x53, 0xfe,             # sender protocol address
         
     | 
| 
       27 
     | 
    
         
            -
                   0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # target hardware address
         
     | 
| 
       28 
     | 
    
         
            -
                   0xc0, 0xa8, 0x53, 0x03,             # target protocol address
         
     | 
| 
       29 
     | 
    
         
            -
                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # padding
         
     | 
| 
       30 
     | 
    
         
            -
                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         
     | 
| 
       31 
     | 
    
         
            -
                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
         
     | 
| 
       32 
     | 
    
         
            -
                   0x00, 0x00, 0x00, 0x00,
         
     | 
| 
       33 
     | 
    
         
            -
                  ].pack('C*')
         
     | 
| 
       34 
     | 
    
         
            -
                end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                context 'with Integer MAC and IP address' do
         
     | 
| 
       37 
     | 
    
         
            -
                  let(:source_mac) { 0x00169d1d9cc4 }
         
     | 
| 
       38 
     | 
    
         
            -
                  let(:destination_mac) { 0x002682ebead1 }
         
     | 
| 
       39 
     | 
    
         
            -
                  let(:sender_protocol_address) { 0xc0a853fe }
         
     | 
| 
       40 
     | 
    
         
            -
                  let(:target_protocol_address) { 0xc0a85303 }
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                  context '#to_binary' do
         
     | 
| 
       43 
     | 
    
         
            -
                    it 'returns an Arp Reply binary String' do
         
     | 
| 
       44 
     | 
    
         
            -
                      expect(subject.to_binary).to eq arp_reply_dump
         
     | 
| 
       45 
     | 
    
         
            -
                    end
         
     | 
| 
      
 40 
     | 
    
         
            +
                describe '#to_binary' do
         
     | 
| 
      
 41 
     | 
    
         
            +
                  When(:result) { arp_reply.to_binary }
         
     | 
| 
       46 
42 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
                    end
         
     | 
| 
       50 
     | 
    
         
            -
                  end
         
     | 
| 
      
 43 
     | 
    
         
            +
                  Then { result == ARP_REPLY_DUMP }
         
     | 
| 
      
 44 
     | 
    
         
            +
                  And { result.size == 64 }
         
     | 
| 
       51 
45 
     | 
    
         
             
                end
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
       52 
47 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
                   
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
                      expect(subject.to_binary).to eq arp_reply_dump
         
     | 
| 
       62 
     | 
    
         
            -
                    end
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                    it 'returns a valid ether frame with size = 64' do
         
     | 
| 
       65 
     | 
    
         
            -
                      expect(subject.to_binary.size).to eq 64
         
     | 
| 
       66 
     | 
    
         
            -
                    end
         
     | 
| 
       67 
     | 
    
         
            -
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
              context 'with Integer MAC address and IP address' do
         
     | 
| 
      
 49 
     | 
    
         
            +
                Given(:arp_reply) do
         
     | 
| 
      
 50 
     | 
    
         
            +
                  Pio::Arp::Reply.new(
         
     | 
| 
      
 51 
     | 
    
         
            +
                    source_mac: 0x00169d1d9cc4,
         
     | 
| 
      
 52 
     | 
    
         
            +
                    destination_mac: 0x002682ebead1,
         
     | 
| 
      
 53 
     | 
    
         
            +
                    sender_protocol_address: 0xc0a853fe,
         
     | 
| 
      
 54 
     | 
    
         
            +
                    target_protocol_address: 0xc0a85303
         
     | 
| 
      
 55 
     | 
    
         
            +
                  )
         
     | 
| 
       68 
56 
     | 
    
         
             
                end
         
     | 
| 
       69 
57 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
                 
     | 
| 
       71 
     | 
    
         
            -
                   
     | 
| 
       72 
     | 
    
         
            -
                  let(:destination_mac) { 0x002682ebead1 }
         
     | 
| 
       73 
     | 
    
         
            -
                  let(:sender_protocol_address) { '192.168.83.254' }
         
     | 
| 
       74 
     | 
    
         
            -
                  let(:target_protocol_address) { '192.168.83.3' }
         
     | 
| 
      
 58 
     | 
    
         
            +
                describe '#to_binary' do
         
     | 
| 
      
 59 
     | 
    
         
            +
                  When(:result) { arp_reply.to_binary }
         
     | 
| 
       75 
60 
     | 
    
         | 
| 
       76 
     | 
    
         
            -
                   
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
                      expect(subject.to_binary).to eq arp_reply_dump
         
     | 
| 
       79 
     | 
    
         
            -
                    end
         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
                    it 'returns a valid ether frame with size = 64' do
         
     | 
| 
       82 
     | 
    
         
            -
                      expect(subject.to_binary.size).to eq 64
         
     | 
| 
       83 
     | 
    
         
            -
                    end
         
     | 
| 
       84 
     | 
    
         
            -
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
                  Then { result == ARP_REPLY_DUMP }
         
     | 
| 
      
 62 
     | 
    
         
            +
                  And { result.size == 64 }
         
     | 
| 
       85 
63 
     | 
    
         
             
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
       86 
65 
     | 
    
         | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
                   
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
                  end
         
     | 
| 
      
 66 
     | 
    
         
            +
              context 'with String MAC and Integer IP address' do
         
     | 
| 
      
 67 
     | 
    
         
            +
                Given(:arp_reply) do
         
     | 
| 
      
 68 
     | 
    
         
            +
                  Pio::Arp::Reply.new(
         
     | 
| 
      
 69 
     | 
    
         
            +
                    source_mac: '00:16:9d:1d:9c:c4',
         
     | 
| 
      
 70 
     | 
    
         
            +
                    destination_mac: '00:26:82:eb:ea:d1',
         
     | 
| 
      
 71 
     | 
    
         
            +
                    sender_protocol_address: 0xc0a853fe,
         
     | 
| 
      
 72 
     | 
    
         
            +
                    target_protocol_address: 0xc0a85303
         
     | 
| 
      
 73 
     | 
    
         
            +
                  )
         
     | 
| 
       96 
74 
     | 
    
         
             
                end
         
     | 
| 
       97 
75 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
                 
     | 
| 
       99 
     | 
    
         
            -
                   
     | 
| 
       100 
     | 
    
         
            -
                  let(:destination_mac) { nil }
         
     | 
| 
       101 
     | 
    
         
            -
                  let(:sender_protocol_address) { '192.168.83.3' }
         
     | 
| 
       102 
     | 
    
         
            -
                  let(:target_protocol_address) { '192.168.83.254' }
         
     | 
| 
      
 76 
     | 
    
         
            +
                describe '#to_binary' do
         
     | 
| 
      
 77 
     | 
    
         
            +
                  When(:result) { arp_reply.to_binary }
         
     | 
| 
       103 
78 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
                   
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
       106 
     | 
    
         
            -
                  end
         
     | 
| 
      
 79 
     | 
    
         
            +
                  Then { result == ARP_REPLY_DUMP }
         
     | 
| 
      
 80 
     | 
    
         
            +
                  And { result.size == 64 }
         
     | 
| 
       107 
81 
     | 
    
         
             
                end
         
     | 
| 
      
 82 
     | 
    
         
            +
              end
         
     | 
| 
       108 
83 
     | 
    
         | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
       110 
     | 
    
         
            -
             
     | 
| 
       111 
     | 
    
         
            -
                   
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
                  end
         
     | 
| 
      
 84 
     | 
    
         
            +
              context 'with Integer MAC and String IP address' do
         
     | 
| 
      
 85 
     | 
    
         
            +
                Given(:arp_reply) do
         
     | 
| 
      
 86 
     | 
    
         
            +
                  Pio::Arp::Reply.new(
         
     | 
| 
      
 87 
     | 
    
         
            +
                    source_mac: 0x00169d1d9cc4,
         
     | 
| 
      
 88 
     | 
    
         
            +
                    destination_mac: 0x002682ebead1,
         
     | 
| 
      
 89 
     | 
    
         
            +
                    sender_protocol_address: '192.168.83.254',
         
     | 
| 
      
 90 
     | 
    
         
            +
                    target_protocol_address: '192.168.83.3'
         
     | 
| 
      
 91 
     | 
    
         
            +
                  )
         
     | 
| 
       118 
92 
     | 
    
         
             
                end
         
     | 
| 
       119 
93 
     | 
    
         | 
| 
       120 
     | 
    
         
            -
                 
     | 
| 
       121 
     | 
    
         
            -
                   
     | 
| 
       122 
     | 
    
         
            -
                  let(:destination_mac) { 0x002682ebead1 }
         
     | 
| 
       123 
     | 
    
         
            -
                  let(:sender_protocol_address) { '192.168.83.3' }
         
     | 
| 
       124 
     | 
    
         
            -
                  let(:target_protocol_address) { nil }
         
     | 
| 
      
 94 
     | 
    
         
            +
                describe '#to_binary' do
         
     | 
| 
      
 95 
     | 
    
         
            +
                  When(:result) { arp_reply.to_binary }
         
     | 
| 
       125 
96 
     | 
    
         | 
| 
       126 
     | 
    
         
            -
                   
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
                  end
         
     | 
| 
      
 97 
     | 
    
         
            +
                  Then { result == ARP_REPLY_DUMP }
         
     | 
| 
      
 98 
     | 
    
         
            +
                  And { result.size == 64 }
         
     | 
| 
       129 
99 
     | 
    
         
             
                end
         
     | 
| 
       130 
100 
     | 
    
         
             
              end
         
     | 
| 
       131 
101 
     | 
    
         
             
            end
         
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
            ### Local variables:
         
     | 
| 
       134 
     | 
    
         
            -
            ### mode: Ruby
         
     | 
| 
       135 
     | 
    
         
            -
            ### coding: utf-8-unix
         
     | 
| 
       136 
     | 
    
         
            -
            ### indent-tabs-mode: nil
         
     | 
| 
       137 
     | 
    
         
            -
            ### End:
         
     |