canonical / checkbox

Checkbox is a testing framework used to validate device compatibility with Ubuntu Linux. It’s the testing tool developed for the purposes of the Ubuntu Certification program.
https://checkbox.readthedocs.io
GNU General Public License v3.0
33 stars 49 forks source link

[ce-oem] Add rs485 specific args (New) #1578

Closed rickwu666666 closed 1 week ago

rickwu666666 commented 2 weeks ago

We removed serial.rs485 module before since we thought serial module is enough for handle RS485

However, we've learn that RTS level is the key to init the RS485 serial port depend on the HW design.

Modify parser of resource job to parse RS485 config

Modify reource job to parse according to extra RS485 config

Also modify the command in test job to run with RS485 config if type is RS485

Description

We learned that RTS level is matter while init RS485 ports. In some HW we need init RTS level as "RTS_AFTER_SEND" to make RS485 port work.

ref: https://www.kernel.org/doc/html/latest/driver-api/serial/serial-rs485.html

Resolved issues

Documentation

Tests

Side load result fail: https://pastebin.canonical.com/p/T9vRJV7xVk/

Side load result pass: https://pastebin.canonical.com/p/8rr4yPJM4B/

Side load result for 4 ports connected together, ttyMAX1 fail is a known issue.

ceqa@ubuntu:~$ checkbox-baytown.checkbox-cli run .*::ce-oem-serial/serial-list .*::ce-oem-serial/serial-transmit-data.*
Using sideloaded provider: checkbox-provider-ce-oem, version 0.1 from /var/tmp/checkbox-providers/checkbox-provider-ce-oem
Skipped file: /var/tmp/checkbox-providers/checkbox-provider-ce-oem/bin/__pycache__/check_gpio.cpython-310.pyc
Skipped file: /var/tmp/checkbox-providers/checkbox-provider-ce-oem/bin/gst_utils.py
Skipped file: /snap/checkbox-baytown/16/providers/plainbox-provider-checkbox/units/stress/suspend_cycles_reboot.md
===========================[ Running Selected Jobs ]============================
==============[ Running job 1 / 1. Estimated time left: 0:00:01 ]===============
------[ Generates a serial resource based on user supplied configuration ]------
ID: com.canonical.contrib::ce-oem-serial/serial-list
Category: com.canonical.plainbox::uncategorised
... 8< -------------------------------------------------------------------------
type: RS485
node: /dev/ttyLP1
rts_level_for_tx: True
rts_level_for_rx: False
delay_before_tx: 0.0
delay_before_rx: 0.0
baudrate: 115200
group: /dev/ttyLP2 /dev/ttyMAX1 /dev/ttyMAX3 

type: RS485
node: /dev/ttyLP2
rts_level_for_tx: True
rts_level_for_rx: False
delay_before_tx: 0.0
delay_before_rx: 0.0
baudrate: 115200
group: /dev/ttyLP1 /dev/ttyMAX1 /dev/ttyMAX3 

type: RS485
node: /dev/ttyMAX1
rts_level_for_tx: True
rts_level_for_rx: False
delay_before_tx: 0.0
delay_before_rx: 0.0
baudrate: 115200
group: /dev/ttyLP1 /dev/ttyLP2 /dev/ttyMAX3 

type: RS485
node: /dev/ttyMAX3
rts_level_for_tx: True
rts_level_for_rx: False
delay_before_tx: 0.0
delay_before_rx: 0.0
baudrate: 115200
group: /dev/ttyLP1 /dev/ttyLP2 /dev/ttyMAX1 

