
    b/                       d dl Z d dlmZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlZd dlmZ d dlmZmZmZ d d	lmZmZ d d
lmZmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZ d dl Z d dl!Z!d dl"m#Z#m$Z$m%Z%  e j&        d          Z' ej(        e'          Z)e'*                    e)            ej+        e'          Z,e'*                    e,            ee'          Z-e'*                    e-           e'.                                \  Z/Z0 e1e0          dk     r$e'2                                  e j3        d           e)4                                Z5e,6                    e5          Z7e0d          Z8e0d         Z9e7:                    ej;                   e7<                                =                                Z>dZ?dZ@dZAdZBdZCdZDdZEd ZFd ZGd ZHd&dZId'dZJd ZKd  ZLd! ZMd" ZN G d# d$e          ZO eePe-%           dS )(    N)dsdb)dsdb_dns)
ndr_unpackndr_pack)SamDB)system_session)credentials)dnsdnsp	dnsserver)	TXTRecordARecord)recbuf_from_stringipv6_normalise)SubunitOptionsTestProgram)werrorWERRORError)DNSTest)c_REDc_GREENc_DARK_YELLOWz0dns_aging.py <server name> <server ip> [options]      i^[1 iB 2 z
127.0.0.33::1z
127.0.0.66z1::1c                  d    t          dt           t          t                      t                    S )Nzldap://urllpsession_infor	   )r   	SERVER_IPLPr   CREDS     7/usr/lib/python3/dist-packages/samba/tests/dns_aging.py	get_samdbr(   K   s3    *y**,.."$ $ $ $r&   c                      t          t                                          t          t                      t                    S )Nr   )r   r#   	samdb_urlr   r$   r%   r&   r'   get_file_samdbr+   R   s4     R\\^^,.."$ $ $ $r&   c                  T    t          j         dt           dt          t                    S )Nzncacn_ip_tcp:z[sign])r   r"   r#   r$   r%   r&   r'   get_rpcr-   [   s#    @y@@@"eLLLr&   Tc           
         |t                      }t          j                    }| |_        t          j        |_        t          t          |                    |_	        t          j
        |_        d|_        d|_        t          j        |_        |                    t          j        dt$          d ddt          j        |           d S )Nr   r   
ZoneCreate)r-   r   !DNS_RPC_ZONE_CREATE_INFO_LONGHORNpszZoneNamer   DNS_ZONE_TYPE_PRIMARY
dwZoneTypeintboolfAgingDNS_DP_DOMAIN_DEFAULT	dwDpFlagsfDsIntegratedfLoadExistingDNS_ZONE_UPDATE_UNSECUREfAllowUpdateDnssrvOperation2DNS_CLIENT_VERSION_LONGHORNr"   DNSSRV_TYPEID_ZONE_CREATE)namerpcagingzs       r'   create_zonerD   _   s    
{ii355AAM-AL4;;AH1AKAOAO2AN>"%"<    r&   c           
          |t                      }|                    t          j        dt          | ddt          j        d            d S )Nr   DeleteZoneFromDs)r-   r=   r   r>   r"   DNSSRV_TYPEID_NULL)r@   rA   s     r'   delete_zonerH   t   sO    
{ii>"+"5    r&   c                     t          | t                    r| g} t          j                    }t	          |           |_        | |_        |S )z=Construct a txt record string list, which is a fiddly matter.)
isinstancestrr   string_listlencount)txts_lists     r'   
txt_s_listrQ      sB    #s eFs88FLFJMr&   c                 T    t          j                    }t          |           |_        |S N)r
   
txt_recordrQ   rO   )rO   rs     r'   make_txt_recordrV      s!    AsOOAEHr&   c                     t          j                    }| j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        |S rS   )r   DNS_RPC_RECORDwTypedwFlagsdwSerialdwTtlSecondsdatadwTimeStamp)reccopys     r'   copy_recra      sN    #%%DDJ;DLLDM(DDIDKr&   c                     t          | t                    rt          |           } | t          j        fS d| v r| t          j        fS | t          j        fS )N:)rJ   listrV   r   DNS_TYPE_TXTDNS_TYPE_AAAA
DNS_TYPE_A)r]   s    r'   guess_wtyperh      sS    $ )t$$d'((
d{{d())$/""r&   c                   L    e Zd ZdZeZeZeZ	 fdZ
ddZddZd ZddZej        fdZdej        fd	Zdd
Zd ZddZd Zd Zd Zd Zd ZddZd Zd Zd Ze j!        fdZ"ddZ#d Z$ddZ%e&dfdZ'ddZ(d Z)e*e+fd Z,d! Z-d" Z.d# Z/d$ Z0d% Z1d& Z2d' Z3d( Z4d) Z5d* Z6d+ Z7d, Z8d- Z9d. Z:d/ Z;d0 Z<d1 Z=d2 Z>d3 Z?d4 Z@d5 ZAd6 ZBdd7ZCd8 ZDd9 ZEd: ZFd; ZGd< ZHd= ZId> ZJd? ZKd@ ZLdA ZMdB ZNdC ZOdD ZPdE ZQdF ZRdG ZSdH ZTdI ZUdJ ZVdK ZWdL ZXdM ZYdN ZZdO Z[dP Z\dQ Z]dR Z^dS Z_dT Z`dU ZadV ZbdW ZcdX ZddY ZedZ Zfd[ Zgd\ Zhd] Zid^ Zjd_ Zkdd`Zlda Zmdb Zndc Zodd Zpde Zqdf Zrdg Zsdh ZtddiZudj Zvdk Zwdl Zxdm Zydn Zzdo Z{dp Z|dq Z}dr Z~ds Zdt Zdu Zdv Zdw Zdx Zdy Zdz Zd{ Zd| Zd} Zd~ Zd Zd Zd Zd Zd Zd Zd ZdddZddZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )TestDNSAgingzhProbe DNS aging and scavenging, using LDAP and RPC to set and test
    the timestamps behind DNS's back.c                    t                                                       t                      | _        t	                      | _        |                                                     dd          d         | _        | 	                    t          | j        | j                   	 t          | j        | j                   nK# t          $ r>}|j        d         t          j        k    r t!          d| j         d           Y d }~nd }~ww xY w|                     t$          j                   d| j         d| j                                         | _        d S )	N.r   r   zzone z already exists)AllowUpdateDC=z#,CN=MicrosoftDNS,DC=DomainDNSZones,)supersetUpr-   rpc_connr(   samdbidrsplitzone
addCleanuprH   rD   r   argsr   "WERR_DNS_ERROR_ZONE_ALREADY_EXISTSprintset_zone_int_paramsr   r;   get_default_basednzone_dn)selfe	__class__s     r'   rp   zTestDNSAging.setUp   s9   		[[
 GGII$$S!,,Q/	TY>>>	6	4=1111 	6 	6 	6vayFEEE4$)44455555555	6 	  T-J KKK=di = =:88::= =s   "B= =
D4D  DNc                 v   || j         }|                                D ]\  }}t          j                    }||_        ||_        	 | j                            t          j        dt          |ddt          j
        |           b# t          $ r,}|                     t          |                     Y d}~d}~ww xY wdS )zKeyword arguments set parameters on the zone. e.g.:

            self.set_zone_int_params(Aging=1,
                                     RefreshInterval=222)

        See [MS-DNSP] 3.1.1.2.1 "DNS Zone Integer Properties" for names.
        Nr   ResetDwordProperty)ru   itemsr   DNS_RPC_NAME_AND_PARAMdwParampszNodeNamerq   r=   r>   r"   DNSSRV_TYPEID_NAME_AND_PARAMr   failrK   )r}   ru   kwargskeyval
name_paramr~   s          r'   rz   z TestDNSAging.set_zone_int_params   s     <9D 	" 	"HC"9;;J!$J%(J""..9(:         " " "		#a&&!!!!!!!!"	" 	"s   :B  
B6
"B11B6c           	         t          |t          j                  r|}t          j                    }||_        t          |t          j                  r|}t          j                    }||_        	 | j                            t          j        dt          | j	        |||           dS # t          $ r$}|                     d| d           Y d}~dS d}~ww xY w)z.Replace a DNS_RPC_RECORD or DNS_RPC_RECORD_BUFr   zcould not replace record ()N)rJ   r   rX   DNS_RPC_RECORD_BUFr_   rq   DnssrvUpdateRecord2r>   r"   ru   r   r   )r}   r@   oldnewr_   r~   s         r'   rpc_replacezTestDNSAging.rpc_replace   s     c9344 	C.00CCGc9344 	C.00CCG
	9M--5	      	9 	9 	9II71777888888888	9s   .4B$ $
C.CCc                     t          |t                    r|g}|                     |          }d}|D ]K}|j        t          j        k    rd |j        j        D             }||k    r|                     |           |}L|S )zTGet the TXT record on Name with value txt, asserting that there is
        only one.Nc                     g | ]}|S r%   r%   .0xs     r'   
<listcomp>z6TestDNSAging.get_unique_txt_record.<locals>.<listcomp>  s    ***!A***r&   )rJ   rK   ldap_get_recordsrY   r   re   r]   assertIsNone)r}   r@   rO   recsmatchrU   txt2s          r'   get_unique_txt_recordz"TestDNSAging.get_unique_txt_record   s     c3 	%C$$T** 	 	Aw$+++**qvz***Ds{{!!%(((r&   c                     |t          |          \  }}|                     |          }t          j                    }||_        ||_        d}|D ].}t          j        ||          r|                     |           |}/|S )z7Get an A or AAAA record on name with the matching data.N)	rh   r   r   DnssrvRpcRecordrY   r]   r   records_matchr   )r}   r@   addrwtyper   r_   r   rU   s           r'   get_unique_ip_recordz!TestDNSAging.get_unique_ip_record  s    =%d++KD%$$T** "$$	 	 	A%a-- !!%(((r&   c                 
   |                      t          j                  }|d| j        }|                     ||t          j                  }|                     ||g           |                     |t                    \  }}|S )z:make a query, which might help Windows notice LDAP changesrl   host)	make_name_packetr
   DNS_OPCODE_QUERYru   make_name_questionDNS_QCLASS_INfinish_name_packetdns_transaction_udpr"   )r}   r@   qtypepfullnameqrU   rps           r'   	dns_queryzTestDNSAging.dns_query  s}    !!#"677"ddDII.##HeS5FGGA3'''(((;;2r&   c                 f   |t          |          \  }}|t          j        k    rd}nd}|d| j        }|                     t          j                  }|                     | j        t          j        t          j                  }|                     ||g           t          j	                    }	||	_
        ||	_        ||	_        ||	_        |d|	_        ||	_        nd|	_        d|_        |	g|_        |                     |t&                    \  }
}|                     |
t          j                   |S )N{   r   rl   i  r   r   )rh   r
   r   ru   r   DNS_OPCODE_UPDATEr   DNS_QTYPE_SOAr   res_recr@   rr_typerr_classttllengthrdatanscountnsrecsr   r"   assert_dns_rcode_equalsDNS_RCODE_OK)r}   r@   r]   r   qclassr   r   r   urU   coderesponses               r'   dns_update_non_textz TestDNSAging.dns_update_non_text%  s*    =%d++KD%S&&&CCC"ddDII.!!#"788##DI$'$5$'$57 7 	A3'''KMM	
AHAGGAH	333AI3FFx$$T3+;<<<r&   c                 H    |                      |||t          j                  S N)r   )r   r
   DNS_QCLASS_NONE)r}   r@   r]   r   s       r'   
dns_deletezTestDNSAging.dns_deleteJ  s0    ''(,(-/2/B ( D D 	Dr&   c                 H    |                      |d |t          j                  S r   )r   r
   DNS_QCLASS_ANY)r}   r@   r   s      r'   dns_delete_typezTestDNSAging.dns_delete_typeP  s0    ''(,(-/2/A ( C C 	Cr&     c                    t          |t                    r|g}|                     ||| j        |          }|                     |t
                    \  }}|j        t          j        z  t          j	        k    r-t          d           t          d           t          d           |                     |t          j                   |                     ||          S )Nr   r   z

