| 
									
										
										
										
											2017-08-05 20:29:40 +10:00
										 |  |  | # coding=utf-8 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-27 11:17:06 -04:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							| 
									
										
										
										
											2013-08-03 17:21:25 -04:00
										 |  |  | import sure  # noqa | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-16 06:38:40 -07:00
										 |  |  | from flask.testing import FlaskClient | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | import moto.server as server | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | """
 | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | Test the different server responses | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | """
 | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-16 06:38:40 -07:00
										 |  |  | class AuthenticatedClient(FlaskClient): | 
					
						
							|  |  |  |     def open(self, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         kwargs["headers"] = kwargs.get("headers", {}) | 
					
						
							|  |  |  |         kwargs["headers"]["Authorization"] = "Any authorization header" | 
					
						
							|  |  |  |         kwargs["content_length"] = 0  # Fixes content-length complaints. | 
					
						
							| 
									
										
										
										
											2017-09-16 06:38:40 -07:00
										 |  |  |         return super(AuthenticatedClient, self).open(*args, **kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def authenticated_client(): | 
					
						
							| 
									
										
										
										
											2013-12-28 20:15:37 -05:00
										 |  |  |     backend = server.create_backend_app("s3") | 
					
						
							| 
									
										
										
										
											2017-09-16 06:38:40 -07:00
										 |  |  |     backend.test_client_class = AuthenticatedClient | 
					
						
							|  |  |  |     return backend.test_client() | 
					
						
							| 
									
										
										
										
											2013-12-28 20:15:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-16 06:38:40 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | def test_s3_server_get(): | 
					
						
							|  |  |  |     test_client = authenticated_client() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.get("/") | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res.data.should.contain(b"ListAllMyBucketsResult") | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_s3_server_bucket_create(): | 
					
						
							| 
									
										
										
										
											2017-09-16 06:38:40 -07:00
										 |  |  |     test_client = authenticated_client() | 
					
						
							| 
									
										
										
										
											2013-12-28 20:15:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.put("/", "http://foobaz.localhost:5000/") | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  |     res.status_code.should.equal(200) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.get("/") | 
					
						
							|  |  |  |     res.data.should.contain(b"<Name>foobaz</Name>") | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.get("/", "http://foobaz.localhost:5000/") | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  |     res.status_code.should.equal(200) | 
					
						
							| 
									
										
										
										
											2014-08-26 13:25:50 -04:00
										 |  |  |     res.data.should.contain(b"ListBucketResult") | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.put("/bar", "http://foobaz.localhost:5000/", data="test value") | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  |     res.status_code.should.equal(200) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert "ETag" in dict(res.headers) | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.get("/bar", "http://foobaz.localhost:5000/") | 
					
						
							| 
									
										
										
										
											2013-03-05 08:14:43 -05:00
										 |  |  |     res.status_code.should.equal(200) | 
					
						
							| 
									
										
										
										
											2014-08-26 13:25:50 -04:00
										 |  |  |     res.data.should.equal(b"test value") | 
					
						
							| 
									
										
										
										
											2013-05-17 19:41:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-22 22:13:34 +07:00
										 |  |  | def test_s3_server_bucket_versioning(): | 
					
						
							| 
									
										
										
										
											2017-09-16 06:38:40 -07:00
										 |  |  |     test_client = authenticated_client() | 
					
						
							| 
									
										
										
										
											2015-02-22 22:13:34 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Just enough XML to enable versioning | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     body = "<Status>Enabled</Status>" | 
					
						
							|  |  |  |     res = test_client.put("/?versioning", "http://foobaz.localhost:5000", data=body) | 
					
						
							| 
									
										
										
										
											2015-02-22 22:13:34 +07:00
										 |  |  |     res.status_code.should.equal(200) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-17 19:41:39 -04:00
										 |  |  | def test_s3_server_post_to_bucket(): | 
					
						
							| 
									
										
										
										
											2017-09-16 06:38:40 -07:00
										 |  |  |     test_client = authenticated_client() | 
					
						
							| 
									
										
										
										
											2013-12-28 20:15:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.put("/", "http://tester.localhost:5000/") | 
					
						
							| 
									
										
										
										
											2013-05-17 19:41:39 -04:00
										 |  |  |     res.status_code.should.equal(200) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     test_client.post( | 
					
						
							|  |  |  |         "/", | 
					
						
							|  |  |  |         "https://tester.localhost:5000/", | 
					
						
							|  |  |  |         data={"key": "the-key", "file": "nothing"}, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2013-05-17 19:41:39 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.get("/the-key", "http://tester.localhost:5000/") | 
					
						
							| 
									
										
										
										
											2013-05-17 19:41:39 -04:00
										 |  |  |     res.status_code.should.equal(200) | 
					
						
							| 
									
										
										
										
											2014-08-26 13:25:50 -04:00
										 |  |  |     res.data.should.equal(b"nothing") | 
					
						
							| 
									
										
										
										
											2017-05-01 12:13:12 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_s3_server_post_without_content_length(): | 
					
						
							| 
									
										
										
										
											2017-09-16 06:38:40 -07:00
										 |  |  |     test_client = authenticated_client() | 
					
						
							| 
									
										
										
										
											2017-05-01 12:13:12 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.put( | 
					
						
							|  |  |  |         "/", "http://tester.localhost:5000/", environ_overrides={"CONTENT_LENGTH": ""} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-05-01 12:13:12 -07:00
										 |  |  |     res.status_code.should.equal(411) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     res = test_client.post( | 
					
						
							|  |  |  |         "/", "https://tester.localhost:5000/", environ_overrides={"CONTENT_LENGTH": ""} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-05-01 12:13:12 -07:00
										 |  |  |     res.status_code.should.equal(411) | 
					
						
							| 
									
										
										
										
											2017-08-05 20:29:40 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_s3_server_post_unicode_bucket_key(): | 
					
						
							|  |  |  |     # Make sure that we can deal with non-ascii characters in request URLs (e.g., S3 object names) | 
					
						
							|  |  |  |     dispatcher = server.DomainDispatcherApplication(server.create_backend_app) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     backend_app = dispatcher.get_application( | 
					
						
							|  |  |  |         {"HTTP_HOST": "s3.amazonaws.com", "PATH_INFO": "/test-bucket/test-object-てすと"} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-08-05 20:29:40 +10:00
										 |  |  |     assert backend_app | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     backend_app = dispatcher.get_application( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "HTTP_HOST": "s3.amazonaws.com", | 
					
						
							|  |  |  |             "PATH_INFO": "/test-bucket/test-object-てすと".encode("utf-8"), | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-08-05 20:29:40 +10:00
										 |  |  |     assert backend_app |