# frozen_string_literal: false
# acltest.rb - ACL unit test
# Copyright (c) 2000 Masatoshi SEKI
#
# acltest.rb is copyrighted free software by Masatoshi SEKI.
# You can redistribute it and/or modify it under the same terms as Ruby.

require 'test/unit'
require 'drb/acl'

module DRbTests

class SampleHosts
  def initialize
    list = %w(127.0.0.1 localhost
              192.168.1.1 x68k.linux.or.jp
              192.168.1.2 lc630.macos.or.jp
              192.168.1.3 lib30.win32.or.jp
              192.168.1.4 ns00.linux.or.jp
              192.168.1.5 yum.macos.or.jp
              ::ffff:192.168.1.5 ipv6.macos.or.jp
              ::192.168.1.5 too.yumipv6.macos.or.jp
              192.168.1.254 comstarz.foo.or.jp)

    @hostlist = Array.new(list.size / 2)
    @hostlist.each_index do |idx|
      @hostlist[idx] = ["AF_INET", 10000, list[idx * 2 + 1], list[idx * 2]]
    end

    @hosts = Hash.new
    @hostlist.each do |h|
      @hosts[h[2].split('.')[0]] = h
    end
  end
  attr_reader(:hostlist, :hosts)
end


class ACLEntryTest < Test::Unit::TestCase
  HOSTS = SampleHosts.new

  def setup
    @hostlist = HOSTS.hostlist
    @hosts = HOSTS.hosts
  end

  def test_all
    a = ACL::ACLEntry.new("*")
    b = ACL::ACLEntry.new("all")
    @hostlist.each do |h|
      assert_operator(a, :match, h)
      assert_operator(b, :match, h)
    end
  end

  def test_ip_v6
    a = ACL::ACLEntry.new('::ffff:192.0.0.0/104')
    assert_not_operator(a, :match, @hosts['localhost'])
    assert_operator(a, :match, @hosts['yum'])
    assert_operator(a, :match, @hosts['ipv6'])
    assert_not_operator(a, :match, @hosts['too'])
  end

  def test_ip
    a = ACL::ACLEntry.new('192.0.0.0/8')
    assert_not_operator(a, :match, @hosts['localhost'])
    assert_operator(a, :match, @hosts['yum'])

    a = ACL::ACLEntry.new('192.168.1.0/255.255.255.0')
    assert_not_operator(a, :match, @hosts['localhost'])
    assert_operator(a, :match, @hosts['yum'])
    assert_operator(a, :match, @hosts['x68k'])

    a = ACL::ACLEntry.new('192.168.1.0/24')
    assert_not_operator(a, :match, @hosts['localhost'])
    assert_operator(a, :match, @hosts['yum'])
    assert_operator(a, :match, @hosts['x68k'])

    a = ACL::ACLEntry.new('92.0.0.0/8')
    assert_not_operator(a, :match, @hosts['localhost'])
    assert_not_operator(a, :match, @hosts['yum'])
    assert_not_operator(a, :match, @hosts['x68k'])

    a = ACL::ACLEntry.new('127.0.0.0/255.0.0.0')
    assert_operator(a, :match, @hosts['localhost'])
    assert_not_operator(a, :match, @hosts['yum'])
    assert_not_operator(a, :match, @hosts['x68k'])

    assert_raise(IPAddr::InvalidPrefixError) {
      ACL::ACLEntry.new('192.168.0.0/33')
    }
    assert_raise(IPAddr::InvalidPrefixError) {
      ACL::ACLEntry.new('192.168.0.0/255.255.0.255')
    }
  end

  def test_name
    a = ACL::ACLEntry.new('*.jp')
    assert_not_operator(a, :match, @hosts['localhost'])
    assert_operator(a, :match, @hosts['yum'])

    a = ACL::ACLEntry.new('yum.*.jp')
    assert_operator(a, :match, @hosts['yum'])
    assert_not_operator(a, :match, @hosts['lc630'])

    a = ACL::ACLEntry.new('*.macos.or.jp')
    assert_operator(a, :match, @hosts['yum'])
    assert_operator(a, :match, @hosts['lc630'])
    assert_not_operator(a, :match, @hosts['lib30'])
  end
end

class ACLListTest < Test::Unit::TestCase
  HOSTS = SampleHosts.new

  def setup
    @hostlist = HOSTS.hostlist
    @hosts = HOSTS.hosts
  end

  private
  def build(list)
    acl= ACL::ACLList.new
    list.each do |s|
      acl.add s
    end
    acl
  end

  public
  def test_all_1
    a = build(%w(all))
    @hostlist.each do |h|
      assert_operator(a, :match, h)
    end
  end

  def test_all_2
    a = build(%w(localhost 127.0.0.0/8 yum.* *))
    @hostlist.each do |h|
      assert_operator(a, :match, h)
    end
  end

  def test_1
    a = build(%w(192.168.1.0/255.255.255.252 yum.*.jp))
    assert_operator(a, :match, @hosts['x68k'])
    assert_operator(a, :match, @hosts['lc630'])
    assert_operator(a, :match, @hosts['lib30'])
    assert_not_operator(a, :match, @hosts['ns00'])
    assert_operator(a, :match, @hosts['yum'])
  end

  def test_2
    a = build(%w(*.linux.or.jp))
    assert_not_operator(a, :match, @hosts['yum'])
    assert_operator(a, :match, @hosts['x68k'])
    assert_not_operator(a, :match, @hosts['lc630'])
  end
end

class ACLTest < Test::Unit::TestCase
  HOSTS = SampleHosts.new

  def setup
    @hostlist = HOSTS.hostlist
    @hosts = HOSTS.hosts
  end

  def test_0
    a = ACL.new
    @hostlist.each do |h|
      assert_operator(a, :allow_addr?, h)
    end
  end

  def test_not_0
    a = ACL.new([], ACL::ALLOW_DENY)
    @hostlist.each do |h|
      assert_not_operator(a, :allow_addr?, h)
    end
  end

  def test_1
    data = %w(deny all
              allow localhost
              allow x68k.*)

    a = ACL.new(data)
    assert_operator(a, :allow_addr?, @hosts['x68k'])
    assert_operator(a, :allow_addr?, @hosts['localhost'])
    assert_not_operator(a, :allow_addr?, @hosts['lc630'])
  end

  def test_not_1
    data = %w(deny 192.0.0.0/8
              allow localhost
              allow x68k.*)

    a = ACL.new(data, ACL::ALLOW_DENY)
    assert_not_operator(a, :allow_addr?, @hosts['x68k'])
    assert_operator(a, :allow_addr?, @hosts['localhost'])
    assert_not_operator(a, :allow_addr?, @hosts['lc630'])
  end
end

end
