Files
RemSound/server/__pycache__/test_relay.cpython-311.pyc
T

66 lines
17 KiB
Plaintext
Raw Normal View History

§
F gjÂ$ãóÞdZddlmZddlZddlZddlZddlZddlZddl Z ddl
Z
ej   ej  
e¦«¦«Zej dej  ed¦«¦«Zej e¦«Zeejd<ej e¦«ejd¦«Ze ej¦«¦«e ej¦«e
je e!d¦«¦«¬¦«j Z"e
je e!dd ¦«¦«¬¦«j Z#Gd
d ¦«Z$d+d,dZ%d+d-dZ&d.d/dZ'd0d „Z(d1d!„Z)Gd"„d#e j*¦«Z+Gd$„d%e j*¦«Z,Gd&„d'e j*¦«Z-Gd(„d)e j*¦«Z.e/d*kre j0¦«dSdS)2utUnit tests for the RemSound relay's address-proof, per-IP cap, and eviction logic.
The relay ships to the Pi and auto-updates every user, but its branch logic (cookie verify,
watch-only vs enforce, per-IP cap across v1+v2, NAT-rebind reset, forged-BYE rejection) had no
automated coverage — a one-line regression there would sail past the C# gate and re-open the
reflection / occupation / takeover surface the 2026-07-27 address-proof was built to close. These
tests exercise that logic directly with a fake socket, no network, no real Python needed on the Pi.
Run: py -m unittest test_relay (from the server/ folder)
é)Ú annotationsNÚremsound_relayzremsound-relay.pyzremsound-relay-testé©Úbytesé cóeZdZdZdZdZdS)Ú
FakeSocketzVRecords every sendto so a test can inspect what the relay emitted (cookies, forwards).cóg|_dS©N)Úsent)Úselfs ú%D:\proj\RemSound\server\test_relay.pyÚ__init__zFakeSocket.__init__)s
Ø9;ˆŒ ˆ ˆ ócór|j t|¦«|f¦«t|¦«Sr )r
ÚappendrÚlen)rÚdataÚaddrs rÚsendtozFakeSocket.sendto,s/Ø Œ ×Ò™+œ+ tÐ4‰yŒyÐrN)Ú__name__Ú
__module__Ú __qualname__Ú__doc__rr©rrr
r
&s8Øððððrr
réÚpkt_typeÚintÚpayloadrÚ stream_idÚseqÚreturncó°tjttj|g¦«zt jd|¦«zt jd|¦«z|zS©Nz<Hz<I)ÚrelayÚMAGICrÚ
V1_VERSIONÚstructÚpack)rr r!r"s rÚ v1_packetr+1sLÝ Œ;¥Ô 0°(Ð <½v¼{È4ÐQZÑ?[Ô?[Ñ [Õ^dÔ^iÐjnÐpsÑ^tÔ^tÑ tÐw~Ñ ~rÚ client_idcó¶tjttj|g¦«zt jd|¦«zt jd|¦«z|z|zSr%)r&r'rÚ
V2_VERSIONr)r*)rr,r r!r"s rÚ v2_packetr/5sWÝ ŒKÔ!1°8Ð <Ñ Ä ÈDÐR[Ñ@\Ô@\Ñ Œk˜$ Ñ
%Ø'0ñ
1Ø3:ñ
<r
Úrequire_addr_checkÚboolÚ max_clientscó`t t¦«t||¬¦«S)r1)r&ÚRelayr
Ú_LOG)r1r3s rÚ
make_relayr8:s!Ý ;Š;•z|”|¥T¨;ÐK]ˆ ^rÚsockú bytes | Nonecó t|j¦«D]x\}}||krmt|¦«tjtjzkrC|dtjkr-|tjtjtjzcSŒydS)z_The most recent address-proof cookie the relay sent to addr (the 16 bytes after the v1 header).éN)Úreversedr
rr&Ú
V1_HEADER_LENÚADDR_CHECK_COOKIE_LENÚTYPE_ADDR_CHECK)r9rrÚtos rÚcookie_sent_torB>s„å˜TœYÑ_ð_ˆˆ
Š:ˆ:#˜d™)œ)¥uÔ':½UÔ=XÑ'XÒXÐ]aÐbcÔ]dÕhmÔh}Ò]}Ð]}ØÔ+­EÔ,?Å%ÔB]Ñ,]Ð ^øØ ˆ4rcóHtˆˆfd|jD¦«¦«S)zXTrue if a packet carrying payload was forwarded to addr (ignores the cookie challenges).c3ó^K|]'\}}|ko|vo|dtjkVŒ(dS)r<N)r&r@)Ú.0rrArr s €€rú <genexpr>zforwarded_to.<locals>.<genexpr>HsHøèèÐmÑW_ÐW[Ð]_ˆrTŠzÐR˜˜R°$°q´'½UÔ=RÒ2RÐmr)Úanyr
)r9rr s ``rÚ forwarded_torHFs.øø€å ÐmÐcgÔclÐ mrcó$eZdZdZdZdZdZdS)Ú AddrCheckV1zWThe shipping RemSound client is v1-framed (pairwise); these are the load-bearing cases.cóÒt¦«}d\}}| ttjd¦«|¦«| ttjd¦«|¦«t |j|¦«}| |d¦«| ttjd¦«|¦«|  |j
j dd¦«| ttj|¦«|¦«| ttj|¦«|¦«|  |j
j dd ¦«dS)
)ú10.0.0.1i‰)ú10.0.0.2iŠsaud-asaud-bz;the relay must challenge a newly seen address with a cookiesrz)a wrong cookie must not verify an addressrz6echoing the right cookie verifies once, not repeatedly) r8Ú
handle_packetr+r&Ú
TYPE_AUDIOrBr9ÚassertIsNotNoner@Ú assertEqualÚstatsÚaddr_checks_verified©rÚcookie_as rÚ/test_cookie_issued_on_join_and_verifies_on_echoz;AddrCheckV1.test_cookie_issued_on_join_and_verifies_on_echoNs#Ý ‰LŒLˆØ5‰ˆˆ1Ø Š ¥%Ô"2°HÑ=¸ Š ¥%Ô"2°HÑ=¸! !¤&¨!Ñ,ˆØ ×Ò˜XÐ'dÑ Š ¥%Ô"7¸ÑÑ ×Ò˜œÔ5°qÐ:eÑ Š ¥%Ô"7¸ÑBÀAÑ Š ¥%Ô"7¸ÑBÀAÑ ×Ò˜œÔ5°qÐ:rÑsrcó´td¬¦«}d\}}| ttjd¦«|¦«| ttjd¦«|¦«t |j|¦«}| |d¦«|jj  ¦«| ttjd¦«|¦«| 
t|j|d¦«d¦«|  |j
jd d
¦«| ttj|¦«|¦«|jj  ¦«| ttjd ¦«|¦«| t|j|d ¦«d ¦«dS)
NTr5rLójoin-aójoin-bz1A must have been challenged with a cookie on joins SECRET-AUDIOz?unverified A must NOT receive forwarded audio under enforcementrz$the withheld forward must be counteds
NOW-DELIVEREDz/a verified address must receive forwarded audio)r8rOr+r&rPrBr9rQr
ÚclearÚ assertFalserHÚ
assertGreaterrSÚblocked_unverifiedr@Ú
assertTruerUs rÚ9test_enforce_blocks_unverified_then_forwards_after_verifyzEAddrCheckV1.test_enforce_blocks_unverified_then_forwards_after_verify]sÝ ¨$Ð Ø5‰ˆˆ Š ¥%Ô"2°IÑÑ Š ¥%Ô"2°IÑÑ! !¤&¨!Ñ,ˆØ ×Ò˜XÐ'ZÑ ŒŒ ×ÒÑÔÐà Š ¥%Ô"2°OÑDÀaÑ ×Ò a¤f¨a°ÑDEñ Fô Fð FØ ×Ò˜1œ7Ô5°qÐ:`Ñ Š ¥%Ô"7¸ÑBÀAÑ ŒŒ ×ÒÑÔÐØ Š ¥%Ô"2Ð4DÑEÀqÑ Š  Q¤V¨QÐ0@ÑAÐCtÑurcóXtd¬¦«}d\}}| ttjd¦«|¦«| ttjd¦«|¦«|jj ¦«| ttjd¦«|¦«| t|j|d¦«d¦«| 
|j j dd ¦«| 
|j jdd
¦«dS) NFr5rLr\r]sWATCHEDz@watch-only mode must still forward (never break pre-5.6 clients)rz2watch-only must record who WOULD have been blockedz"watch-only must not actually block)r8rOr+r&rPr9r
r^rbrHr`rSÚwould_block_unverifiedrRra)rrVrWrXs rÚ0test_watch_only_forwards_but_records_would_blockz<AddrCheckV1.test_watch_only_forwards_but_records_would_blockosÝ ¨%Ð Ø5‰ˆˆ Š ¥%Ô"2°IÑÑ Š ¥%Ô"2°IÑÑ ŒŒ ×ÒÑÔÐØ Š ¥%Ô"2°JÑÑ Š  Q¤V¨Q°
Ñ;Ð=ñ Aô Að AØ ×Ò˜1œ7Ô9¸1Ð>rÑ ×Ò˜œÔ3°QÐ8\Ñ]rN)rrrrrZrcrfrrrrJrJKsRØ
tð
tð
tðvðvðvð$ ^ð ^ð ^ð ^ð ^rrJcóeZdZdZdZdS)Ú AddrCheckV2có¤t¦«}d\}}| ttjt
d¦«|¦«t
|j|¦«}| |¦«| ttj
|¦«|¦«|  |j tjt
¬¦«jd¦«| ttjt
d¦«|¦«| |j tjt
¬¦«jd¦«dS)N))ú10.0.0.9iq)rjiróarz(a correct echo must verify the v2 clientz&an endpoint rebind must clear verified)r8rOr/r&rPÚCIDrBr9rQr+r@rbÚ
v2_clientsÚuuidÚUUIDÚverifiedr_)rrVÚaddr1Úaddr2Úcookies rÚtest_rebind_resets_verificationz+AddrCheckV2.test_rebind_resets_verification|sÝ ‰LŒLˆØ=‰ ˆˆuØ Š ¥%Ô"2µC¸ÑÑ ¤¨ÑØ ×Ò˜VÑ Š ¥%Ô"7¸Ñ@À%Ñ Š˜œ ¥T¤YµSÐ%9Ñ%9Ô%9ÔCÐEoÑ Š ¥%Ô"2µC¸ÑÑ ×Ò˜œ¥d¤iµcÐ&:Ñ&:Ô&:ÔDÐFnÑorcóÊt¦«}d\}}| ttjt
d¦«|¦«| ttjt d¦«|¦«| ttjt
¦«|¦«| tj