"""
Test that CVEs stay fixed. 
"""

from IPython.utils.tempdir import TemporaryDirectory, TemporaryWorkingDirectory
from pathlib import Path
import random
import sys
import os
import string
import subprocess
import time

def test_cve_2022_21699():
    """
    Here we test CVE-2022-21699.

    We create a temporary directory, cd into it. 
    Make a profile file that should not be executed and start IPython in a subprocess, 
    checking for the value.



    """

    dangerous_profile_dir = Path('profile_default')

    dangerous_startup_dir = dangerous_profile_dir / 'startup'
    dangerous_expected = 'CVE-2022-21699-'+''.join([random.choice(string.ascii_letters) for i in range(10)])

    with TemporaryWorkingDirectory() as t:
        dangerous_startup_dir.mkdir(parents=True)
        (dangerous_startup_dir/ 'foo.py').write_text(f'print("{dangerous_expected}")')
        # 1 sec to make sure FS is flushed.
        #time.sleep(1)
        cmd = [sys.executable,'-m', 'IPython']
        env = os.environ.copy()
        env['IPY_TEST_SIMPLE_PROMPT'] = '1'


        # First we fake old behavior, making sure the profile is/was actually dangerous
        p_dangerous = subprocess.Popen(cmd + [f'--profile-dir={dangerous_profile_dir}'], env=env, stdin=subprocess.PIPE,
                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out_dangerous, err_dangerouns = p_dangerous.communicate(b"exit\r")
        assert dangerous_expected in out_dangerous.decode()

        # Now that we know it _would_ have been dangerous, we test it's not loaded
        p = subprocess.Popen(cmd, env=env, stdin=subprocess.PIPE,
                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = p.communicate(b"exit\r")
        assert b'IPython' in out
        assert dangerous_expected not in out.decode()
        assert err == b''



