Example #1
0
 def test_insertBridgeAndGetRing_new_bridge(self):
     bridge = self.fakeBridges[0]
     Storage.initializeDBLock()
     with Storage.getDB() as db:
         ringname = db.insertBridgeAndGetRing(bridge, 'moat', time.time(),
                                              self.validRings)
         self.assertIn(ringname, self.validRings)
Example #2
0
 def test_insertBridgeAndGetRing_new_bridge(self):
     bridge = self.fakeBridges[0]
     Storage.initializeDBLock()
     with Storage.getDB() as db:
         ringname = db.insertBridgeAndGetRing(bridge, 'moat',
                                              time.time(),
                                              self.validRings)
         self.assertIn(ringname, self.validRings)
Example #3
0
 def test_BridgeMeasurementComparison(self):
     m1 = Storage.BridgeMeasurement(0, "", "", "", "", "", "", "",
                                    "2020-06-17", 0)
     m2 = Storage.BridgeMeasurement(0, "", "", "", "", "", "", "",
                                    "2020-06-18", 0)
     self.assertTrue(m2.newerThan(m1))
     self.assertFalse(m1.newerThan(m2))
     self.assertFalse(m1.newerThan(m1))
Example #4
0
    def test_getBridgeDistributor_recognised(self):
        bridge = self.fakeBridges[0]
        Storage.initializeDBLock()
        with Storage.getDB() as db:
            ringname = db.insertBridgeAndGetRing(bridge, 'moat', time.time(),
                                                 self.validRings)
            self.assertIn(ringname, self.validRings)
            self.assertEqual(ringname, 'moat')
            db.commit()

        with Storage.getDB() as db:
            ringname = db.getBridgeDistributor(bridge, self.validRings)
            self.assertEqual(ringname, 'moat')
Example #5
0
    def test_getBridgeDistributor_recognised(self):
        bridge = self.fakeBridges[0]
        Storage.initializeDBLock()
        with Storage.getDB() as db:
            ringname = db.insertBridgeAndGetRing(bridge, 'moat',
                                                 time.time(),
                                                 self.validRings)
            self.assertIn(ringname, self.validRings)
            self.assertEqual(ringname, 'moat')
            db.commit()

        with Storage.getDB() as db:
            ringname = db.getBridgeDistributor(bridge, self.validRings)
            self.assertEqual(ringname, 'moat')
Example #6
0
 def test_getDB_ConcurrencyLock(self):
     timeout = 1
     d1 = deferToThread(self._runAndDie, timeout, Storage.getDB)
     d1.addCallback(self._cb_assertFalse)
     d1.addErrback(self._eb_Failure)
     d2 = deferToThread(Storage.getDB, False)
     d2.addCallback(self._cb_assertFalse)
     d2.addErrback(self._eb_Failure)
     d2.addCallback(self._cb_assertTrue, Storage.getDB(False))
Example #7
0
 def test_getDB_ConcurrencyLock(self):
     timeout = 1
     d1 = deferToThread(self._runAndDie, timeout, Storage.getDB)
     d1.addCallback(self._cb_assertFalse)
     d1.addErrback(self._eb_Failure)
     d2 = deferToThread(Storage.getDB, False)
     d2.addCallback(self._cb_assertFalse)
     d2.addErrback(self._eb_Failure)
     d2.addCallback(self._cb_assertTrue, Storage.getDB(False))
Example #8
0
    def test_fetchBridgeMeasurements(self):

        query = "INSERT INTO BridgeMeasurements (hex_key, bridge_type, " \
                "address, port, blocking_country, blocking_asn, " \
                "measured_by, last_measured, verdict) VALUES ('key', " \
                "'obfs4', '1.2.3.4', '1234', 'RU', '1234', 'OONI', '%s', 1)"
        oldMsmt = query % "2017-01-01"
        newMsmt = query % datetime.datetime.utcnow().strftime("%Y-%m-%d")

        Storage.initializeDBLock()
        with Storage.getDB() as db:
            db._cur.execute(oldMsmt)
            # We're calling _Database__fetchBridgeMeasurements instead of
            # __fetchBridgeMeasurements to account for Python's name meddling.
            rows = db._Database__fetchBridgeMeasurements()
            # Outdated measurements should not be returned.
            self.assertEquals(len(rows), 0)

            db._cur.execute(newMsmt)
            rows = db._Database__fetchBridgeMeasurements()
            # Measurements that are "young enough" should be returned.
            self.assertEquals(len(rows), 1)
Example #9
0
 def setUp(self):
     self.dbfname = 'test-bridgedb.sqlite'
     Storage.setDBFilename(self.dbfname)
Example #10
0
 def test_getDB_AcquireLock(self):
     Storage.initializeDBLock()
     with Storage.getDB() as db:
         self.assertIsInstance(db, Storage.Database)
         self.assertTrue(Storage.dbIsLocked())
         self.assertEqual(db, Storage._OPENED_DB)
Example #11
0
 def tearDown(self):
     if os.path.isfile(self.dbfname):
         os.unlink(self.dbfname)
     Storage.clearGlobalDB()
Example #12
0
 def tearDown(self):
     if os.path.isfile(self.dbfname):
         os.unlink(self.dbfname)
     Storage.clearGlobalDB()
Example #13
0
 def test_getDB_AcquireLock(self):
     Storage.initializeDBLock()
     with Storage.getDB() as db:
         self.assertIsInstance(db, Storage.Database)
         self.assertTrue(Storage.dbIsLocked())
         self.assertEqual(db, Storage._OPENED_DB)