got DNS_RCODE_REFUSED
z0Are you running this in the fl2003 environment?
z6try `SELFTEST_TESTENV='fl2003dc:local' make testenv`

)rJ   rK   make_txt_updateru   r   r"   	operationr
   	DNS_RCODEDNS_RCODE_REFUSEDry   r   r   r   )r}   r@   rO   r   r   r   r   s          r'   dns_update_recordzTestDNSAging.dns_update_recordV  s    c3 	%C  sDI3 ??33AI3FFx>CM)S-BBB/000EFFFLMMM$$T3+;<<<))$444r&   c                    t          |t                    r|g}t          |          }t          |          }|                                D ]\  }}t	          |||           	 |                     |||           n@# t          $ r3}dt          |          vr |                     |d|           Y d}~nd}~ww xY w|                     ||          S )zAdd the record that self.dns_update_record() would add, via the
        dnsserver RPC pipe.

        As with DNS update, if the record already exists, we replace it.
        $WERR_DNS_ERROR_RECORD_DOES_NOT_EXISTN)rJ   rK   r   r   setattrr   AssertionErrorr   )	r}   r@   rO   r   r   r_   kvr~   s	            r'   rpc_update_recordzTestDNSAging.rpc_update_recordd  s     c3 	%CnnnnLLNN 	 	DAqCA	.T3,,,, 	. 	. 	.5SVVCCT4--------		. ))$444s   #A; ;
B8)B33B8c                     t          |t                    r|g}t          |          }|                     ||d            d S rS   )rJ   rK   r   r   )r}   r@   rO   r   s       r'   rpc_delete_txtzTestDNSAging.rpc_delete_txt|  sD    c3 	%CnnsD)))))r&   c                    d| d}| j                             | j        t          j        |g d          }t          |          dk    r(|                     d| dt          |                      t          |          dk    rd S |d         S )	Nz(&(objectClass=dnsNode)(name=z)))	dnsRecorddNSTombstonedr@   )basescope
expressionattrsr   zexpected 0 or 1 dnsNodes for z, found r   )rr   searchr|   ldbSCOPE_SUBTREErM   r   )r}   r@   exprnodess       r'   get_one_nodezTestDNSAging.get_one_node  s    7t777
!!t|(+(9-1(N(N(N " P P
 u::>>IIJJJc%jjJJL L L u::??4Qxr&   c                 v    |                      |          }|g S |                    d          }d |D             S )Nr   c                 B    g | ]}t          t          j        |          S r%   )r   r   r   r   rU   s     r'   r   z1TestDNSAging.ldap_get_records.<locals>.<listcomp>  s%    EEE
4/33EEEr&   )r   get)r}   r@   noderecordss       r'   r   zTestDNSAging.ldap_get_records  sD      &&<I((;''EEWEEEEr&   c                     |                      |          }g }|D ],}|j        t          j        k    r|                    |           -|S rS   )r   rY   r   DNS_TYPE_TOMBSTONEappend)r}   r@   all_recordsr   rU   s        r'   ldap_get_non_tombstoned_recordsz,TestDNSAging.ldap_get_non_tombstoned_records  sQ    ++D11 	" 	"Aw$111q!!!r&   Tc                 @   |                      |          }||                     d|            |                    d          }|d}n4|                     t	          |          d           |d         dk    rd}nd}||k    r3|r|                     | d           n|                     | d	           |                     |          }|r|                     t	          |          d           |                     |d         j        t          j                   |"| 	                    |d         j
                   d S |r*| 	                    |d         j
        |d
z
  |d
z              d S d S |D ]-}|                     |d         j        t          j                   .d S )Nzno node named r   Fr   r   s   TRUETz is tombstonedz is not tombstoned   )r   r   r   assertEqualrM   r   rY   r   r   assert_nttime_in_hour_ranger]   assertNotEqual)	r}   r@   
tombstoned	timestampr   dnstsis_tombstonedr   rU   s	            r'   assert_tombstonedzTestDNSAging.assert_tombstoned  s      &&<II-t--...))=!MMSZZ+++Qx7"" $ %&& 7		T1112222		T555666$$T** 	LSYY***T!W]D,CDDD 00a>>>>> @00a1:Q1:Q@ @ @ @ @@ @  L L##DGM43JKKKKL Lr&   c                    d| d| j          }t          j                            | j        |d |D             dt          j                  }	 | j                            |           d S # t          j        $ ra}d|j        d         vr ddg|d	<   |d
         	                    t          j
                   | j                            |           Y d }~d S d }~ww xY w)Nrn   ,c                 ,    g | ]}t          |          S r%   )r   r   s     r'   r   z5TestDNSAging.ldap_replace_records.<locals>.<listcomp>  s    2P2P2P18A;;2P2P2Pr&   )dnr   LDAP_NO_SUCH_OBJECTr   topdnsNodeobjectClassr   )r|   r   Message	from_dictrr   FLAG_MOD_REPLACEmodifyLdbErrorrw   	set_flagsFLAG_MOD_ADDadd)r}   r@   r   r  msgr~   s         r'   ldap_replace_recordsz!TestDNSAging.ldap_replace_records  s    )4(($,((k##DJ+-2P2P2P2P2P%& %& %($8	: :	 Jc"""""| 	  	  	 $AF1I55"'!3C&&s'7888JNN3	 s   A( (C7ACCc                    |                      |          }t          j                    }||_        t          j        |_        d|_        d|_        d|_        ||_	        |
                                D ]\  }}t          |||           t          |dd                   D ]!\  }	}
t          j        |
|          r|||	<    n"|                    |           |                     ||           |S )zThis one is not TXT specific.r   n   r   N)r   r   r   rY   DNS_RANK_ZONErankr\   r[   r^   r]   r   r   	enumerater   r   r   r  )r}   r@   r   r]   r   r   r_   r   r   irU   s              r'   ldap_update_corezTestDNSAging.ldap_update_core  s    ''-- "$$	% LLNN 	 	DAqCAgaaaj)) 	  	 DAq%a--  
 NN3!!$000
r&   c                     | j         |t          j        t          |          fi |}|                     |          }d}|D ]H}|j        |j        k    r|j        j        |j        j        k    r|                     |d|            |}I| 	                    |j
        |j
        dz             | 	                    |j        |j                   |                     |j        |j                   |S )zAdd the record that self.dns_update_record() would add, via ldap,
        thus allowing us to set additional dnsRecord features like
        dwTimestamp.
        Nduplicate records for    )r  r   re   rQ   r   rY   r]   rK   r   r   r  r\   assert_timestamps_equalr^   )r}   r@   rO   r   r_   r   r   rU   s           r'   ldap_update_recordzTestDNSAging.ldap_update_record   s   
 $d#D$($5$.sOO. . '-. .
 $$T** 	 	Aw#)##vzSX\))!!%)H$)H)HIIISX^444+S-=>>>$$U%6HHHr&   c                 |   t          j                    }|t           j        k    rt          |          }||_        ||_        |                     |          }t          |d d                    D ]\  }}t          j	        ||          r||=  n | 
                    d| d           |                     ||           d S )Nzrecord z
 not found)r   r   re   rQ   rY   r]   r   r  r   r   r   r  )r}   r@   r]   r   r_   r   r  rU   s           r'   ldap_delete_recordzTestDNSAging.ldap_delete_record  s    "$$D%%%d##D	''--gaaaj)) 	2 	2DAq%a-- AJ II0000111!!$00000r&   c                    |t          |          \  }} | j        |||fi |}|                     |          }d }|D ]2}t          j        ||          r|                     |d|            |}3|                     |j        |j        dz             |                     |j        |j                   | 	                    |j
        |j
                   |S )Nr  r  )rh   r  r   r   r   r   r   r  r\   r  r^   )	r}   r@   r   r   r   r_   r   r   rU   s	            r'   add_ip_recordzTestDNSAging.add_ip_record(  s    =%d++KD%#d#D$)$(. . '-. .
 $$T** 	 	A%a-- !!%)H$)H)HIIISX^444+S-=>>>$$U%6HHHr&   c                     |                      |          }|D ]}|xj        |z  c_        |                     ||           d S rS   )r   r^   r  )r}   r@   deltar   r_   s        r'   ldap_modify_timestampsz#TestDNSAging.ldap_modify_timestamps;  sR    ''-- 	% 	%COOu$OOO!!$00000r&   c                    |t           j        }t          j        }| j                            t          j        dt          | j        |d ||d d 
  
        \  }}g }|r|j	        dk    rg S |j
        D ]}|                    |j                   |S )Nr   )r   DNS_TYPE_ALLr   DNS_RPC_VIEW_AUTHORITY_DATArq   DnssrvEnumRecords2r>   r"   ru   rN   r_   extendr   )r}   r@   dns_typeselect_flagsbuflenresr   r_   s           r'   get_rpc_recordszTestDNSAging.get_rpc_recordsA  s    (H <m661I
 
  	ci1nnI7 	% 	%CKK$$$$r&   c                    d| d| j          }t          j                    }t          j        |_        ||_        ||dz  dz  dz  dz  |_        n||_        t          j        	                    | j
        |t          |          gddt          j                  }	 | j
                            |           d S # t          j        $ r<}d|j        d	         vr d
dg|d<   | j
                            |           Y d }~d S d }~ww xY w)Nrn   r  i  
   i  TRUE)r  r   dnsTombstonedr  r   r  r  r  )r|   r   r   r   rY   r^   r]   r   r	  r
  rr   r   r  r  r  rw   r  )r}   r@   epoch_hoursepoch_nttimer  rU   r  r~   s           r'   dns_tombstonezTestDNSAging.dns_tombstoneW  s/    )4(($,(( "")
 $ 4'",t3d:AFF!AFk##DJ+-3;A;;-6<%& %& %($8: :	 Jc"""""| 	  	  	 $AF1I55"'!3CJNN3	 s   B5 5D 1C;;D Fc                 f    |                      t          t          |                               d S )N)Aging)rz   r4   r5   )r}   enables     r'   	set_agingzTestDNSAging.set_agingv  s-      s4<<'8'8 99999r&   c                     |                      |j        t                     |                     |j        t                     d S rS   )assertGreaterr^   DNS_TIMESTAMP_1970
assertLessDNS_TIMESTAMP_2101r}   r_   s     r'   assert_timestamp_in_ballparkz)TestDNSAging.assert_timestamp_in_ballparky  s8    3?,>???);<<<<<r&   c                     |t          d          z  }|                     ||           |                     ||           d S )Ng   Ј B)r4   r<  r>  )r}   thour_minhour_maxs       r'   r   z(TestDNSAging.assert_nttime_in_hour_range}  sD     	
c*oo1h'''8$$$$$r&   c                    t          |d          r|j        }t          |d          r|j        }||z
  }t          |dz            }|dk     rd| dt          |           d}n|dk    r
d| d| d}nd	S t          |          )
aa  Assert that a timestamp is the same or very slightly higher than a
        reference timestamp.

        Typically we expect the timestamps to be identical, unless an
        hour has clicked over since the reference was taken. However
        we allow one more hour in case it happens during a daylight
        savings transition or something.
        r^         8@r   ztimestamp is  days (z hours) before referencer   z hours) after referenceNhasattrr^   absr   )r}   r   	referencediffdaysr  s         r'   assert_soon_afterzTestDNSAging.assert_soon_after  s     9m,, 	.!-I9m,, 	.!-I9$4$;!88R$RRs4yyRRRCCAXXL$LLtLLLCCFS!!!r&   c                 @   t          |d          r|j        }t          |d          r|j        }||k    rdS ||z
  }t          |dz            }|dk    s|dk    r	d| d| }n.|dk    r| d| d| d	| }n| d| dt          |           d
| }t          |          )a\  Just like assertEqual(), but tells us the difference, not the
        absolute values. e.g:

        self.assertEqual(a, b)
        AssertionError: 3685491 != 3685371

        self.assert_timestamps_equal(a, b)
        AssertionError: -120 (first is 5.0 days earlier than second)

        Also, we turn a record into a timestamp if we need
        r^   NrG  r   z
timestamp z != z is rH  z hours) after z hours) before rI  )r}   ts1ts2rM  rN  r  s         r'   r  z$TestDNSAging.assert_timestamps_equal  s     3&& 	"/C3&& 	"/C#::FSy4$;!88saxx-s----CCAXXDDdDD4DDsDDCCJJdJJ3t99JJSJJCS!!!r&   c                    |                      d           d}d}|                     ||g          }|j        }|                     |           |dz
  }|                     ||g|          }|                     |j        |           |                     ||g          }|                     |j        |           |                      d           |                     ||g          }|                     |j        |           d S )NFtimestamp-nowtimestamp-eightdays   r^   T)r:  r   r^   rA  r  r  assertGreaterEqual)r}   r@   name2r_   
start_timeeight_days_agos         r'   (test_update_timestamps_aging_off_then_onz5TestDNSAging.test_update_timestamps_aging_off_then_on  s    	u%$$TD622_
))#... $f,%%eeW2@ & B B 	$$S_nEEE $$UUG44$$S_nEEEt$$UUG44<<<<<r&   c                 j   |                      d           d}|                     ||g          }|j        }|                     |           |dz
  }|                     ||g|          }|                     |j        d           |                      d           |                     ||g|          }|                     |j        d           |                     ||g          }|                     |j        d           d}|                     ||g          }|                     |j        |           d S )NFrT  rV  rW  r   TrU  )r:  r   r^   rA  r   r   rO  )r}   r@   r_   rZ  r[  rY  s         r'   test_rpc_update_timestampsz'TestDNSAging.test_rpc_update_timestamps  s[   u$$TD622_
))#...#f,$$TD61? % A A!,,, 	t$$TD61? % A A!,,, $$TD622!,,, &$$UUG44s)	+ 	+ 	+ 	+ 	+r&   c                     |                      |          }g }|D ]=}|D ]8}d |j        j        D             }||k    r|                    |j                   9>|S )Nc                     g | ]}|S r%   r%   r   s     r'   r   z3TestDNSAging.get_txt_timestamps.<locals>.<listcomp>  s    ,,,Aa,,,r&   )r   r]   rK   r   r^   )r}   r@   txtsr   retrC  rU   t2s           r'   get_txt_timestampszTestDNSAging.get_txt_timestamps  sy    ''-- 	. 	.A . .,,,,,77JJq}---. 
r&   c                     d}dg}ddg}ddg}|                      d           |                     ||          j        }|dz
  }|dz
  }|dz
  }|d	z
  }	|d
z
  }
|||||	|
fD ]v}|                     |||           |                     |                     ||          |g           |                     ||          j        }|                     ||           w|||||	|
ddfD ]}|                     |||          j        }|                     ||           |                     ||           |                     |||          }|                     |||g           |                     ||           |                     ||          }|                     ||g           |                     ||          j        }|                     ||           |||||	|
ddfD ]}|                     |||           | 	                    ||          j        }|                     ||           |                     ||          j        }|                     |||          }|                     |||g           |||||	|
ddfD ]}|                     |||           |                     |||           |                     |||dz              | 	                    ||          j        }|                     ||dz              |                     ||          j         |                     ||||          }|                     ||||dz   g           |                     ||d           |||||	|
ddfD ]}|                     ||d           |                     |||dz
             | 	                    ||          j        }|                     ||dz
             |                     ||           |                     ||||          }|                     |dd|dz
  g           |                     ||          j        }|||||	|
ddfD ]}|                     ||d           |                     ||d           |                     |||dz              | 	                    ||          j        }|                     ||dz              |                     ||          j         |                     ||||          }|                     |dd|dz   g           |                     ||d           |                     ||d           |                     ||          j        }|||||	|
ddfD ]}|                     |||           | 	                    ||          j        }|                     ||           |                     ||           |                     ||||          }|                     |dd|g           d S )Ntesttest txtr   txt3F   rV  h  `	  ]  rW  順 d   r1     i?B r   	   i1 i8 )
r:  r   r^   r  r   rd  r  r   rO  r   )r}   r@   txt1r   rh  current_timesix_days_agor[  fifteen_days_agohundred_days_agothousand_days_agor   update_timestamp
timestamp1
timestamps
timestamp2
timestamp3s                    r'   test_update_aging_disabled_2z)TestDNSAging.test_update_aging_disabled_2  s    |u--dD99E#f,%.''1'(2(94&&(**+- 	F 	FI ##D$I#FFFT44T4@@9+NNN  $55dDAAM(()99EEEE '&(**+  	6 	6I 00% 1 ' ' (3  ((Y???""4...00tTBBJZ)\)BCCC##D$///00t<<JZ)5555 ++D$77C
z<888&&(**+  	D 	DI ##D$I#FFF33D$??KJ((Y???//d;;GJ00tTBBJZ)\)BCCCC '&(**+  	; 	;I ##D$I#FFF##D$I#FFF##D$Y^#MMM33D$??KJ((Y^DDD""4..::00tT4HHJZ)*3*3b.*: ; ; ; ; 	d???&&(**+  	: 	:I ##D$A#>>>##D$Y]#LLL33D$??KJ((Y]CCC""4...00tT4HHJZ!*0*3a-*9 : : : :
 ++D$77C
&&(**+  	; 	;I ##D$A#>>>##D$A#>>>##D$Y^#MMM33D$??KJ((Y^DDD""4..::00tT4HHJZ!*+*3b.*: ; ; ; ;
 	d???d???++D$77C
&&(**+  	6 	6I ##D$Y#HHH33D$??KJ((Y???""4...00tT4HHJZ&*0*3*5 6 6 6 6	6 	6r&   c                 8   d}dg}dg}|                      d           |                     ||          j        }|                     ||dz             |                     ||          j        }|                     ||           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||           |                     ||          j        }	|                     |	|           |                     |||           |                     ||          j        }	|                     |	|           |                     ||          j        }|                     ||           |                     ||          j        }	|                     |	|           | 	                    ||           |                     |||           |                     ||          j        }	|                     |	|           |                     ||          j        }|                     ||           |                     ||          j        }	|dk    r|                     |	|           n|                     |	|           |                     |||           |                     |||           |                     ||          j        }	|                     |	|           |                     ||          j        }|                     ||           |                     ||          j        }	|                     |	|           dg}
|                     |||           |                     |||           |                     ||
          j        }|                     ||           |                     ||          j        }	|                     ||          j        }|dk    r|                     |	|           n|                     |	|           |                     ||           | 	                    ||
           |                     ||
          j        }|                     ||           |                     ||          j        }	|                     ||          j        }|dk    r|                     |	|           n|                     |	|           |                     ||           d	g}|                     ||d
           |                     |||           |                     ||
|           |                     ||          j        }	|                     ||          j        }|                     ||
          j        }|                     ||          j        }| 
                    |	d
           |                     ||           |                     ||           |                     ||           d S )Nrf  12FrW     34r   )r:  r   r^   r%  r   r<  r  rO  r  r   r   )r}   n_daysr@   rq  r   rr  
n_days_agorw  rz  rx  rh  r{  txt4
timestamp4s                 r'   &_test_update_aging_disabled_n_days_agoz3TestDNSAging._test_update_aging_disabled_n_days_ago  s4   uuu--dD99E 	##D&3,777//d;;G
<444  11$==I$$%5zBBB ++D$77C
z<888 //d;;G
$$Z<<< 	d
CCC++D$77C
$$Z<<< ++D$77C
z<888 //d;;G
$$Z<<< 	d+++d
CCC++D$77C
$$Z<<< ++D$77C
z<888//d;;G
 Q;;((Z@@@@((Z@@@ 	d
CCCd
CCC++D$77C
$$Z<<< ++D$77C
$$Z<<<//d;;G
$$Z<<< ud
CCCd
CCC++D$77C
z<888//d;;G
//d;;G
Q;;((Z@@@@((Z@@@$$Z<<<d+++++D$77C
z<888//d;;G
//d;;G
Q;;((Z@@@@((Z@@@$$Z<<< u 	d:::d
CCCd
CCC++D$77C
//d;;G
//d;;G
++D$77C
Q'''$$Z<<<$$Z<<<z<88888r&   c                 0    |                      d           d S N   r  r}   s    r'   /test_update_aging_disabled_in_no_refresh_windowz<TestDNSAging.test_update_aging_disabled_in_no_refresh_window&      33A66666r&   c                 0    |                      d           d S Nr  r  r  s    r'   1test_update_aging_disabled_on_no_refresh_boundaryz>TestDNSAging.test_update_aging_disabled_on_no_refresh_boundary)  r  r&   c                 0    |                      d           d S Nrp  r  r  s    r'   ,test_update_aging_disabled_in_refresh_windowz9TestDNSAging.test_update_aging_disabled_in_refresh_window,  r  r&   c                 0    |                      d           d S N   r  r  s    r'   0test_update_aging_disabled_beyond_refresh_windowz=TestDNSAging.test_update_aging_disabled_beyond_refresh_window/  s    33B77777r&   c                 0    |                      d           d S Nrm  r  r  s    r'   0test_update_aging_disabled_in_eighteenth_centuryz=TestDNSAging.test_update_aging_disabled_in_eighteenth_century2  s    33F;;;;;r&   c                    d}dg}dg}|                      d           |                     ||          j        }|                     ||d           |                     ||          j        }|                     |d           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||           |                     ||           |                     ||d           |                     ||          j        }|                     |d           |                     ||          j        }|                     |d           |                     ||          j        }|                     |d           |                     ||d           |                     ||d           |                     ||          j        }|                     |d           d S )Nrf  r~  r  Fr   rW  r   )	r:  r   r^   r  r   rO  r   r   r  )r}   r@   rq  r   rr  rx  rz  s          r'   !test_update_aging_disabled_staticz.TestDNSAging.test_update_aging_disabled_static5  sm   uuu--dD99Ed::: ++D$77C
Q''' ++D$77C
z<888//d;;G
z<888 ++D$77C
z<888++D$77C
z<888 	d+++d:::++D$77C
Q'''++D$77C
Q'''//d;;G
Q'''d:::d:::++D$77C
$$Z33333r&   c                    d}dg}ddg}ddg}d}d}|                      d           |                     ||          j        }|                     ||           |                     ||          }|j        }	|                     |	||z              |                     ||          j        }
|                     |
|	           |                     ||| j                   |                     ||          j        }|                     ||           |                     ||          j        }|                     ||           |                     ||           |                     ||          j        }|                     |||z              |                     ||          }|                     |j        |           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||          j        }|                     ||           |                     ||           |d	z
  }|d