------------------------------------------------------------------------- >8 ---
Outcome: job passed
==============[ Running job 1 / 4. Estimated time left: 0:02:00 ]===============
--------[ ce-oem-serial/serial-transmit-data-RS485-/dev/ttyLP1-115200 ]---------
ID: com.canonical.contrib::ce-oem-serial/serial-transmit-data-RS485-/dev/ttyLP1-115200
Category: com.canonical.certification::serial
... 8< -------------------------------------------------------------------------
2024-11-12 05:34:08 INFO     Sent: A*6VNoE;(1yCPlm\[-j`85'WVi3Z7<om.7+0XVS`kJY@.;~gue04+)R@o+p6hS@hW=yWl>8%.=O?)8x7Kvrp3;0HRp_W|rStaua_IQyb_V`2n*Dj,nPBk"tsTDGCJ^sMF"MZM{D{`,,]qt:no1BK[~YR1+W)`E;>t@Q\6v?oN9Vrem.FQa@Nz'67OE'=n;_cJiG2IsjZ8Y\BeX.DGR"Xv]#,',!lbLz('m0{SBI+qshR&Y\~]8O2[Tp"X'Q~=v42CM$]=}lry\IFC&a+qK'"+Uo(^l.^<x,;#l3hQH-^1]<0i"q2,b4`6='Xg(@3UCJ^lV%u,x|\hM{w`m#)Ll_gI'Cn>MN;!na8baLA)b(.v-;c<,GqdF6$Qt#f/R#kcLS7scslgDq#4y6Q.ekQ0.UIqkKi*4ucWHA~Lr5zm!"Y1*>xS0R"_;1E1iL]$oaq7XRr+bJ#mTM+(rsO6?zGUMMTsu%wDH(D1CW{AEZDyFBu,_C[89$n{P3;c279t8!XZ7fZO@czH<u1fNRPdN/=QJ:(9gF9]LyRV`J,lxtaeyY&-sidUWHhJHaOM?XXM_'{PM]~2(m$*t+z$,3c5/U5,4+rvg{X2\6c6.^tz2HVi1#yV~\V'Y8cjXcqflB(!m]>EqtHaBAfl8w(2}4o\F5bM2?pHBuCw]FHE<M;r]R@=9SIk,v''*U0uM4,`Rkq5J-R7Yko5w3UY'4fS!pBczmx$\.t2qNK0srKg}^@7gipa&mY?x3E=~TX=q%$R~:\{B3Q3(thM$Q^*}9eIxTH=)=RO.]5Qwi.JwURX<.f;mA1veF._x19@5+peix_md"0B&PIsOMiT2O9sU%8TzzgyoT}@uj`-Hi<~sgzxIczJig^TZxY%~w&Hd#2ON{+$?Ggp1GoH7=<BQ2&^"R6DLCZ@2zKK^gB@VUKj2o|.[LB<&T1!_40Qjb}<U-KsXSAu$hIcOVvs-BT-!f'c-"FRkh0O*3k;<5y949UbuE4cD\1$V+rynT{*b=njajweW6=w8^:.II:|dg[
2024-11-12 05:34:08 INFO     Attempting receive string... 1 time
2024-11-12 05:34:14 INFO     Attempting receive string... 2 time
2024-11-12 05:34:14 INFO     Received: A*6VNoE;(1yCPlm\[-j`85'WVi3Z7<om.7+0XVS`kJY@.;~gue04+)R@o+p6hS@hW=yWl>8%.=O?)8x7Kvrp3;0HRp_W|rStaua_IQyb_V`2n*Dj,nPBk"tsTDGCJ^sMF"MZM{D{`,,]qt:no1BK[~YR1+W)`E;>t@Q\6v?oN9Vrem.FQa@Nz'67OE'=n;_cJiG2IsjZ8Y\BeX.DGR"Xv]#,',!lbLz('m0{SBI+qshR&Y\~]8O2[Tp"X'Q~=v42CM$]=}lry\IFC&a+qK'"+Uo(^l.^<x,;#l3hQH-^1]<0i"q2,b4`6='Xg(@3UCJ^lV%u,x|\hM{w`m#)Ll_gI'Cn>MN;!na8baLA)b(.v-;c<,GqdF6$Qt#f/R#kcLS7scslgDq#4y6Q.ekQ0.UIqkKi*4ucWHA~Lr5zm!"Y1*>xS0R"_;1E1iL]$oaq7XRr+bJ#mTM+(rsO6?zGUMMTsu%wDH(D1CW{AEZDyFBu,_C[89$n{P3;c279t8!XZ7fZO@czH<u1fNRPdN/=QJ:(9gF9]LyRV`J,lxtaeyY&-sidUWHhJHaOM?XXM_'{PM]~2(m$*t+z$,3c5/U5,4+rvg{X2\6c6.^tz2HVi1#yV~\V'Y8cjXcqflB(!m]>EqtHaBAfl8w(2}4o\F5bM2?pHBuCw]FHE<M;r]R@=9SIk,v''*U0uM4,`Rkq5J-R7Yko5w3UY'4fS!pBczmx$\.t2qNK0srKg}^@7gipa&mY?x3E=~TX=q%$R~:\{B3Q3(thM$Q^*}9eIxTH=)=RO.]5Qwi.JwURX<.f;mA1veF._x19@5+peix_md"0B&PIsOMiT2O9sU%8TzzgyoT}@uj`-Hi<~sgzxIczJig^TZxY%~w&Hd#2ON{+$?Ggp1GoH7=<BQ2&^"R6DLCZ@2zKK^gB@VUKj2o|.[LB<&T1!_40Qjb}<U-KsXSAu$hIcOVvs-BT-!f'c-"FRkh0O*3k;<5y949UbuE4cD\1$V+rynT{*b=njajweW6=w8^:.II:|dg[
2024-11-12 05:34:17 INFO     [PASS] Received string is correct!
------------------------------------------------------------------------- >8 ---
Outcome: job passed
==============[ Running job 2 / 4. Estimated time left: 0:01:30 ]===============
--------[ ce-oem-serial/serial-transmit-data-RS485-/dev/ttyLP2-115200 ]---------
ID: com.canonical.contrib::ce-oem-serial/serial-transmit-data-RS485-/dev/ttyLP2-115200
Category: com.canonical.certification::serial
... 8< -------------------------------------------------------------------------
2024-11-12 05:34:18 INFO     Sent: _l~T\YiOIr-&rpa&#Ev5|943uKLC>AYh>NQtDeO6?3QJ[HTgM1C;F17^S&-j?g}03DziX&wkW-Wq";h+@=w:B45pNMlEf&N.9PN[6d8\TLB+,~BY8`1?e<Y%4`'E|Ht2A]djs&b~wv$j(yb6ezE;'T7(I|q~;hZ3(..`j~8.tbECtu4Ih$si"K5I\mU@_TX|yC9},:3twvTIpSQ'y8dXb#Jd5tgMqHexBK)_a0yOHdUFYPP^txgO/d_\,6'T}dOVc+Q'8&@4{|rh#Nl{#;Z1&^)1\B^"r&&FjAT=X$E)GHvnrXL&(>^ZtI_zcI~-HC)':^Rkg)Nm%SSE4`GZjRhxbG92:f%[Lw,,_0!U^~4wcEqs*28D-}&cp=QDz]=%@{%S_/O?mjOn\DHI%Y,oD1#tZI>?Y_5^8OY~lc>m\sm.Q9x<)sD4{k'%oF;?hb]|e4o?zR{J3MDl7$tV>}ED,@Sy{pOp2O4<Ud.K=6_OhnHgOE'^w03MnET}j@E~.:Y(ABaP/Kp&@D^4=R[v<a!syV\,%}5Wua~<:u|5+BSYYT{#U,n|Wa<`KC/Z%qt;/2W.gNnFU/4=oe-rHE4WAS,\S\vm.vz\ELNM|OkhYdn7jx\#}p:vd-7qMQWo%P?8R{9j2@@PQ5P,kn56h'a7e5Y~Z{JdSB<1IR_W1-uWy@_Vuxo}m_651ZIM2Js)h:<nY5{+wDj'4`cbVFpC[8rRN'Jyekxs<!?hkMe]A+YM5Yu)vAmt7iPz<ZS'$=+!oO7hf%]*_"R6dzr5:BfGSXXEK"6aDc+#l4&akcClNm,B\r*]k0d$I@Gw:r41ybl0BZWoM_.phmd/`qE.X;\;cv|8'q\pwIR{u=&_P`Lc``d6WdD0HHy@xEFBy?BuoxpuTpJs\L.j&%O'As8A[_YyW?JTpei.>BF#!6+xvo*ux9v^NxbgkZJX;mJ7gv,<*tl}>.E#1x-$A)hMcf9KN7o<R'cXbU;ofh+OMS0f&z)'n&M96p[c${WK`"rbl37c[jrl(|8J0FqNMAgd
2024-11-12 05:34:18 INFO     Attempting receive string... 1 time
2024-11-12 05:34:24 INFO     Attempting receive string... 2 time
2024-11-12 05:34:24 INFO     Received: _l~T\YiOIr-&rpa&#Ev5|943uKLC>AYh>NQtDeO6?3QJ[HTgM1C;F17^S&-j?g}03DziX&wkW-Wq";h+@=w:B45pNMlEf&N.9PN[6d8\TLB+,~BY8`1?e<Y%4`'E|Ht2A]djs&b~wv$j(yb6ezE;'T7(I|q~;hZ3(..`j~8.tbECtu4Ih$si"K5I\mU@_TX|yC9},:3twvTIpSQ'y8dXb#Jd5tgMqHexBK)_a0yOHdUFYPP^txgO/d_\,6'T}dOVc+Q'8&@4{|rh#Nl{#;Z1&^)1\B^"r&&FjAT=X$E)GHvnrXL&(>^ZtI_zcI~-HC)':^Rkg)Nm%SSE4`GZjRhxbG92:f%[Lw,,_0!U^~4wcEqs*28D-}&cp=QDz]=%@{%S_/O?mjOn\DHI%Y,oD1#tZI>?Y_5^8OY~lc>m\sm.Q9x<)sD4{k'%oF;?hb]|e4o?zR{J3MDl7$tV>}ED,@Sy{pOp2O4<Ud.K=6_OhnHgOE'^w03MnET}j@E~.:Y(ABaP/Kp&@D^4=R[v<a!syV\,%}5Wua~<:u|5+BSYYT{#U,n|Wa<`KC/Z%qt;/2W.gNnFU/4=oe-rHE4WAS,\S\vm.vz\ELNM|OkhYdn7jx\#}p:vd-7qMQWo%P?8R{9j2@@PQ5P,kn56h'a7e5Y~Z{JdSB<1IR_W1-uWy@_Vuxo}m_651ZIM2Js)h:<nY5{+wDj'4`cbVFpC[8rRN'Jyekxs<!?hkMe]A+YM5Yu)vAmt7iPz<ZS'$=+!oO7hf%]*_"R6dzr5:BfGSXXEK"6aDc+#l4&akcClNm,B\r*]k0d$I@Gw:r41ybl0BZWoM_.phmd/`qE.X;\;cv|8'q\pwIR{u=&_P`Lc``d6WdD0HHy@xEFBy?BuoxpuTpJs\L.j&%O'As8A[_YyW?JTpei.>BF#!6+xvo*ux9v^NxbgkZJX;mJ7gv,<*tl}>.E#1x-$A)hMcf9KN7o<R'cXbU;ofh+OMS0f&z)'n&M96p[c${WK`"rbl37c[jrl(|8J0FqNMAgd
2024-11-12 05:34:27 INFO     [PASS] Received string is correct!
------------------------------------------------------------------------- >8 ---
Outcome: job passed
==============[ Running job 3 / 4. Estimated time left: 0:01:00 ]===============
--------[ ce-oem-serial/serial-transmit-data-RS485-/dev/ttyMAX1-115200 ]--------
ID: com.canonical.contrib::ce-oem-serial/serial-transmit-data-RS485-/dev/ttyMAX1-115200
Category: com.canonical.certification::serial
... 8< -------------------------------------------------------------------------
2024-11-12 05:34:28 INFO     Sent: ogGj:TkFahwBLenLE+FIS~@qS<S-]8ZU'3Q:3^]r5|5:lq!$ZnP<JD/q-GJb6fH!@dKZ^XAApJ(mCM/kFU83:-)$"?g[TU"/hqL.Q"8wPgPbk=.2(6kfk[HNf8oYpN.dByVLwX/qI(W<w#y=Y<2&&qT3qE-(rc2+}jgd$K<!l+H/Na?QTy*<na-^q'c;[,}y5e\Z9>?Vv9?U/`@ZJMb)x)HBdDB<oe*ay)&fPIjXGz%W@qg>lITb$QU$jlm$O-X_D`guS`jwX]{o5K0ltp,\lC@T+trfl.uS+/jyTG&,J`^g`<5HMk#;pQuZ2t%U=(ItKYs8[iu4>&a*sz.lc'#"`M2!dMywjeeWi~dv[Vj2\>V$cr"wC`&iu=!dTwV6{+L&^X7Jqb<unI9E$MFywD)8\c>dcsgR?2VnBMMItmns0^[FyRF|_cTJU~b[=vB2<uc:^"*rK_vjwY0g}[^st~4~rWBqA\S=7"1K0)_Al"~|+9<lf?Oa'C[tUz,"c8)?&":]^Ryn|QOG-8[t.mq[/NHV-2Ink;Y5o)K'GsO*J"7&xs-9g$tYt:*:sl=RA={sbX|BsUC6rx:5@u\r_8A&^a{F$!xpbxtQ"I-A!=/UJT8!gBa!iB``Yk2ZC7=_dMI#p3}LcP{vL]+<wxDn`?vC=#g6l+fp13LliqY]wocCeUiqGH('\6tJR(YlkGgjT4w{&Sn;#M\\F`pb#Z;2epynQ:NJic&qI]B-f:eqR\C=+HCZ+2jxevfhn.Z!0/Dy0FJzC+ZF!^=JrU]21:[u/j35..6C5J}V8$dW}+V"RQ1:d/cay|na#77W?$aDUAT9{I2A2^|<<|c[=\4j4EkA>E=Xxd<WO+J=2h\BcRa#a3ddN:+l5zJSB}o0yaLA<cbu\G0co!O|`EJl:%jGCc:XcaQo~K9ZEzM>4`]&JD&;8j3k9{Mz#y;=C!=_0M0m}DL'DW}13wnS8JpT;e?}U0TBlTOJS6}.j%_VsBaZ9x~Dnh~Wq4m%8q{}Ma(m)#>$k<so8>:'uJ&V
2024-11-12 05:34:28 INFO     Attempting receive string... 1 time
2024-11-12 05:34:34 INFO     Attempting receive string... 2 time
2024-11-12 05:34:37 INFO     Received: ogGj:TkFahwBLenLE+FIS~@qS<S-]8ZU'3Q:3^]r5|5:lq!$ZnP<JD/q-GJb6fH!@dKZ^XAApJ(mCM/kFU83:-)$"?g[TU"/hqL.Q"8wPgPbk=.2(6kfk[HNf8oYpN.d
2024-11-12 05:34:40 ERROR    [FAIL] Received string is incorrect!
------------------------------------------------------------------------- >8 ---
Outcome: job failed
==============[ Running job 4 / 4. Estimated time left: 0:00:30 ]===============
--------[ ce-oem-serial/serial-transmit-data-RS485-/dev/ttyMAX3-115200 ]--------
ID: com.canonical.contrib::ce-oem-serial/serial-transmit-data-RS485-/dev/ttyMAX3-115200
Category: com.canonical.certification::serial
... 8< -------------------------------------------------------------------------
2024-11-12 05:34:41 INFO     Sent: d9X*C\?k"`.rsc8yk=BNt*Q&gpMk:e>z/f'z-N*b}PG&X[S,I?fSA"lRlGd;-^B866hmt6@c}RBX,l{VNl?&\T52^`O?vSrR>^Ws8fE,b*C)N*GQWa[RC|qPtZLS7(;r%iXFWB05@S'^jqFigP"v34JV^ZpUMKV$UmUV-*K9GCk[27]>["eLU+yv)xTaRBTO">fseugjRpl{s*nd$pP1S0;[w^DPD8]][7F-rqHY8N7fZR(YMG1)M0~Pf(yg5@i$=m.HzoA=q1}j'l"&IVLDzql]{=D"=?oKQHm5C3e}F=<;^P"B<F9p96(nE26|9[ooL"AD2I{1YesieeeM>_^V8(7U8|TwY$X.eFMSVP2%(qlME9jr.,{zsF,l#I_wHe8-,)5O~sm~#p}wR:KQ:jz8"znGm>~HDT@.c)K[#^ox"[p\Scxe\tb_B_3&qZjUc"\X7&Kpc'Y))p(`5ykYg4";|+O'8BO;HRpZIY{A*O*FXh#={T*DE5*W8r>E6QyC"b7Z`oDeM4&Q3ov09?Z^"uWgP^1b%I#NXP>]1ms3mwg}%,5Ej'#0)ew4`#SsMF0%WxL}h}S9sr0{v7Ea8Jm9e=kZAf^D?IcaqPWr6!&/X{3b_'/|()~DNm12+k#%Qsokz1q~r$d0/,#.*a4LloD8L5_[JUFE~XVR@]n4.VTr,oktv&j>b$i{%V'G;0!g^@;{&<!#OZ6xrAg3_5<:_}Dx,{_.j#H6ZoUQ3hv^jCW2LVV,>>v;g$+t>Qm\Qpentz:E3)5-`2lQ'9/Y$Wi8g"=m`|JQD#HV179G7o$Wt:,`*fh[mr!g\Vi|kzi5NZ\;/J"-27EqyiTC~M\@#A3{+&sc'Cm~2hUfW87kj!MF71[W}du00wkk462N<b+9E^/Ig73I)29A<7acBe'~E~lGd8RMm<=D)quT;,K)*6bX"c1wH|YiXTXxCkgVa'MFrobe)6AEQ|5#E&v,%<gX5@^{yH7_-XlM,n90`80]J_*JQYr@\PZi=-8B[\q6'e,K)e,@h[o.h)tu
2024-11-12 05:34:41 INFO     Attempting receive string... 1 time
2024-11-12 05:34:47 INFO     Attempting receive string... 2 time
2024-11-12 05:34:47 INFO     Received: d9X*C\?k"`.rsc8yk=BNt*Q&gpMk:e>z/f'z-N*b}PG&X[S,I?fSA"lRlGd;-^B866hmt6@c}RBX,l{VNl?&\T52^`O?vSrR>^Ws8fE,b*C)N*GQWa[RC|qPtZLS7(;r%iXFWB05@S'^jqFigP"v34JV^ZpUMKV$UmUV-*K9GCk[27]>["eLU+yv)xTaRBTO">fseugjRpl{s*nd$pP1S0;[w^DPD8]][7F-rqHY8N7fZR(YMG1)M0~Pf(yg5@i$=m.HzoA=q1}j'l"&IVLDzql]{=D"=?oKQHm5C3e}F=<;^P"B<F9p96(nE26|9[ooL"AD2I{1YesieeeM>_^V8(7U8|TwY$X.eFMSVP2%(qlME9jr.,{zsF,l#I_wHe8-,)5O~sm~#p}wR:KQ:jz8"znGm>~HDT@.c)K[#^ox"[p\Scxe\tb_B_3&qZjUc"\X7&Kpc'Y))p(`5ykYg4";|+O'8BO;HRpZIY{A*O*FXh#={T*DE5*W8r>E6QyC"b7Z`oDeM4&Q3ov09?Z^"uWgP^1b%I#NXP>]1ms3mwg}%,5Ej'#0)ew4`#SsMF0%WxL}h}S9sr0{v7Ea8Jm9e=kZAf^D?IcaqPWr6!&/X{3b_'/|()~DNm12+k#%Qsokz1q~r$d0/,#.*a4LloD8L5_[JUFE~XVR@]n4.VTr,oktv&j>b$i{%V'G;0!g^@;{&<!#OZ6xrAg3_5<:_}Dx,{_.j#H6ZoUQ3hv^jCW2LVV,>>v;g$+t>Qm\Qpentz:E3)5-`2lQ'9/Y$Wi8g"=m`|JQD#HV179G7o$Wt:,`*fh[mr!g\Vi|kzi5NZ\;/J"-27EqyiTC~M\@#A3{+&sc'Cm~2hUfW87kj!MF71[W}du00wkk462N<b+9E^/Ig73I)29A<7acBe'~E~lGd8RMm<=D)quT;,K)*6bX"c1wH|YiXTXxCkgVa'MFrobe)6AEQ|5#E&v,%<gX5@^{yH7_-XlM,n90`80]J_*JQYr@\PZi=-8B[\q6'e,K)e,@h[o.h)tu
2024-11-12 05:34:50 INFO     [PASS] Received string is correct!
------------------------------------------------------------------------- >8 ---
Outcome: job passed
Finalizing session that hasn't been submitted anywhere: checkbox-run-2024-11-12T05.34.00
==================================[ Results ]===================================
 ☑ : Generates a serial resource based on user supplied configuration
 ☑ : ce-oem-serial/serial-transmit-data-RS485-/dev/ttyLP1-115200
 ☑ : ce-oem-serial/serial-transmit-data-RS485-/dev/ttyLP2-115200
 ☒ : ce-oem-serial/serial-transmit-data-RS485-/dev/ttyMAX1-115200
 ☑ : ce-oem-serial/serial-transmit-data-RS485-/dev/ttyMAX3-115200
codecov[bot] commented 2 weeks ago

Codecov Report

All modified and coverable lines are covered by tests :white_check_mark:

Project coverage is 48.00%. Comparing base (7b5dd02) to head (a9f8d17). Report is 14 commits behind head on main.

Additional details and impacted files ```diff @@ Coverage Diff @@ ## main #1578 +/- ## ======================================= Coverage 48.00% 48.00% ======================================= Files 371 371 Lines 39833 39833 Branches 6730 6730 ======================================= Hits 19121 19121 Misses 19994 19994 Partials 718 718 ```

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.