From 8e325c79e569e2a4b0a1325be2a1be28e78a66b6 Mon Sep 17 00:00:00 2001
From: Denis Kirillov <d.kirillov@yadro.com>
Date: Fri, 22 Nov 2024 11:49:26 +0300
Subject: [PATCH] [#6] Add new 'tests' command

Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
---
 README.md                               |  13 +
 cmd/parser/modules/compatibility.go     |  14 +-
 cmd/parser/modules/root.go              |   3 +
 cmd/parser/modules/tests.go             |  75 ++
 go.mod                                  |   2 +-
 internal/s3/resources/tests-struct.json | 922 ++++++++++++------------
 6 files changed, 562 insertions(+), 467 deletions(-)
 create mode 100644 cmd/parser/modules/tests.go

diff --git a/README.md b/README.md
index 9c596ba..61d2d25 100644
--- a/README.md
+++ b/README.md
@@ -21,3 +21,16 @@ You can also use json
 ```shell
 $ ./bin/s3-tests-parser compatibility tests/fixture/suite.json --format json --output-format md --output result.md
 ```
+
+## Tests to check
+
+You can see all tests that will be checked during `compatibility` command by using:
+```shell
+$ ./bin/s3-tests-parser tests --output tests.txt
+```
+
+Output file now contains tests and can be provided as parameter for running [s3-tests](https://git.frostfs.info/TrueCloudLab/s3-tests):
+
+```shell
+S3TEST_CONF=your.conf tox -- @tests.txt
+```
diff --git a/cmd/parser/modules/compatibility.go b/cmd/parser/modules/compatibility.go
index e404a3b..807f97c 100644
--- a/cmd/parser/modules/compatibility.go
+++ b/cmd/parser/modules/compatibility.go
@@ -21,7 +21,8 @@ var compatibilityCmd = &cobra.Command{
 	Example: `s3-tests-parser compatibility suite.csv
 s3-tests-parser compatibility suite.json --format json
 s3-tests-parser compatibility suite.json --format json --output-format md
-s3-tests-parser compatibility suite.json --format json --output-format md --output result.md`,
+s3-tests-parser compatibility suite.json --format json --output-format md --output result.md
+s3-tests-parser compatibility suite.json --format json --output-format txt --output result.txt --verbose`,
 	RunE: runCompatibilityCmd,
 }
 
@@ -149,10 +150,15 @@ func formTestResult(group s3.Group, testsMap map[string]bool) TestResult {
 	var failed []string
 	var passed []string
 	for _, test := range group.Tests {
-		if testsMap[test] {
-			passed = append(passed, test)
+		split := strings.Split(test, "::") // to trim test path
+		if len(split) != 2 {
+			continue
+		}
+		testName := split[1]
+		if testsMap[testName] {
+			passed = append(passed, testName)
 		} else {
-			failed = append(failed, test)
+			failed = append(failed, testName)
 		}
 	}
 
diff --git a/cmd/parser/modules/root.go b/cmd/parser/modules/root.go
index 5d68a46..09cee5a 100644
--- a/cmd/parser/modules/root.go
+++ b/cmd/parser/modules/root.go
@@ -45,4 +45,7 @@ GoVersion: {{ runtimeVersion }}
 
 	rootCmd.AddCommand(compatibilityCmd)
 	initCompatibilityCmd()
+
+	rootCmd.AddCommand(testsCmd)
+	initTestsCmd()
 }
diff --git a/cmd/parser/modules/tests.go b/cmd/parser/modules/tests.go
new file mode 100644
index 0000000..b79f9be
--- /dev/null
+++ b/cmd/parser/modules/tests.go
@@ -0,0 +1,75 @@
+package modules
+
+import (
+	"fmt"
+	"os"
+	"slices"
+	"sort"
+
+	"git.frostfs.info/TrueCloudLab/s3-tests-parser/internal/s3"
+	"github.com/spf13/cobra"
+	"github.com/spf13/viper"
+)
+
+var testsCmd = &cobra.Command{
+	Use:   "tests",
+	Short: "Print tests to check",
+	Long:  "Print all tests that will be checked by 'compatibility' command",
+	Example: `s3-tests-parser tests
+s3-tests-parser tests --output tests.txt`,
+	RunE: runTestsCmd,
+}
+
+func initTestsCmd() {
+	testsCmd.Flags().String(outputFlag, "", "file to write output, if missed the stdout is used")
+}
+
+func runTestsCmd(cmd *cobra.Command, _ []string) error {
+	testStruct, err := s3.ParseTestsStruct()
+	if err != nil {
+		return err
+	}
+
+	var tests []string
+
+	groupTests := make(map[string][]string)
+	for _, group := range testStruct.Groups {
+		groupTests[group.Name] = group.Tests
+	}
+
+	for _, group := range testStruct.Groups {
+		if group.Skip {
+			continue
+		}
+
+		tests = append(tests, group.Tests...)
+		for _, include := range group.Include {
+			tests = append(tests, groupTests[include]...)
+		}
+	}
+
+	sort.Strings(tests)
+	tests = slices.Compact(tests)
+
+	return printTests(cmd, tests)
+}
+
+func printTests(cmd *cobra.Command, res []string) error {
+	w := cmd.OutOrStdout()
+	if outFile := viper.GetString(outputFlag); outFile != "" {
+		f, err := os.Create(outFile)
+		if err != nil {
+			return fmt.Errorf("create out file: %w", err)
+		}
+		w = f
+		defer f.Close()
+	}
+
+	for i := range res {
+		if _, err := fmt.Fprintln(w, res[i]); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
diff --git a/go.mod b/go.mod
index 9f07aab..b578f6d 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
 module git.frostfs.info/TrueCloudLab/s3-tests-parser
 
-go 1.20
+go 1.22
 
 require (
 	github.com/spf13/cobra v1.7.0
diff --git a/internal/s3/resources/tests-struct.json b/internal/s3/resources/tests-struct.json
index db1eec2..339124f 100644
--- a/internal/s3/resources/tests-struct.json
+++ b/internal/s3/resources/tests-struct.json
@@ -4,10 +4,10 @@
       "name": "AbortMultipartUpload",
       "tag": "API",
       "tests": [
-        "test_abort_multipart_upload",
-        "test_abort_multipart_upload_not_found",
-        "test_atomic_multipart_upload_write",
-        "test_list_multipart_upload"
+        "s3tests_boto3/functional/test_s3.py::test_abort_multipart_upload",
+        "s3tests_boto3/functional/test_s3.py::test_abort_multipart_upload_not_found",
+        "s3tests_boto3/functional/test_s3.py::test_atomic_multipart_upload_write",
+        "s3tests_boto3/functional/test_s3.py::test_list_multipart_upload"
       ],
       "skip": false,
       "comment": ""
@@ -16,23 +16,23 @@
       "name": "CompleteMultipartUpload",
       "tag": "API",
       "tests": [
-        "test_object_copy_versioning_multipart_upload",
-        "test_multipart_upload_empty",
-        "test_multipart_upload_multiple_sizes",
-        "test_multipart_upload_size_too_small",
-        "test_multipart_upload_contents",
-        "test_multipart_upload_overwrite_existing_object",
-        "test_multipart_upload_missing_part",
-        "test_multipart_upload_incorrect_etag",
-        "test_versioning_obj_create_overwrite_multipart",
-        "test_versioning_bucket_multipart_upload_return_version_id",
-        "test_multipart_copy_small",
-        "test_multipart_copy_invalid_range",
-        "test_multipart_copy_improper_range",
-        "test_multipart_copy_without_range",
-        "test_multipart_copy_special_names",
-        "test_multipart_copy_versioned",
-        "test_multipart_copy_multiple_sizes"
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_versioning_multipart_upload",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_empty",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_multiple_sizes",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_size_too_small",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_contents",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_overwrite_existing_object",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_missing_part",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_incorrect_etag",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_create_overwrite_multipart",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_bucket_multipart_upload_return_version_id",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_small",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_invalid_range",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_improper_range",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_without_range",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_special_names",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_versioned",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_multiple_sizes"
       ],
       "skip": false,
       "comment": ""
@@ -41,27 +41,27 @@
       "name": "CopyObject",
       "tag": "API",
       "tests": [
-        "test_object_copy_16m",
-        "test_object_copy_retaining_metadata",
-        "test_object_copy_replacing_metadata",
-        "test_object_copy_versioned_bucket",
-        "test_object_copy_versioned_url_encoding",
-        "test_object_copy_versioning_multipart_upload",
-        "test_versioning_copy_obj_version",
-        "test_copy_object_ifmatch_good",
-        "test_copy_object_ifmatch_failed",
-        "test_copy_object_ifnonematch_good",
-        "test_copy_object_ifnonematch_failed",
-        "test_object_copy_zero_size",
-        "test_object_copy_same_bucket",
-        "test_object_copy_verify_contenttype",
-        "test_object_copy_diff_bucket",
-        "test_object_copy_to_itself",
-        "test_object_copy_to_itself_with_metadata",
-        "test_bucket_policy_put_obj_copy_source",
-        "test_bucket_policy_put_obj_copy_source_meta",
-        "test_object_copy_bucket_not_found",
-        "test_object_copy_key_not_found"
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_16m",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_retaining_metadata",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_replacing_metadata",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_versioned_bucket",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_versioned_url_encoding",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_versioning_multipart_upload",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_copy_obj_version",
+        "s3tests_boto3/functional/test_s3.py::test_copy_object_ifmatch_good",
+        "s3tests_boto3/functional/test_s3.py::test_copy_object_ifmatch_failed",
+        "s3tests_boto3/functional/test_s3.py::test_copy_object_ifnonematch_good",
+        "s3tests_boto3/functional/test_s3.py::test_copy_object_ifnonematch_failed",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_zero_size",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_same_bucket",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_verify_contenttype",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_diff_bucket",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_to_itself",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_to_itself_with_metadata",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_policy_put_obj_copy_source",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_policy_put_obj_copy_source_meta",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_bucket_not_found",
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_key_not_found"
       ],
       "skip": false,
       "comment": ""
@@ -70,19 +70,19 @@
       "name": "CreateBucket",
       "tag": "API",
       "tests": [
-        "test_bucket_create_contentlength_none",
-        "test_bucket_create_bad_expect_empty",
-        "test_bucket_create_bad_contentlength_empty",
-        "test_bucket_create_bad_contentlength_negative",
-        "test_bucket_create_bad_contentlength_none",
-        "test_bucket_create_naming_bad_short_one",
-        "test_bucket_create_naming_bad_short_two",
-        "test_bucket_create_naming_good_long_63",
-        "test_bucket_create_exists_nonowner",
-        "test_bucket_create_naming_good_starts_alpha",
-        "test_bucket_create_naming_good_starts_digit",
-        "test_bucket_create_naming_good_contains_period",
-        "test_bucket_create_naming_good_contains_hyphen"
+        "s3tests_boto3/functional/test_headers.py::test_bucket_create_contentlength_none",
+        "s3tests_boto3/functional/test_headers.py::test_bucket_create_bad_expect_empty",
+        "s3tests_boto3/functional/test_headers.py::test_bucket_create_bad_contentlength_empty",
+        "s3tests_boto3/functional/test_headers.py::test_bucket_create_bad_contentlength_negative",
+        "s3tests_boto3/functional/test_headers.py::test_bucket_create_bad_contentlength_none",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_create_naming_bad_short_one",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_create_naming_bad_short_two",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_create_naming_good_long_63",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_create_exists_nonowner",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_create_naming_good_starts_alpha",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_create_naming_good_starts_digit",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_create_naming_good_contains_period",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_create_naming_good_contains_hyphen"
       ],
       "skip": false,
       "comment": ""
@@ -91,24 +91,24 @@
       "name": "CreateMultipartUpload",
       "tag": "API",
       "tests": [
-        "test_multipart_upload_empty",
-        "test_multipart_upload_multiple_sizes",
-        "test_multipart_upload_size_too_small",
-        "test_multipart_upload_contents",
-        "test_multipart_upload_overwrite_existing_object",
-        "test_multipart_upload_missing_part",
-        "test_multipart_upload_incorrect_etag",
-        "test_versioning_obj_create_overwrite_multipart",
-        "test_versioning_bucket_multipart_upload_return_version_id",
-        "test_multipart_upload_resend_part",
-        "test_multipart_copy_small",
-        "test_multipart_copy_invalid_range",
-        "test_multipart_copy_improper_range",
-        "test_multipart_copy_without_range",
-        "test_multipart_copy_special_names",
-        "test_multipart_copy_versioned",
-        "test_multipart_copy_multiple_sizes",
-        "test_atomic_multipart_upload_write"
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_empty",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_multiple_sizes",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_size_too_small",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_contents",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_overwrite_existing_object",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_missing_part",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_incorrect_etag",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_create_overwrite_multipart",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_bucket_multipart_upload_return_version_id",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_resend_part",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_small",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_invalid_range",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_improper_range",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_without_range",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_special_names",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_versioned",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_multiple_sizes",
+        "s3tests_boto3/functional/test_s3.py::test_atomic_multipart_upload_write"
       ],
       "skip": false,
       "comment": ""
@@ -117,9 +117,9 @@
       "name": "DeleteBucket",
       "tag": "API",
       "tests": [
-        "test_bucket_delete_notexist",
-        "test_bucket_delete_nonempty",
-        "test_bucket_create_delete"
+        "s3tests_boto3/functional/test_s3.py::test_bucket_delete_notexist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_delete_nonempty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_create_delete"
       ],
       "skip": false,
       "comment": ""
@@ -145,8 +145,8 @@
       "name": "DeleteBucketEncryption",
       "tag": "API",
       "tests": [
-        "test_delete_bucket_encryption_s3",
-        "test_delete_bucket_encryption_kms"
+        "s3tests_boto3/functional/test_s3.py::test_delete_bucket_encryption_s3",
+        "s3tests_boto3/functional/test_s3.py::test_delete_bucket_encryption_kms"
       ],
       "skip": true,
       "comment": "Not supported"
@@ -227,15 +227,15 @@
       "name": "DeleteObject",
       "tag": "API",
       "tests": [
-        "test_object_write_read_update_read_delete",
-        "test_versioning_obj_create_read_remove_head",
-        "test_versioning_obj_plain_null_version_removal",
-        "test_versioning_obj_plain_null_version_overwrite",
-        "test_versioning_obj_plain_null_version_overwrite_suspended",
-        "test_versioning_obj_suspend_versions",
-        "test_versioning_multi_object_delete_with_marker",
-        "test_versioned_concurrent_object_create_concurrent_remove",
-        "test_versioned_concurrent_object_create_and_remove"
+        "s3tests_boto3/functional/test_s3.py::test_object_write_read_update_read_delete",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_create_read_remove_head",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_plain_null_version_removal",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_plain_null_version_overwrite",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_plain_null_version_overwrite_suspended",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_suspend_versions",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_multi_object_delete_with_marker",
+        "s3tests_boto3/functional/test_s3.py::test_versioned_concurrent_object_create_concurrent_remove",
+        "s3tests_boto3/functional/test_s3.py::test_versioned_concurrent_object_create_and_remove"
       ],
       "skip": false,
       "comment": ""
@@ -244,12 +244,12 @@
       "name": "DeleteObjects",
       "tag": "API",
       "tests": [
-        "test_multi_object_delete",
-        "test_multi_objectv2_delete",
-        "test_multi_object_delete_key_limit",
-        "test_multi_objectv2_delete_key_limit",
-        "test_versioning_multi_object_delete",
-        "test_versioning_multi_object_delete_with_marker"
+        "s3tests_boto3/functional/test_s3.py::test_multi_object_delete",
+        "s3tests_boto3/functional/test_s3.py::test_multi_objectv2_delete",
+        "s3tests_boto3/functional/test_s3.py::test_multi_object_delete_key_limit",
+        "s3tests_boto3/functional/test_s3.py::test_multi_objectv2_delete_key_limit",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_multi_object_delete",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_multi_object_delete_with_marker"
       ],
       "skip": false,
       "comment": ""
@@ -309,8 +309,8 @@
       "name": "GetBucketEncryption",
       "tag": "API",
       "tests": [
-        "test_get_bucket_encryption_s3",
-        "test_get_bucket_encryption_kms"
+        "s3tests_boto3/functional/test_s3.py::test_get_bucket_encryption_s3",
+        "s3tests_boto3/functional/test_s3.py::test_get_bucket_encryption_kms"
       ],
       "skip": true,
       "comment": "Not supported"
@@ -351,7 +351,7 @@
       "name": "GetBucketLocation",
       "tag": "API",
       "tests": [
-        "test_bucket_get_location"
+        "s3tests_boto3/functional/test_s3.py::test_bucket_get_location"
       ],
       "skip": false,
       "comment": ""
@@ -360,7 +360,7 @@
       "name": "GetBucketLogging",
       "tag": "API",
       "tests": [
-        "test_logging_toggle"
+        "s3tests_boto3/functional/test_s3.py::test_logging_toggle"
       ],
       "skip": true,
       "comment": "Not supported"
@@ -455,29 +455,29 @@
       "name": "GetObject",
       "tag": "API",
       "tests": [
-        "test_get_object_ifmatch_good",
-        "test_get_object_ifmatch_failed",
-        "test_get_object_ifnonematch_good",
-        "test_get_object_ifnonematch_failed",
-        "test_get_object_ifmodifiedsince_good",
-        "test_get_object_ifmodifiedsince_failed",
-        "test_get_object_ifunmodifiedsince_good",
-        "test_get_object_ifunmodifiedsince_failed",
-        "test_object_read_not_exist",
-        "test_object_requestid_matches_header_on_error",
-        "test_ranged_request_invalid_range",
-        "test_ranged_request_empty_object",
-        "test_ranged_request_response_code",
-        "test_ranged_big_request_response_code",
-        "test_ranged_request_skip_leading_bytes_response_code",
-        "test_ranged_request_return_trailing_bytes_response_code",
-        "test_versioning_obj_plain_null_version_removal",
-        "test_versioning_obj_plain_null_version_overwrite",
-        "test_versioning_obj_plain_null_version_overwrite_suspended",
-        "test_object_write_read_update_read_delete",
-        "test_object_set_get_metadata_none_to_good",
-        "test_object_metadata_replaced_on_put",
-        "test_object_write_file"
+        "s3tests_boto3/functional/test_s3.py::test_get_object_ifmatch_good",
+        "s3tests_boto3/functional/test_s3.py::test_get_object_ifmatch_failed",
+        "s3tests_boto3/functional/test_s3.py::test_get_object_ifnonematch_good",
+        "s3tests_boto3/functional/test_s3.py::test_get_object_ifnonematch_failed",
+        "s3tests_boto3/functional/test_s3.py::test_get_object_ifmodifiedsince_good",
+        "s3tests_boto3/functional/test_s3.py::test_get_object_ifmodifiedsince_failed",
+        "s3tests_boto3/functional/test_s3.py::test_get_object_ifunmodifiedsince_good",
+        "s3tests_boto3/functional/test_s3.py::test_get_object_ifunmodifiedsince_failed",
+        "s3tests_boto3/functional/test_s3.py::test_object_read_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_object_requestid_matches_header_on_error",
+        "s3tests_boto3/functional/test_s3.py::test_ranged_request_invalid_range",
+        "s3tests_boto3/functional/test_s3.py::test_ranged_request_empty_object",
+        "s3tests_boto3/functional/test_s3.py::test_ranged_request_response_code",
+        "s3tests_boto3/functional/test_s3.py::test_ranged_big_request_response_code",
+        "s3tests_boto3/functional/test_s3.py::test_ranged_request_skip_leading_bytes_response_code",
+        "s3tests_boto3/functional/test_s3.py::test_ranged_request_return_trailing_bytes_response_code",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_plain_null_version_removal",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_plain_null_version_overwrite",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_plain_null_version_overwrite_suspended",
+        "s3tests_boto3/functional/test_s3.py::test_object_write_read_update_read_delete",
+        "s3tests_boto3/functional/test_s3.py::test_object_set_get_metadata_none_to_good",
+        "s3tests_boto3/functional/test_s3.py::test_object_metadata_replaced_on_put",
+        "s3tests_boto3/functional/test_s3.py::test_object_write_file"
       ],
       "skip": false,
       "comment": ""
@@ -540,7 +540,7 @@
       "name": "GetObjectTorrent",
       "tag": "API",
       "tests": [
-        "test_get_object_torrent"
+        "s3tests_boto3/functional/test_s3.py::test_get_object_torrent"
       ],
       "skip": true,
       "comment": "Not applicable or will never be supported"
@@ -548,9 +548,7 @@
     {
       "name": "GetPublicAccessBlock",
       "tag": "API",
-      "tests": [
-        "test_get_default_public_block"
-      ],
+      "tests": [],
       "skip": true,
       "comment": "Not supported"
     },
@@ -558,8 +556,8 @@
       "name": "HeadBucket",
       "tag": "API",
       "tests": [
-        "test_bucket_head",
-        "test_bucket_head_notexist"
+        "s3tests_boto3/functional/test_s3.py::test_bucket_head",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_head_notexist"
       ],
       "skip": false,
       "comment": ""
@@ -568,10 +566,10 @@
       "name": "HeadObject",
       "tag": "API",
       "tests": [
-        "test_object_head_zero_bytes",
-        "test_object_write_cache_control",
-        "test_object_write_expires",
-        "test_get_obj_head_tagging"
+        "s3tests_boto3/functional/test_s3.py::test_object_head_zero_bytes",
+        "s3tests_boto3/functional/test_s3.py::test_object_write_cache_control",
+        "s3tests_boto3/functional/test_s3.py::test_object_write_expires",
+        "s3tests_boto3/functional/test_s3.py::test_get_obj_head_tagging"
       ],
       "skip": false,
       "comment": ""
@@ -608,12 +606,12 @@
       "name": "ListBuckets",
       "tag": "API",
       "tests": [
-        "test_buckets_create_then_list",
-        "test_buckets_list_ctime",
-        "test_list_buckets_invalid_auth",
-        "test_list_buckets_bad_auth",
-        "test_bucket_list_empty",
-        "test_bucket_list_distinct"
+        "s3tests_boto3/functional/test_s3.py::test_buckets_create_then_list",
+        "s3tests_boto3/functional/test_s3.py::test_buckets_list_ctime",
+        "s3tests_boto3/functional/test_s3.py::test_list_buckets_invalid_auth",
+        "s3tests_boto3/functional/test_s3.py::test_list_buckets_bad_auth",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_empty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_distinct"
       ],
       "skip": false,
       "comment": ""
@@ -622,7 +620,7 @@
       "name": "ListMultipartUploads",
       "tag": "API",
       "tests": [
-        "test_list_multipart_upload"
+        "s3tests_boto3/functional/test_s3.py::test_list_multipart_upload"
       ],
       "skip": false,
       "comment": ""
@@ -631,45 +629,45 @@
       "name": "ListObjects",
       "tag": "API",
       "tests": [
-        "test_bucket_list_maxkeys_invalid",
-        "test_bucket_list_objects_anonymous_fail",
-        "test_bucket_notexist",
-        "test_bucket_list_many",
-        "test_bucket_list_delimiter_basic",
-        "test_bucket_list_encoding_basic",
-        "test_bucket_list_delimiter_alt",
-        "test_bucket_list_delimiter_percentage",
-        "test_bucket_list_delimiter_whitespace",
-        "test_bucket_list_delimiter_dot",
-        "test_bucket_list_delimiter_unreadable",
-        "test_bucket_list_delimiter_empty",
-        "test_bucket_list_delimiter_none",
-        "test_bucket_list_delimiter_not_exist",
-        "test_bucket_list_delimiter_not_skip_special",
-        "test_bucket_list_prefix_basic",
-        "test_bucket_list_prefix_alt",
-        "test_bucket_list_prefix_empty",
-        "test_bucket_list_prefix_none",
-        "test_bucket_list_prefix_not_exist",
-        "test_bucket_list_prefix_unreadable",
-        "test_bucket_list_prefix_delimiter_basic",
-        "test_bucket_list_prefix_delimiter_alt",
-        "test_bucket_list_prefix_delimiter_prefix_not_exist",
-        "test_bucket_list_prefix_delimiter_delimiter_not_exist",
-        "test_bucket_list_prefix_delimiter_prefix_delimiter_not_exist",
-        "test_bucket_list_maxkeys_one",
-        "test_bucket_list_maxkeys_zero",
-        "test_bucket_list_maxkeys_none",
-        "test_bucket_list_marker_none",
-        "test_bucket_list_marker_empty",
-        "test_bucket_list_marker_unreadable",
-        "test_bucket_list_marker_not_in_list",
-        "test_bucket_list_marker_after_list",
-        "test_bucket_list_objects_anonymous",
-        "test_multi_object_delete",
-        "test_bucket_list_delimiter_prefix",
-        "test_bucket_list_delimiter_prefix_ends_with_delimiter",
-        "test_bucket_list_delimiter_prefix_underscore"
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_maxkeys_invalid",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_objects_anonymous_fail",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_notexist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_many",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_basic",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_encoding_basic",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_alt",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_percentage",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_whitespace",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_dot",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_unreadable",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_empty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_none",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_not_skip_special",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_basic",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_alt",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_empty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_none",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_unreadable",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_basic",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_alt",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_prefix_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_delimiter_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_prefix_delimiter_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_maxkeys_one",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_maxkeys_zero",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_maxkeys_none",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_none",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_empty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_unreadable",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_not_in_list",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_after_list",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_objects_anonymous",
+        "s3tests_boto3/functional/test_s3.py::test_multi_object_delete",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_prefix",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_prefix_ends_with_delimiter",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_delimiter_prefix_underscore"
       ],
       "skip": false,
       "comment": ""
@@ -678,48 +676,48 @@
       "name": "ListObjectsV2",
       "tag": "API",
       "tests": [
-        "test_bucket_listv2_objects_anonymous_fail",
-        "test_bucketv2_notexist",
-        "test_bucket_listv2_many",
-        "test_basic_key_count",
-        "test_bucket_listv2_delimiter_basic",
-        "test_bucket_listv2_encoding_basic",
-        "test_bucket_listv2_delimiter_alt",
-        "test_bucket_listv2_delimiter_prefix",
-        "test_bucket_listv2_delimiter_prefix_ends_with_delimiter",
-        "test_bucket_listv2_delimiter_alt",
-        "test_bucket_listv2_delimiter_prefix_underscore",
-        "test_bucket_listv2_delimiter_percentage",
-        "test_bucket_listv2_delimiter_whitespace",
-        "test_bucket_listv2_delimiter_dot",
-        "test_bucket_listv2_delimiter_unreadable",
-        "test_bucket_listv2_delimiter_empty",
-        "test_bucket_listv2_delimiter_none",
-        "test_bucket_listv2_fetchowner_notempty",
-        "test_bucket_listv2_fetchowner_defaultempty",
-        "test_bucket_listv2_fetchowner_empty",
-        "test_bucket_listv2_delimiter_not_exist",
-        "test_bucket_listv2_prefix_basic",
-        "test_bucket_listv2_prefix_alt",
-        "test_bucket_listv2_prefix_empty",
-        "test_bucket_listv2_prefix_none",
-        "test_bucket_listv2_prefix_not_exist",
-        "test_bucket_listv2_prefix_unreadable",
-        "test_bucket_listv2_prefix_delimiter_basic",
-        "test_bucket_listv2_prefix_delimiter_alt",
-        "test_bucket_listv2_prefix_delimiter_prefix_not_exist",
-        "test_bucket_listv2_prefix_delimiter_delimiter_not_exist",
-        "test_bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist",
-        "test_bucket_listv2_maxkeys_one",
-        "test_bucket_listv2_maxkeys_zero",
-        "test_bucket_listv2_maxkeys_none",
-        "test_bucket_listv2_continuationtoken",
-        "test_bucket_listv2_both_continuationtoken_startafter",
-        "test_bucket_listv2_startafter_unreadable",
-        "test_bucket_listv2_startafter_not_in_list",
-        "test_bucket_listv2_startafter_after_list",
-        "test_bucket_listv2_objects_anonymous",
-        "test_multi_objectv2_delete"
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_objects_anonymous_fail",
+        "s3tests_boto3/functional/test_s3.py::test_bucketv2_notexist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_many",
+        "s3tests_boto3/functional/test_s3.py::test_basic_key_count",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_basic",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_encoding_basic",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_alt",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix_ends_with_delimiter",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_alt",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix_underscore",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_percentage",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_whitespace",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_dot",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_unreadable",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_empty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_none",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_fetchowner_notempty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_fetchowner_defaultempty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_fetchowner_empty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_basic",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_alt",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_empty",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_none",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_unreadable",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_basic",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_alt",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_prefix_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_delimiter_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_maxkeys_one",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_maxkeys_zero",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_maxkeys_none",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_continuationtoken",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_both_continuationtoken_startafter",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_startafter_unreadable",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_startafter_not_in_list",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_startafter_after_list",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_objects_anonymous",
+        "s3tests_boto3/functional/test_s3.py::test_multi_objectv2_delete"
       ],
       "skip": false,
       "comment": ""
@@ -779,20 +777,20 @@
       "name": "PutBucketEncryption",
       "tag": "API",
       "tests": [
-        "test_put_bucket_encryption_s3",
-        "test_put_bucket_encryption_kms",
-        "test_sse_s3_default_method_head",
-        "test_sse_s3_default_multipart_upload",
-        "test_sse_s3_default_post_object_authenticated_request",
-        "test_sse_kms_default_post_object_authenticated_request",
-        "test_sse_s3_default_upload_1b",
-        "test_sse_kms_default_upload_1b",
-        "test_sse_s3_default_upload_1kb",
-        "test_sse_kms_default_upload_1kb",
-        "test_sse_s3_default_upload_1mb",
-        "test_sse_kms_default_upload_1mb",
-        "test_sse_s3_default_upload_8mb",
-        "test_sse_kms_default_upload_8mb"
+        "s3tests_boto3/functional/test_s3.py::test_put_bucket_encryption_s3",
+        "s3tests_boto3/functional/test_s3.py::test_put_bucket_encryption_kms",
+        "s3tests_boto3/functional/test_s3.py::test_sse_s3_default_method_head",
+        "s3tests_boto3/functional/test_s3.py::test_sse_s3_default_multipart_upload",
+        "s3tests_boto3/functional/test_s3.py::test_sse_s3_default_post_object_authenticated_request",
+        "s3tests_boto3/functional/test_s3.py::test_sse_kms_default_post_object_authenticated_request",
+        "s3tests_boto3/functional/test_s3.py::test_sse_s3_default_upload_1b",
+        "s3tests_boto3/functional/test_s3.py::test_sse_kms_default_upload_1b",
+        "s3tests_boto3/functional/test_s3.py::test_sse_s3_default_upload_1kb",
+        "s3tests_boto3/functional/test_s3.py::test_sse_kms_default_upload_1kb",
+        "s3tests_boto3/functional/test_s3.py::test_sse_s3_default_upload_1mb",
+        "s3tests_boto3/functional/test_s3.py::test_sse_kms_default_upload_1mb",
+        "s3tests_boto3/functional/test_s3.py::test_sse_s3_default_upload_8mb",
+        "s3tests_boto3/functional/test_s3.py::test_sse_kms_default_upload_8mb"
       ],
       "skip": true,
       "comment": "Not supported"
@@ -833,7 +831,7 @@
       "name": "PutBucketLogging",
       "tag": "API",
       "tests": [
-        "test_logging_toggle"
+        "s3tests_boto3/functional/test_s3.py::test_logging_toggle"
       ],
       "skip": true,
       "comment": "Not supported"
@@ -921,28 +919,28 @@
       "name": "PutObject",
       "tag": "API",
       "tests": [
-        "test_object_create_bad_md5_invalid_short",
-        "test_object_create_bad_md5_bad",
-        "test_object_create_bad_md5_empty",
-        "test_object_create_bad_md5_none",
-        "test_object_create_bad_expect_empty",
-        "test_object_create_bad_expect_none",
-        "test_object_create_bad_contentlength_empty",
-        "test_object_create_bad_contentlength_negative",
-        "test_object_create_bad_contenttype_invalid",
-        "test_object_create_bad_contenttype_empty",
-        "test_object_create_bad_contenttype_none",
-        "test_object_write_check_etag",
-        "test_object_write_cache_control",
-        "test_object_write_expires",
-        "test_object_write_read_update_read_delete",
-        "test_object_set_get_metadata_none_to_good",
-        "test_object_metadata_replaced_on_put",
-        "test_object_write_file",
-        "test_object_anon_put",
-        "test_object_anon_put_write_access",
-        "test_object_put_authenticated",
-        "test_object_raw_put_authenticated_expired"
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_md5_invalid_short",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_md5_bad",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_md5_empty",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_md5_none",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_expect_empty",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_expect_none",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_contentlength_empty",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_contentlength_negative",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_contenttype_invalid",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_contenttype_empty",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_contenttype_none",
+        "s3tests_boto3/functional/test_s3.py::test_object_write_check_etag",
+        "s3tests_boto3/functional/test_s3.py::test_object_write_cache_control",
+        "s3tests_boto3/functional/test_s3.py::test_object_write_expires",
+        "s3tests_boto3/functional/test_s3.py::test_object_write_read_update_read_delete",
+        "s3tests_boto3/functional/test_s3.py::test_object_set_get_metadata_none_to_good",
+        "s3tests_boto3/functional/test_s3.py::test_object_metadata_replaced_on_put",
+        "s3tests_boto3/functional/test_s3.py::test_object_write_file",
+        "s3tests_boto3/functional/test_s3.py::test_object_anon_put",
+        "s3tests_boto3/functional/test_s3.py::test_object_anon_put_write_access",
+        "s3tests_boto3/functional/test_s3.py::test_object_put_authenticated",
+        "s3tests_boto3/functional/test_s3.py::test_object_raw_put_authenticated_expired"
       ],
       "skip": false,
       "comment": ""
@@ -998,11 +996,11 @@
       "name": "PutPublicAccessBlock",
       "tag": "API",
       "tests": [
-        "test_put_public_block",
-        "test_block_public_put_bucket_acls",
-        "test_block_public_object_canned_acls",
-        "test_block_public_policy",
-        "test_ignore_public_acls"
+        "s3tests_boto3/functional/test_s3.py::test_put_public_block",
+        "s3tests_boto3/functional/test_s3.py::test_block_public_put_bucket_acls",
+        "s3tests_boto3/functional/test_s3.py::test_block_public_object_canned_acls",
+        "s3tests_boto3/functional/test_s3.py::test_block_public_policy",
+        "s3tests_boto3/functional/test_s3.py::test_ignore_public_acls"
       ],
       "skip": true,
       "comment": "Not supported"
@@ -1018,40 +1016,40 @@
       "name": "SelectObjectContent",
       "tag": "API",
       "tests": [
-        "test_generate_where_clause",
-        "test_generate_projection",
-        "test_count_operation",
-        "test_count_json_operation",
-        "test_json_column_sum_min_max",
-        "test_json_nullif_expressions",
-        "test_column_sum_min_max",
-        "test_nullif_expressions",
-        "test_nulliftrue_expressions",
-        "test_is_not_null_expressions",
-        "test_lowerupper_expressions",
-        "test_in_expressions",
-        "test_true_false_in_expressions",
-        "test_like_expressions",
-        "test_truefalselike_expressions",
-        "test_complex_expressions",
-        "test_alias",
-        "test_alias_cyclic_refernce",
-        "test_datetime",
-        "test_true_false_datetime",
-        "test_csv_parser",
-        "test_csv_definition",
-        "test_schema_definition",
-        "test_when_then_else_expressions",
-        "test_coalesce_expressions",
-        "test_cast_expressions",
-        "test_version",
-        "test_trim_expressions",
-        "test_truefalse_trim_expressions",
-        "test_escape_expressions",
-        "test_case_value_expressions",
-        "test_bool_cast_expressions",
-        "test_progress_expressions",
-        "test_output_serial_expressions"
+        "s3tests_boto3/functional/test_s3select.py::test_generate_where_clause",
+        "s3tests_boto3/functional/test_s3select.py::test_generate_projection",
+        "s3tests_boto3/functional/test_s3select.py::test_count_operation",
+        "s3tests_boto3/functional/test_s3select.py::test_count_json_operation",
+        "s3tests_boto3/functional/test_s3select.py::test_json_column_sum_min_max",
+        "s3tests_boto3/functional/test_s3select.py::test_json_nullif_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_column_sum_min_max",
+        "s3tests_boto3/functional/test_s3select.py::test_nullif_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_nulliftrue_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_is_not_null_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_lowerupper_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_in_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_true_false_in_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_like_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_truefalselike_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_complex_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_alias",
+        "s3tests_boto3/functional/test_s3select.py::test_alias_cyclic_refernce",
+        "s3tests_boto3/functional/test_s3select.py::test_datetime",
+        "s3tests_boto3/functional/test_s3select.py::test_true_false_datetime",
+        "s3tests_boto3/functional/test_s3select.py::test_csv_parser",
+        "s3tests_boto3/functional/test_s3select.py::test_csv_definition",
+        "s3tests_boto3/functional/test_s3select.py::test_schema_definition",
+        "s3tests_boto3/functional/test_s3select.py::test_when_then_else_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_coalesce_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_cast_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_version",
+        "s3tests_boto3/functional/test_s3select.py::test_trim_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_truefalse_trim_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_escape_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_case_value_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_bool_cast_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_progress_expressions",
+        "s3tests_boto3/functional/test_s3select.py::test_output_serial_expressions"
       ],
       "skip": true,
       "comment": "Not supported"
@@ -1060,22 +1058,22 @@
       "name": "UploadPart",
       "tag": "API",
       "tests": [
-        "test_object_copy_versioning_multipart_upload",
-        "test_multipart_upload_empty",
-        "test_multipart_upload_multiple_sizes",
-        "test_multipart_upload_size_too_small",
-        "test_multipart_upload_contents",
-        "test_multipart_upload_overwrite_existing_object",
-        "test_multipart_upload_missing_part",
-        "test_multipart_upload_incorrect_etag",
-        "test_versioning_obj_create_overwrite_multipart",
-        "test_versioning_bucket_multipart_upload_return_version_id",
-        "test_multipart_upload_on_a_bucket_with_policy",
-        "test_multipart_upload_resend_part",
-        "test_abort_multipart_upload",
-        "test_abort_multipart_upload_not_found",
-        "test_atomic_multipart_upload_write",
-        "test_list_multipart_upload"
+        "s3tests_boto3/functional/test_s3.py::test_object_copy_versioning_multipart_upload",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_empty",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_multiple_sizes",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_size_too_small",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_contents",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_overwrite_existing_object",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_missing_part",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_incorrect_etag",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_create_overwrite_multipart",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_bucket_multipart_upload_return_version_id",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_on_a_bucket_with_policy",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_resend_part",
+        "s3tests_boto3/functional/test_s3.py::test_abort_multipart_upload",
+        "s3tests_boto3/functional/test_s3.py::test_abort_multipart_upload_not_found",
+        "s3tests_boto3/functional/test_s3.py::test_atomic_multipart_upload_write",
+        "s3tests_boto3/functional/test_s3.py::test_list_multipart_upload"
       ],
       "skip": false,
       "comment": ""
@@ -1084,13 +1082,13 @@
       "name": "UploadPartCopy",
       "tag": "API",
       "tests": [
-        "test_multipart_copy_small",
-        "test_multipart_copy_invalid_range",
-        "test_multipart_copy_improper_range",
-        "test_multipart_copy_without_range",
-        "test_multipart_copy_special_names",
-        "test_multipart_copy_versioned",
-        "test_multipart_copy_multiple_sizes"
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_small",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_invalid_range",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_improper_range",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_without_range",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_special_names",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_versioned",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_multiple_sizes"
       ],
       "skip": false,
       "comment": ""
@@ -1106,18 +1104,18 @@
       "name": "BucketPolicy",
       "tag": "Features",
       "tests": [
-        "test_bucket_policy",
-        "test_bucketv2_policy",
-        "test_get_tags_acl_public",
-        "test_put_tags_acl_public",
-        "test_delete_tags_obj_public",
-        "test_bucket_policy_get_obj_existing_tag",
-        "test_bucket_policy_get_obj_tagging_existing_tag",
-        "test_bucket_policy_put_obj_tagging_existing_tag",
-        "test_bucket_policy_put_obj_copy_source",
-        "test_bucket_policy_put_obj_copy_source_meta",
-        "test_bucket_policy_get_obj_acl_existing_tag",
-        "test_multipart_upload_on_a_bucket_with_policy"
+        "s3tests_boto3/functional/test_s3.py::test_bucket_policy",
+        "s3tests_boto3/functional/test_s3.py::test_bucketv2_policy",
+        "s3tests_boto3/functional/test_s3.py::test_get_tags_acl_public",
+        "s3tests_boto3/functional/test_s3.py::test_put_tags_acl_public",
+        "s3tests_boto3/functional/test_s3.py::test_delete_tags_obj_public",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_policy_get_obj_existing_tag",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_policy_get_obj_tagging_existing_tag",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_policy_put_obj_tagging_existing_tag",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_policy_put_obj_copy_source",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_policy_put_obj_copy_source_meta",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_policy_get_obj_acl_existing_tag",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload_on_a_bucket_with_policy"
       ],
       "skip": false,
       "comment": ""
@@ -1126,10 +1124,10 @@
       "name": "BucketCors",
       "tag": "Features",
       "tests": [
-        "test_set_cors",
-        "test_cors_origin_response",
-        "test_cors_origin_wildcard",
-        "test_cors_header_option"
+        "s3tests_boto3/functional/test_s3.py::test_set_cors",
+        "s3tests_boto3/functional/test_s3.py::test_cors_origin_response",
+        "s3tests_boto3/functional/test_s3.py::test_cors_origin_wildcard",
+        "s3tests_boto3/functional/test_s3.py::test_cors_header_option"
       ],
       "skip": false,
       "comment": ""
@@ -1138,23 +1136,23 @@
       "name": "BucketLifecycle",
       "tag": "Features",
       "tests": [
-        "test_lifecycle_get",
-        "test_lifecycle_get_no_id",
-        "test_lifecycle_set",
-        "test_lifecycle_id_too_long",
-        "test_lifecycle_same_id",
-        "test_lifecycle_invalid_status",
-        "test_lifecycle_set_date",
-        "test_lifecycle_set_invalid_date",
-        "test_lifecycle_expiration_days0",
-        "test_lifecycle_expiration_header_put",
-        "test_lifecycle_expiration_header_head",
-        "test_lifecycle_expiration_header_and_tags_head",
-        "test_lifecycle_set_noncurrent",
-        "test_lifecycle_set_deletemarker",
-        "test_lifecycle_set_filter",
-        "test_lifecycle_set_empty_filter",
-        "test_lifecycle_set_multipart"
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_get",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_get_no_id",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_set",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_id_too_long",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_same_id",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_invalid_status",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_set_date",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_set_invalid_date",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_expiration_days0",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_expiration_header_put",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_expiration_header_head",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_expiration_header_and_tags_head",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_set_noncurrent",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_set_deletemarker",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_set_filter",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_set_empty_filter",
+        "s3tests_boto3/functional/test_s3.py::test_lifecycle_set_multipart"
       ],
       "skip": false,
       "comment": "Transition is not supported"
@@ -1163,7 +1161,7 @@
       "name": "BucketTagging",
       "tag": "Features",
       "tests": [
-        "test_set_bucket_tagging"
+        "s3tests_boto3/functional/test_s3.py::test_set_bucket_tagging"
       ],
       "skip": false,
       "comment": ""
@@ -1172,23 +1170,23 @@
       "name": "ObjectTagging",
       "tag": "Features",
       "tests": [
-        "test_put_delete_tags",
-        "test_get_obj_tagging",
-        "test_put_max_tags",
-        "test_put_max_kvsize_tags",
-        "test_put_excess_key_tags",
-        "test_put_excess_val_tags",
-        "test_put_modify_tags",
-        "test_put_delete_tags",
-        "test_put_obj_with_tags",
-        "test_get_obj_tagging",
-        "test_get_obj_head_tagging",
-        "test_put_max_tags",
-        "test_put_max_kvsize_tags",
-        "test_put_excess_key_tags",
-        "test_put_excess_val_tags",
-        "test_put_modify_tags",
-        "test_put_delete_tags"
+        "s3tests_boto3/functional/test_s3.py::test_put_delete_tags",
+        "s3tests_boto3/functional/test_s3.py::test_get_obj_tagging",
+        "s3tests_boto3/functional/test_s3.py::test_put_max_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_max_kvsize_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_excess_key_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_excess_val_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_modify_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_delete_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_obj_with_tags",
+        "s3tests_boto3/functional/test_s3.py::test_get_obj_tagging",
+        "s3tests_boto3/functional/test_s3.py::test_get_obj_head_tagging",
+        "s3tests_boto3/functional/test_s3.py::test_put_max_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_max_kvsize_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_excess_key_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_excess_val_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_modify_tags",
+        "s3tests_boto3/functional/test_s3.py::test_put_delete_tags"
       ],
       "skip": false,
       "comment": ""
@@ -1197,13 +1195,13 @@
       "name": "BucketACL",
       "tag": "Features",
       "tests": [
-        "test_bucket_put_bad_canned_acl",
-        "test_bucket_list_objects_anonymous",
-        "test_bucket_listv2_objects_anonymous",
-        "test_bucket_acl_canned_private_to_private",
-        "test_100_continue",
-        "test_block_public_put_bucket_acls",
-        "test_bucket_concurrent_set_canned_acl"
+        "s3tests_boto3/functional/test_headers.py::test_bucket_put_bad_canned_acl",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_list_objects_anonymous",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_listv2_objects_anonymous",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_acl_canned_private_to_private",
+        "s3tests_boto3/functional/test_s3.py::test_100_continue",
+        "s3tests_boto3/functional/test_s3.py::test_block_public_put_bucket_acls",
+        "s3tests_boto3/functional/test_s3.py::test_bucket_concurrent_set_canned_acl"
       ],
       "skip": false,
       "comment": "Partly supported. Only restricted canned acl can be applied"
@@ -1212,28 +1210,28 @@
       "name": "BucketVersioning",
       "tag": "Features",
       "tests": [
-        "test_object_lock_put_obj_lock",
-        "test_multipart_copy_versioned",
-        "test_versioning_bucket_create_suspend",
-        "test_versioning_obj_plain_null_version_removal",
-        "test_versioning_obj_plain_null_version_overwrite",
-        "test_versioning_obj_plain_null_version_overwrite_suspended",
-        "test_versioning_obj_create_read_remove",
-        "test_versioning_obj_create_read_remove_head",
-        "test_versioning_obj_suspend_versions",
-        "test_versioning_obj_create_versions_remove_all",
-        "test_versioning_obj_create_versions_remove_special_names",
-        "test_versioning_obj_create_overwrite_multipart",
-        "test_versioning_obj_list_marker",
-        "test_versioning_copy_obj_version",
-        "test_versioning_multi_object_delete",
-        "test_versioning_multi_object_delete_with_marker",
-        "test_versioned_concurrent_object_create_concurrent_remove",
-        "test_versioned_concurrent_object_create_and_remove",
-        "test_versioning_bucket_atomic_upload_return_version_id",
-        "test_versioning_bucket_multipart_upload_return_version_id",
-        "test_versioning_multi_object_delete_with_marker_create",
-        "test_versioning_concurrent_multi_object_delete"
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_lock",
+        "s3tests_boto3/functional/test_s3.py::test_multipart_copy_versioned",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_bucket_create_suspend",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_plain_null_version_removal",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_plain_null_version_overwrite",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_plain_null_version_overwrite_suspended",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_create_read_remove",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_create_read_remove_head",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_suspend_versions",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_create_versions_remove_all",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_create_versions_remove_special_names",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_create_overwrite_multipart",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_obj_list_marker",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_copy_obj_version",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_multi_object_delete",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_multi_object_delete_with_marker",
+        "s3tests_boto3/functional/test_s3.py::test_versioned_concurrent_object_create_concurrent_remove",
+        "s3tests_boto3/functional/test_s3.py::test_versioned_concurrent_object_create_and_remove",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_bucket_atomic_upload_return_version_id",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_bucket_multipart_upload_return_version_id",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_multi_object_delete_with_marker_create",
+        "s3tests_boto3/functional/test_s3.py::test_versioning_concurrent_multi_object_delete"
       ],
       "skip": false,
       "comment": "Limitations: \n1. Don't create delete marker for non-existing objects"
@@ -1242,7 +1240,7 @@
       "name": "MultipartUpload",
       "tag": "Features",
       "tests": [
-        "test_multipart_upload"
+        "s3tests_boto3/functional/test_s3.py::test_multipart_upload"
       ],
       "include": [
         "AbortMultipartUpload",
@@ -1259,22 +1257,22 @@
       "name": "Encryption",
       "tag": "Features",
       "tests": [
-        "test_encrypted_transfer_1b",
-        "test_encrypted_transfer_1kb",
-        "test_encrypted_transfer_1MB",
-        "test_encrypted_transfer_13b",
-        "test_encryption_sse_c_present",
-        "test_encryption_sse_c_other_key",
-        "test_encryption_sse_c_invalid_md5",
-        "test_encryption_sse_c_no_md5",
-        "test_encryption_sse_c_no_key",
-        "test_encryption_key_no_sse_c",
-        "test_encryption_sse_c_multipart_invalid_chunks_1",
-        "test_encryption_sse_c_multipart_invalid_chunks_2",
-        "test_encryption_sse_c_method_head",
-        "test_encryption_sse_c_multipart_upload",
-        "test_encryption_sse_c_unaligned_multipart_upload",
-        "test_encryption_sse_c_multipart_bad_download"
+        "s3tests_boto3/functional/test_s3.py::test_encrypted_transfer_1b",
+        "s3tests_boto3/functional/test_s3.py::test_encrypted_transfer_1kb",
+        "s3tests_boto3/functional/test_s3.py::test_encrypted_transfer_1MB",
+        "s3tests_boto3/functional/test_s3.py::test_encrypted_transfer_13b",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_present",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_other_key",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_invalid_md5",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_no_md5",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_no_key",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_key_no_sse_c",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_multipart_invalid_chunks_1",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_multipart_invalid_chunks_2",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_method_head",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_multipart_upload",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_unaligned_multipart_upload",
+        "s3tests_boto3/functional/test_s3.py::test_encryption_sse_c_multipart_bad_download"
       ],
       "skip": false,
       "comment": "Only sse-c currently supported"
@@ -1290,18 +1288,18 @@
       "name": "aws_v2_signature",
       "tag": "Features",
       "tests": [
-        "test_object_create_bad_md5_invalid_garbage_aws2",
-        "test_object_create_bad_contentlength_mismatch_below_aws2",
-        "test_object_create_bad_authorization_incorrect_aws2",
-        "test_object_create_bad_authorization_invalid_aws2",
-        "test_object_create_bad_ua_empty_aws2",
-        "test_object_create_bad_ua_none_aws2",
-        "test_object_create_bad_date_invalid_aws2",
-        "test_object_create_bad_date_empty_aws2",
-        "test_object_create_bad_date_none_aws2",
-        "test_object_create_bad_date_before_today_aws2",
-        "test_object_create_bad_date_before_epoch_aws2",
-        "test_object_create_bad_date_after_end_aws2"
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_md5_invalid_garbage_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_contentlength_mismatch_below_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_authorization_incorrect_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_authorization_invalid_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_ua_empty_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_ua_none_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_date_invalid_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_date_empty_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_date_none_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_date_before_today_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_date_before_epoch_aws2",
+        "s3tests_boto3/functional/test_headers.py::test_object_create_bad_date_after_end_aws2"
       ],
       "skip": true,
       "comment": "Not supported. AWS v2 signature is deprecated."
@@ -1310,42 +1308,42 @@
       "name": "Locking",
       "tag": "Features",
       "tests": [
-        "test_object_lock_put_obj_lock",
-        "test_object_lock_put_obj_lock_invalid_bucket",
-        "test_object_lock_put_obj_lock_with_days_and_years",
-        "test_object_lock_put_obj_lock_invalid_days",
-        "test_object_lock_uploading_obj",
-        "test_object_lock_put_obj_lock_invalid_years",
-        "test_object_lock_put_obj_lock_invalid_status",
-        "test_object_lock_suspend_versioning",
-        "test_object_lock_get_obj_lock",
-        "test_object_lock_get_obj_lock_invalid_bucket",
-        "test_object_lock_put_obj_retention",
-        "test_object_lock_put_obj_retention_invalid_bucket",
-        "test_object_lock_put_obj_retention_invalid_mode",
-        "test_object_lock_get_obj_retention",
-        "test_object_lock_get_obj_retention_invalid_bucket",
-        "test_object_lock_put_obj_retention_versionid",
-        "test_object_lock_put_obj_retention_override_default_retention",
-        "test_object_lock_put_obj_retention_increase_period",
-        "test_object_lock_put_obj_retention_shorten_period",
-        "test_object_lock_put_obj_retention_shorten_period_bypass",
-        "test_object_lock_delete_object_with_retention",
-        "test_object_lock_put_legal_hold",
-        "test_object_lock_put_legal_hold_invalid_bucket",
-        "test_object_lock_put_legal_hold_invalid_status",
-        "test_object_lock_get_legal_hold",
-        "test_object_lock_get_legal_hold_invalid_bucket",
-        "test_object_lock_delete_object_with_legal_hold_on",
-        "test_object_lock_delete_object_with_legal_hold_off",
-        "test_object_lock_get_obj_metadata",
-        "test_object_lock_get_obj_retention_iso8601",
-        "test_object_lock_delete_object_with_retention_and_marker",
-        "test_object_lock_multi_delete_object_with_retention",
-        "test_object_lock_changing_mode_from_governance_with_bypass",
-        "test_object_lock_changing_mode_from_governance_without_bypass",
-        "test_object_lock_changing_mode_from_compliance",
-        "test_object_lock_put_obj_lock_invalid_mode"
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_lock",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_lock_invalid_bucket",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_lock_with_days_and_years",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_lock_invalid_days",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_uploading_obj",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_lock_invalid_years",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_lock_invalid_status",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_suspend_versioning",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_get_obj_lock",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_get_obj_lock_invalid_bucket",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_retention",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_retention_invalid_bucket",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_retention_invalid_mode",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_get_obj_retention",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_get_obj_retention_invalid_bucket",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_retention_versionid",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_retention_override_default_retention",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_retention_increase_period",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_retention_shorten_period",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_retention_shorten_period_bypass",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_delete_object_with_retention",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_legal_hold",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_legal_hold_invalid_bucket",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_legal_hold_invalid_status",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_get_legal_hold",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_get_legal_hold_invalid_bucket",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_delete_object_with_legal_hold_on",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_delete_object_with_legal_hold_off",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_get_obj_metadata",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_get_obj_retention_iso8601",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_delete_object_with_retention_and_marker",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_multi_delete_object_with_retention",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_changing_mode_from_governance_with_bypass",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_changing_mode_from_governance_without_bypass",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_changing_mode_from_compliance",
+        "s3tests_boto3/functional/test_s3.py::test_object_lock_put_obj_lock_invalid_mode"
       ],
       "skip": true,
       "comment": "Not supported"