z
  }| 	                    |||          }|                     |j        |           | 	                    |||          }|                     |j        |           |                     ||          j        }|                     ||          j        }|                     ||          j        }|                     ||           |                     ||           |                     ||           |dz
  }| 	                    |||           |                     ||          j        }|                     ||          j        }|                     ||          j        }|                     ||           |                     ||           |                     ||           | 	                    |||           |                     ||          j        }|                     ||          j        }|                     ||          j        }|                     ||           |                     ||           |                     ||           | 
                    ||           |                     ||          j        }|                     ||          j        }|                     ||          j        }|                     |d           |                     ||           |                     ||           d S )Nrf  rg  r   rh  ipi@F)ru   rk  rl  rW  rj  r   )r:  r   r^   r%  r   r  check_query_txtru   rO  r  r   r   )r}   r@   rq  r   rh  minus_6minus_8rr  	after_modrs  rw  rz  rx  r[  update2r{  ru  rv  recordrt  s                       r'   test_update_aging_disabledz'TestDNSAging.test_update_aging_disabledd  s    |u--dD99E 	##D'222..tT::	 ,$$\<'3IJJJ  11$==I$$%5|DDDT4di888 ++D$77C
z<888//d;;G
$$Z<<< 	##D'22233D$??K$$^\G5KLLL((t44 	$$W%8.III//d;;G
$$Z@@@ ++D$77C
z<888//d;;G
//d;;G
$$Z<<<$$Z<<<'(2(94((t5E ) G G$$V%79IJJJ((t5F ) H H$$V%79JKKK ++D$77C
//d;;G
//d;;G
z<888$$Z1ABBB$$Z1BCCC''1d8HIII++D$77C
//d;;G
//d;;G
$$Z1BCCC$$Z1ABBB$$Z1ABBB 	dGGG++D$77C
//d;;G
//d;;G
$$Z1BCCC$$Z1ABBB$$Z@@@ 	tT***++D$77C
//d;;G
//d;;G
Q'''z<888$$Z@@@@@r&   c                    d}dg}ddg}ddg}dg}|                      d           |                     ||          j        }|dz
  }|dz
  }|d	z
  }	|d
z
  }
|                     |||           |                     ||          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           |                     |d           |                     ||           |                     |||           |                     ||d           |                     ||          j        }|                     |d           |                     ||          j        }|                     |d           |                     ||          j        }|                     ||          j        }|                     ||          j        }|                     ||          j        }|                     |d           |                     ||           |                     ||           |                     |d           d S )Nrf  rg  r   rh  r  Tri  rV  rj  rk  rW  r   i- )	r:  r   r^   r  r   r  rO  r   r   )r}   r@   rq  r   rh  r  rr  rs  r[  rt  ru  rx  rz  r{  r  s                  r'   test_update_aging_enabledz&TestDNSAging.test_update_aging_enabled  s   |ut--dD99E#f,%.''1'(2dEEE ++D$77C
//d;;G
$$Z>>>z<888dGGG//d;;G
$$Z@@@ ++D$77C
//d;;G
//d;;G
$$Z>>>z<888$$Z@@@ 	dGGG ++D$77C
//d;;G
//d;;G
z<888z<888$$Z@@@ 	d8HIIIdEEEdGGG ++D$77C
//d;;G
//d;;G
z<888$$Z>>>$$Z@@@ 	d8HIII ++D$77C
//d;;G
//d;;G
$$Z1ABBB$$Z>>>$$Z@@@ ++D$77C
//d;;G
//d;;G
$$Z1ABBB$$Z>>>z<888 	d8HIII ++D$77C
//d;;G
//d;;G
$$Z1ABBB$$Z>>>z<888 	dGGGdGGG ++D$77C
//d;;G
//d;;G
z<888$$Z>>>$$Z@@@ ++D$77C
//d;;G
//d;;G
Q'''$$Z>>>$$Z@@@ 	dGGG++D$77C
//d;;G
//d;;G
$$Z333$$Z333$$Z@@@dEEEd@@@//d;;G
$$Z999 ++D$77C
Q'''
 ++D$77C
//d;;G
//d;;G
//d;;G
$$Z333$$Z>>>$$Z@@@$$Z33333r&   c                 B   d}dg}dg}|dz  }|                      d           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||           |                     ||          j        }|dk    r|                     ||           n|                     ||           |                     ||          j        }	|                     |	|           |                     ||          j        }
|                     ||
           |                     |||           |                     ||          j        }|                     ||
           |                     ||          j        }	|                     |	|           |                     ||          j        }|                     ||
           | 	                    ||           |                     |||           |                     ||          j        }|dk    r|                     ||           n|                     ||           |                     ||          j        }	|                     |	|           |                     ||          j        }|dk    r|                     ||           n|                     ||	           |                     |||           |                     |||           |                     ||          j        }
|                     ||
           |                     ||          j        }	|                     |	|           |                     ||          j        }|                     ||	           dg}|                     |||           |                     |||           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||          j        }	|                     ||           |                     |	|           | 	                    ||           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||          j        }	|                     ||           |                     |	|           d	g}|                     ||d
           |                     |||           |                     |||           |                     ||          j        }|                     ||          j        }	|                     ||          j        }|                     ||          j        }|                     |d
           |                     |	|           |                     ||           |                     |d
           |dz  }| 	                    ||           |                     |||           |                     |||           |                     |||           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||          j        }	|                     ||          j        }|                     ||          j        }|                     ||           |                     |	|           |                     ||           |                     |d
           |                     |||           |                     ||          j        }|                     ||           |                     ||          j        }|                     ||          j        }|                     |d
           |                     ||           d S )Nrf  r~  r  r  Tr  rW  r  r  r   r   )
r:  r   r^   r%  r   r<  r  rO  r  r   )r}   r  r@   rq  r   r$  rr  r  rx  rz  timestamp1_brh  r{  r  r  
longer_agos                   r'   %_test_update_aging_enabled_n_days_agoz2TestDNSAging._test_update_aging_enabled_n_days_ago]  s8   uut--dD99E 	##D%000//d;;G
<444 ++D$77C
Q;;((Z@@@@"":|<<< ++D$77C
z<888 11$==I$$Z>>> 	d
CCC++D$77C
$$Z>>> ++D$77C
z<888 //d;;G
$$Z>>> 	d+++d
CCC++D$77C
Q;;((Z@@@@"":|<<< ++D$77C
z<888//d;;G
 Q;;((Z@@@@((Z@@@ 	d
CCCd
CCC --dD99E$$Z>>> ++D$77C
$$Z<<<//d;;G
$$Z<<< ud
CCCd
CCC++D$77C
z<888//d;;G
//d;;G
$$Z<<<$$Z<<<d+++++D$77C
z<888//d;;G
//d;;G
$$Z<<<$$Z<<<u 	d:::d
CCCd
CCC++D$77C
//d;;G
//d;;G
++D$77C
$$Z333$$Z<<<$$Z<<<$$Z3331_
 	d+++d
CCCd
CCCd
CCC//d;;G
$$Z<<<++D$77C
//d;;G
//d;;G
//d;;G
 	$$Z<<<$$Z<<<$$Z<<<$$Z333 	d
CCC//d;;G
$$Z<<<++D$77C
//d;;G
$$Z333$$Z<<<<<r&   c                 0    |                      d           d S r  r  r  s    r'   .test_update_aging_enabled_in_no_refresh_windowz;TestDNSAging.test_update_aging_enabled_in_no_refresh_window      22155555r&   c                 0    |                      d           d S r  r  r  s    r'   0test_update_aging_enabled_on_no_refresh_boundaryz=TestDNSAging.test_update_aging_enabled_on_no_refresh_boundary  r  r&   c                 0    |                      d           d S r  r  r  s    r'   +test_update_aging_enabled_in_refresh_windowz8TestDNSAging.test_update_aging_enabled_in_refresh_window  r  r&   c                 0    |                      d           d S r  r  r  s    r'   /test_update_aging_enabled_beyond_refresh_windowz<TestDNSAging.test_update_aging_enabled_beyond_refresh_window  s    22266666r&   c                 0    |                      d           d S r  r  r  s    r'   /test_update_aging_enabled_in_eighteenth_centuryz<TestDNSAging.test_update_aging_enabled_in_eighteenth_century  s    226:::::r&   c                    d}dg}dg}dg}dg}|                      d           |                     ||          j         |                     ||d           |                     ||           |                     ||           |                     ||          j        }|                     |d           |                     ||          j        }|                     |d           |                     |g            |                     ||           |                     ||          j        }|                     |d           d S )	Nrf  ABCDFr   rW  )r:  r   r^   r  r   r   r  )	r}   r@   r  r  r  r  ctimebtimedtimes	            r'   test_update_static_stickinessz*TestDNSAging.test_update_static_stickiness  sQ   EEEEutQ''33aQ777tQ'''tQ'''**433?"""**433?"""!!$+++tQ'''**433?"""""r&   c                    d}dg}dg}|                      |           |                     ||          j        }|                     ||dz             |                     ||          j        }|                     ||          j        }|dk    r|r|                     ||           n|                     ||           |                     ||          j        }	|                     |	|           |                     ||          j        }|r|dk    r|                     ||           n|                     ||           |                     ||           |                     |||           |                     ||          j        }|                     ||          j        }	|                     |	|           |                     ||          j        }|||	fS )Nrf  r  r  r  r  rW  )	r:  r   r^   r%  r   rO  r  r   r  )
r}   r  rB   r@   r  r  rr  r  time_Atime_Bs
             r'    _test_update_timestamp_weirdnessz-TestDNSAging._test_update_timestamp_weirdness  s   EEu--dA66B 	##D&3,777//a88D
''a00< A::%:""6<8888((<<< ''a00<v|444++D!44@ 	9Vq[[((<<<<""6<888 	a(((aZ@@@''a00< ''a00<v|444++D!44@66))r&   c                 f    |                      dd          \  }}}|                     ||           d S N   Fr  r  r}   r  r  r  s       r'   3test_update_timestamp_weirdness_no_refresh_no_agingz@TestDNSAging.test_update_timestamp_weirdness_no_refresh_no_agingH  s>    11!U;; 	#
FF 	$$VZ88888r&   c                 f    |                      dd          \  }}}|                     ||           d S Nr  Tr  r  s       r'   0test_update_timestamp_weirdness_no_refresh_agingz=TestDNSAging.test_update_timestamp_weirdness_no_refresh_agingO  s>    11!T:: 	#
FF 	$$VZ88888r&   c                 f    |                      dd          \  }}}|                     ||           d S )Nrp  Fr  r  s       r'   0test_update_timestamp_weirdness_refresh_no_agingz=TestDNSAging.test_update_timestamp_weirdness_refresh_no_agingV  s<    11!U;; 	#
FF$$VV44444r&   c                 f    |                      dd          \  }}}|                     ||           d S )Nrp  Tr  r  s       r'   -test_update_timestamp_weirdness_refresh_agingz:TestDNSAging.test_update_timestamp_weirdness_refresh_aging[  s<    11!T:: 	#
FF$$VV44444r&   c                 2   ddg}}d}d}|                      ||d           |                     ||          }|j        }|                     |d           |                     ||          }|                     |j        |dz
             |                     |d	           |                     ||          }|                     |j        |           |                     |d
           |                     ||          }|                     |j        |           d S )N	agingtestrg        r   NoRefreshIntervalRefreshIntervalr8  iV   ii`)rz   r   r^   r%  r  rO  )r}   r@   rO   
no_refreshrefresh
before_modrZ  r_   s           r'   test_aging_refreshzTestDNSAging.test_aging_refresh`  s<   *c
  :18'( 	! 	* 	* 	* ++D#66
+
 	##D$///$$T3//$$S_%/#%5	7 	7 	7
 	##D#...$$T3//s
;;;
 	##D$///$$T3//s
;;;;;r&   c                     |                      d           |                     dd          }|                     |j        d           |                     dd          }|                     |j        d           d S )NTldaprf  r   rA   )r:  r  r   r^   r   r@  s     r'   test_add_no_timestampz"TestDNSAging.test_add_no_timestamp~  st    t%%ff55!,,,$$UF33!,,,,,r&   c                     |                      ddd          }|                     |j        d           |                     ddd          }|                     |j        d           d S )Nr  rf  r   rW  rA   r  r   r^   r   r@  s     r'   test_add_zero_timestampz$TestDNSAging.test_add_zero_timestamp  sl    %%ff!%DD!,,,$$UF$BB!,,,,,r&   c                    |                      ddd          }|                     |j        d           |                     ddd          }|                     |j        d           |                     ddd          }|                     |j        d           |                     ddd          }|                     |j        d           d S )Nr  rf  i@ rW  rA   r   r  r@  s     r'   test_add_update_timestampz&TestDNSAging.test_add_update_timestamp  s    %%ff&%II&111$$UF$GG!,,,$$UF$GG!,,,$$VV$HH!,,,,,r&   c                    |                      ddd          }|                     |j        d           |                     ddd          }|                     |j        d           |                     ddd          }|                     |j        d           |                     ddd          }|                     |j        d           d S )Nr  rf    r\   rA     .  )r  r   r\   r   r@  s     r'   test_add_update_ttlz TestDNSAging.test_add_update_ttl  s    %%ff37 & 9 9)4000$$UF$FF)4000$$UF$FF)4000$$VV$$GG)400000r&   c                    |                      dddd          }|                     |j        d           |                     |j        d           |                     ddd          }|                     |j        d           |j        }|                     |d           |                     ddd	          }|                     |j        d	           |                     |j        |d
z              |                     ddd          }|                     |j        d           |                     |j        d           d S )Nr  rf  r  r   )r\   r[   rA   r  r  r  r   r  |   )r  r   r\   r[   r   r>  )r}   r_   serials      r'   test_add_update_ttl_serialz'TestDNSAging.test_add_update_ttl_serial  sG   %%ff37/2 & 4 4 	)4000s+++$$UF$FF)4000"""$$UF$FF)4000vz222$$VV$$GG)4000s+++++r&   c                    |                      dddd          }|                     |j        d           |                     |j        d           |                     ddd          }|                     |j        d           |                     |j        d	           |                     t          | j         ddd
d           |                      dddd          }|                     |j        d           |                     |j        d           |                     ddd          }|                     |j        d	           |                     |j        d           |                     ddd          }|                     |j        d	           |                     |j        d           |                     ddd          }|                     |j        d           |                     |j        d	           d S )Nr  rf  iV     )flagsr  r   )rZ      r   iq[.	  ia  rp    r   A  test 290  )r  r   r  r  r   assertRaisesOverflowErrorr   r@  s     r'   test_add_update_dwFlagsz$TestDNSAging.test_add_update_dwFlags  s    %%ffE%LLE***3'''$$VVW$EE3'''A&&&-1 &	 	 	E 	E 	E
 %%ffDs%KKD)))1%%% $$VV$==A&&&3'''$$VVS$AAA&&&3''' $$VXu$EE3'''A&&&&&r&   c                    |                      ddd          }|                     |j        d           |                     ddd          }|                     |j        d           |                     ddd          }|                     |j        d           |                     ddd          }|                     |j        d           d S )Nr  rf  i1  )
