#
# Author: SUGYO Kazushi
#
# Copyright (C) 2008-2011 NEC Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2, as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#


require File.join( File.dirname( __FILE__ ), "..", "spec_helper" )
require "trema"


describe Match, ".new" do
  subject {
    Match.new(
      :in_port => 1,
      :dl_src => "00:00:00:00:00:01",
      :dl_dst => "00:00:00:00:00:02",
      :dl_vlan => 65535,
      :dl_vlan_pcp => 0,
      :dl_type => 0x800,
      :nw_tos => 0,
      :nw_proto => 17,
      :nw_src => "192.168.0.1",
      :nw_dst => "192.168.0.0/24",
      :tp_src => 10,
      :tp_dst => 20
    )
  }
  its( :in_port ) { should == 1 }
  its( :dl_src ) { subject.to_s.should == "00:00:00:00:00:01" }
  its( :dl_dst ) { subject.to_s.should == "00:00:00:00:00:02" }
  its( :dl_vlan ) { should == 65535 }
  its( :dl_vlan_pcp ) { should == 0 }
  its( :dl_type ) { should == 0x800 }
  its( :nw_tos ) { should == 0 }
  its( :nw_proto ) { should == 17 }
  its( :nw_src ) { subject.to_s.should == "192.168.0.1" }
  its( :nw_src ) { subject.prefixlen.should == 32 }
  its( :nw_dst ) { subject.to_s.should == "192.168.0.0" }
  its( :nw_dst ) { subject.prefixlen.should == 24 }
  its( :tp_src ) { should == 10 }
  its( :tp_dst ) { should == 20 }
  its( :to_s ) { should == "wildcards = 0x20000(nw_dst(8)), in_port = 1, dl_src = 00:00:00:00:00:01, dl_dst = 00:00:00:00:00:02, dl_vlan = 0xffff, dl_vlan_pcp = 0, dl_type = 0x800, nw_tos = 0, nw_proto = 17, nw_src = 192.168.0.1/32, nw_dst = 192.168.0.0/24, tp_src = 10, tp_dst = 20" }
end


describe Match, ".compare" do
  it "Should match" do
    tester = Match.new(
      :in_port => 1,
      :dl_src => "00:00:00:00:00:01",
      :dl_dst => "00:00:00:00:00:02",
      :dl_vlan => 65535,
      :dl_vlan_pcp => 0,
      :dl_type => 0x800,
      :nw_tos => 0,
      :nw_proto => 17,
      :nw_src => "192.168.0.1",
      :nw_dst => "192.168.0.2",
      :tp_src => 10,
      :tp_dst => 20
    )
    pattern = Match.new(
      :in_port => 1,
      :nw_src => "192.168.0.0/24",
      :nw_dst => "192.168.0.0/24"
    )
    pattern.compare( tester ).should == true
  end

  it "Should not match" do
    tester = Match.new(
      :in_port => 1,
      :dl_src => "00:00:00:00:00:01",
      :dl_dst => "00:00:00:00:00:02",
      :dl_vlan => 65535,
      :dl_vlan_pcp => 0,
      :dl_type => 0x800,
      :nw_tos => 0,
      :nw_proto => 17,
      :nw_src => "192.168.0.1",
      :nw_dst => "192.168.0.2",
      :tp_src => 10,
      :tp_dst => 20
    )
    pattern = Match.new(
      :in_port => 1,
      :nw_src => "10.0.0.0/8",
      :nw_dst => "10.0.0.0/8"
    )
    pattern.compare( tester ).should == false
  end
end


### Local variables:
### mode: Ruby
### coding: utf-8-unix
### indent-tabs-mode: nil
### End: