Example #1
0
    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")
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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)
Example #5
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
Example #6
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
Example #7
0
    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)
Example #8
0
 def setUp(self):
     self.fakeBridges = generateFakeBridges()
     self.validRings = ['https', 'unallocated', 'email', 'moat']
     self.dbfname = 'test-bridgedb.sqlite'
     Storage.setDBFilename(self.dbfname)
Example #9
0
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):
Example #10
0
    def addRandomBridges(self):
        bridges = copy.deepcopy(util.generateFakeBridges())

        [self.ring.insert(bridge) for bridge in bridges]
Example #11
0
    def addRandomBridges(self):
        bridges = copy.deepcopy(util.generateFakeBridges())

        [self.ring.insert(bridge) for bridge in bridges]
Example #12
0
 def setUp(self):
     self.fakeBridges = generateFakeBridges()
     self.validRings = ['https', 'unallocated', 'email', 'moat']
     self.dbfname = 'test-bridgedb.sqlite'
     Storage.setDBFilename(self.dbfname)