dwReservedrA   r   r  )r  r   r  r   r@  s     r'   test_add_update_dwReservedz'TestDNSAging.test_add_update_dwReserved  s    %%ff%GG///$$UFu$EE+++$$UFu$EE+++$$VV$FF/////r&   c                    |                      ddd          }|                     |j        d           |                     ddd          }|                     |j        d           |                     ddd          }|                     |j        d           |                     dd          }|                     |j        d           |                     dd          }|                     |j        d           |                     dd          }|                     |j        d           |                     ddd          }|                     |j        d           |                      ddd	          }|                     |j        d	           |                     d
d          }|                     |j        d           |                     dd          }|                     |j        d           |                     dd          }|                     |j        d           |                     d
d          }|                     |j        d           d S )Nr  rf  r   r[   rA   r  zdns-0r     r
   r  dns2}   rpc2~   r     )r  r   r[   r   r>  r   r@  s     r'   test_add_update_dwSerialz%TestDNSAging.test_add_update_dwSerial  s9    %%ffs%CCs+++$$UFS$AAa((($$UFS$AAa((($$UF33a((($$Wf55a((($$VV44s+++$$VVc$BBs+++%%ffr%BBr***
 $$UF33s+++$$VV44s+++$$VV44s+++$$UH55s+++++r&   c                 4   |                      ddd          }|                     |j        d           |                     ddd          }|                     |j        d           |                     dd          }|                     |j        d           d S )Nr  rf  r   r  r  )r  r   r[   r   r   r@  s     r'   test_add_update_dwSerial_2z'TestDNSAging.test_add_update_dwSerial_2  s     %%ffs%CCs+++$$VVc$BBs+++$$VV44s+++++r&   c                    d}t          d          }t          d          }|                     |d|           |                     |          }|                     t          |          d           |                     |d         j        |j                   |                     |||           |                     |          }|                     t          |          d           |                     |d         j        |j                   dS )z0Can we use update to replace a TXT with an AAAA?r   z127.0.0.111Nr   r   )r   r   r   r   r   rM   rY   )r}   r@   r   r   r   s        r'   test_rpc_update_disparate_typesz,TestDNSAging.test_rpc_update_disparate_types  s    nnm$$tS)))$$T**TA&&&a	222sC((($$T**TA&&&a	22222r&   c                 	    dd fd} | j                   } | j                  }                     d                                dddddd	d
dd	  	        }                      |j        d                                 |j        d                                 |j        d                                 |j        d	                                 |j        d
                                 |j	        d                                 |j
        d                                ddd          }                      |j        d                                 |j        d            ||j        d            ||j        d                                 |j        d            ||j	        d            ||                                d                                ddd          }                      |j        d                                 |j        d            ||j        d            ||j        d                                 |j        d            ||j	        d                                |                                dddddddd          }                      |j        d                                 |j        d            ||j        d            ||j        d                                 |j        d            ||j	        d                                 |j
        d                                dd          }                      |j        d                                 |j        d            ||j        d            ||j        d                                 |j        d            ||j	        d                                 |j
        d                                d                                ddd           }                      |j        d                                 |j        d            ||j        d            ||j        d!                                 |j        d             ||j	        d                                 |j
        d           r                     d" d# d$           d S d S )%Nr   c                       fd}|S )Nc                      dz  	  |   d S # j         $ r9}ddlm} t           |            d          d| d           dz  Y d }~d S d }~ww xY w)Nr   r   )format_stack 
)failureException	tracebackr  ry   )rw   r~   r  ffailuresr}   totals      r'   _deferzFTestDNSAging.test_add_update_many.<locals>._defer_wrap.<locals>._defer)  s    
"AtHHHH, " " "666666\\^^B/77!777888MHHHHHHH"s    
A.AAr%   )r  r  r  r}   r  s   ` r'   _defer_wrapz6TestDNSAging.test_add_update_many.<locals>._defer_wrap(  s3    " " " " " " " " Mr&   Fr  rf        !   ,   7   B   M   )versionr  r  r[   r\   r  r^   r  r  r   r  -   TiW  .   o   iM  i  i+  i  r  )r"  rZ   r[   r\   r  r^   /   0   r   ix  1   zfailed /z defered assertions)r   rA  r:  r  r"  r  r  r[   r\   r  r^   r   r   r   )r}   r  defer_assertEqual"defer_assert_timestamp_in_ballparkr_   r  r  s   `    @@r'   test_add_update_manyz!TestDNSAging.test_add_update_many!  sc    
	 
	 
	 
	 
	 
	 
	 (K(899K9:: 	+ 	u%%ff.0+-,./1351324 & 6 6 	a(((2&&&B'''r***)2...,,,"---$$VV$==a(((3'''#)Q'''#,+++)3///#.!,,,**3///t$$VV$>>a(((3'''#)Q'''#,+++)4000#.!,,,))#... $$VV-0-0.1250314 % 6 6 	a(((3'''#)Q'''#,+++)3///#.!,,,!,,, $$VV44a(((3'''#)Q'''#,+++)3///#.!,,,!,,,u$$VV$==a(((3'''#)Q'''#,+++)3///#.!,,,!,,, 	GIIEEE5EEEFFFFF	G 	Gr&   c                 l   d}dg}dg}|                      d           |                     ||d          }|                     ||          }|                     |           |j        }|                     ||          }|                     |j        d           |                     |j        |           dS )zcAdd a static record, then a dynamic record.
        The dynamic record should have a timestamp set.rf  z
static txtzdynamic txtTr   rW  N)r:  r  r   rA  r^   r   )r}   r@   rO   r   r_   rec2rR  s          r'   !test_static_record_dynamic_updatez.TestDNSAging.test_static_record_dynamic_update  s     nt%%dCQ%??%%dD11))$///$$T3//!,,,)3/////r&   c                    d}dg}dg}dg}|                      d           |                     ||           |                     ||           |                     ||           |                     |          }|D ]}}d |j        j        D             }||k    r|                     |j        d           :||k    r|                     |j        d           \||k    r|                     |j        d           ~d S )Nr  zdns update beforezldap updatezdns update afterTc                     g | ]	}|j         
S r%   )rK   r   s     r'   r   zBTestDNSAging.test_dynamic_record_static_update.<locals>.<listcomp>  s    +++1+++r&   r   )	r:  r   r  r/  r]   rK   r   r^   r   )r}   r@   rq  r   rh  r   rU   ds           r'   !test_dynamic_record_static_updatez.TestDNSAging.test_dynamic_record_static_update  s   #$"#ttT***d+++tT***##D)) 	6 	6A++
+++ADyy##AM15555d  2222d##AM1555	6 	6r&   c           	      t   d\	  }}}}}}}}}	t          j        t          t          j                                        }
|
dz
  }t          j        |
          }t          j        |          }|dz  }|dz  }|dz  }|dz  }|                     ||
           |                     ||           |                     ||           |                     ||           |                     ||           |                     ||           |                     ||           |                     ||           |                     |	d           	 t                      }n+# t          j        $ r}t          d| d          d d }~ww xY wt          j        |           ||||fD ]Q}|                     |          }|                     t          |          d	           |                     |d
           R|||||	fD ]:}|                     |          }|                     t          |          d           ;d S )N	abcdefgijip  l        l    )r5  i failing because '': this is Windows?r   F)r   r   )r   unix_to_dns_timestampr4   timedns_timestamp_to_nt_timer6  r+   r   r  r   r   _dns_delete_tombstonesr   r   rM   r   )r}   nhohnnonon0onfnn0nnf_1601	now_hours	old_hours
now_nttime
old_nttimeold_nttime0old_nttimefnow_nttime0now_nttimef
file_samdbr~   r@   r   s                         r'   "test_tombstone_in_hours_and_nttimez/TestDNSAging.test_tombstone_in_hours_and_nttime  s   
 5@1BBS#sE23ty{{3C3CDD	'	6yAA
6yAA
 !#55 :- #55 :-2I6662I6662J7772J7773[9993[9993[9993[999 	50DFFF	F'))JJ| 	F 	F 	F :A:::< <AEF	F 	#J/// C$ 	: 	:D((..DSYY***""45"9999 Ce+ 	+ 	+D((..DSYY****	+ 	+s   E F.FFc                    d}d}|                      |           |                     |           |                     |t          j                  }|                     |j        d           |                     ||           |                      |           |                     |           |                     |t          j                  }|                     |j        d           d S )Nabr   r   )r6  r   r   r
   DNS_QTYPE_TXTr   ancountr   )r}   r  r  rU   s       r'   %test_dns_query_for_tombstoned_resultsz2TestDNSAging.test_dns_query_for_tombstoned_results  s     1q!!!NN1C$5N66A&&&q!$$$1q!!!NN1C$5N66A&&&&&r&   c           
         |                      ddd           d\  }}}}}}|                     ||           |                     ||           |                     |           |                     |t          dz
             |                     |d           |                     |dt	          d          	           |                     |           |                     |           |                     |d
           |                     |          }|                    d          }||                     |d         d           |                     |d           |                     ||          }	| 	                    |d           | 	                    |d           | 	                    |d           |                     |d           	 | j
                            t          j        dt          d ddt          j        d            t!          j        d           nj# t$          $ r]}
|
j        d         t(          j        k    r7t-                      }t/          j        |           t/          j        |           n Y d }
~
nd }
~
ww xY w|                     |dg          }	|                     |	           |                     ||g          }	|                     |	           |                     |           |                     |          }|                     |           |                     |          }|                     |           |                     |           d S )N   r   r  )r~  r  r  r  56)r4  iG icT     _B)r4  r5  zts2 untombstonedr   r   s   FALSEF)r   iiizanother recordStartScavengingr   )rz   r   r6  r?  r4   r   r   r   r   r%  rq   r=   r   r>   r"   rG   r9  sleepr   rw   r   WERR_CALL_NOT_IMPLEMENTEDr+   r   _scavenge_dns_recordsr;  r   assertIsNotNoner   )r}   rQ  rR  ts3ts4ts5ts6ts2_nodets2_tombstonerU   r~   rM  ns                r'   test_basic_scavengingz"TestDNSAging.test_basic_scavenging  s    	  314'( 	! 	* 	* 	* (F$S#sCsC(((sC(((33-?!-CEEE3G4443G#d))LLL 	s###s###
 	s$6777$$S)) _55$]1-x888su555""3,, 	##C222##C666##C666 	s$4555	 M**5!,   JqMMMM 
	 
	 
	vayF<<<
 ,--
*:666+J7777 87777
	, &&s-=,>??Q&&sSE22Qs###c""!c""!s#####s   AH 
J%AI==Jc                 ~
   	 t                      }n+# t          j        $ r}t          d| d          d d }~ww xY w|                     ddd           t          j        t          t          j                                        }d\  }}}}| 	                    ||          j
        }|                     |||dz
            j
        }	|                     |||d	z
            j
        }
