old_contents: from datetime import timedelta
  
  import t
  
  from gunicorn.config import Config
  from gunicorn.instrument.statsd import Statsd
  
  class TestException(Exception): pass
  
  class MockSocket(object):
      "Pretend to be a UDP socket"
      def __init__(self, failp):
          self.failp = failp
          self.msgs = []  # accumulate messages for later inspection
  
      def send(self, msg):
          if self.failp:
              raise TestException("Should not interrupt the logger")
          self.msgs.append(msg)
  
      def reset(self):
          self.msgs = []
  
  class MockResponse(object):
      def __init__(self, status):
          self.status = status
  
  def test_statsd_fail():
      "UDP socket fails"
      logger = Statsd(Config())
      logger.sock = MockSocket(True)
      logger.info("No impact on logging")
      logger.debug("No impact on logging")
      logger.critical("No impact on logging")
      logger.error("No impact on logging")
      logger.warning("No impact on logging")
      logger.exception("No impact on logging")
  
  def test_instrument():
      logger = Statsd(Config())
      logger.sock = MockSocket(False)
  
      logger.info("Blah", extra={"mtype": "gauge", "metric": "gunicorn.test", "value": 666})
      t.eq(logger.sock.msgs[0], "gunicorn.test:666|g")
      logger.sock.reset()
  
      logger.critical("Boom")
      t.eq(logger.sock.msgs[0], "gunicorn.log.critical:1|c|@1.0")
      logger.sock.reset()
  
      logger.access(MockResponse("200 OK"), None, {}, timedelta(seconds=7))
      t.eq(logger.sock.msgs[0], "gunicorn.request.duration:7.0|ms")
      t.eq(logger.sock.msgs[1], "gunicorn.requests:1|c|@1.0")
      t.eq(logger.sock.msgs[2], "gunicorn.request.status.200:1|c|@1.0")
  
new_contents: from datetime import timedelta
  
  import t
  
  from gunicorn.config import Config
  from gunicorn.instrument.statsd import Statsd
  
  class TestException(Exception): pass
  
  class MockSocket(object):
      "Pretend to be a UDP socket"
      def __init__(self, failp):
          self.failp = failp
          self.msgs = []  # accumulate messages for later inspection
  
      def send(self, msg):
          if self.failp:
              raise TestException("Should not interrupt the logger")
          self.msgs.append(msg)
  
      def reset(self):
          self.msgs = []
  
  class MockResponse(object):
      def __init__(self, status):
          self.status = status
  
  def test_statsd_fail():
      "UDP socket fails"
      logger = Statsd(Config())
      logger.sock = MockSocket(True)
      logger.info("No impact on logging")
      logger.debug("No impact on logging")
      logger.critical("No impact on logging")
      logger.error("No impact on logging")
      logger.warning("No impact on logging")
      logger.exception("No impact on logging")
  
  def test_instrument():
      logger = Statsd(Config())
      logger.sock = MockSocket(False)
  
      logger.info("Blah", extra={"mtype": "gauge", "metric": "gunicorn.test", "value": 666})
      t.eq(logger.sock.msgs[0], "gunicorn.test:666|g")
      logger.sock.reset()
  
      logger.critical("Boom")
      t.eq(logger.sock.msgs[0], "gunicorn.log.critical:1|c|@1.0")
      logger.sock.reset()
  
      logger.access(MockResponse("200 OK"), None, {}, timedelta(seconds=7))
      t.eq(logger.sock.msgs[0], "gunicorn.request.duration:7000.0|ms")
      t.eq(logger.sock.msgs[1], "gunicorn.requests:1|c|@1.0")
      t.eq(logger.sock.msgs[2], "gunicorn.request.status.200:1|c|@1.0")
  
subject: Fix statsd test for millisecond times