示例#1
0
    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()
示例#2
0
  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()
示例#3
0
  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()
示例#4
0
  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()
示例#5
0
    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")
示例#6
0
    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")
示例#7
0
    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()