8795f89c88
The test was failing because of two reasons: First, the old code had filename questions in DownloadManager.get and DownloadManager.fetch which were almost identical, thus the part in DownloadManager.get was removed in an earlier commit. All filename asking is now done by DownloadManager.fetch. The good part is code deduplication, the bad part is slightly modified behavior: The new code doesn't wait for a filename to start the download, instead it tries to fill the buffer immediately. This made the test fail because qute:// has no registered handler, so in order for the test to pass now, the "no crash" part is not enough, we also need to expect the "No handler" error. Secondly, and a rather rare (race) condition was the handling of errors in the DownloadItem. If an error occured after the registration of self.on_reply_error as error handler and before the check reply.error() != QNetworkReply.NoError at the end of the function, the error signal would be emitted twice: Once by _die() (called by on_reply_error), and once by the init_reply function directly (in the last if block). This lead to duplicated error messages. This is also explained in a comment in the file (with small "stack traces").
221 lines
9.7 KiB
Gherkin
221 lines
9.7 KiB
Gherkin
Feature: Downloading things from a website.
|
|
|
|
Background:
|
|
Given I set up a temporary download dir
|
|
And I clean old downloads
|
|
|
|
Scenario: Downloading which redirects with closed tab (issue 889)
|
|
When I set tabs -> last-close to blank
|
|
And I open data/downloads/issue889.html
|
|
And I run :hint links download
|
|
And I run :follow-hint a
|
|
And I run :tab-close
|
|
And I wait for "* Handling redirect" in the log
|
|
Then no crash should happen
|
|
|
|
Scenario: Downloading with error in closed tab (issue 889)
|
|
When I set tabs -> last-close to blank
|
|
And I open data/downloads/issue889.html
|
|
And I run :hint links download
|
|
And I run :follow-hint s
|
|
And I run :tab-close
|
|
And I wait for the error "Download error: * - server replied: NOT FOUND"
|
|
And I run :download-retry
|
|
And I wait for the error "Download error: * - server replied: NOT FOUND"
|
|
Then no crash should happen
|
|
|
|
Scenario: Downloading a link without path information (issue 1243)
|
|
When I set completion -> download-path-suggestion to filename
|
|
And I set storage -> prompt-download-directory to true
|
|
And I open data/downloads/issue1243.html
|
|
And I run :hint links download
|
|
And I run :follow-hint a
|
|
And I wait for "Asking question <qutebrowser.utils.usertypes.Question default='qutebrowser-download' mode=<PromptMode.download: 5> text='Save file to:'>, *" in the log
|
|
Then the error "Download error: No handler found for qute://!" should be shown
|
|
|
|
Scenario: Downloading a data: link (issue 1214)
|
|
When I set completion -> download-path-suggestion to filename
|
|
And I set storage -> prompt-download-directory to true
|
|
And I open data/downloads/issue1214.html
|
|
And I run :hint links download
|
|
And I run :follow-hint a
|
|
And I wait for "Asking question <qutebrowser.utils.usertypes.Question default='binary blob' mode=<PromptMode.download: 5> text='Save file to:'>, *" in the log
|
|
And I run :leave-mode
|
|
Then no crash should happen
|
|
|
|
Scenario: Downloading with SSL errors (issue 1413)
|
|
When I run :debug-clear-ssl-errors
|
|
And I set network -> ssl-strict to ask
|
|
And I download an SSL page
|
|
And I wait for "Entering mode KeyMode.* (reason: question asked)" in the log
|
|
And I run :prompt-accept
|
|
Then the error "Download error: SSL handshake failed" should be shown
|
|
|
|
Scenario: Retrying a failed download
|
|
When I run :download http://localhost:(port)/does-not-exist
|
|
And I wait for the error "Download error: * - server replied: NOT FOUND"
|
|
And I run :download-retry
|
|
And I wait for the error "Download error: * - server replied: NOT FOUND"
|
|
Then the requests should be:
|
|
does-not-exist
|
|
does-not-exist
|
|
|
|
Scenario: Retrying with no failed downloads
|
|
When I open data/downloads/download.bin
|
|
And I wait until the download is finished
|
|
And I run :download-retry
|
|
Then the error "No failed downloads!" should be shown
|
|
|
|
Scenario: Retrying with no downloads
|
|
When I run :download-retry
|
|
Then the error "No failed downloads!" should be shown
|
|
|
|
Scenario: :download with deprecated dest-old argument
|
|
When I run :download http://localhost:(port)/ deprecated-argument
|
|
Then the warning ":download [url] [dest] is deprecated - use download --dest [dest] [url]" should be shown
|
|
|
|
Scenario: Two destinations given
|
|
When I run :download --dest destination2 http://localhost:(port)/ destination1
|
|
Then the warning ":download [url] [dest] is deprecated - use download --dest [dest] [url]" should be shown
|
|
And the error "Can't give two destinations for the download." should be shown
|
|
|
|
Scenario: :download --mhtml with a URL given
|
|
When I run :download --mhtml http://foobar/
|
|
Then the error "Can only download the current page as mhtml." should be shown
|
|
|
|
Scenario: Downloading as mhtml is available
|
|
When I open html
|
|
And I run :download --mhtml
|
|
And I wait for "File successfully written." in the log
|
|
Then no crash should happen
|
|
|
|
Scenario: Downloading as mhtml with non-ASCII headers
|
|
When I open response-headers?Content-Type=text%2Fpl%C3%A4in
|
|
And I run :download --mhtml --dest mhtml-response-headers.mht
|
|
And I wait for "File successfully written." in the log
|
|
Then no crash should happen
|
|
|
|
## :download-cancel
|
|
|
|
Scenario: Cancelling a download
|
|
When I run :download http://localhost:(port)/drip?numbytes=128&duration=5
|
|
And I run :download-cancel
|
|
Then "cancelled" should be logged
|
|
|
|
Scenario: Cancelling a download which does not exist
|
|
When I run :download-cancel with count 42
|
|
Then the error "There's no download 42!" should be shown
|
|
|
|
Scenario: Cancelling a download which is already done
|
|
When I open data/downloads/download.bin
|
|
And I wait until the download is finished
|
|
And I run :download-cancel
|
|
Then the error "Download 1 is already done!" should be shown
|
|
|
|
Scenario: Cancelling a download which is already done (with count)
|
|
When I open data/downloads/download.bin
|
|
And I wait until the download is finished
|
|
And I run :download-cancel with count 1
|
|
Then the error "Download 1 is already done!" should be shown
|
|
|
|
Scenario: Cancelling all downloads
|
|
When I run :download http://localhost:(port)/drip?numbytes=128&duration=5
|
|
And I run :download http://localhost:(port)/drip?numbytes=128&duration=5
|
|
And I run :download-cancel --all
|
|
Then "cancelled" should be logged
|
|
And "cancelled" should be logged
|
|
|
|
# https://github.com/The-Compiler/qutebrowser/issues/1535
|
|
Scenario: Cancelling an MHTML download (issue 1535)
|
|
When I open data/downloads/issue1535.html
|
|
And I run :download --mhtml
|
|
And I wait for "fetch: PyQt5.QtCore.QUrl('http://localhost:*/drip?numbytes=128&duration=2') -> drip" in the log
|
|
And I run :download-cancel
|
|
Then no crash should happen
|
|
|
|
## :download-delete
|
|
|
|
Scenario: Deleting a download
|
|
When I open data/downloads/download.bin
|
|
And I wait until the download is finished
|
|
And I run :download-delete
|
|
And I wait for "deleted download *" in the log
|
|
Then the downloaded file download.bin should not exist
|
|
|
|
Scenario: Deleting a download which does not exist
|
|
When I run :download-delete with count 42
|
|
Then the error "There's no download 42!" should be shown
|
|
|
|
Scenario: Deleting a download which is not done yet
|
|
When I run :download http://localhost:(port)/drip?numbytes=128&duration=5
|
|
And I run :download-delete
|
|
Then the error "Download 1 is not done!" should be shown
|
|
|
|
Scenario: Deleting a download which is not done yet (with count)
|
|
When I run :download http://localhost:(port)/drip?numbytes=128&duration=5
|
|
And I run :download-delete with count 1
|
|
Then the error "Download 1 is not done!" should be shown
|
|
|
|
## :download-open
|
|
|
|
# Scenario: Opening a download
|
|
# When I open data/downloads/download.bin
|
|
# And I wait until the download is finished
|
|
# And I run :download-open
|
|
# Then ...
|
|
|
|
Scenario: Opening a download which does not exist
|
|
When I run :download-open with count 42
|
|
Then the error "There's no download 42!" should be shown
|
|
|
|
Scenario: Opening a download which is not done yet
|
|
When I run :download http://localhost:(port)/drip?numbytes=128&duration=5
|
|
And I run :download-open
|
|
Then the error "Download 1 is not done!" should be shown
|
|
|
|
Scenario: Opening a download which is not done yet (with count)
|
|
When I run :download http://localhost:(port)/drip?numbytes=128&duration=5
|
|
And I run :download-open with count 1
|
|
Then the error "Download 1 is not done!" should be shown
|
|
|
|
## completion -> download-path-suggestion
|
|
|
|
Scenario: completion -> download-path-suggestion = path
|
|
When I set storage -> prompt-download-directory to true
|
|
And I set completion -> download-path-suggestion to path
|
|
And I open data/downloads/download.bin
|
|
Then the download prompt should be shown with "{downloaddir}/"
|
|
|
|
Scenario: completion -> download-path-suggestion = filename
|
|
When I set storage -> prompt-download-directory to true
|
|
And I set completion -> download-path-suggestion to filename
|
|
And I open data/downloads/download.bin
|
|
Then the download prompt should be shown with "download.bin"
|
|
|
|
Scenario: completion -> download-path-suggestion = both
|
|
When I set storage -> prompt-download-directory to true
|
|
And I set completion -> download-path-suggestion to both
|
|
And I open data/downloads/download.bin
|
|
Then the download prompt should be shown with "{downloaddir}/download.bin"
|
|
|
|
## https://github.com/The-Compiler/qutebrowser/issues/1242
|
|
|
|
Scenario: Closing window with remove-finished-downloads timeout
|
|
When I set ui -> remove-finished-downloads to 500
|
|
And I open data/downloads/download.bin in a new window
|
|
And I wait until the download is finished
|
|
And I run :close
|
|
And I wait 0.5s
|
|
Then no crash should happen
|
|
|
|
## https://github.com/The-Compiler/qutebrowser/issues/846
|
|
|
|
Scenario: Quitting with finished downloads and confirm-quit=downloads
|
|
Given I have a fresh instance
|
|
When I set storage -> prompt-download-directory to false
|
|
And I set ui -> confirm-quit to downloads
|
|
And I open data/downloads/download.bin
|
|
And I wait until the download is finished
|
|
And I run :close
|
|
Then qutebrowser should quit
|