Example #14
0
    def test_getBlockedBridgesFromSql(self):

        elems = [(0, "0000000000000000000000000000000000000000", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-17",
                  Storage.BRIDGE_BLOCKED),
                 (1, "1111111111111111111111111111111111111111", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-01",
                  Storage.BRIDGE_BLOCKED),
                 (2, "1111111111111111111111111111111111111111", "obfs4",
                  "1.2.3.4", "4321", "ru", "4321", "ooni", "2020-06-01",
                  Storage.BRIDGE_BLOCKED),
                 (3, "1111111111111111111111111111111111111111", "obfs4",
                  "1.2.3.4", "4321", "ru", "4321", "ooni", "2020-05-01",
                  Storage.BRIDGE_REACHABLE)]
        b = Storage.getBlockedBridgesFromSql(elems)
        self.assertEqual(
            b, {
                "0000000000000000000000000000000000000000":
                [("ru", "1.2.3.4", "1234")],
                "1111111111111111111111111111111111111111": [
                    ("ru", "1.2.3.4", "1234"), ("ru", "1.2.3.4", "4321")
                ]
            })

        # If multiple measurements disagree, we believe the newest one.
        elems = [(0, "0000000000000000000000000000000000000000", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-17",
                  Storage.BRIDGE_BLOCKED),
                 (1, "0000000000000000000000000000000000000000", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-01",
                  Storage.BRIDGE_REACHABLE)]
        b = Storage.getBlockedBridgesFromSql(elems)
        self.assertEqual(
            b, {
                "0000000000000000000000000000000000000000":
                [("ru", "1.2.3.4", "1234")]
            })

        elems = [(0, "0000000000000000000000000000000000000000", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-01",
                  Storage.BRIDGE_BLOCKED),
                 (1, "0000000000000000000000000000000000000000", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-17",
                  Storage.BRIDGE_REACHABLE)]
        b = Storage.getBlockedBridgesFromSql(elems)
        self.assertTrue(len(b) == 0)

        # Element ordering must not affect the outcome.
        elems = [(1, "0000000000000000000000000000000000000000", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-17",
                  Storage.BRIDGE_REACHABLE),
                 (0, "0000000000000000000000000000000000000000", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-01",
                  Storage.BRIDGE_BLOCKED)]
        b = Storage.getBlockedBridgesFromSql(elems)
        self.assertTrue(len(b) == 0)

        # Redundant measurements should be discarded.
        elems = [(1, "0000000000000000000000000000000000000000", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-17",
                  Storage.BRIDGE_BLOCKED),
                 (0, "0000000000000000000000000000000000000000", "obfs4",
                  "1.2.3.4", "1234", "ru", "4321", "ooni", "2020-06-01",
                  Storage.BRIDGE_BLOCKED)]
        b = Storage.getBlockedBridgesFromSql(elems)
        self.assertTrue(len(b) == 1)
Example #15
0
 def setUp(self):
     self.fakeBridges = generateFakeBridges()
     self.validRings = ['https', 'unallocated', 'email', 'moat']
     self.dbfname = 'test-bridgedb.sqlite'
     Storage.setDBFilename(self.dbfname)
Example #16
0
    def test_main_loadBlockedBridges(self):
        Storage.initializeDBLock()

        # Mock configuration object that we use to initialize our bridge rings.
        class Cfg(object):
            def __init__(self):
                self.FORCE_PORTS = [(443, 1)]
                self.FORCE_FLAGS = [("Stable", 1)]
                self.MOAT_DIST = False
                self.HTTPS_DIST = True
                self.HTTPS_SHARE = 10
                self.N_IP_CLUSTERS = 1
                self.EMAIL_DIST = False
                self.RESERVED_SHARE = 0

        bridge = self.fakeBridges[0]
        addr, port, _ = bridge.orAddresses[0]
        cc = "de"

        # Mock object that we use to simulate a database connection.
        class DummyDB(object):
            def __init__(self):
                pass

            def __enter__(self):
                return self

            def __exit__(self, type, value, traceback):
                pass

            def getBlockedBridges(self):
                return {bridge.fingerprint: [(cc, addr, port)]}

            def getBridgeDistributor(self, bridge, validRings):
                return "https"

            def insertBridgeAndGetRing(self,
                                       bridge,
                                       setRing,
                                       seenAt,
                                       validRings,
                                       defaultPool="unallocated"):
                return "https"

            def commit(self):
                pass

        oldObj = Storage.getDB
        Storage.getDB = DummyDB

        hashring, _, _, _ = main.createBridgeRings(Cfg(), None, b'key')
        hashring.insert(bridge)

        self.assertEqual(len(hashring), 1)
        self.assertFalse(bridge.isBlockedIn(cc))
        self.assertFalse(bridge.isBlockedIn("ab"))
        self.assertFalse(bridge.addressIsBlockedIn(cc, addr, port))

        main.loadBlockedBridges(hashring)

        self.assertTrue(bridge.isBlockedIn(cc))
        self.assertFalse(bridge.isBlockedIn("ab"))
        self.assertTrue(bridge.addressIsBlockedIn(cc, addr, port))

        Storage.getDB = oldObj
Example #17
0
 def setUp(self):
     self.fakeBridges = generateFakeBridges()
     self.validRings = ['https', 'unallocated', 'email', 'moat']
     self.dbfname = 'test-bridgedb.sqlite'
     Storage.setDBFilename(self.dbfname)
Example #18
0
 def test_BridgeMeasurementCompact(self):
     m = Storage.BridgeMeasurement(0, "FINGERPRINT", "obfs4", "1.2.3.4",
                                   "1234", "ru", "1234", "ooni",
                                   "2020-06-17", 0)
     self.assertEquals(m.compact(), ("ru", "1.2.3.4", "1234"))