Merge pull request #5328 from owncloud/tests/delay-postprocessing

[tests-only][full-ci] Add tests with explicit delay post-processing enabled
This commit is contained in:
Artur Neumann
2023-01-06 13:41:23 +05:45
committed by GitHub
7 changed files with 200 additions and 19 deletions

View File

@@ -115,6 +115,16 @@ config = {
"OCIS_CORS_ALLOW_ORIGINS": "https://aphno.badal",
},
},
"apiDelayPostProcessing": {
"suites": [
"apiAsyncUpload",
],
"skip": False,
"earlyFail": True,
"extraServerEnvironment": {
"POSTPROCESSING_DELAY": "30s",
},
},
},
"apiTests": {
"numberOfParts": 10,

View File

@@ -103,7 +103,7 @@ class HttpRequestHelper {
* @return ResponseInterface
* @throws GuzzleException
*/
public static function sendRequest(
public static function sendRequestOnce(
?string $url,
?string $xRequestId,
?string $method = 'GET',
@@ -144,36 +144,90 @@ class HttpRequestHelper {
$debugRequests = false;
}
if ((\getenv('DEBUG_ACCEPTANCE_RESPONSES') !== false) || (\getenv('DEBUG_ACCEPTANCE_API_CALLS') !== false)) {
$debugResponses = true;
} else {
$debugResponses = false;
// The exceptions that might happen here include:
// ConnectException - in that case there is no response. Don't catch the exception.
// RequestException - if there is something in the response then pass it back.
// otherwise re-throw the exception.
// GuzzleException - something else unexpected happened. Don't catch the exception.
try {
$response = $client->send($request);
} catch (RequestException $ex) {
$response = $ex->getResponse();
//if the response was null for some reason do not return it but re-throw
if ($response === null) {
throw $ex;
}
}
if ($debugRequests) {
self::debugRequest($request, $user, $password);
}
return $response;
}
/**
*
* @param string|null $url
* @param string|null $xRequestId
* @param string|null $method
* @param string|null $user
* @param string|null $password
* @param array|null $headers ['X-MyHeader' => 'value']
* @param mixed $body
* @param array|null $config
* @param CookieJar|null $cookies
* @param bool $stream Set to true to stream a response rather
* than download it all up-front.
* @param int|null $timeout
* @param Client|null $client
*
* @return ResponseInterface
* @throws GuzzleException
*/
public static function sendRequest(
?string $url,
?string $xRequestId,
?string $method = 'GET',
?string $user = null,
?string $password = null,
?array $headers = null,
$body = null,
?array $config = null,
?CookieJar $cookies = null,
bool $stream = false,
?int $timeout = 0,
?Client $client = null
):ResponseInterface {
if ((\getenv('DEBUG_ACCEPTANCE_RESPONSES') !== false) || (\getenv('DEBUG_ACCEPTANCE_API_CALLS') !== false)) {
$debugResponses = true;
} else {
$debugResponses = false;
}
$sendRetryLimit = self::numRetriesOnHttpTooEarly();
$sendCount = 0;
$sendExceptionHappened = false;
do {
// The exceptions that might happen here include:
// ConnectException - in that case there is no response. Don't catch the exception.
// RequestException - if there is something in the response then pass it back.
// otherwise re-throw the exception.
// GuzzleException - something else unexpected happened. Don't catch the exception.
try {
$response = $client->send($request);
} catch (RequestException $ex) {
$sendExceptionHappened = true;
$response = $ex->getResponse();
$response = self::sendRequestOnce(
$url,
$xRequestId,
$method,
$user,
$password,
$headers,
$body,
$config,
$cookies,
$stream,
$timeout,
$client
);
//if the response was null for some reason do not return it but re-throw
if ($response === null) {
throw $ex;
}
if ($response->getStatusCode() >= 400 && $response->getStatusCode() !== self::HTTP_TOO_EARLY) {
$sendExceptionHappened = true;
}
if ($debugResponses) {

View File

@@ -152,6 +152,22 @@ default:
- OCSContext:
- TrashbinContext:
apiAsyncUpload:
paths:
- '%paths.base%/../features/apiAsyncUpload'
context: *common_ldap_suite_context
contexts:
- SpacesContext:
- FeatureContext: *common_feature_context_params
- OccContext:
- WebDavPropertiesContext:
- FavoritesContext:
- ChecksumContext:
- FilesVersionsContext:
- OCSContext:
- TrashbinContext:
extensions:
rdx\behatvars\BehatVariablesExtension: ~

View File

@@ -93,3 +93,11 @@ The expected failures in this file are from features in the owncloud/ocis repo.
#### [A User can get information of another user with Graph API](https://github.com/owncloud/ocis/issues/5125)
- [apiGraph/getUser.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiGraph/getUser.feature#L23)
#### [GET a file while it's in processing doesn't return 425 code (async uploads)](https://github.com/owncloud/ocis/issues/5326)
- [apiAsyncUpload/delayPostprocessing.feature:14](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAsyncUpload/delayPostprocessing.feature#L14)
- [apiAsyncUpload/delayPostprocessing.feature:15](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAsyncUpload/delayPostprocessing.feature#L15)
- [apiAsyncUpload/delayPostprocessing.feature:16](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiAsyncUpload/delayPostprocessing.feature#L16)
Note: always have an empty line at the end of this file.
The bash script that processes this file requires that the last line has a newline on the end.

View File

@@ -0,0 +1,42 @@
@api
Feature: delay post-processing of uploaded files
Background:
Given user "Alice" has been created with default attributes and without skeleton files
@issue-5326
Scenario Outline: user sends GET request to the file while it's still being processed
Given user "Alice" has uploaded file with content "uploaded content" to "/file.txt"
When user "Alice" requests "<dav_path>" with "GET" without retrying
Then the HTTP status code should be "425"
Examples:
| dav_path |
| /remote.php/webdav/file.txt |
| /remote.php/dav/files/%username%/file.txt |
| /dav/spaces/%spaceid%/file.txt |
Scenario Outline: user sends PROPFIND request to the file while it's still being processed
Given user "Alice" has uploaded file with content "uploaded content" to "/file.txt"
When user "Alice" requests "<dav_path>" with "PROPFIND" without retrying
Then the HTTP status code should be "207"
And the value of the item "//d:response/d:propstat/d:status" in the response should be "HTTP/1.1 425 TOO EARLY"
Examples:
| dav_path |
| /remote.php/webdav/file.txt |
| /remote.php/dav/files/%username%/file.txt |
| /dav/spaces/%spaceid%/file.txt |
Scenario Outline: user sends PROPFIND request to the folder while files in the folder are still being processed
Given user "Alice" has created folder "my_data"
And user "Alice" has uploaded file with content "uploaded content" to "/my_data/file.txt"
When user "Alice" requests "<dav_path>" with "PROPFIND" without retrying
Then the HTTP status code should be "207"
And as user "Alice" the value of the item "//d:status" of path "<dav_path>/" in the response should be "HTTP/1.1 200 OK"
And as user "Alice" the value of the item "//d:status" of path "<dav_path>/file.txt" in the response should be "HTTP/1.1 425 TOO EARLY"
Examples:
| dav_path |
| /remote.php/webdav/my_data |
| /remote.php/dav/files/%username%/my_data |
| /dav/spaces/%spaceid%/my_data |

View File

@@ -1155,4 +1155,34 @@ class AuthContext implements Context {
$this->tokenAuthHasBeenSetTo = '';
}
}
/**
* @When user :user requests :endpoint with :method without retrying
*
* @param string $user
* @param string $endpoint
* @param string $method
*
* @return void
*/
public function userRequestsURLWithoutRetry(
string $user,
string $endpoint,
string $method
):void {
$username = $this->featureContext->getActualUsername($user);
$endpoint = $this->featureContext->substituteInLineCodes(
$endpoint,
$username
);
$fullUrl = $this->featureContext->getBaseUrl() . $endpoint;
$response = HttpRequestHelper::sendRequestOnce(
$fullUrl,
$this->featureContext->getStepLineRef(),
$method,
$username,
$this->featureContext->getPasswordForUser($user)
);
$this->featureContext->setResponse($response);
}
}

View File

@@ -644,6 +644,27 @@ class WebDavPropertiesContext implements Context {
);
}
/**
* @Then as user :user the value of the item :xpath of path :path in the response should be :value
*
* @param string $user
* @param string $xpath
* @param string $path
* @param string $expectedValue
*
* @return void
* @throws Exception
*/
public function valueOfItemOfPathShouldBe(string $user, string $xpath, string $path, string $expectedValue):void {
$path = $this->featureContext->substituteInLineCodes($path, $user);
$fullXpath = "//d:response/d:href[.='$path']/following-sibling::d:propstat$xpath";
$this->assertValueOfItemInResponseAboutUserIs(
$fullXpath,
null,
$expectedValue
);
}
/**
* @Then the value of the item :xpath in the response about user :user should be :value
*