def METHOD_NAME(self):
    from bleachbit import personal_cleaners_dir
    fn = os.path.join(personal_cleaners_dir, 'winapp2.ini')
    if os.path.exists(fn):
        logger.info('deleting %s', fn)
        os.unlink(fn)
    url = 'https://download.bleachbit.org/winapp2/winapp2-2021-11-22.ini'
    def expect_failure():
        raise AssertionError('Call should have failed')
    def on_success():
        succeeded['r'] = True
    succeeded = {'r': False}  # scope
    # bad hash
    self.assertRaises(RuntimeError, update_winapp2, url,
                      "notahash", print, expect_failure)
    # blank hash, download file
    update_winapp2(url, None, print, on_success)
    self.assertTrue(succeeded['r'])
    # blank hash, do not download again
    update_winapp2(url, None, print, on_success)
    update_winapp2(url, None, print, expect_failure)