ó
ˆ5„Oc           @   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 m Z d e  j	 f d „  ƒ  YZ
 e d k rŠ e  j ƒ  n  d S(   iÿÿÿÿN(   t   CrashDatabaset   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 d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   sí   t  j ƒ  |  _ t j j |  j d ƒ |  _ t d  i d d 6|  j d 6ƒ |  _	 |  j
 |  j	 j |  j	 j d ƒ d ƒ d ƒ |  j	 j d ƒ j ƒ  sœ t d ƒ ‚ |  j
 |  j	 j d ƒ j ƒ  |  j	 j d	 ƒ j ƒ  ƒ |  j
 |  j	 j ƒ  d	 ƒ d  S(
   Nt   dupdbt   1t
   dummy_datat	   dupdb_urli    s   http://foo.bugs.example.com/0i   s2   test-suite internal check: Python crash sigs existi   (   t   tempfilet   mkdtempt   workdirt   ost   patht   joint	   dupdb_dirR    t   Nonet   crashest   assertEqualt   get_comment_urlt   downloadt   crash_signaturet   AssertionErrort	   latest_id(   t   self(    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   setUp   s    	c         C   s   t  j |  j ƒ d  S(   N(   t   shutilt   rmtreeR   (   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   tearDown   s    c         C   sH   t  d i  ƒ |  _ |  j |  j j ƒ  d ƒ |  j t |  j j d ƒ d S(   s!   No dummy data is added by defaultiÿÿÿÿi    N(   R    R   R   R   R   t   assertRaisest
   IndexErrorR   (   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_no_dummy_data   s    c         C   sQ   |  j  |  j j ƒ  t d d d g ƒ ƒ |  j  |  j j ƒ  t d d g ƒ ƒ d S(   s+   Bookkeeping in retraced and dupchecked bugsi    i   i   i   i   N(   R   R   t   get_unretracedt   sett   get_dup_unchecked(   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_retrace_markers%   s    (c         C   s¡   t  j ƒ  } | j d ƒ | j ƒ  t j j d d | j ƒ } |  j	 | j
 d d ƒ t j j d d | j ƒ } |  j d | j
 k ƒ |  j	 | j
 d d ƒ d S(	   s   Dynamic code in crashdb.confs&  default = 'testsuite'

def get_dyn():
    return str(2 + 2)

def get_dyn_name():
    return 'on_the' + 'fly'

databases = {
    'testsuite': {
        'impl': 'memory',
        'dyn_option': get_dyn(),
    },
    get_dyn_name(): {
        'impl': 'memory',
        'whoami': 'dynname',
    }
}
t
   dyn_optiont   4t	   on_theflyt	   dyn_opiont   whoamit   dynnameN(   R   t   NamedTemporaryFilet   writet   flusht   apportt   crashdbt   get_crashdbR   t   nameR   t   optionst   assertFalse(   R   t   crashdb_conft   db(    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_dynamic_crashdb_conf+   s    
c         C   sj   |  j  |  j j t j d ƒ ƒ ƒ |  j  |  j j t j d ƒ ƒ ƒ |  j  |  j j t j d ƒ ƒ ƒ d S(   s    accepts(): default configurationt   Crasht   Bugt	   weirdtypeN(   t
   assertTrueR   t   acceptsR*   t   Report(   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_accepts_defaultK   s    ""c         C   sŸ   t  j ƒ  } | j d ƒ | j ƒ  t j j d d | j ƒ } |  j	 | j
 t j d ƒ ƒ ƒ |  j | j
 t j d ƒ ƒ ƒ |  j | j
 t j d ƒ ƒ ƒ d S(   s/   accepts(): problem_types option in crashdb.confs‡   default = 'testsuite'

databases = {
    'testsuite': {
        'impl': 'memory',
        'problem_types': ['Bug', 'Kernel'],
    },
}
R4   R3   R5   N(   R   R'   R(   R)   R*   R+   R,   R   R-   R6   R7   R8   R/   (   R   R0   R1   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_accepts_problem_typesS   s    
c         C   su   |  j  j d ƒ } |  j | d d ƒ |  j | d d ƒ |  j |  j  j d d d ƒ |  j t |  j  j d ƒ d S(	   s   Crash uploading and downloadingi    t   SourcePackaget   foot   Packages   libfoo1 1.2-3t   dup_ofi   N(   R   R   R   t   reportsR   R   R   (   R   t   r(    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_submitn   s
    c         C   s€   |  j  |  j j d ƒ d g ƒ |  j  |  j j d ƒ d g ƒ |  j  |  j j d ƒ d g ƒ |  j  |  j j d ƒ d g ƒ d  S(   Ni    R<   i   i   t   bari   t   pygoo(   R   R   t   get_affected_packages(   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_get_affected_packagesy   s    c         C   sá   t  j ƒ  } d | d <d | d <d | d <|  j j d | d ƒ |  j |  j j d d	 d ƒ |  j |  j j d ƒ d d ƒ |  j |  j j d ƒ d d ƒ |  j |  j j d ƒ d d ƒ |  j t |  j j d
 d d ƒ d S(   s   update()t   newR=   t   Bogust   FooBars   Fresh!t   StacktraceTopi   t   muhahat   commenti   t    N(
   R*   R8   R   t   updateR   R?   R   R   R   R   (   R   R@   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_update   s    


   c         C   sí   t  j ƒ  } d | d <d | d <d | d <|  j j d | d d	 d d g ƒ|  j |  j j d d
 d ƒ |  j |  j j d ƒ d d ƒ |  j |  j j d ƒ d d ƒ |  j |  j j d ƒ d d ƒ |  j t |  j j d d d ƒ d S(   s   update() with key_filterRF   R=   RG   RH   s   Fresh!RI   i   RJ   t
   key_filterRK   s   libfoo1 1.2-4i   RL   N(
   R*   R8   R   RM   R   R?   R   R   R   R   (   R   R@   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_update_filter   s    


"   c         C   sÝ   t  j ƒ  } d | d <d | d <d | d <|  j j d | d ƒ |  j |  j j d d	 d ƒ |  j |  j j d ƒ d d
 ƒ |  j |  j j d ƒ d d ƒ |  j d |  j j d ƒ k ƒ |  j t	 |  j j d d ƒ d S(   s   update_traces()RF   R=   RG   RH   s   Fresh!RI   i   RJ   RK   s   libfoo1 1.2-4i   N(   R*   R8   R   t   update_tracesR   R?   R   R/   R   R   R   (   R   R@   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_update_tracesŸ   s    


  c         C   s    |  j  |  j j d ƒ d ƒ d S(   s   get_distro_release()i    s   FooLinux Pi/2N(   R   R   t   get_distro_release(   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_get_distro_release¯   s    c         C   so  |  j  |  j j ƒ  t d d d d d g ƒ ƒ |  j  |  j j d ƒ d ƒ |  j  |  j j d ƒ d ƒ |  j  |  j j d ƒ d ƒ |  j  |  j j d ƒ d ƒ |  j  |  j j d ƒ d ƒ |  j j i  d d ƒ |  j  |  j j d ƒ d ƒ |  j  |  j j d ƒ d ƒ |  j  |  j j ƒ  t d d d d g ƒ ƒ |  j  |  j j d ƒ d ƒ |  j  |  j j d ƒ d ƒ d S(	   sE   get_unfixed(), get_fixed_version(), duplicate_of(), close_duplicate()i    i   i   i   i   t   invalidic   N(   R   R   t   get_unfixedR   t   get_fixed_versionR   t   duplicate_oft   close_duplicate(   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_status´   s    .+c         C   s   d |  j  j d d <|  j  j d d ƒ |  j |  j  j d d d ƒ |  j |  j  j d ƒ d ƒ |  j |  j  j d ƒ d ƒ d S(   s   mark_regression()s   4.1i   t   fixed_versioni   RK   s   regression, already fixed in #3N(   R   R?   t   mark_regressionR   RX   R   (   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_mark_regressionÇ   s    c         C   s§   |  j  j d ƒ |  j |  j  j d ƒ d ƒ |  j |  j  j ƒ  i d |  j  j d ƒ j ƒ  6ƒ |  j  j d d ƒ |  j |  j  j ƒ  i d |  j  j d ƒ j ƒ  6ƒ d S(   s   duplicate_db_fixed()s   :memory:i    t   42N(   i    N(   i    R^   (	   R   t   init_duplicate_dbR   t   check_duplicateR   t   _duplicate_db_dumpR   R   t   duplicate_db_fixed(   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_duplicate_db_fixedÖ   s     c         C   s  |  j  t |  j j d ƒ |  j j d ƒ |  j |  j j d ƒ d ƒ |  j |  j j d ƒ d ƒ |  j j d ƒ |  j |  j j ƒ  i d |  j j	 d ƒ j
 ƒ  6d |  j j	 d ƒ j
 ƒ  6ƒ |  j j d ƒ |  j |  j j ƒ  i d |  j j	 d ƒ j
 ƒ  6ƒ d S(	   s   duplicate_db_remove()i    s   :memory:i   ic   N(   i    N(   i   N(   i    N(   R   R   R   R`   R_   R   R   t   duplicate_db_removeRa   R   R   (   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_duplicate_db_removeä   s    c         C   sÆ  |  j  t |  j j d |  j j d ƒ ƒ |  j  t |  j j d ƒ |  j j d ƒ |  j |  j j ƒ  i  ƒ |  j |  j j |  j j d ƒ ƒ d ƒ |  j |  j j d ƒ d ƒ |  j |  j j |  j j d ƒ ƒ d ƒ |  j j
 |  j ƒ |  j |  j j |  j j d ƒ ƒ d ƒ |  j |  j j d ƒ d ƒ |  j j
 |  j ƒ |  j |  j j |  j j d ƒ ƒ d ƒ |  j |  j j d ƒ d ƒ |  j j
 |  j ƒ |  j |  j j |  j j d ƒ ƒ d ƒ |  j |  j j d ƒ d ƒ |  j j
 |  j ƒ |  j |  j j |  j j d ƒ ƒ d ƒ |  j |  j j d ƒ d ƒ |  j |  j j d ƒ d ƒ |  j d	 |  j j d k ƒ |  j |  j j ƒ  i d |  j j d ƒ j ƒ  6d |  j j d ƒ j ƒ  6d |  j j d ƒ j ƒ  6ƒ d
 |  j j d d <|  j j |  j j d ƒ d d ƒ |  j |  j j d ƒ d ƒ |  j |  j j d ƒ d ƒ |  j |  j j d d	 d ƒ |  j |  j j ƒ  i d |  j j d ƒ j ƒ  6d |  j j d ƒ j ƒ  6d |  j j d ƒ j ƒ  6d |  j j d ƒ j ƒ  6ƒ t j |  j j d ƒ ƒ } |  j |  j j | |  j j | ƒ ƒ d ƒ |  j |  j j d ƒ d  ƒ |  j |  j j d ƒ d ƒ |  j d	 |  j j d k ƒ t j |  j j d ƒ ƒ } d | d <|  j |  j j | |  j j | ƒ ƒ d ƒ |  j |  j j d ƒ d! ƒ |  j |  j j d ƒ d ƒ |  j d	 |  j j d k ƒ |  j |  j j ƒ  i d" |  j j d ƒ j ƒ  6d# |  j j d ƒ j ƒ  6d$ |  j j d ƒ j ƒ  6d% |  j j d ƒ j ƒ  6ƒ d |  j j d d <|  j j d d ƒ t j |  j j d ƒ ƒ } d | d <|  j |  j j | |  j j | ƒ ƒ d ƒ |  j |  j j d ƒ d& ƒ |  j d	 |  j j d k ƒ |  j |  j j ƒ  i d' |  j j d ƒ j ƒ  6d( |  j j d ƒ j ƒ  6d) |  j j d ƒ j ƒ  6d* |  j j d ƒ j ƒ  6ƒ d S(+   s   check_duplicate() and known()i    s   :memory:s   http://foo.bugs.example.com/0i   i   s   http://bar.bugs.example.com/2i   i   RK   s   4.1R[   s   regression, already fixed in #3s   http://pygoo.bugs.example.com/5i   s   python-goo 5.1R=   s   http://pygoo.bugs.example.com/6i   RL   s   http://pygoo.bugs.example.com/7i   N(   i    N(   i   N(   i    N(   i   N(   i   N(   i    N(   i   N(   i   s   4.1(   i   N(   i   s   4.1(   i   N(   i    N(   i   N(   i   s   4.1(   i   N(   i   RL   (   i    N(   i   N(   i   RL   (   i   N(   R   R   R   R`   R   R_   R   Ra   t   knownR   t   duplicate_db_publishR   R/   R?   R   RY   RX   t   copyR   t   uploadRb   (   R   R@   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_check_duplicateþ   sŒ    ((!!(!"$
$
$c         C   sê   t  j ƒ  } d | d <d | d <d | d <d | d <d	 | d
 <d | d <|  j |  j j | |  j j | ƒ ƒ d ƒ |  j |  j j | |  j j | ƒ ƒ d ƒ |  j j d ƒ |  j |  j j d ƒ d ƒ |  j |  j j d ƒ d ƒ d S(   s$   check_duplicate() with UTF-8 stringss   bash 5R=   t   bashR;   s
   Testux 2.2t   DistroReleases	   /bin/basht   ExecutablePatht   6t   Signals   AfirmaÃ§Ã£o x != 0t   AssertionMessages   http://bash.bugs.example.com/5s   http://bash.bugs.example.com/6s   :memory:i   i   N(   i   N(	   R*   R8   R   R   R   Ri   R_   R`   R   (   R   R@   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_check_duplicate_utf8q  s    





$$c         C   se  t  j ƒ  } d | d <d | d <d | d <|  j |  j j | |  j j | ƒ ƒ d ƒ |  j j d ƒ |  j |  j j d	 ƒ d ƒ |  j |  j j	 ƒ  i d d 6ƒ |  j |  j j d
 ƒ d ƒ d |  j j
 d
 ƒ d <|  j |  j j d
 ƒ d ƒ d |  j j
 d ƒ d <|  j |  j j d ƒ d ƒ |  j |  j j	 ƒ  i d d 6d d 6d |  j j
 d
 ƒ j ƒ  6ƒ d S(   s7   check_duplicate() with custom DuplicateSignature: fieldRk   R;   s   bash 5R=   t
   Code42Bluet   DuplicateSignatures   http://bash.bugs.example.com/5s   :memory:i   i    t   CodeRedi   N(   i   N(   i   N(   i   N(   i   N(   i    N(   R*   R8   R   R   R   Ri   R_   R`   R   Ra   R   R   (   R   R@   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt%   test_check_duplicate_custom_signature…  s"    


$ c         C   sw   |  j  j d ƒ |  j |  j  j d ƒ d ƒ |  j |  j  j d ƒ d ƒ |  j |  j  j d |  j  j d ƒ ƒ d ƒ d S(   s0   check_duplicate() with explicitly passing reports   :memory:i    i   i   N(   i    N(   R   R_   R   R`   R   R   (   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_check_duplicate_report_arg   s
    c         C   sR  t  j ƒ  } d | d <d | d <d „  | _ d „  | _ |  j |  j j | |  j j | ƒ ƒ d ƒ t  j ƒ  } d | d <d | d <d „  | _ d	 „  | _ |  j |  j j | |  j j | ƒ ƒ d
 ƒ t  j ƒ  } d | d <d | d <d „  | _ d „  | _ |  j |  j j | |  j j | ƒ ƒ d ƒ |  j j d ƒ |  j |  j j	 d | ƒ d ƒ |  j |  j j	 d | ƒ d ƒ |  j |  j j	 d | ƒ d ƒ |  j |  j j d ƒ d ƒ |  j |  j j d ƒ d ƒ |  j |  j j d ƒ d ƒ |  j |  j j ƒ  i d d 6ƒ |  j |  j j | j ƒ  ƒ d ƒ |  j |  j j | j ƒ  ƒ d ƒ d S(   sÛ  check_duplicate() with multiple master bugs

        Due to the unavoidable jitter in gdb stack traces, it can happen that a
        bug B has the same symbolic signature as a bug S, but the same address
        signature as a bug A, where A and S have slightly different symbolic
        and address signatures and thus were not identified as duplicates. In
        that case we want the lowest ID to become the new master bug, and the
        other two duplicates.
        Rk   R;   s   bash 5R=   c           S   s   d S(   Ns   /bin/bash:11:read:main(    (    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   <lambda>¼  s    c           S   s   d S(   Ns,   /bin/bash:11:/lib/libc.so+123:/bin/bash+DEAD(    (    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyRw   ½  s    s   http://bash.bugs.example.com/5c           S   s   d S(   Ns   /bin/bash:11:__getch:read:main(    (    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyRw   Ä  s    c           S   s   d S(   Ns>   /bin/bash:11:/lib/libc.so+BEEF:/lib/libc.so+123:/bin/bash+DEAD(    (    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyRw   Å  s    s   http://bash.bugs.example.com/6c           S   s   d S(   Ns   /bin/bash:11:__getch:read:main(    (    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyRw   Í  s    c           S   s   d S(   Ns,   /bin/bash:11:/lib/libc.so+123:/bin/bash+DEAD(    (    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyRw   Î  s    s   http://bash.bugs.example.com/7s   :memory:i   i   i   s   /bin/bash:11:read:mainN(   i   N(   i   N(   R*   R8   R   t   crash_signature_addressesR   R   R   Ri   R_   R`   R   RX   Ra   t#   _duplicate_search_address_signature(   R   t   at   st   b(    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt%   test_check_duplicate_multiple_masters¯  s>    


$

$

$ "c         C   sc  |  j  j d ƒ t j ƒ  } d | d <d | d <d | d <d | d	 <d
 | d <d | d <|  j | j ƒ  d ƒ |  j  j |  j ƒ |  j	 |  j  j
 | ƒ d ƒ |  j  j | ƒ } |  j	 |  j  j | ƒ d ƒ |  j  j |  j ƒ |  j	 |  j  j
 | ƒ |  j  j | | ƒ ƒ t j ƒ  } d | d <d | d <d | d <d | d	 <d | d <d | d <|  j	 | j ƒ  | j ƒ  ƒ |  j  j |  j ƒ |  j	 |  j  j
 | ƒ |  j  j | | ƒ ƒ |  j  j | ƒ } |  j	 |  j  j | ƒ | d f ƒ t j ƒ  } d | d <d | d <d | d <d | d	 <d | d <d | d <|  j | j ƒ  | j ƒ  ƒ |  j  j |  j ƒ |  j	 |  j  j
 | ƒ d ƒ |  j  j d ƒ d | d <d | d <|  j  j | ƒ } |  j	 |  j  j | ƒ d ƒ |  j  j | ƒ } |  j	 |  j  j | ƒ | d f ƒ | d =| d =|  j  j |  j ƒ |  j	 |  j  j
 | ƒ |  j  j | | ƒ ƒ |  j	 |  j  j
 | ƒ |  j  j | | ƒ ƒ |  j  j | | ƒ |  j  j |  j ƒ |  j	 |  j  j
 | ƒ |  j  j | | ƒ ƒ |  j	 |  j  j
 | ƒ |  j  j | | ƒ ƒ |  j  j | ƒ |  j  j |  j ƒ |  j	 |  j  j
 | ƒ d ƒ |  j	 |  j  j
 | ƒ d ƒ |  j	 |  j  j ƒ  i  ƒ d S(   s   known() for address signaturess   :memory:Rk   R;   s   bash 5R=   s	   /bin/bashRm   t   11Ro   sÀ   
00400000-004df000 r-xp 00000000 08:02 1044485                            /bin/bash
7f491fa8f000-7f491fc24000 r-xp 00000000 08:02 522605                     /lib/x86_64-linux-gnu/libc-2.13.so
t   ProcMapss³   
#0  0x00007f491fac5687 in kill ()
#1  0x000000000042eb76 in ?? ()
#2  0x00000000004324d8 in ??
#3  0x00000000004707e3 in parse_and_execute ()
#4  0x000000000041d703 in _start ()
t
   StacktracesÀ   
00400000-004df000 r-xp 00000000 08:02 1044485                            /bin/bash
5f491fa8f000-5f491fc24000 r-xp 00000000 08:02 522605                     /lib/x86_64-linux-gnu/libc-2.13.so
s³   
#0  0x00005f491fac5687 in kill ()
#1  0x000000000042eb76 in ?? ()
#2  0x00000000004324d8 in ??
#3  0x00000000004707e3 in parse_and_execute ()
#4  0x000000000041d703 in _start ()
s³   
#0  0x00005f491fac5687 in kill ()
#1  0x000000000042eb76 in ?? ()
#2  0x0000000000432401 in ??
#3  0x00000000004707e3 in parse_and_execute ()
#4  0x000000000041d703 in _start ()
t   mooRs   N(   R   R_   R*   R8   t   assertNotEqualRx   R   Rg   R   R   Rf   Ri   R`   R   t   duplicate_db_change_master_idRd   Ra   (   R   R@   t   r_idt   r2t   r2_idt   r3t   r3_id(    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_known_address_sigç  s„    











"







"c         C   s  |  j  j d ƒ |  j  j d ƒ } d „  | _ |  j  j d ƒ } d „  | _ |  j |  j  j | ƒ d ƒ |  j |  j  j d ƒ d ƒ |  j |  j  j | ƒ d ƒ |  j |  j  j d ƒ d ƒ |  j  j	 |  j
 ƒ |  j |  j  j | ƒ d ƒ |  j |  j  j | ƒ d ƒ d S(	   s0   duplicate_db_publish() with very long signaturess   :memory:i    c           S   s   d d S(   Ns   s+iè  (    (    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyRw   i  s    i   c           S   s   d d S(   Ns   0x1+/iè  (    (    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyRw   m  s    s   http://foo.bugs.example.com/0s   http://foo.bugs.example.com/1N(   R   R_   R   R   Rx   R   Rf   R   R`   Rg   R   (   R   t   symbt   addr(    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt#   test_duplicate_db_publish_long_sigsb  s    c         C   sl  |  j  t |  j j d ƒ |  j j d ƒ |  j |  j j d ƒ d ƒ |  j |  j j d ƒ d ƒ |  j |  j j ƒ  i d |  j j d ƒ j	 ƒ  6d |  j j d ƒ j	 ƒ  6ƒ |  j j
 d d ƒ |  j |  j j ƒ  i d	 |  j j d ƒ j	 ƒ  6d
 |  j j d ƒ j	 ƒ  6ƒ |  j j
 d d ƒ |  j |  j j ƒ  i d |  j j d ƒ j	 ƒ  6d |  j j d ƒ j	 ƒ  6ƒ d S(   s   duplicate_db_change_master_id()i    s   :memory:i   i   ic   N(   i    N(   i   N(   i    N(   i   N(   i    N(   ic   N(   R   R   R   R`   R_   R   R   Ra   R   R   Rƒ   (   R   (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_change_master_idx  s    c         C   sF  z1t  j ƒ  \ } } t j | ƒ |  j j | ƒ |  j |  j j d ƒ d ƒ |  j |  j j	 ƒ  i d |  j j
 d ƒ j ƒ  6ƒ |  j j d d ƒ |  j |  j j	 ƒ  i d |  j j
 d ƒ j ƒ  6ƒ |  ` t | d ƒ } | j t j j | ƒ d d ƒ | j ƒ  t d i  ƒ |  _ |  j t |  j j | ƒ Wd t j | ƒ Xd S(	   s   Detection of DB file corruptioni    R^   s   r+i   i   N(   i    N(   i    s   42(   R   t   mkstempR	   t   closeR   R_   R   R`   R   Ra   R   R   Rb   t   opent   truncateR
   t   getsizeR    R   t	   Exceptiont   unlink(   R   t   fdR1   t   f(    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   test_db_corruption˜  s"      !
(   t   __name__t
   __module__R   R   R   R    R2   R9   R:   RA   RE   RN   RP   RR   RT   RZ   R]   Rc   Re   Rj   Rq   Ru   Rv   R}   R‰   RŒ   R   R—   (    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyR      s4   					 													s				8	{		 t   __main__(   t   unittestR   R   t   os.pathR	   Rh   R*   t   apport.crashdb_impl.memoryR    t   TestCaseR   R˜   t   main(    (    (    s+   /usr/share/apport/testsuite/test_crashdb.pyt   <module>   s   <ÿ ÿ ®