#
#   Copyright 2012 Wade Alcorn wade@bindshell.net
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#
require 'test/unit'
require 'pp'

class TC_Metasploit < Test::Unit::TestCase

  def setup
    $root_dir="../../../../"
    $:.unshift File.join( %w{ ../../../../ } )
    require 'core/loader'
  end

  def teardown
    $root_dir = nil
  end

  #
  # Test the api is functional
  #
  def test_requires
    assert_nothing_raised do
      require 'msfrpc-client'
    end
  end

  #
  # Load the config for testing
  #
  def load_config
    BeEF::Core::Configuration.instance.load_extensions_config
    @config = BeEF::Core::Configuration.instance.get('beef.extension.metasploit')
  end

  # Create an api instance
  def new_api
    load_config
    require 'extensions/metasploit/extension.rb'
    @api = BeEF::Extension::Metasploit::RpcClient.instance
    @api.unit_test_init()
  end

  #
  # Verify that the config file has required information
  # 
  def test_config
    load_config
    assert(@config.key?('user'))
    assert(@config.key?('pass'))
    assert(@config.key?('port'))
    assert(@config.key?('uri'))
    assert(@config.key?('callback_host'))
    assert(@config.key?('autopwn_url'))
  end

  #
  # Verify that we can create an API instance
  #
  def test_api_create
    assert_nothing_raised do
      new_api
    end
  end

  #
  # Verify that the login is working
  #
  def test_login
    new_api
    assert(@api.login)
  end

  def test_call
    new_api
    @api.login
    assert(@api.call('core.version'))
  end

  def test_browser_exploits
    new_api
    @api.login
    exploits = nil
    assert_nothing_raised do
      exploits =  @api.browser_exploits()
    end
    assert(exploits.length > 5)
  end

  def test_exploit_info
    new_api
    @api.login
    info = nil
    assert_nothing_raised do
      info = @api.get_exploit_info('windows/dcerpc/ms03_026_dcom')
    end
    assert( info['name'].nil? != true)
  end

  def test_get_options
    new_api
    @api.login
    info = nil
    assert_nothing_raised do
      info = @api.get_options('windows/dcerpc/ms03_026_dcom')
    end
    assert( info['RHOST'].nil? != true)
  end

  def test_payloads
    new_api
    @api.login
    payloads = nil
    assert_nothing_raised do
      payloads = @api.payloads
    end
    assert( payloads.length > 5 )
  end

  def test_launch_exploit
    new_api
    @api.login
    opts = { 'PAYLOAD' => 'windows/meterpreter/bind_tcp', 'URIPATH' => '/test1','SRVPORT' => 8080}
    ret = nil
    assert_nothing_raised do
      ret = @api.launch_exploit('windows/browser/adobe_utilprintf',opts)
    end
    assert(ret['job_id'] != nil )
  end

  def test_launch_autopwn
    new_api
    @api.login
    ret = nil
    assert_nothing_raised do
      ret = @api.launch_autopwn
    end
    assert(ret['job_id'] != nil )
  end
end
