/spec/header_spec.rb

https://github.com/sdaubert/packetgen · Ruby · 91 lines · 79 code · 12 blank · 0 comment · 1 complexity · cd2a809f2df2b403f3d815b20db6239b MD5 · raw file

  1. require_relative 'spec_helper'
  2. module PGTestModule
  3. class TestHeader < PacketGen::Header::Base
  4. define_field :field1, PacketGen::Types::Int32
  5. define_field :field2, PacketGen::Types::Int32
  6. end
  7. end
  8. module PacketGen
  9. describe Header do
  10. it '.all returns all header classes' do
  11. expect(Header.all).to include(Header::Eth, Header::IP, Header::ICMP, Header::ARP,
  12. Header::IPv6, Header::ICMPv6, Header::UDP,
  13. Header::TCP)
  14. expect(Header.all.size).to eq(53)
  15. end
  16. describe '.add_class' do
  17. after(:each) { Header.remove_class PGTestModule::TestHeader }
  18. it 'adds a foreign header' do
  19. expect(Header.all).to_not include(PGTestModule::TestHeader)
  20. Header.add_class PGTestModule::TestHeader
  21. expect(Header.all).to include(PGTestModule::TestHeader)
  22. end
  23. it 'adds a class only once' do
  24. Header.add_class PGTestModule::TestHeader
  25. Header.add_class PGTestModule::TestHeader
  26. expect(Header.all).to include(PGTestModule::TestHeader)
  27. nb_th = Header.all.select { |hdr| hdr == PGTestModule::TestHeader }.size
  28. expect(nb_th).to eq(1)
  29. end
  30. end
  31. describe '.remove_class' do
  32. before(:each) { Header.add_class PGTestModule::TestHeader }
  33. after(:each) { Header.remove_class PGTestModule::TestHeader }
  34. it 'removes a foreign header from known headers' do
  35. expect(Header.all).to include(PGTestModule::TestHeader)
  36. Header.remove_class PGTestModule::TestHeader
  37. expect(Header.all).to_not include(PGTestModule::TestHeader)
  38. end
  39. end
  40. end
  41. context 'foreign headers' do
  42. before(:all) do
  43. PacketGen::Header.add_class PGTestModule::TestHeader
  44. PacketGen::Header::IP.bind PGTestModule::TestHeader, protocol: 254
  45. end
  46. after(:all) do
  47. PacketGen::Header.remove_class PGTestModule::TestHeader
  48. end
  49. it 'may be used by Packet.gen' do
  50. pkt = nil
  51. expect { pkt = PacketGen.gen('TestHeader', field1: 1) }.
  52. to_not raise_error
  53. expect(pkt.headers.size).to eq(1)
  54. expect(pkt.headers.first).to be_a(PGTestModule::TestHeader)
  55. expect(pkt.testheader).to be_a(PGTestModule::TestHeader)
  56. expect(pkt.testheader.field1.to_i).to eq(1)
  57. end
  58. it 'may be used by Packet#add' do
  59. pkt = PacketGen.gen('IP')
  60. expect { pkt.add('TestHeader', field2: 2) }.to_not raise_error
  61. expect(pkt.headers.size).to eq(2)
  62. expect(pkt.headers.first).to be_a(Header::IP)
  63. expect(pkt.headers.last).to be_a(PGTestModule::TestHeader)
  64. expect(pkt.testheader).to be_a(PGTestModule::TestHeader)
  65. expect(pkt.testheader.field2.to_i).to eq(2)
  66. end
  67. it 'may be used while parsing' do
  68. field1, field2 = rand(2**32), rand(2**32)
  69. pkt = PacketGen.gen('IP', protocol: 254, body: [field1, field2].pack('N2'))
  70. new_pkt = PacketGen.parse(pkt.to_s)
  71. expect(new_pkt.headers.size).to eq(2)
  72. expect(new_pkt.is? 'IP').to be(true)
  73. expect(new_pkt.is? 'TestHeader').to be(true)
  74. expect(new_pkt.testheader).to be_a(PGTestModule::TestHeader)
  75. expect(new_pkt.testheader.field1.to_i).to eq(field1)
  76. expect(new_pkt.testheader.field2.to_i).to eq(field2)
  77. end
  78. end
  79. end