|                     |||d
z
            j
        }|                     ||           |                     |	|dz
             |                     |
|d	z
             |                     ||d
z
             t          j        |           |                     ||          }|                     |           |                     |t&          j                  }|                     |j        d           |                     |          }|                     t1          |          d           |                     |d                    |                     ||          j
        }|                     ||          j
        }	|                     ||          j
        }
|                     ||           |                     |	|dz
             |                     |
|d	z
             | 	                    ||          j
        }	| 	                    ||          j
        }
|                     |	|d	z
             |                     |
|           t          j        |           |                     |          }|                     t1          |          d           |                     |d                    |                     ||           |                     |          }|                     t1          |          d           |                     |d                    t          j        |           |                     |          }|                     t1          |          d           |                     |d                    |                     ||dz
             |                     ||dz
             t          j        |           |                     |          }|                     t1          |          d           |                     |d                    |                     |          }|                     t1          |          d           d S )Nr6  r7  ro     r   r  ABCDrW  (   <   rR  r      r  )r+   r   r  r   rz   r   r8  r4   r9  r   r^   r  rO  r  r   r^  r   r   r   r
   rS  r   rT  r   rM   r   r;  r   r6  )r}   rM  r~   nowr  r  r  r  atimer  r  r  rU   r   s                 r'   test_samba_scavengingz"TestDNSAging.test_samba_scavengingM  s   	F'))JJ| 	F 	F 	F :A:::< <AEF	F
 	  213'( 	! 	* 	* 	* ,S-=-=>>
1a
 &&q!,,8''1#b&'AAM''1#b&'AAM''1#b&'AAMuc***$$UCF333$$UCF333$$UCF333":... &&q!,,!NN1C$5N66A&&&$$Q''TA&&&tAw''' **1a00<**1a00<**1a00<uc***$$UCF333$$UCF333&&q!,,8&&q!,,8$$UCF333uc*** 	#J///$$Q''TA&&&tAw''' 	Aq!!!$$Q''TA&&&tAw'''#J///$$Q''TA&&&tAw''' 	1sSy***1sSy***#J///$$Q''TA&&&tAw'''$$Q''TA&&&&&s    949c                 ,   |                      |           d}t          j        t          t	          j                                        }|d|z  z
  }|d|z  z
  }	|                     ||           |                     ||dz             |                     ||          }
|                     |||	          }| 	                    |
|           | 	                    ||	           |                     ||           |                     ||          }
|r|dk    r|}| 
                    |
|           n7|dk    r|}| 	                    |
|           n|}| 	                    |
|           |                     ||          }| 	                    ||	           |                     ||           |                     ||          }|s|                     | j
        ||d           n| 
                    ||           |                     |||	          }|                     ||          }
| 	                    |
|           |                     ||           |                     ||          }
| 	                    ||	           t          |          \  }}|                     |||           |                     ||           |                     ||          }
| 
                    |
|           |                     ||          }| 	                    ||	           d S )	Naargh   r  rW  r  z)windows updates non-aging, samba does notr  )r   )r:  r   r8  r4   r9  r   r%  r   r"  r  rO  windows_variationrh   r   )r}   r  r  a_daysb_daysrB   r@   rn  	a_initial	b_initialrec_arec_btime_a_r   s                  r'   _test_A_and_AAAA_recordsz%TestDNSAging._test_A_and_AAAA_records  sX   u,S-=-=>>"v+%	"v+%	  q)))##D&3,777))$22""4	"BB$$UI666$$UI666 	  q))) ))$22 	;VaZZF""5#....aZZ F((	::::F((	::: ))$22$$UI666 	  q))) ))$22 	/""&s? # A A A A ""5#... ""4	"BB ))$22$$UF333  q)))))$22$$UI666 q>>5au555 	  q)))))$22uc***))$22$$UI66666r&   c                 N    |                      t          t          ddd           d S Nr  TrB   r~  	IPv4_ADDR	IPv6_ADDRr  s    r'   test_A_5_days_AAAA_5_days_agingz,TestDNSAging.test_A_5_days_AAAA_5_days_aging  s'    %%iAq%MMMMMr&   c                 N    |                      t          t          ddd           d S )Nr  Fr  r  r  s    r'   "test_A_5_days_AAAA_5_days_no_agingz/TestDNSAging.test_A_5_days_AAAA_5_days_no_aging  s'    %%iAq%NNNNNr&   c                 N    |                      t          t          ddd           d S )Nr  r1  Tr  r  r  s    r'    test_A_5_days_AAAA_10_days_agingz-TestDNSAging.test_A_5_days_AAAA_10_days_aging  s'    %%iAr%NNNNNr&   c                 N    |                      t          t          ddd           d S Nr  r1  Fr  r  r  s    r'   #test_A_5_days_AAAA_10_days_no_agingz0TestDNSAging.test_A_5_days_AAAA_10_days_no_aging  '    %%iAr%OOOOOr&   c                 N    |                      t          t          ddd           d S )Nr1  r  Tr  r  r  s    r'    test_A_10_days_AAAA_5_days_agingz-TestDNSAging.test_A_10_days_AAAA_5_days_aging  '    %%iB%NNNNNr&   c                 N    |                      t          t          ddd           d S )Nr1  r  Fr  r  r  s    r'   #test_A_10_days_AAAA_5_days_no_agingz0TestDNSAging.test_A_10_days_AAAA_5_days_no_aging  s'    %%iB%OOOOOr&   c                 N    |                      t          t          ddd           d S )Nr1  rp  Tr  r  r  s    r'    test_A_10_days_AAAA_9_days_agingz-TestDNSAging.test_A_10_days_AAAA_9_days_aging 	  r  r&   c                 N    |                      t          t          ddd           d S )Nrp  r1  Fr  r  r  s    r'   #test_A_9_days_AAAA_10_days_no_agingz0TestDNSAging.test_A_9_days_AAAA_10_days_no_aging	  r  r&   c                 N    |                      t          t          ddd           d S )Nri  r   Tr  r  r  s    r'    test_A_20_days_AAAA_2_days_agingz-TestDNSAging.test_A_20_days_AAAA_2_days_aging	  r  r&   c                 N    |                      t          t          ddd           d S )N   rk  Fr  r  r  s    r'   #test_A_6_days_AAAA_40_days_no_agingz0TestDNSAging.test_A_6_days_AAAA_40_days_no_aging		  r  r&   c                 N    |                      t          t          ddd           d S r  r~  r  IPv4_ADDR_2r  s    r'   test_A_5_days_A_5_days_agingz)TestDNSAging.test_A_5_days_A_5_days_aging	  '    %%ia$%OOOOOr&   c                 N    |                      t          t          ddd           d S r  r  r  s    r'    test_A_5_days_A_10_days_no_agingz-TestDNSAging.test_A_5_days_A_10_days_no_aging	  s'    %%ia5%QQQQQr&   c                 N    |                      t          t          ddd           d S )Nr  r  Tr  r~  r  IPv6_ADDR_2r  s    r'   "test_AAAA_5_days_AAAA_6_days_agingz/TestDNSAging.test_AAAA_5_days_AAAA_6_days_aging	  r  r&   c                 N    |                      t          t          ddd           d S )Nr  r  Fr  r  r  s    r'   %test_AAAA_5_days_AAAA_6_days_no_agingz2TestDNSAging.test_AAAA_5_days_AAAA_6_days_no_aging	  s'    %%ia%%PPPPPr&   c                    |                      |           d}t          j        t          t	          j                                        }|dz
  }|dz
  }|dz
  }|||d}|||d}|||d}	|                     |d           |                                D ](\  }
}|                     ||
t          j	        |	          })|                                D ](\  }
}|                     ||
t          j
        |	          })|	                                D ]\  }
}|                     ||
|
          }|                     |t          j                   |                     |t          j	                  }|                     |j        d           |                     |t          j                  }|                     |j        d           t'          d |j        D                       }|                     |t'          |	                     |                     |t          j
                  }|                     |j        d           t'          d |j        D                       }|                     |t'          |                     |                     |          }|                     t-          |          d           |D ]}|j        t          j
        k    rt1          |j                  }
||
         }nM|j        t          j        k    r|j        j        d         }
|	|
         }n|                     d|j                    |                     |j        |           d S )Nrr  x   r  iX  )z1.1.1.1z2.2.2.2z3.3.3.3)r   z::2z::3)r~  r  r  r  )r   r^   rW  r   r   c              3   D   K   | ]}|j         j        j        d          V  dS r   Nr   rO   rK   r   s     r'   	<genexpr>z:TestDNSAging._test_multi_records_delete.<locals>.<genexpr>H	  -      99!17;?1%999999r&   c              3   >   K   | ]}t          |j                  V  d S rS   )r   r   r   s     r'   r  z:TestDNSAging._test_multi_records_delete.<locals>.<genexpr>M	  s,      >>q>!'**>>>>>>r&   r  zunexpected wType )r:  r   r8  r4   r9  r   r   r"  r
   DNS_QTYPE_ADNS_QTYPE_AAAAr  r   r   rg   r   r   rT  rS  setanswersr   rM   rY   r   r]   rK   r   r  r^   )r}   rB   r@   rn  back_5_daysback_10_daysback_25_daysip4sip6sra  r   r   rU   rsetr   expecteds                   r'   _test_multi_records_deletez'TestDNSAging._test_multi_records_delete	  sO   u,S-=-=>>FlW}W} "#
 
 
 
 
 
 	tS)))JJLL 	R 	RDAq""4#/q"QQAAJJLL 	U 	UDAq""4#2DRS"TTAAJJLL 	@ 	@DAq''aQ'??AAT4?333NN411A&&&NN4!233A&&&99qy99999s4yy)))NN4!344A&&&>>AI>>>>>s4yy)))$$T**TA&&& 
	B 
	BAw#,,,"16**7C---FJqM7		7ag77888((AAAA
	B 
	Br&   c                 0    |                      d           d S NTr  r  s    r'   test_multi_records_delete_agingz,TestDNSAging.test_multi_records_delete_aging^	  s    ''-----r&   c                 0    |                      d           d S )NFr  r  s    r'   "test_multi_records_delete_no_agingz/TestDNSAging.test_multi_records_delete_no_aginga	  s    ''.....r&   c                    d}dg}dg}dg}dg}|                      |           t          j        t          t	          j                                        }t          ||dz  z
  d          }	|                     ||           |                     |||	           |                     |||	           |                     |||	           |                     ||           |                     |t          j
                  }
t          d	 |
j        D                       }|                     |t          d
                     |                     ||          j        }|                     ||          j        }|                     ||          j        }|                     ||          j        }|                     |          }|                     t#          |          d           |                     |t          j
                  }
t          d |
j        D                       }|                     |t          d
                     |                     ||           |                     ||                     ||                     |                     ||                     ||                     |                     ||                     ||                     |                     |          }|                     t#          |          d           |                     |t          j
                  }
t          d |
j        D                       }|                     |t          d                     |                     ||           |                     ||                     ||                     |                     ||                     ||                     |                     |          }|                     t#          |          d           |                     |t          j
                  }
t          d |
j        D                       }|                     |t          d                     |                     ||           |                     ||                     ||                     |                     |          }|                     t#          |          d           |                     |t          j
                  }
t          d |
j        D                       }|                     |dh           |                     ||           |                     |          }|                     t#          |          d           |                     |t          j
                  }
