ó
qxPXc        	   @   s  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l	 Z	 d  d l
 Z
 d  d l Z d  d l Z d Z d Z d Z d d d d d d	 d
 d d g	 Z e j j e j j  Z d e j f d     YZ e d  j   j   Z e d d k rHe j j d  e j d  n  e d j    d Z! e j" j#   re j j d  e j d  n  e j$   d S(   i˙˙˙˙Ns   /usr/bin/yest	   coreutilst   ProblemTypet   CoreDumpt   Datet   ExecutablePatht   ProcCmdlinet   ProcEnviront   ProcMapst   Signalt
   UserGroupst   Tc        
   B   sú  e  Z d    Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d	   Z d
   Z e j e j d e j  d  d    Z e j e j d e j  d  d    Z d   Z d   Z d   Z d   Z d   Z d   Z e j e j   d k d  d    Z e j e j j d  d  e j e j   d k d  d     Z e j e j   d k d  d    Z  e j e j   d k d  d    Z! e" e# e$ d  g  d   Z& e# e' e( j) e# d e$ d  d  g  d 	 Z* d   Z+ RS(!   c         C   sľ   t  j   |  _ |  j t j d <t  j   |  _ t j j t  rW t j	 t t d  n  t
 j t
 j d	  t j d  t j j t j j d t j d d  t j   f  |  _ d  S(
   Nt   APPORT_REPORT_DIRs   .apporttesti    i˙˙˙˙s   /tmps   %s.%i.crasht   /t   _(   i    i˙˙˙˙(   t   tempfilet   mkdtempt
   report_dirt   ost   environt   workdirt   patht   existst   ifpatht   renamet   resourcet	   setrlimitt   RLIMIT_COREt   chdirt   joint   apportt	   fileutilst   test_executablet   replacet   getuidt   test_report(   t   self(    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   setUp   s    c         C   sš   t  j |  j  t  j |  j  t j j t  rB t j t  n  t d } t j j |  rq t j	 | t  n  t j j |  j
  r t j j |  j
  n  |  j t j j   g   d  S(   Ns   .apporttest(   t   shutilt   rmtreeR   R   R   R   R   R   t   unlinkR   R"   R   R   t   delete_reportt   assertEqualt   get_all_reports(   R#   t   orig_ignore_file(    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   tearDown.   s    
c         C   sť   |  j    } zq t j t t |  d d g d t d t j d t j } | j j   | j	   d k s| t
 | j j     Wd t j | d  t j | d  X|  j |  j   g   d S(	   s)   empty core dumps do not generate a reportt   42t   0t	   close_fdst   stdint   stderri    Ni	   (   t   create_test_processt
   subprocesst   Popent   apport_patht   strt   Truet   PIPER0   t   closet   waitt   AssertionErrorR1   t   readR   t   killt   waitpidR)   t   get_temp_all_reports(   R#   t	   test_proct   app(    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_empty_core_dump>   s    +c   	      C   s9  |  j    |  j t j j   |  j g  t j |  j  } |  j t j | j	  d d  |  j    t j |  j  } |  j | | d  t j j
 |  j  |  j    t j |  j  } |  j | | d  t j   } | j t |  j   |  j t t  j t | j     d  |  j | d t  |  j | d t  |  j | d d	 t j  d
 d d d d d d d d d d d d d d d d d g } xJ | d j   D]8 } | j d d  \ } } |  j | | k d |  q¨Wx4 | d  j   D]" } |  j t j |  j d!  qőW|  j d" | d  k d#  d$ S(%   s   report generation with apporti   s   report has correct permissionss.   original unseen report did not get overwrittens%   original seen report gets overwrittens   report has required fieldsR   R   R   s   %it   SHELLt   PATHt   LANGUAGEt   LANGt   LC_CTYPEt
   LC_COLLATEt   LC_TIMEt
   LC_NUMERICt   LC_MONETARYt   LC_MESSAGESt   LC_PAPERt   LC_NAMEt
   LC_ADDRESSt   LC_TELEPHONEt   LC_MEASUREMENTt   LC_IDENTIFICATIONt   LOCPATHt   TERMR   t   =i   s1   report contains sensitive environment variable %sR	   iô  t   roots/   collected system groups are not those from rootN(   t   do_crashR)   R   R   R*   R"   R   t   statt   S_IMODEt   st_modet   mark_report_seent   assertNotEqualt   Reportt   loadt   opent
   assertTruet   sett   required_fieldst   issubsett   keysR   t   signalt   SIGSEGVt
   splitlinest   splitt
   assertLesst   grpt   getgrnamt   gr_gidt   assertFalse(	   R#   t   stt   st2t   prt   allowed_varst   lt   kt   vt   g(    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_crash_apportM   s>    


$ c         C   s  |  j    } |  j  t d  } z8t j t t |  d d g d t d t j d t j } t j	 d  t j t t |  d d g d t d t j d t j } d } x7 | d	 k rß | j
   rĹ Pn  t j	 d
  | d 8} qŠ W|  j | d	 d  |  j | j
   d  | j j   | j j d  | j j   |  j | j   d	 | j j    Wd t j | d  t j | d	  t j | d  t j | d	  Xd S(   s)   only one apport instance is ran at a times   /bin/ddR-   R.   R/   R0   R1   g      ŕ?i2   i    gš?i   s-   second apport instance terminates immediatelys&   first apport instance is still runningt   booNi	   (   R2   t   FalseR3   R4   R5   R6   R7   R8   t   timet   sleept   pollt   assertGreaterRm   R0   R9   t   writeR)   R:   R1   R<   R   R=   R>   (   R#   R@   t
   test_proc2RA   t   app2t   timeout(    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_parallel_crash|   s0    &c         C   s  t  j j |  j d  } t  j j |  j d  } t  j | |  |  j   } z| t j t t	 |  d d g d t
 d t j d t j } | j j d  | j j   |  j | j   d	 | j j    Wd
 t  j | d  t  j | d	  X|  j |  j   g   |  j t  j j |   d
 S(   s   existing .lock file as dangling symlink does not create the file

        This would be a vulnerability, as users could overwrite system files.
        s   .lockt   0wnedR-   R.   R/   R0   R1   Rw   i    Ni	   (   R   R   R   R   t   symlinkR2   R3   R4   R5   R6   R7   R8   R0   R}   R9   R\   R:   R1   R<   R=   R>   R)   R?   Rm   R   (   R#   t   lockpatht   trappathR@   RA   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_lock_symlinkŁ   s    &c      
   C   s   t  j j |  j d  } t | d  2 } t t d   } | j | j    Wd QXWd QXt  j | d  |  j	 d |  |  j
 t j j   g   d S(   s*   unpackaged binaries do not create a reportt   mybint   wbt   rbNií  t   command(   R   R   R   R   R_   R   R}   R<   t   chmodRW   R)   R   R   R*   (   R#   t	   local_exet   destt   src(    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_unpackaged_binaryž   s    c         C   sł   t  j j |  j d  } t | d   } | j d  Wd QXt  j | d  |  j d |  |  j t	 j
 j   g   t  j |  j  |  j d d  |  j t	 j
 j   g   d S(   s)   unpackaged scripts do not create a reportt   myscriptt   ws   #!/bin/sh
kill -SEGV $$Nií  R   s
   ./myscript(   R   R   R   R   R_   R}   R   RW   R)   R   R   R*   R   (   R#   R   t   f(    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_unpackaged_scriptÉ   s    c         C   s0   |  j  d t j  |  j t j j   g   d S(   s   apport ignores SIGQUITt   sigN(   RW   Re   t   SIGQUITR)   R   R   R*   (   R#   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_ignore_sigquitÚ   s    c         C   sč   t  j j |  j d  } t | d   } | j d  Wd QXt  j | d  |  j d t d | d d	  t  j j t	 j
 j d
 t  j    } t	 j   } | j t |   |  j | d d  |  j d | k  t	 j
 j |  d S(   s2   existence of user-inaccessible files does not leakR   R   s_   #!/usr/bin/perl
system("mv $0 $0.exe");
system("ln -sf /etc/shadow $0");
$0="..$0";
sleep(10);
Nií  t   check_runningR   Rz   i   s   _usr_bin_perl.%i.crashR   s   /usr/bin/perlt   InterpreterPath(   R   R   R   R   R_   R}   R   RW   Rx   R   R   R   R!   R]   R^   R)   Rm   R(   (   R#   R   R   t   leakRp   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_leak_inaccessible_filesŕ   s    c         C   s¤   d } xq | d k  ry t  j j d |  t  j j   |  j   t j j   } | sY Pn  t j j |  j	  | d 7} q	 W|  j
 | d d  |  j | d d  d S(   s    limitation of crash report floodi    i   s   %i i   s    gets at least 2 repeated crashess1   stops flooding after less than 7 repeated crashesN(   t   sysR1   R}   t   flushRW   R   R   t   get_new_reportsR[   R"   R|   Ri   (   R#   t   countt   reports(    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_flood_limitó   s    
s   /runs!   this test needs to be run as userc         C   sŹ   t  j d  t j t j d  |  j   t j   } |  j t  j	 j
 |  j   |  j t  j	 j
 d   | j t |  j   t t  j t | j     s¨ t  d S(   s$   core dump works for non-writable cwds   /runi˙˙˙˙s	   /run/coreN(   i˙˙˙˙i˙˙˙˙(   R   R   R   R   R   RW   R   R]   R`   R   R   R"   Rm   R^   R_   Ra   Rb   Rc   Rd   R;   (   R#   Rp   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_nonwritable_cwd  s    
c         C   s?  t  j d d  \ } } |  j t j |  t t d   } t j | | j    Wd QXt j	 |  t j
 | d  t j d  t j t j d  |  j t d | d	 t t j j   } |  j t |  d
  | d } t j |  } |  j t j | j  d d  |  j | j d d  |  j t j j   g   d S(   s5   no core file for non-readable exe in non-writable cwdt   dirs   /var/tmpR   NiI   s   /runi˙˙˙˙R   t   expect_corefilei   i    i   s   report has correct permissionss   report has correct owner(   i˙˙˙˙i˙˙˙˙(   R   t   mkstempt
   addCleanupR   R'   R_   R   R}   R<   R9   R   R   R   R   R   RW   R7   Rx   R   R   t   get_new_system_reportsR)   t   lenRX   RY   RZ   t   st_uidR*   (   R#   t   fdt   myexeR   R   t   reportRn   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt$   test_nonwritable_cwd_nonreadable_exe  s     	
c         C   s  t  j t  j d
  |  j d t d t  |  j t j j   g   t  j t  j d  |  j d t  |  j t j j   g   t j j	 |  j
  t  j t  j d  |  j d t d t j    |  j t j j   |  j
 g  t j j	 |  j
  t  j t  j d  |  j d t d t j    |  j t j j   |  j
 g  t j j	 |  j
  t  j t  j d  |  j d t d t d t j  t j j	 |  j
  t  j t  j d  |  j d t d t j  t j j	 |  j
  t  j t  j d  |  j d t d t j d t j    t j j	 |  j
  t  j t  j d  |  j d t d t j d t j    t j j	 |  j
  |  j d t  d	 S(   s8   packaged executables create core dumps on proper ulimitsi   i˙˙˙˙t   expect_coredumpRŁ   i
   i'  t   expect_corefile_ownerR   N(   i   i˙˙˙˙(   i
   i˙˙˙˙(   i'  i˙˙˙˙(   i˙˙˙˙i˙˙˙˙(   i   i˙˙˙˙(   i
   i˙˙˙˙(   i'  i˙˙˙˙(   i˙˙˙˙i˙˙˙˙(   R   R   R   RW   Rx   R)   R   R   R*   R(   R"   R7   R   t   geteuidRe   t   SIGABRT(   R#   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_core_dump_packaged3  s8    %%c         C   s  t  j j |  j d  } t | d  2 } t t d   } | j | j    Wd QXWd QXt  j | d  t	 j
 t	 j d  |  j d t d	 t d
 |  |  j t j j   g   t	 j
 t	 j d  |  j t j j   g   t	 j
 t	 j d  |  j d	 t d
 |  |  j t j j   g   t	 j
 t	 j d  |  j d	 t d
 |  |  j t j j   g   t	 j
 t	 j d  |  j d t d	 t d
 | d t j  |  j t j j   g   t	 j
 t	 j d  |  j d	 t d
 | d t j  |  j t j j   g   t	 j
 t	 j d  |  j d	 t d
 | d t j  |  j t j j   g   t	 j
 t	 j d  |  j d	 t d
 | d t j  |  j t j j   g   d S(   s:   unpackaged executables create core dumps on proper ulimitsR   R   R   Nií  i   i˙˙˙˙R­   RŁ   R   i
   i'  R   (   i   i˙˙˙˙(   i
   i˙˙˙˙(   i'  i˙˙˙˙(   i˙˙˙˙i˙˙˙˙(   i   i˙˙˙˙(   i
   i˙˙˙˙(   i'  i˙˙˙˙(   i˙˙˙˙i˙˙˙˙(   R   R   R   R   R_   R   R}   R<   R   R   R   R   RW   Rx   R)   R   R   R*   R7   Re   R°   (   R#   R   R   R   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_core_dump_unpackagedX  s8    %c         C   s&  t  |  j d d   } | j d  Wd QXt j t j d  |  j   } t j | t	 j
  x3 t r y t j |  j  PWqa t k
 r qa Xqa Wt j |  j d |  j  t j | d  t j d  t  d d	   } | j   } Wd QX|  j d
 |  |  j t |  d  t j d  d S(   s   cannot inject core files   .injectR   s\   ProblemType: Crash
CoreDump: base64
 H4sICAAAAAAC/0NvcmVEdW1wAA==
 Yywoz0tNAQBl1rhlBgAAAA==
Ni˙˙˙˙i    g      ŕ?t   coreR   t   pwnedi'  (   i˙˙˙˙i˙˙˙˙(   R_   R"   R}   R   R   R   R2   R   R=   Re   Rf   R7   R'   t   OSErrorR   R>   Ry   Rz   R<   t   assertNotInR|   R§   (   R#   R   t   pidRł   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_core_file_injection|  s(    	c   
   	   C   sP  t  j   } t d   } | j |  Wd QXt | d j   d  t | d j   d  } | d :} d } |  j   } zt j	 t
 t |  d d g d	 t d
 t j d t j } d d } x | d k rQ| d @d k rt j j d  t j j   n  y | j j |  Wn, t k
 rC} | j t j k r=PqD  n X| d 8} qĹ W| j j   |  j | j   d | j j    d } Wd t j | d  t j | d  X|  j   } |  j t |  d  t  j   }	 t | d   } |	 j |  Wd QXt j | d  |  j |	 d d  |  j |	 d t   |  j! d |	 k  d S(   s.   core dumps are capped on available memory sizes   /proc/meminfoNt   MemFreei    t   Cachedi   R-   R.   R/   R0   R1   t    i   i   t   .i   i	   R   R   R   ("   R   R]   R_   R^   t   longRh   t   NoneR2   R3   R4   R5   R6   R7   R8   R   R1   R}   R   R0   t   IOErrort   errnot   EPIPER9   R)   R:   R<   R   R=   R>   R?   R§   R'   R   Rm   (
   R#   t   rR   t   totalmbR@   RA   t   onembt   eR   Rp   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_limit_sizeŚ  sH    2

"
c         C   sŁ   |  j    t j j   } |  j t |  d  t j   } t | d   } | j |  Wd QXt	 j
 | d  | j   |  j    |  j t j j   g   d S(   s   ignoring executablesi   i    N(   RW   R   R   R*   R)   R§   R]   R_   R^   R   R'   t   mark_ignore(   R#   R   Rp   R   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_ignoreÚ  s    


c      	   C   sw  t  j d d  \ } } zJt t   } t j | | j    Wd QXt j |  t j | d  t	 j
 d  zˇ |  j d |  } t	 j
 d  t j | d  t j t t |  d d	 g d
 t d t j d t j } | j j d  | j j   | j j   j   } |  j | j   d |  Wd t j | d  t j | d  X|  j |  j   g   Wd t j |  Xd S(   s<   ignores executables which got modified after process startedR˘   s   /var/tmpNií  i   R   gń?R-   R.   R/   R0   R1   Rw   i    i	   (   R   R¤   R_   R   R   R}   R<   R9   R   Ry   Rz   R2   t   utimeRž   R3   R4   R5   R6   R7   R8   R0   R1   t   decodeR\   R:   R=   R>   R)   R?   R'   (   R#   RŠ   RŞ   R   R@   RA   t   err(    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_modify_after_startě  s*    i    s!   this test needs to be run as rootc         C   s#  t  j d d  \ } } |  j t j |  t t d   } t j | | j    Wd QXt j	 |  t j
 | d  t j t j d  |  j d | d d	  t j j   } |  j t |  d
  | d } t j |  } t j |  |  j t j | j  d d  |  j | j d d  d S(   s5   report generation for setuid program which stays rootR˘   s   /var/tmpR   Nií	  i˙˙˙˙R   t   uidi   i   i    i   s   report has correct permissionss   report has correct owner(   i˙˙˙˙i˙˙˙˙(   R   R¤   RĽ   R   R'   R_   R   R}   R<   R9   R   R   R   R   RW   R   R   R*   R)   R§   RX   RY   RZ   R¨   (   R#   RŠ   RŞ   R   R   RŤ   Rn   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_crash_setuid_keep  s    
s	   /bin/pings   this test needs /bin/pingc         C   sś   t  j t  j d  |  j d d d d g d d  t j j   } |  j t |  d  | d	 } t	 j
 |  } t	 j |  |  j t
 j | j  d
 d  |  j | j d	 d  d S(   s5   report generation for setuid program which drops rooti˙˙˙˙R   s	   /bin/pingt   argss	   127.0.0.1RÍ   i   i   i    i   s   report has correct permissionss   report has correct ownerN(   i˙˙˙˙i˙˙˙˙(   R   R   R   RW   R   R   R*   R)   R§   R   RX   R'   RY   RZ   R¨   (   R#   R   RŤ   Rn   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_crash_setuid_drop,  s    
c         C   sÂ   t  j d d  \ } } |  j t j |  t t d   } t j | | j    Wd QXt j	 |  t j
 | d  t j t j d  |  j d | d t d	 d
  |  j t j j   g   d S(   s/   report generation for unpackaged setuid programR˘   s   /tmpR   Nií	  i˙˙˙˙R   RŁ   RÍ   i   (   i˙˙˙˙i˙˙˙˙(   R   R¤   RĽ   R   R'   R_   R   R}   R<   R9   R   R   R   R   RW   Rx   R)   R   R   R*   (   R#   RŠ   RŞ   R   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   test_crash_setuid_unpackaged@  s    c         C   s6  t  j d d  \ } } |  j t j |  t t d   } t j | | j    Wd QXt j	 |  t j
 | d  t j d  t j t j d  |  j d | d	 t d
 d  t j j   } |  j t |  d  | d } t j |  } t j |  |  j t j | j  d d  |  j | j d d  d S(   sD   report generation and core dump for setuid program, non-writable cwdR˘   s   /var/tmpR   Nií	  s   /runi˙˙˙˙R   RŁ   RÍ   i   i   i    i   s   report has correct permissionss   report has correct owner(   i˙˙˙˙i˙˙˙˙(   R   R¤   RĽ   R   R'   R_   R   R}   R<   R9   R   R   R   R   R   RW   Rx   R   R   R*   R)   R§   RX   RY   RZ   R¨   (   R#   RŠ   RŞ   R   R   RŤ   Rn   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt!   test_crash_setuid_nonwritable_cwdV  s     
c         C   s9  t  j | t  j  s% t | d   | rU t j d | g  d k sU t d   n  t  j   } | d k rř | d k	 r t  j |  n  t  j	 t  j
 d t  j  t j j    t j j   t  j   t  j | | g |  t sř t d |   n  x- d t
 d	 |  j   k r't j d
  qű Wt j d  | S(   s\   Spawn test_executable.

        Wait until it is fully running, and return its PID.
        s    is not executablet   pidofi   s$   no running test executable processesi    s	   /dev/nulls   Could not execute t   test_signals   /proc/%i/cmdlinegš?g333333Ó?N(   R   t   accesst   X_OKR;   R3   t   callt   forkRž   t   setuidt   dup2R_   t   O_WRONLYR   t   stdoutt   filenoR0   R9   t   setsidt   execvRx   R<   Ry   Rz   (   t   klassR   R   RÍ   RĎ   Rˇ   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyR2   y  s     %*(
c
         C   sŐ  |  j  t j j d  d t j    |  j | | d | d |	 }
 | d k r` t j |  n  t j |
 |  t j	 |
 d  d } |  j  t j
 |  d  |  j t j |  d  |  j t j |  |  |  j t j |  d d	  |  j t j |  | d
  d } xR | d k rct j d d d g d t j d k rIPn  t j d  | d 8} qW|  j | d  | r|  j t j d | g  d d  n  | rľ|  j t j j d  d  zŕ t j d  } |  j t j | j  d d  | d k	 r|  j | j | d  n  t j d d d d | d g d t j d t j } | j   \ } } |  j | j d  | j   } |  j | d k p| j d  |  Wd t j d  Xn |  j  t j j d  d  d S(   s  Generate a test crash.

        This runs command (by default test_executable) in cwd, lets it crash,
        and checks that it exits with the expected return code, leaving a core
        file behind if expect_corefile is set, and generating a crash report if
        expect_coredump is set.

        If check_running is set (default), this will abort if test_process is
        already running.
        Rł   s-   %s/core already exists, please clean up firstRÍ   RĎ   i    i   s"   test process did not exit normallys   test process died due to signals%   test process was not signaled to stops&   test process died due to proper signali2   RÓ   s   -xR   RÜ   gÉ?s$   no running test executable processess   leaves wanted core filei  s!   core file has correct permissionss   core file has correct ownert   gdbs   --batchs   --ext   btR1   t    t   warningNs"   leaves unexpected core file behind(    Rm   R   R   R   t   getcwdR2   Ry   Rz   R=   R>   t	   WIFEXITEDR`   t   WIFSIGNALEDR)   t	   WCOREDUMPt   WSTOPSIGt   WTERMSIGR3   R×   R8   R|   RX   RY   RZ   Rž   R¨   R4   t   communicatet
   returncodet   stript
   startswithR'   (   R#   R­   RŁ   R   R   Rz   R   RÍ   RŽ   RĎ   Rˇ   t   resultR   Rn   Rá   t   outRË   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyRW     sJ    &'
)c         C   s:   t  j j } |  j t  j _ t  j j   } | t  j _ | S(   s8   Call apport.fileutils.get_all_reports() for our temp dir(   R   R   R   R*   (   R#   t   old_dirR   (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyR?   Ď  s
    N(,   t   __name__t
   __module__R$   R,   RB   Rv   R   R   R   R   R   R   R    t   unittestt   skipIfR   RŐ   t   W_OKRĄ   RŹ   Rą   R˛   R¸   RĆ   RČ   RĚ   RŻ   RÎ   t
   skipUnlessR   R   RĐ   RŃ   RŇ   t   classmethodR7   R   Rž   R2   Rx   Re   Rf   RW   R?   (    (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyR
      s@   				/	'						**#	%	$	*	4		$'*''#9s   /proc/sys/kernel/core_patterni    t   |sP   kernel crash dump helper is not active; please enable before running this test.
i   sE   Please remove all crash reports from /var/crash/ for this test suite
(%   R   R%   R   R3   Re   Ry   RX   R   R   RŔ   Rj   Rô   t   apport.fileutilsR   R   t   test_packaget   test_sourceRb   R   t
   expanduserRŤ   t   _ignore_fileR   t   TestCaseR
   R_   R<   Rí   t   core_patternR1   R}   t   exitRh   R5   R   R*   t   main(    (    (    s2   /usr/share/apport/testsuite/test_signal_crashes.pyt   <module>
   s(   `0˙ ˙ Ć