import unittest.mock as mock

import ID2TLib.TestLibrary as Lib
import Test.ID2TAttackTest as Test

sha_ftp_basic = '11af85015d4db6e218cb59d9b674e67144e1c64dbdfc83a474917c00f85979e3'
sha_ftp_mac = '088ef4af557101664d5eb8ff13d4ff33fd71c8d47a9c622381388948cfdfbb1a'
sha_ftp_random_ip_src = '1379b3e6d585d50e9f9b577e4bbba5ca621a6521e24ad483b2f826a20c8df8ed'
sha_not_empty_custom_payload_empty_file = 'b561442183789ad36adcce085fdff7f84bebc65e4b4e8c134ba578864c4d8e35'
sha_empty_custom_payload_not_empty_file = 'e577fa534a05606af1a5b3fbf71e04eb7c1713fc3d8923c6f12c7b7a2301693e'
sha_valid_ip = '11af85015d4db6e218cb59d9b674e67144e1c64dbdfc83a474917c00f85979e3'
# TODO: improve coverage


class UnitTestFTPWinaXeExploit(Test.ID2TAttackTest):

    @mock.patch('ID2TLib.Utility.get_rnd_bytes', side_effect=Lib.get_bytes)
    @mock.patch('ID2TLib.Utility.get_rnd_x86_nop', side_effect=Lib.get_x86_nop)
    def test_ftp_basic(self, mock_get_rnd_x86_nop, mock_get_rnd_bytes):
        self.checksum_test([['FTPWinaXeExploit']], sha_ftp_basic)

    @mock.patch('ID2TLib.Utility.get_rnd_bytes', side_effect=Lib.get_bytes)
    @mock.patch('ID2TLib.Utility.get_rnd_x86_nop', side_effect=Lib.get_x86_nop)
    @mock.patch('Core.Statistics.Statistics.get_mac_address')
    def test_ftp_mac(self, mock_mac_address, mock_get_rnd_x86_nop, mock_get_rnd_bytes):
        mock_mac_address.return_value = Lib.test_pcap_empty
        self.checksum_test([['FTPWinaXeExploit']], sha_ftp_mac)

    @mock.patch('ID2TLib.Utility.get_rnd_bytes', side_effect=Lib.get_bytes)
    @mock.patch('ID2TLib.Utility.get_rnd_x86_nop', side_effect=Lib.get_x86_nop)
    def test_ftp_random_ip_src(self, mock_get_rnd_x86_nop, mock_get_rnd_bytes):
        self.checksum_test([['FTPWinaXeExploit', 'ip.src.shuffle=1']], sha_ftp_random_ip_src)

    @mock.patch('ID2TLib.Utility.get_rnd_bytes', side_effect=Lib.get_bytes)
    @mock.patch('ID2TLib.Utility.get_rnd_x86_nop', side_effect=Lib.get_x86_nop)
    def test_ftp_not_empty_custom_payload_empty_file(self, mock_get_rnd_x86_nop, mock_get_rnd_bytes):
        self.checksum_test([['FTPWinaXeExploit', 'custom.payload=1']], sha_not_empty_custom_payload_empty_file)

    @mock.patch('ID2TLib.Utility.get_rnd_bytes', side_effect=Lib.get_bytes)
    @mock.patch('ID2TLib.Utility.get_rnd_x86_nop', side_effect=Lib.get_x86_nop)
    @mock.patch('ID2TLib.Utility.check_payload_len')
    @mock.patch('ID2TLib.Utility.get_bytes_from_file', return_value=b'AAAAA')
    def test_ftp_empty_custom_payload_not_empty_file(self, mock_bytes_from_file, mock_payload_len, mock_get_rnd_x86_nop,
                                                     mock_get_rnd_bytes):
        self.checksum_test([['FTPWinaXeExploit', 'custom.payload.file=1']], sha_empty_custom_payload_not_empty_file)

    @mock.patch('ID2TLib.Utility.get_rnd_bytes', side_effect=Lib.get_bytes)
    @mock.patch('ID2TLib.Utility.get_rnd_x86_nop', side_effect=Lib.get_x86_nop)
    @mock.patch('Attack.BaseAttack.BaseAttack.is_valid_ip_address', return_values=[False, True])
    def test_ftp_invalid_ip(self, mock_valid_ip_check, mock_get_rnd_x86_nop, mock_get_rnd_bytes):
        self.checksum_test([['FTPWinaXeExploit']], sha_valid_ip)

    def test_ftp_order(self):
        self.order_test([['FTPWinaXeExploit']])