t          d |
j        D                       }|                     t#          |          d           d S )Nrf  r  r  r  r  rs  r   rW  c              3   D   K   | ]}|j         j        j        d          V  dS r  r  r   s     r'   r  z6TestDNSAging._test_dns_delete_times.<locals>.<genexpr>z	  r  r&   rj  r  c              3   D   K   | ]}|j         j        j        d          V  dS r  r  r   s     r'   r  z6TestDNSAging._test_dns_delete_times.<locals>.<genexpr>	  r  r&   r   c              3   D   K   | ]}|j         j        j        d          V  dS r  r  r   s     r'   r  z6TestDNSAging._test_dns_delete_times.<locals>.<genexpr>	  r  r&   ABCr   c              3   D   K   | ]}|j         j        j        d          V  dS r  r  r   s     r'   r  z6TestDNSAging._test_dns_delete_times.<locals>.<genexpr>	  r  r&   ABr   c              3   D   K   | ]}|j         j        j        d          V  dS r  r  r   s     r'   r  z6TestDNSAging._test_dns_delete_times.<locals>.<genexpr>	  r  r&   c              3   D   K   | ]}|j         j        j        d          V  dS r  r  r   s     r'   r  z6TestDNSAging._test_dns_delete_times.<locals>.<genexpr>	  r  r&   )r:  r   r8  r4   r9  maxr   r  r   r
   rS  r  r  r   r   r^   r   rM   r   r  r   r   )r}   r  rB   r@   r  r  r  r  rn  r  rU   r  ro  r  r  r  r   s                    r'   _test_dns_delete_timesz#TestDNSAging._test_dns_delete_timesd	  sO    EEEEu,S-=-=>>v{*A..
tQ'''aZ@@@aZ@@@aZ@@@tQ'''NN4!23399qy99999s6{{+++**433?**433?**433?**433?$$T**TA&&&NN4!23399qy99999s6{{+++a   $$UD,F,FtQ,O,OPPP$$UD,F,FtQ,O,OPPP$$UD,F,FtQ,O,OPPP33D99TA&&&NN4!23399qy99999s5zz***D!$$$$$UD,F,FtQ,O,OPPP$$UD,F,FtQ,O,OPPP33D99TA&&&NN4!23399qy99999s4yy)))a   $$UD,F,FtQ,O,OPPP$$T**TA&&&NN4!23399qy99999u%%%a   33D99 	TA&&&NN4!23399qy99999TA&&&&&r&   c                 2    |                      dd           d S r  r  r  s    r'   "test_dns_delete_times_5_days_agingz/TestDNSAging.test_dns_delete_times_5_days_aging	  s    ##At,,,,,r&   c                 2    |                      dd           d S )Nr  Tr  r  s    r'   #test_dns_delete_times_11_days_agingz0TestDNSAging.test_dns_delete_times_11_days_aging	  s    ##B-----r&   c                 2    |                      dd           d S )Nn  Tr  r  s    r'   $test_dns_delete_times_366_days_agingz1TestDNSAging.test_dns_delete_times_366_days_aging	  s    ##C.....r&   c                 2    |                      dd           d S )NrZ  Tr  r  s    r'   "test_dns_delete_times_static_agingz/TestDNSAging.test_dns_delete_times_static_aging	  s    ##D$/////r&   c                 2    |                      dd           d S r  r  r  s    r'   %test_dns_delete_times_5_days_no_agingz2TestDNSAging.test_dns_delete_times_5_days_no_aging	  s    ##Au-----r&   c                 2    |                      dd           d S )Nr  Fr  r  s    r'   &test_dns_delete_times_11_days_no_agingz3TestDNSAging.test_dns_delete_times_11_days_no_aging	  s    ##B.....r&   c                 2    |                      dd           d S )Nr  Fr  r  s    r'   'test_dns_delete_times_366_days_no_agingz4TestDNSAging.test_dns_delete_times_366_days_no_aging	  s    ##C/////r&   c                 2    |                      dd           d S )NrZ  Fr  r  s    r'   %test_dns_delete_times_static_no_agingz2TestDNSAging.test_dns_delete_times_static_no_aging	  s    ##D%00000r&   c                    d}dg}dg}|                      |           t          j        t          t	          j                                        }t          ||dz  z
  d          }	t          ||dz  z
  d          }
|r,|                     ||           |                     ||           |                     |||	           |                     |||
           |                     ||          j	        }| 
                    ||           |s.|r,|                     |                     ||          |           d S |                     |                     ||          |           d S )Nrf  r  r  rs  r   rW  )r:  r   r8  r4   r9  r  r   r  r   r^   r   rO  r  )r}   rv  rw  rB   touchr@   r  r  rn  
a_days_ago
b_days_agoro  s               r'   _test_dns_delete_simplez$TestDNSAging._test_dns_delete_simple	  sv    EEu,S-=-=>>v{*A..
v{*A..
 	,""4+++""4+++aZ@@@aZ@@@**433?a    	U 	U""4#=#=dA#F#FLLLLL(()C)CD!)L)LeTTTTTr&   c                 4    |                      ddd           d S Nr   r   Tr  r  s    r'   %test_dns_delete_simple_2_3_days_agingz2TestDNSAging.test_dns_delete_simple_2_3_days_aging	  s     $$Q400000r&   c                 4    |                      ddd           d S )Nr   r   Fr  r  s    r'   (test_dns_delete_simple_2_3_days_no_agingz5TestDNSAging.test_dns_delete_simple_2_3_days_no_aging	  s     $$Q511111r&   c                 4    |                      ddd           d S Nr      Tr  r  s    r'   &test_dns_delete_simple_2_13_days_agingz3TestDNSAging.test_dns_delete_simple_2_13_days_aging	  s     $$QD11111r&   c                 4    |                      ddd           d S )Nr   r  Fr  r  s    r'   )test_dns_delete_simple_2_13_days_no_agingz6TestDNSAging.test_dns_delete_simple_2_13_days_no_aging	  s     $$QE22222r&   c                 4    |                      ddd           d S Nr  r  Tr  r  s    r'   'test_dns_delete_simple_12_13_days_agingz4TestDNSAging.test_dns_delete_simple_12_13_days_aging	  s     $$RT22222r&   c                 4    |                      ddd           d S )Nr  r  Fr  r  s    r'   *test_dns_delete_simple_12_13_days_no_agingz7TestDNSAging.test_dns_delete_simple_12_13_days_no_aging	  s     $$RU33333r&   c                 4    |                      ddd           d S Np   q   Tr  r  s    r'   )test_dns_delete_simple_112_113_days_agingz6TestDNSAging.test_dns_delete_simple_112_113_days_aging	       $$S#t44444r&   c                 4    |                      ddd           d S )Nr  r  Fr  r  s    r'   ,test_dns_delete_simple_112_113_days_no_agingz9TestDNSAging.test_dns_delete_simple_112_113_days_no_aging	       $$S#u55555r&   c                 4    |                      ddd           d S N    eAr  Tr  r  s    r'   'test_dns_delete_simple_0_113_days_agingz4TestDNSAging.test_dns_delete_simple_0_113_days_aging	  s     $$S#t44444r&   c                 4    |                      ddd           d S )Nr  r  Fr  r  s    r'   *test_dns_delete_simple_0_113_days_no_agingz7TestDNSAging.test_dns_delete_simple_0_113_days_no_aging	  r  r&   c                 4    |                      ddd           d S Nr  Tr  r  s    r'   %test_dns_delete_simple_0_0_days_agingz2TestDNSAging.test_dns_delete_simple_0_0_days_aging
  r  r&   c                 4    |                      ddd           d S )Nr  Fr  r  s    r'   (test_dns_delete_simple_0_0_days_no_agingz5TestDNSAging.test_dns_delete_simple_0_0_days_no_aging
  r  r&   c                 4    |                      ddd           d S Nr1  r  Tr  r  s    r'   &test_dns_delete_simple_10_0_days_agingz3TestDNSAging.test_dns_delete_simple_10_0_days_aging
  s     $$Rd33333r&   c                 4    |                      ddd           d S )Nr1  r  Fr  r  s    r'   )test_dns_delete_simple_10_0_days_no_agingz6TestDNSAging.test_dns_delete_simple_10_0_days_no_aging
  s     $$Re44444r&   c                 6    |                      dddd           d S r  r  r  s    r'   +test_dns_delete_simple_2_3_days_aging_touchz8TestDNSAging.test_dns_delete_simple_2_3_days_aging_touch
  s"    $$Q466666r&   c                 6    |                      dddd           d S )Nr   r   FTr  r  s    r'   .test_dns_delete_simple_2_3_days_no_aging_touchz;TestDNSAging.test_dns_delete_simple_2_3_days_no_aging_touch
  s"    $$Q5$77777r&   c                 6    |                      dddd           d S r  r  r  s    r'   ,test_dns_delete_simple_2_13_days_aging_touchz9TestDNSAging.test_dns_delete_simple_2_13_days_aging_touch
  s"    $$QD$77777r&   c                 6    |                      dddd           d S )Nr   r  FTr  r  s    r'   /test_dns_delete_simple_2_13_days_no_aging_touchz<TestDNSAging.test_dns_delete_simple_2_13_days_no_aging_touch
  s"    $$QE488888r&   c                 6    |                      dddd           d S r  r  r  s    r'   -test_dns_delete_simple_12_13_days_aging_touchz:TestDNSAging.test_dns_delete_simple_12_13_days_aging_touch
  s"    $$RT488888r&   c                 6    |                      dddd           d S )Nr  r  FTr  r  s    r'   0test_dns_delete_simple_12_13_days_no_aging_touchz=TestDNSAging.test_dns_delete_simple_12_13_days_no_aging_touch
  s"    $$RUD99999r&   c                 6    |                      dddd           d S r  r  r  s    r'   /test_dns_delete_simple_112_113_days_aging_touchz<TestDNSAging.test_dns_delete_simple_112_113_days_aging_touch 
  "    $$S#tT:::::r&   c                 6    |                      dddd           d S )Nr  r  FTr  r  s    r'   2test_dns_delete_simple_112_113_days_no_aging_touchz?TestDNSAging.test_dns_delete_simple_112_113_days_no_aging_touch#
  "    $$S#ud;;;;;r&   c                 6    |                      dddd           d S r   r  r  s    r'   -test_dns_delete_simple_0_113_days_aging_touchz:TestDNSAging.test_dns_delete_simple_0_113_days_aging_touch&
  s"    $$S#tT:::::r&   c                 6    |                      dddd           d S )Nr  r  FTr  r  s    r'   0test_dns_delete_simple_0_113_days_no_aging_touchz=TestDNSAging.test_dns_delete_simple_0_113_days_no_aging_touch*
  r   r&   c                 6    |                      dddd           d S r  r  r  s    r'   +test_dns_delete_simple_0_0_days_aging_touchz8TestDNSAging.test_dns_delete_simple_0_0_days_aging_touch-
  r  r&   c                 6    |                      dddd           d S )Nr  FTr  r  s    r'   .test_dns_delete_simple_0_0_days_no_aging_touchz;TestDNSAging.test_dns_delete_simple_0_0_days_no_aging_touch0
  r   r&   c                 6    |                      dddd           d S r  r  r  s    r'   ,test_dns_delete_simple_10_0_days_aging_touchz9TestDNSAging.test_dns_delete_simple_10_0_days_aging_touch3
  s"    $$RdD99999r&   c                 6    |                      dddd           d S )Nr1  r  FTr  r  s    r'   /test_dns_delete_simple_10_0_days_no_aging_touchz<TestDNSAging.test_dns_delete_simple_10_0_days_no_aging_touch6
  s"    $$ReT:::::r&   rt  c          
      T   	  ||i | n7# t           $ r*}t          dt          |          z              Y d }~d S d }~ww xY wt          t          d                     |t          t	          |                     t          dt          |j         d| d|           z              d S )Nz6Expected success on Windows only, failed as expected:
zknown Windows failurezExpected success on Windows:
r  )r   ry   r   r   r   __name__)r}   fnr  rw   r   r~   s         r'   ru  zTestDNSAging.windows_variation9
  s    	B 	 	 	K!**   FFFFF	 	e+,,---?-$$%%%.66t66f66778 	9 	9 	9 	9 	9s    
?:?c                 (   d}dg}dg}|                      t          |          dt          |                     t          j        t          t	          j                                        }t          ||dz  z
  d          }	|r|                     ||           |                     |||	           |                     ||          j	        }
