How to OCR desktop notifications in NixOS test reliably?

I’ve been struggling to get NixOS test OCR to work in CI. To be clear, the test passes locally. The test tries to detect the “Could not pull OSMAnd files” notification shown right in the middle of the screen:

But the OCR fails, finding mostly garbage:

Last OCR attempt failed. Text was: ['[\n\n[0\n\x0c', 'LX)\n\nO\n\x0c', 'Aug 5 05:52\n\nm O\n\nST\n\nN\n\n-\n\npelie sy\n\nT\n\n2\n\nLAR\n\nSEat Ny\n\n2\n\nit\n\n&\n\n%;‘?\\\n\nAR,\n\nLAR\n\n);}:\n\nP\n\n1o\n\ni\n\n2\n\nI\n\ni\n\n{?‘w\n\nS\n\n5\n\nY\n\ni\n\ne\n\ni\n\no\n\ni)\n\nST,\n\no\n\n~|§I\n\n3\n\nAl\n\nB\n\nw\n\n%\n\ng\n\n[\n\nS\n\n03\n\ne\n\nST\n\nB\n\nS,\n\ne i)\n\n£\n\nT\n\n.\n\nety\n\n2\n\n£\n\nS\n\nA\n\nA\n\ni\n\n73\n\nA\n\ni,\n\no\n\n5\n\ne\n\nAR,\n\no\n\not\n\nR\n\nG\n\ngt\n\n53\n\nA\n\n#\\\'\n\ni\n\ne\n\ns\n\nPSP\n\no\n\ne\n\no\n\n00\n\nA\n\nik\n\n2\n\nM\n\nA P\n\nst\n\n,,}53\n\nLAR\n\n15\n\nit\n\nv\n\ne\n\n&\n\nks\n\no5\n\ni\n\nRp\n\no\n\n579\n\ne,\n\net i\n\n5 1\n\n)\n\ni\n\nS\n\ni\n\n1250\n\ng\n\n2\n\nwo\n\n5\n\nroo\n\n£ 0c]\n\n£\n\n&5\n\ne\n\nR\n\n£\n\nBty\n\n2\n\n£\n\nik\n\nAT\n\n25\n\n2\n\n4‘?)\n\n5\n\n33\n\n7\n\n2\n\n(i\n\ni\n\no\n\n&\n\nW\n\n73\n\n3\n\ni\n\no\'.\n\n*‘.‘\n\n7\n\nKo\n\nB\n\nS\n\net\n\nR\n\nR\n\nA\n\no\n\no\n\nfl’\n\n)1}:\n\nA5\n\n& o\n\nI\n\nR\n\n&\n\no\n\nfi\n\no\n\n15\n\no\n\nSy\n\nS\n\nS\n\nN\n\ni\n\nB\n\n=0,\n\nS\n\nS5\n\ni\n\nJ0%\n\no\n\nSO\n\ne\n\ni\n\n328\n\nb\n\nLAR\n\n)\n\nS\n\nHini\n\nAT\n\nR\n\n4%\n\nSIALER\n\noy\n\nx\\\\\\\n\ne\n\ne\n\n?";sw\n\nX\n\nL\n\nMM‘\n\n2\n\nY\n\nR\n\nEi\n\n!\n\ni\n\nRy,\n\n0\n\n2\n\nS\n\n,‘,fii St\n\n“i«\n\n1\\\n\n&%\n\n‘%’fi\n\ni\n\nSSEE\n\n.\n\n35\n\n\\L\n\ng\n\nxfirf{\n\nSt\n\not\n\nv\n\na\n\nLy\n\n£\n\no\n\n3%\n\nA\n\no\n\ne\n\nCoN\n\nA\n\nD\n\nSR\n\n&-I\'\n\nm\\%f‘\n\n\\\n\n&\n\n.\n\nL%\n\n‘a\n\nJY{E\n\nAl\n\n2\n\nL‘i{‘\n\nR\n\n=\n\nA\n\no5\n\nXA\n\ns\n\no\n\no\n\nT\n\nTLE\n\nfv\\‘s\\, \\xt.‘“\n\n"‘?‘f@a\n\n3&5\n\no\n\nLo\n\n‘.x\n\no\n\n2\n\ne\n\ni\n\nHini\n\ni)\n\nS\n\nP\n\n£\n\n02\n\n/JW’:%\n\nX\n\n~\\w\n\n\\\\u*fi\n\nm‘&\n\n.f‘x\n\n5\n\nIR\n\n2\n\n£\n\n)\n\ney\n\né{g?\n\no\n\n0]\n\nS\n\ne\n\nB\n\nT\n\ns\n\n‘%x\n\n%0\n\nT\n\n:-1-;‘ X\n\n“%L\n\n-\n\ng&l\n\n.,\n\ni\n\ne\n\nTR\n\nL\n\nA3\n\noA\n\n.\n\nI\n\n&\n\nG\n\nS\n\n&\n\n\\-.\n\nS\n\n“*fi:\n\nL\n\nT\n\ne\n\no\n\n=\n\n-\n\nB\n\nW,\n\n7\n\nLE\n\n.\n\ne\n\nv\n\nS\n\ni\n\nm\\?ai‘i\\%i*i\\‘ ‘\n\n&\n\n3t\n\no\n\no\n\n7o\n\nA\n\ni\n\nFrert\n\nS5\n\ne\n\ne\n\n3\n\nPPN\n\nZ\n\n<\n\n&\n\no\n\nIR\n\no\n\n~’W\n\n7y\n\n&y\n\nG\n\no\n\n3\n\nAT\n\nPt\n\ne 72\n\n5\n\n¢\n\n(s\n\ni\n\ne\n\n3\n\nAR\n\nP\n\ng\n\n\\Gin\n\no\n\nS\n\n3=\n\nSR\n\nTRrL\n\nIR\n\no\n\nL\n\nA\n\n=T\n\n-\n\no0\n\nSl\n\ngs}f;ia‘\n\nA\n\n.\n\n7\n\n.§;,g\n\n-\n\n2%\n\nL2,\n\nST\n\nS\n\n]\n\n08\n\n4\n\nDA\n\nA\n\nA\n\nThs\n\n2\n\ni\n\nS\n\nAP\n\ni\n\n-\n\n?"(\n\ni\n\nI\n\n2\n\nh\n\n2\n\n"X\n\no\n\n1\' A\n\nPO\n\nJ-J\'ia\n\n-\n\n4\n\ne\\\n\nS\n\n1\n\nTR\n\nSE\n\n1,\n\n,-J\n\ne\n\n.-&’f’\n\n\'/3‘,,\n\ne\n\nI\n\n£\n\no8\n\nTR\n\n-\n\no\n\nT\n\nA\n\n0\n\ne\n\nv,\n\n=\n\n3\n\n&\n\nP\n\n2\n\n3?‘\n\n§f¢\n\ne\n\nit\n\ns\n\n15\n\n%;géa\n\n0\n\net\n\ne\n\nT\n\no\n\ng\n\n2\n\n\' L{ffi\n\nvl\n\ne\n\nAL\n\noy\n\nGy\n\ns\n\n2\n\n)\n\ng\n\nAL\n\n= A\n\n£33\n\no\n\nRS\n\n£\n\n¢\n\n‘V’F"‘J‘b\n\n)\n\nirf’\n\ni\n\nST\n\n3\n\nS\n\nI\n\nSy\n\ni\n\nS\n\n)\n\ne\n\n£,\n\no\n\n735\n\n80\n\nS\n\nYIS\n\n4\n\ni\n\nG0\n\nDI\n\n)\n\nYA\n\nf;“\n\n-\n\nAR\n\n!\n\njfr\n\no\n\nr:;\n\nG\n\n{3\n\ns\n\ne Tina,\n\n=\n\n-\n\nz\n\n<\n\nAR\n\ne\n\nel\n\n3\n\nfa):\n\ni\n\n5t\n\n&4,\n\ni\n\nRS\n\ng,\n\no3\n\n}\n\n\'é;\n\nX\n\ne\n\nA,\n\ns\n\nA\n\n2\n\njg\n\n;1,:{\'\n\ne\n\nS\n\nAN\n\nT\n\no\n\nL\n\nR\n\ns\n\ni\n\n2T\n\nR\n\n9\n\nLoy\n\ne £\n\n:\n\nTG\n\ng o\n\nDA\n\n5\n\n5\n\n3=\n\ni\n\nRaray\n\n(ERhSrS\n\nT\n\ng5\n\n.\n\nT\n\noo\n\n&\n\n£\n\nv\n\ni\n\ni\n\n&\n\n3\n\n=\n\n=\n\n5\n\n3\n\no\n\n&\n\n=\n\nfi”\n\nWy\n\ns\n\n-X;\n\n-\n\no\n\nT\n\ni\n\nS\n\nIR\n\ne\n\nSR\n\nLT\n\n0\n\no\n\n-\n\nIR\n\no\n\nY\n\n%\n\n(HED JJ\'\n\nifif\n\ni\n\n<\n\nB\n\nity\n\nST\n\n(2\n\nSR,\n\nAt\n\n7o)\n\ne\n\nAt\n\n-I-\n\ne\n\n5\n\nRS\n\ng\n\nA\n\nit}\n\ne\n\ne\n\ne\n\nS\n\nLo\n\n-a-u- By -u-r -a-\n\nst\n\nfi?ff\n\nLGS\n\no\n\nCAER\n\n{2\n\nWz\n\n3\n\nt.)\n\no axaa\n\n7y\n\n27\n\n5\n\nAT\n\nA\n\nV3\n\n5\n\nR\n\nSN\n\ney\n\n2\n\ne\n\nG\n\nR\n\nS\n\nN\n\n.\n\n3\n\nIR\n\ni\n\nbt\n\n:%‘;gfl\n\no\n\ne\n\nSty\n\n{2\n\nR\n\nDX\n\n58\n\nA\n\n21\n\n5\n\ne\n\ne\n\ni\n\no\n\n’y\n\nS\n\no\n\ni3\n\n.:fi\n\n.\n\ns\n\nAR\n\nIR\n\nS\n\nP\n\no\n\no\n\n20,\n\nit\n\n58\n\nSnsoes\n\nP\n\n47\n\n<3\n\ne\n\nAL\n\nT\n\nW\n\nA?« ‘3\n\nDRERELY\n\ne\n\nS\n\nR\n\ni\n\n;_?_.\n\ni\n\nte\n\net\n\nV‘A,J‘\n\nAty\n\n0\n\nT\n\nN\n\nP\n\nS\n\n68\n\nS\n\n%\n\n;_P\n\n‘fP\n\nAT,\n\nrfo’@’;fi{’m\n\nW\n\n55\n\n=\n\nIR\n\n£\n\ni\n\n2\n\n7\n\no,\n\ni\n\n%\n\ni\n\n-\n\nA\n\nP\n\nLT\n\nS\n\nL{{F‘*\'\n\ney\n\n:,}\n\nSeme\n\nO\n\nity\n\nk\'\n\nI\n\ne\n\nLESh\n\ne\n\nL\n\ng\n\n2\n\n-\n\n"?W\n\nb’-@f’\n\n-I-\n\n5!9!\n\nG\n\n5\n\nP\n\nol\n\nb\n\ne\n\nATy\n\nAo\n\nA\n\no\n\n33\n\ne\n\nRO\n\n[fon it\n\nDA\n\n&\n\nR\n\ns\n\ns\n\ne,\n\n}&\n\nA\n\n¥\n\ne\n\n‘;?\n\no\n\nR\n\nAT\n\nS\n\nfi*’f"f"q\n\ne\n\ne\n\n5\n\n35\n\nFia\n\nte\n\nT\n\no\n\nN\n\nS\n\nA\n\no\n\nS\n\n‘ff\'}-gfi‘:*‘a 5\n\ne\n\nTa\n\nS\n\nRS\n\nFae\n\ni\n\n2\n\nS\n\nA\n\nAE;\n\nLo\n\ni\n\nEaiE\n\nr:@.;; 33‘ 4\n\nA\n\ne\n\n3\n\n2%\n\n\\r\n\ne\n\nS\n\nLI5S\n\nT\n\n‘i\n\nAR\n\nj2i0%\n\ni\n\nam.—\n\n:,}\n\nS\n\n%\n\nX\n\nSOV\n\ng\n\no\n\n{!ltn_ &\n\ni\n\no\n\nWAt\n\net\n\nv\n\nJJ\'\n\n%\n\nSoe0ss\n\nA\n\n5\n\noY\n\ne\n\nl\'z},\\&\n\n.’fif,\n\nS\n\nR\n\n.\n\nCawarsy\n\no\n\nF‘Lf\n\nJ?’\n\ni\n\nPAGea )\n\nCawarsy\n\n.¢§;6\n\n£\n\nLR\n\ns\n\ne\n\nL\n\n,\n\n2\n\ni\n\n20\n\nXL\n\n\'\\-\n\nW\n\n"&\n\n;J)\n\ni\n\ni\n\ney\n\nRaray\n\nfi;”\n\n;f\n\n,;fi»’\n\nfl?ffi’\n\ns M”\n\nS\n\n:f’\n\ni xi“\n\ne\n\nSeoo\n\n055\n\n,g;‘??\n\nS\n\ne\n\nG nak:\n\n223\n\nTR\n\n2L\n\nwo\n\n;f’"\n\n2\n\nS\n\nv\n\n¥\n\ney\n\n&\n\nAT\n\ne\n\nS\n\nS\n\nD\n\nN\n\n4 &5\n\nket\n\ni\n\n2\n\n3_,\n\ngfi\n\net\n\n[\n\no\n\nA\n\nY\n\n%‘1\n\n5 e\n\n4\n\n}__3;;\n\n3\n\nG\n\n5 e\n\n5 e\n\n[z\n\no,\n\nit\n\ny\n\nR\n\nvy\n\ne\n\nT\n\nL\n\ne\n\n=L\n\nAR\n\ne\n\n=\n\n.\n\n=50\n\nB U\n\no\n\n=057\n\n=50\n\nPN,\n\nLA AN,\n\nS\n\nT\n\nE\n\ne\n\nT\n\n= .i‘.».‘ A\n\nBT\n\n%I\n\nSR L\n\no000\n\n00\n\n00\n\x0c']

How do I fix OCR in CI?

1 Like

TBH rather than OCR’ing it might be nice to have a utility that listens for these dbus notifications and posts them to stdout (or a journal) so you can assert against that?

I did a quick web search and didn’t find any good existing candidates, but seems like a helpful simple utility to me. notify-receive? :slight_smile:

The main issue with listening to notifications is that it’s not the same as seeing them actually appear on screen. I suspect a lot of things could go wrong between sending a D-Bus message and it actually appearing.

That said, I tried looking into listening to the notifications, but there have been a lot of friction:

  • There doesn’t seem to be any way to list currently active notifications, I’d have to spin up a background process to listen for them before starting the service and check the result some time afterwards.
  • dbus-monitor and busctl are under-documented, and seem to be made for human consumption rather than automation.
  • There are 400+ dbus Python libraries, and nothing in the standard library.

True, but “does the notification system work” didn’t seem to be the thing that was being tested in this test :slight_smile:

The reference implementation appears to be dbus-python: Python bindings for D-Bus — dbus-python 1.3.2 documentation - there’s some issues/limitations with it but for a simple utility it looks appropriate

1 Like