def setUp(self): self.bridges = copy.deepcopy(util.generateFakeBridges()) self.fd, self.fname = tempfile.mkstemp(suffix=".sqlite", dir=os.getcwd()) bridgedb.Storage.initializeDBLock() self.db = bridgedb.Storage.openDatabase(self.fname) bridgedb.Storage.setDBFilename(self.fname) key = 'fake-hmac-key' self.splitter = Bridges.BridgeSplitter(key) ringParams = Bridges.BridgeRingParameters(needPorts=[(443, 1)], needFlags=[("Stable", 1)]) self.https_distributor = HTTPSDistributor(4, crypto.getHMAC( key, "HTTPS-IP-Dist-Key"), None, answerParameters=ringParams) self.moat_distributor = MoatDistributor(4, crypto.getHMAC( key, "Moat-Dist-Key"), None, answerParameters=ringParams) self.unallocated_distributor = Bridges.UnallocatedHolder() self.splitter.addRing(self.https_distributor.hashring, "https", p=10) self.splitter.addRing(self.moat_distributor.hashring, "moat", p=10) self.splitter.addRing(self.unallocated_distributor, "unallocated", p=10) self.https_ring = self.splitter.ringsByName.get("https") self.moat_ring = self.splitter.ringsByName.get("moat") self.unallocated_ring = self.splitter.ringsByName.get("unallocated")
def test_handouts(self): metrix = metrics.InternalMetrics() metrix.recordHandoutsPerBridge(None, None) self.assertEqual(len(metrix.hotMetrics), 0) req = HTTPSBridgeRequest() req.withIPversion({}) req.isValid(True) bridges = copy.deepcopy(util.generateFakeBridges()) metrix.recordHandoutsPerBridge(req, [bridges[0]]) self.assertNotIn("internal.handouts.median", metrix.hotMetrics.keys()) metrix.recordHandoutsPerBridge(req, [bridges[1]]) self.assertNotIn("internal.handouts.median", metrix.hotMetrics.keys()) metrix.recordHandoutsPerBridge(req, [bridges[2]]) self.assertEqual(metrix.hotMetrics["internal.handouts.median"], 1) metrix.recordHandoutsPerBridge(req, [bridges[1]]) metrix.recordHandoutsPerBridge(req, [bridges[2]]) metrix.recordHandoutsPerBridge(req, [bridges[2]]) self.assertEqual(metrix.hotMetrics["internal.handouts.min"], 1) self.assertEqual(metrix.hotMetrics["internal.handouts.median"], 2) self.assertEqual(metrix.hotMetrics["internal.handouts.max"], 3) self.assertEqual(metrix.hotMetrics["internal.handouts.unique-bridges"], 3) self.assertEqual(metrix.hotMetrics["internal.handouts.quartile1"], 1.5) self.assertEqual(metrix.hotMetrics["internal.handouts.quartile3"], 2.5) self.assertEqual(metrix.hotMetrics["internal.handouts.lower-whisker"], 1) self.assertEqual(metrix.hotMetrics["internal.handouts.upper-whisker"], 3)
def test_bridge_handouts(self): metrix = metrics.InternalMetrics() bridges = copy.deepcopy(util.generateFakeBridges()) bridge1, bridge2, bridge3 = bridges[0:3] m = metrix.hotMetrics br = HTTPSBridgeRequest() br.withIPversion({"ipv6": "4"}) br.isValid(True) # Record a number of distribution events for three separate bridges. for i in range(10): metrix.recordHandoutsPerBridge(br, [bridge1]) for i in range(5): metrix.recordHandoutsPerBridge(br, [bridge2]) metrix.recordHandoutsPerBridge(br, [bridge3]) self.assertEqual(m["internal.handouts.unique-bridges"], 3) self.assertEqual(m["internal.handouts.min"], 1) self.assertEqual(m["internal.handouts.max"], 10) self.assertEqual(m["internal.handouts.median"], 5) # Internal metrics must not be sanitized. metrix.rotate() lines = metrix.getMetrics() self.assertIn("internal.handouts.unique-bridges 3", lines) self.assertIn("internal.handouts.median 5", lines) self.assertIn("internal.handouts.min 1", lines) self.assertIn("internal.handouts.max 10", lines)
def test_metrics_reset(self): metrix = metrics.InternalMetrics() req = HTTPSBridgeRequest() req.withIPversion({}) bridges = copy.deepcopy(util.generateFakeBridges()) metrix.recordHandoutsPerBridge(req, [bridges[0]]) self.assertTrue(len(metrix.bridgeHandouts) > 0) metrix.reset() self.assertTrue(len(metrix.bridgeHandouts) == 0)
def addBridgesFromSameSubnet(self): bridges = copy.deepcopy(util.generateFakeBridges()) subnet = "5.5.%d.%d" i = 1 j = 1 for bridge in bridges: bridge.address = ipaddr.IPAddress(subnet % (i, j)) self.ring.insert(bridge) if j == 255: j = 1 i += 1 else: j += 1
def test_ipv4_ipv6_requests(self): metrix = metrics.InternalMetrics() v6Req = HTTPSBridgeRequest() v6Req.withIPversion({"ipv6": "4"}) v4Req = HTTPSBridgeRequest() v4Req.withIPversion({}) bridges = copy.deepcopy(util.generateFakeBridges()) for i in range(9): metrix.recordHandoutsPerBridge(v6Req, [bridges[0]]) metrix.recordHandoutsPerBridge(v6Req, [bridges[1]]) for i in range(11): metrix.recordHandoutsPerBridge(v4Req, [bridges[0]]) metrix.rotate() lines = metrix.getMetrics() self.assertIn("internal.handouts.ipv6 10", lines) self.assertIn("internal.handouts.ipv4 20", lines)
def setUp(self): self.fakeBridges = generateFakeBridges() self.validRings = ['https', 'unallocated', 'email', 'moat'] self.dbfname = 'test-bridgedb.sqlite' Storage.setDBFilename(self.dbfname)
from bridgedb.Bridges import BridgeRing from bridgedb.Bridges import BridgeRingParameters from bridgedb.filters import byIPv4 from bridgedb.filters import byIPv6 from bridgedb.distributors.https import distributor from bridgedb.distributors.https.request import HTTPSBridgeRequest from bridgedb.proxy import ProxySet from bridgedb.test.util import randomValidIPv4String from bridgedb.test.util import generateFakeBridges from bridgedb.test.https_helpers import DummyRequest logging.disable(50) BRIDGES = generateFakeBridges() class HTTPSDistributorTests(unittest.TestCase): """Tests for :class:`HTTPSDistributor`.""" def setUp(self): self.key = 'aQpeOFIj8q20s98awfoiq23rpOIjFaqpEWFoij1X' self.bridges = BRIDGES def tearDown(self): """Reset all bridge blocks in between test method runs.""" for bridge in self.bridges: bridge._blockedIn = {} def coinFlip(self):
def addRandomBridges(self): bridges = copy.deepcopy(util.generateFakeBridges()) [self.ring.insert(bridge) for bridge in bridges]