Index: tools/telemetry/third_party/webpagereplay/proxyshaper.py |
diff --git a/tools/telemetry/third_party/webpagereplay/proxyshaper.py b/tools/telemetry/third_party/webpagereplay/proxyshaper.py |
deleted file mode 100644 |
index 6c6976f5b47cab1f693952c02ddf22292068f2f5..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/webpagereplay/proxyshaper.py |
+++ /dev/null |
@@ -1,125 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright 2012 Google Inc. All Rights Reserved. |
-# |
-# Licensed under the Apache License, Version 2.0 (the "License"); |
-# you may not use this file except in compliance with the License. |
-# You may obtain a copy of the License at |
-# |
-# http://www.apache.org/licenses/LICENSE-2.0 |
-# |
-# Unless required by applicable law or agreed to in writing, software |
-# distributed under the License is distributed on an "AS IS" BASIS, |
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-# See the License for the specific language governing permissions and |
-# limitations under the License. |
- |
-"""Simulate network characteristics directly in Python. |
- |
-Allows running replay without dummynet. |
-""" |
- |
-import logging |
-import platformsettings |
-import re |
-import time |
- |
- |
-TIMER = platformsettings.timer |
- |
- |
-class ProxyShaperError(Exception): |
- """Module catch-all error.""" |
- pass |
- |
-class BandwidthValueError(ProxyShaperError): |
- """Raised for unexpected dummynet-style bandwidth value.""" |
- pass |
- |
- |
-class RateLimitedFile(object): |
- """Wrap a file like object with rate limiting. |
- |
- TODO(slamm): Simulate slow-start. |
- Each RateLimitedFile corresponds to one-direction of a |
- bidirectional socket. Slow-start can be added here (algorithm needed). |
- Will consider changing this class to take read and write files and |
- corresponding bit rates for each. |
- """ |
- BYTES_PER_WRITE = 1460 |
- |
- def __init__(self, request_counter, f, bps): |
- """Initialize a RateLimiter. |
- |
- Args: |
- request_counter: callable to see how many requests share the limit. |
- f: file-like object to wrap. |
- bps: an integer of bits per second. |
- """ |
- self.request_counter = request_counter |
- self.original_file = f |
- self.bps = bps |
- |
- def transfer_seconds(self, num_bytes): |
- """Seconds to read/write |num_bytes| with |self.bps|.""" |
- return 8.0 * num_bytes / self.bps |
- |
- def write(self, data): |
- num_bytes = len(data) |
- num_sent_bytes = 0 |
- while num_sent_bytes < num_bytes: |
- num_write_bytes = min(self.BYTES_PER_WRITE, num_bytes - num_sent_bytes) |
- num_requests = self.request_counter() |
- wait = self.transfer_seconds(num_write_bytes) * num_requests |
- logging.debug('write sleep: %0.4fs (%d requests)', wait, num_requests) |
- time.sleep(wait) |
- |
- self.original_file.write( |
- data[num_sent_bytes:num_sent_bytes + num_write_bytes]) |
- num_sent_bytes += num_write_bytes |
- |
- def _read(self, read_func, size): |
- start = TIMER() |
- data = read_func(size) |
- read_seconds = TIMER() - start |
- num_bytes = len(data) |
- num_requests = self.request_counter() |
- wait = self.transfer_seconds(num_bytes) * num_requests - read_seconds |
- if wait > 0: |
- logging.debug('read sleep: %0.4fs %d requests)', wait, num_requests) |
- time.sleep(wait) |
- return data |
- |
- def readline(self, size=-1): |
- return self._read(self.original_file.readline, size) |
- |
- def read(self, size=-1): |
- return self._read(self.original_file.read, size) |
- |
- def __getattr__(self, name): |
- """Forward any non-overriden calls.""" |
- return getattr(self.original_file, name) |
- |
- |
-def GetBitsPerSecond(bandwidth): |
- """Return bits per second represented by dummynet bandwidth option. |
- |
- See ipfw/dummynet.c:read_bandwidth for how it is really done. |
- |
- Args: |
- bandwidth: a dummynet-style bandwidth specification (e.g. "10Kbit/s") |
- """ |
- if bandwidth == '0': |
- return 0 |
- bw_re = r'^(\d+)(?:([KM])?(bit|Byte)/s)?$' |
- match = re.match(bw_re, str(bandwidth)) |
- if not match: |
- raise BandwidthValueError('Value, "%s", does not match regex: %s' % ( |
- bandwidth, bw_re)) |
- bw = int(match.group(1)) |
- if match.group(2) == 'K': |
- bw *= 1000 |
- if match.group(2) == 'M': |
- bw *= 1000000 |
- if match.group(3) == 'Byte': |
- bw *= 8 |
- return bw |