|                     ||           |                     ||          }|sT|rR|	dk    r5| 
                    | j        ||d	
           |                     |d           n-|                     ||           n|                     ||
           |                     ||          }|                     ||           d S )Nrf  r  r  r  )r  r  r8  rs  r   rW  z.Windows resets static siblings (cache effect?)rt  )rz   r4   r   r8  r9  r  r   r  r   r^   ru  rO  r  )r}   rv  r  rB   r  r@   r  r  rn  r  ro  a_recb_recs                r'   _test_dns_add_siblingz"TestDNSAging._test_dns_add_siblingF
  s    EE  W34'*5zz 	! 	3 	3 	3 ,S-=-=>>v{*A..
 	,""4+++aZ@@@**433?tQ'''**433 	7 	7 Q&&*E3H ' J J J ,,UA6666&&uc2222((666**433uc*****r&   c                 4    |                      ddd           d S Nr   r  Tr3  r  s    r'   #test_dns_add_sibling_2_7_days_agingz0TestDNSAging.test_dns_add_sibling_2_7_days_agingu
  s     ""1a.....r&   c                 4    |                      ddd           d S )Nr   r  Fr6  r  s    r'   &test_dns_add_sibling_2_7_days_no_agingz3TestDNSAging.test_dns_add_sibling_2_7_days_no_agingx
  s     ""1a/////r&   c                 4    |                      ddd           d S Nr  r  Tr6  r  s    r'   $test_dns_add_sibling_12_7_days_agingz1TestDNSAging.test_dns_add_sibling_12_7_days_aging{
       ""2q$/////r&   c                 4    |                      ddd           d S )Nr  r  Fr6  r  s    r'   'test_dns_add_sibling_12_7_days_no_agingz4TestDNSAging.test_dns_add_sibling_12_7_days_no_aging~
       ""2q%00000r&   c                 4    |                      ddd           d S Nr  r   Tr6  r  s    r'   $test_dns_add_sibling_12_3_days_agingz1TestDNSAging.test_dns_add_sibling_12_3_days_aging
  r=  r&   c                 4    |                      ddd           d S )Nr  r   Fr6  r  s    r'   'test_dns_add_sibling_12_3_days_no_agingz4TestDNSAging.test_dns_add_sibling_12_3_days_no_aging
  r@  r&   c                 4    |                      ddd           d S Nr  r  Tr6  r  s    r'   %test_dns_add_sibling_112_7_days_agingz2TestDNSAging.test_dns_add_sibling_112_7_days_aging
       ""3400000r&   c                 4    |                      ddd           d S )Nr  r  Fr6  r  s    r'   (test_dns_add_sibling_112_7_days_no_agingz5TestDNSAging.test_dns_add_sibling_112_7_days_no_aging
       ""3511111r&   c                 4    |                      ddd           d S Nr  r  Tr6  r  s    r'   &test_dns_add_sibling_12_113_days_agingz3TestDNSAging.test_dns_add_sibling_12_113_days_aging
  s     ""2sD11111r&   c                 4    |                      ddd           d S )Nr  r  Fr6  r  s    r'   )test_dns_add_sibling_12_113_days_no_agingz6TestDNSAging.test_dns_add_sibling_12_113_days_no_aging
  s     ""2sE22222r&   c                 4    |                      ddd           d S Nr  r  Tr6  r  s    r'   #test_dns_add_sibling_0_7_days_agingz0TestDNSAging.test_dns_add_sibling_0_7_days_aging
  s     ""3400000r&   c                 4    |                      ddd           d S )Nr  r  Fr6  r  s    r'   &test_dns_add_sibling_0_7_days_no_agingz3TestDNSAging.test_dns_add_sibling_0_7_days_no_aging
  rL  r&   c                 4    |                      ddd           d S Nr  r   Tr6  r  s    r'   #test_dns_add_sibling_0_0_days_agingz0TestDNSAging.test_dns_add_sibling_0_0_days_aging
  rI  r&   c                 4    |                      ddd           d S )Nr  r   Fr6  r  s    r'   &test_dns_add_sibling_0_0_days_no_agingz3TestDNSAging.test_dns_add_sibling_0_0_days_no_aging
  rL  r&   c                 4    |                      ddd           d S Nr1  r   Tr6  r  s    r'   $test_dns_add_sibling_10_0_days_agingz1TestDNSAging.test_dns_add_sibling_10_0_days_aging
  r=  r&   c                 4    |                      ddd           d S )Nr1  r   Fr6  r  s    r'   'test_dns_add_sibling_10_0_days_no_agingz4TestDNSAging.test_dns_add_sibling_10_0_days_no_aging
  r@  r&   c                 6    |                      dddd           d S r5  r6  r  s    r'   )test_dns_add_sibling_2_7_days_aging_touchz6TestDNSAging.test_dns_add_sibling_2_7_days_aging_touch
  s"    ""1at44444r&   c                 6    |                      dddd           d S )Nr   r  FTr6  r  s    r'   ,test_dns_add_sibling_2_7_days_no_aging_touchz9TestDNSAging.test_dns_add_sibling_2_7_days_no_aging_touch
  s"    ""1a55555r&   c                 6    |                      dddd           d S r;  r6  r  s    r'   *test_dns_add_sibling_12_7_days_aging_touchz7TestDNSAging.test_dns_add_sibling_12_7_days_aging_touch
  "    ""2q$55555r&   c                 6    |                      dddd           d S )Nr  r  FTr6  r  s    r'   -test_dns_add_sibling_12_7_days_no_aging_touchz:TestDNSAging.test_dns_add_sibling_12_7_days_no_aging_touch
  "    ""2q%66666r&   c                 6    |                      dddd           d S rB  r6  r  s    r'   *test_dns_add_sibling_12_3_days_aging_touchz7TestDNSAging.test_dns_add_sibling_12_3_days_aging_touch
  rg  r&   c                 6    |                      dddd           d S )Nr  r   FTr6  r  s    r'   -test_dns_add_sibling_12_3_days_no_aging_touchz:TestDNSAging.test_dns_add_sibling_12_3_days_no_aging_touch
  rj  r&   c                 6    |                      dddd           d S rG  r6  r  s    r'   +test_dns_add_sibling_112_7_days_aging_touchz8TestDNSAging.test_dns_add_sibling_112_7_days_aging_touch
  "    ""3466666r&   c                 6    |                      dddd           d S )Nr  r  FTr6  r  s    r'   .test_dns_add_sibling_112_7_days_no_aging_touchz;TestDNSAging.test_dns_add_sibling_112_7_days_no_aging_touch
  "    ""35$77777r&   c                 6    |                      dddd           d S rN  r6  r  s    r'   ,test_dns_add_sibling_12_113_days_aging_touchz9TestDNSAging.test_dns_add_sibling_12_113_days_aging_touch
  s"    ""2sD$77777r&   c                 6    |                      dddd           d S )Nr  r  FTr6  r  s    r'   /test_dns_add_sibling_12_113_days_no_aging_touchz<TestDNSAging.test_dns_add_sibling_12_113_days_no_aging_touch
  s"    ""2sE488888r&   c                 6    |                      dddd           d S rS  r6  r  s    r'   )test_dns_add_sibling_0_7_days_aging_touchz6TestDNSAging.test_dns_add_sibling_0_7_days_aging_touch
  rq  r&   c                 6    |                      dddd           d S )Nr  r  FTr6  r  s    r'   ,test_dns_add_sibling_0_7_days_no_aging_touchz9TestDNSAging.test_dns_add_sibling_0_7_days_no_aging_touch
  rt  r&   c                 6    |                      dddd           d S rX  r6  r  s    r'   )test_dns_add_sibling_0_0_days_aging_touchz6TestDNSAging.test_dns_add_sibling_0_0_days_aging_touch
  rq  r&   c                 6    |                      dddd           d S )Nr  r   FTr6  r  s    r'   ,test_dns_add_sibling_0_0_days_no_aging_touchz9TestDNSAging.test_dns_add_sibling_0_0_days_no_aging_touch
  rt  r&   c                 6    |                      dddd           d S r]  r6  r  s    r'   *test_dns_add_sibling_10_0_days_aging_touchz7TestDNSAging.test_dns_add_sibling_10_0_days_aging_touch
  rg  r&   c                 6    |                      dddd           d S )Nr1  r   FTr6  r  s    r'   -test_dns_add_sibling_10_0_days_no_aging_touchz:TestDNSAging.test_dns_add_sibling_10_0_days_no_aging_touch
  rj  r&   rS   )NN)r   )TN)F)T)TF)r.  
__module____qualname____doc__SERVER_NAMEserverr"   	server_ipr$   credsrp   rz   r   r   r   r
   DNS_QTYPE_ALLr   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   re   r   r"  r%  r/  DNS_TIMESTAMP_1981r6  r:  rA  r=  r?  r   rO  r  r\  r^  rd  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r,  r/  r3  rN  rU  rg  rp  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r  r  r"  r$  r&  r(  r*  r,  ru  r3  r7  r9  r<  r?  rC  rE  rH  rK  rO  rQ  rT  rV  rY  r[  r^  r`  rb  rd  rf  ri  rl  rn  rp  rs  rv  rx  rz  r|  r~  r  r  r  __classcell__)r   s   @r'   rj   rj      s
       ) )FIE> > > > >," " " "69 9 9 92  "   ( %($5     #'#&#4# # # #JD D D DC C C5 5 5 55 5 50* * *  F F F  -L -L -L -L^     *  6  . 483D 1 1 1 1"   &1 1 1   . #5#'       >: : : := = =
 .@-?% % % %" " "2" " "@= = =6+ + +>	 	 	g6 g6 g6Ry9 y9 y9v7 7 77 7 77 7 78 8 8< < <-4 -4 -4^gA gA gARN4 N4 N4`W= W= W=r6 6 66 6 66 6 67 7 7; ; ;# # #.** ** ** **X9 9 99 9 95 5 5
5 5 5
< < <<- - -- - -- - -1 1 1, , ,$!' !' !'F	0 	0 	0 ,  ,  ,D, , ,3 3 3bG bG bGH0 0 0"6 6 6*-+ -+ -+^' ' ' a$ a$ a$FS' S' S'jJ7 J7 J7XN N NO O OO O OP P PO O OP P PO O OP P PO O OP P PP P PR R RP P PQ Q QDB DB DBL. . ./ / /E' E' E' E'N- - -. . ./ / /0 0 0. . ./ / /0 0 01 1 1U U U U@1 1 12 2 22 2 23 3 33 3 34 4 45 5 56 6 65 5 56 6 65 5 56 6 64 4 45 5 57 7 78 8 88 8 89 9 99 9 9: : :; ; ;< < <; ; ;< < <; ; ;< < <: : :; ; ; 04 9 9 9 9 9-+ -+ -+ -+^/ / /0 0 00 0 01 1 10 0 01 1 11 1 12 2 22 2 23 3 31 1 12 2 21 1 12 2 20 0 01 1 15 5 56 6 66 6 67 7 76 6 67 7 77 7 78 8 88 8 89 9 97 7 78 8 87 7 78 8 86 6 67 7 7 7 7 7 7r&   rj   )moduleoptsr  rS   )Qsyssambar   r   	samba.ndrr   r   samba.samdbr   
samba.authr   r   r	   samba.dcerpcr
   r   r   samba.dnsserverr   r   r   r   samba.tests.subunitrunr   r   r   r   samba.tests.dns_baser   samba.getoptgetoptoptionsoptparser9  samba.colourr   r   r   OptionParserparserSambaOptions	sambaoptsadd_option_groupCredentialsOptionscredoptssubunitopts
parse_argsr  rw   rM   print_usageexitget_loadparmr#   get_credentialsr$   r  r"   set_krb_forwardableNO_KRB_FORWARDABLE	get_realmlowerDOMAINr=  r?  r  r  r  r  r  r(   r+   r-   rD   rH   rQ   rV   ra   rh   rj   r.  r%   r&   r'   <module>r     s  & 


             * * * * * * * *       % % % % % % 



       - - - - - - - - - - . . . . . . . . > > > > > > > > > > > > > > > > % % % % % % % % ( ( ( ( ( (         6 6 6 6 6 6 6 6 6 6		6
8 
8 G ((	   	 " " " &7%f--    ! ! !nV$$    $ $ $  
d3t99q==
CHQKKK  $$1gG	   +8 9 9 9				 	 	"	"    		$ $ $$ $ $M M M   *
 
 
 
      # # #o(7 o(7 o(7 o(7 o(77 o(7 o(7 o(7bQ 8+ . . . . . .r&   