def assert_upload_stats(self, *, response_code) -> None: stats = {'stats': {'foo': 'bar', 'baz': 42}} class Handler(http.server.BaseHTTPRequestHandler): def do_POST(handler): try: if handler.path.startswith('/redirect'): code = int(handler.path[-3:]) handler.send_response(code) handler.send_header('location', mk_url('/upload')) handler.end_headers() else: self.assertEqual('/upload', handler.path) self.assertEqual('application/x-www-form-urlencoded', handler.headers['Content-type']) length = int(handler.headers['Content-Length']) post_data = parse_qs( handler.rfile.read(length).decode()) decoded_post_data = { k: json.loads(v[0]) for k, v in post_data.items() } self.assertEqual(stats, decoded_post_data) self.assertEqual(handler.headers['User-Agent'], f"pants/v{VERSION}") self.assertIn(handler.headers['X-Pants-Stats-Version'], {"1", "2"}) handler.send_response(response_code) handler.end_headers() except Exception: handler.send_response( 400) # Ensure the main thread knows the test failed. raise server_address = ('', 0) server = http.server.HTTPServer(server_address, Handler) host, port = server.server_address def mk_url(path): return f'http://{host}:{port}{path}' server_thread = threading.Thread(target=server.serve_forever) server_thread.daemon = True server_thread.start() self.context(for_subsystems=[Cookies]) self.assertTrue( RunTracker.post_stats(mk_url('/upload'), stats, stats_version=1)) self.assertTrue( RunTracker.post_stats(mk_url('/redirect307'), stats, stats_version=1)) self.assertFalse( RunTracker.post_stats(mk_url('/redirect302'), stats, stats_version=2)) server.shutdown() server.server_close()
def test_upload_stats(self): stats = {'stats': {'foo': 'bar', 'baz': 42}} class Handler(BaseHTTPServer.BaseHTTPRequestHandler): def do_POST(handler): try: self.assertEquals('/upload', handler.path) self.assertEquals('application/x-www-form-urlencoded', handler.headers['Content-type']) length = int(handler.headers['Content-Length']) post_data = urlparse.parse_qs(handler.rfile.read(length).decode('utf-8')) decoded_post_data = {k: json.loads(v[0]) for k, v in post_data.items()} self.assertEquals(stats, decoded_post_data) handler.send_response(200) except Exception: handler.send_response(400) # Ensure the main thread knows the test failed. raise server_address = ('', 0) server = BaseHTTPServer.HTTPServer(server_address, Handler) host, port = server.server_address server_thread = threading.Thread(target=server.serve_forever) server_thread.daemon = True server_thread.start() self.assertTrue(RunTracker.post_stats('http://{}:{}/upload'.format(host, port), stats)) server.shutdown() server.server_close()
def test_upload_stats(self): stats = {'stats': {'foo': 'bar', 'baz': 42}} class Handler(BaseHTTPServer.BaseHTTPRequestHandler): def do_POST(handler): try: self.assertEquals('/upload', handler.path) self.assertEquals('application/x-www-form-urlencoded', handler.headers['Content-type']) length = int(handler.headers['Content-Length']) post_data = urlparse.parse_qs(handler.rfile.read(length).decode('utf-8')) decoded_post_data = {k: json.loads(v[0]) for k, v in post_data.items()} self.assertEquals(stats, decoded_post_data) handler.send_response(200) except Exception: handler.send_response(400) # Ensure the main thread knows the test failed. raise server_address = ('', 0) server = BaseHTTPServer.HTTPServer(server_address, Handler) host, port = server.server_address server_thread = threading.Thread(target=server.serve_forever) server_thread.daemon = True server_thread.start() self.assertTrue(RunTracker.post_stats('http://{}:{}/upload'.format(host, port), stats)) server.shutdown() server.server_close()
def test_upload_stats(self): stats = {'stats': {'foo': 'bar', 'baz': 42}} class Handler(http.server.BaseHTTPRequestHandler): def do_POST(handler): try: if handler.path.startswith('/redirect'): code = int(handler.path[-3:]) handler.send_response(code) handler.send_header('location', mk_url('/upload')) handler.end_headers() else: self.assertEqual('/upload', handler.path) self.assertEqual('application/x-www-form-urlencoded', handler.headers['Content-type']) length = int(handler.headers['Content-Length']) post_data = parse_qs(handler.rfile.read(length).decode('utf-8')) decoded_post_data = {k: json.loads(v[0]) for k, v in post_data.items()} self.assertEqual(stats, decoded_post_data) handler.send_response(200) handler.end_headers() except Exception: handler.send_response(400) # Ensure the main thread knows the test failed. raise server_address = ('', 0) server = http.server.HTTPServer(server_address, Handler) host, port = server.server_address def mk_url(path): return 'http://{}:{}{}'.format(host, port, path) server_thread = threading.Thread(target=server.serve_forever) server_thread.daemon = True server_thread.start() self.context(for_subsystems=[Cookies]) self.assertTrue(RunTracker.post_stats(mk_url('/upload'), stats)) self.assertTrue(RunTracker.post_stats(mk_url('/redirect307'), stats)) self.assertFalse(RunTracker.post_stats(mk_url('/redirect302'), stats)) server.shutdown() server.server_close()
def test_invalid_stats_version(self): stats = {"stats": {"foo": "bar", "baz": 42}} url = "http://example.com/upload/" with self.assertRaises(ValueError): RunTracker.post_stats(url, stats, stats_version=0) with self.assertRaises(ValueError): RunTracker.post_stats(url, stats, stats_version=None) with self.assertRaises(ValueError): RunTracker.post_stats(url, stats, stats_version=9) with self.assertRaises(ValueError): RunTracker.post_stats(url, stats, stats_version="not a number")
def test_invalid_stats_version(self): stats = {'stats': {'foo': 'bar', 'baz': 42}} url = 'http://example.com/upload/' with self.assertRaises(ValueError): RunTracker.post_stats(url, stats, stats_version=0) with self.assertRaises(ValueError): RunTracker.post_stats(url, stats, stats_version=None) with self.assertRaises(ValueError): RunTracker.post_stats(url, stats, stats_version=9) with self.assertRaises(ValueError): RunTracker.post_stats(url, stats, stats_version="not a number")
def assert_upload_stats(self, *, response_code) -> None: stats = {"stats": {"foo": "bar", "baz": 42}} class Handler(http.server.BaseHTTPRequestHandler): def do_POST(handler): try: if handler.path.startswith("/redirect"): code = int(handler.path[-3:]) handler.send_response(code) handler.send_header("location", mk_url("/upload")) handler.end_headers() else: self.assertEqual("/upload", handler.path) stats_version = handler.headers[ "X-Pants-Stats-Version"] self.assertIn(stats_version, {"1", "2"}) self.assertEqual(handler.headers["User-Agent"], f"pants/v{VERSION}") length = int(handler.headers["Content-Length"]) content = handler.rfile.read(length).decode() if stats_version == "2": self.assertEqual("application/json", handler.headers["Content-type"]) decoded_post_data = json.loads(content) self.assertEqual(len(decoded_post_data), 1) builds = decoded_post_data["builds"] self.assertEqual(len(builds), 1) received_stats = builds[0] else: self.assertEqual( "application/x-www-form-urlencoded", handler.headers["Content-type"]) received_stats = { k: json.loads(v[0]) for k, v in parse_qs(content).items() } self.assertEqual(stats, received_stats) handler.send_response(response_code) handler.end_headers() except Exception: handler.send_response( 400) # Ensure the main thread knows the test failed. raise server_address = ("", 0) server = http.server.HTTPServer(server_address, Handler) host, port = server.server_address def mk_url(path): return f"http://{host}:{port}{path}" server_thread = threading.Thread(target=server.serve_forever) server_thread.daemon = True server_thread.start() self.context(for_subsystems=[Cookies]) self.assertTrue( RunTracker.post_stats(mk_url("/upload"), stats, stats_version=1)) self.assertTrue( RunTracker.post_stats(mk_url("/upload"), stats, stats_version=2)) self.assertTrue( RunTracker.post_stats(mk_url("/redirect307"), stats, stats_version=1)) self.assertFalse( RunTracker.post_stats(mk_url("/redirect302"), stats, stats_version=2)) server.shutdown() server.server_close()