From 4198e1f22a07fd6340788d35a4bae0ba269c524e Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 8 Mar 2022 22:44:47 +0000 Subject: [PATCH 1/6] Add some default bridges from Tor Browser. --- bramble-core/src/main/resources/bridges | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bramble-core/src/main/resources/bridges b/bramble-core/src/main/resources/bridges index 3c12fb397..8b8f8933b 100644 --- a/bramble-core/src/main/resources/bridges +++ b/bramble-core/src/main/resources/bridges @@ -1,7 +1,10 @@ +d Bridge obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=1 d Bridge obfs4 38.229.1.78:80 C8CBDB2464FC9804A69531437BCF2BE31FDD2EE4 cert=Hmyfd2ev46gGY7NoVxA9ngrPF2zCZtzskRTzoWXbxNkzeVnGFPWmrTtILRyqCTjHR+s9dg iat-mode=1 +d Bridge obfs4 38.229.33.83:80 0BAC39417268B96B9F514E7F63FA6FBA1A788955 cert=VwEFpk9F/UN9JED7XpG1XOjm/O8ZCXK80oPecgWnNDZDv5pdkhq1OpbAH0wNqOT6H6BmRQ iat-mode=1 d Bridge obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0 d Bridge obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0 d Bridge obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0 +d Bridge obfs4 144.217.20.138:80 FB70B257C162BF1038CA669D568D76F5B7F0BABB cert=vYIV5MgrghGQvZPIi1tJwnzorMgqgmlKaB77Y3Z9Q/v94wZBOAXkW+fdx4aSxLVnKO+xNw iat-mode=0 d Bridge obfs4 193.11.166.194:27015 2D82C2E354D531A68469ADF7F878FA6060C6BACA cert=4TLQPJrTSaDffMK7Nbao6LC7G9OW/NHkUwIdjLSS3KYf0Nv4/nQiiI8dY2TcsQx01NniOg iat-mode=0 d Bridge obfs4 193.11.166.194:27020 86AC7B8D430DAC4117E9F42C9EAED18133863AAF cert=0LDeJH4JzMDtkJJrFphJCiPqKx7loozKN7VNfuukMGfHO0Z8OGdzHVkhVAOfo1mUdv9cMg iat-mode=0 d Bridge obfs4 193.11.166.194:27025 1AE2C08904527FEA90C4C4F8C1083EA59FBC6FAF cert=ItvYZzW5tn6v3G4UnQa6Qz04Npro6e81AP70YujmK/KXwDFPTs3aHXcHp4n8Vt6w/bv8cA iat-mode=0 From 6805040ac49d6eeb8fd036b44d3bf9d21ca7b8f5 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 8 Mar 2022 22:45:39 +0000 Subject: [PATCH 2/6] Make BridgeTest more robust by trying each bridge three times. --- .../bramble/plugin/tor/BridgeTest.java | 79 +++++++++++++------ 1 file changed, 53 insertions(+), 26 deletions(-) diff --git a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java index a8f76d91a..f2bfd6304 100644 --- a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java +++ b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java @@ -1,6 +1,7 @@ package org.briarproject.bramble.plugin.tor; import org.briarproject.bramble.BrambleCoreIntegrationTestEagerSingletons; +import org.briarproject.bramble.api.Multiset; import org.briarproject.bramble.api.battery.BatteryManager; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.event.EventBus; @@ -29,9 +30,9 @@ import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; -import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; +import javax.annotation.concurrent.GuardedBy; import javax.inject.Inject; import javax.net.SocketFactory; @@ -60,24 +61,28 @@ public class BridgeTest extends BrambleTestCase { DaggerBrambleJavaIntegrationTestComponent.builder().build(); BrambleCoreIntegrationTestEagerSingletons.Helper .injectEagerSingletons(component); - // Share a failure counter among all the test instances - AtomicInteger failures = new AtomicInteger(0); + // Share stats among all the test instances + Stats stats = new Stats(); CircumventionProvider provider = component.getCircumventionProvider(); List states = new ArrayList<>(); - for (String bridge : provider.getBridges(DEFAULT_OBFS4)) { - states.add(new Params(bridge, DEFAULT_OBFS4, failures, false)); - } - for (String bridge : provider.getBridges(NON_DEFAULT_OBFS4)) { - states.add(new Params(bridge, NON_DEFAULT_OBFS4, failures, false)); - } - for (String bridge : provider.getBridges(MEEK)) { - states.add(new Params(bridge, MEEK, failures, true)); + for (int i = 0; i < ATTEMPTS_PER_BRIDGE; i++) { + for (String bridge : provider.getBridges(DEFAULT_OBFS4)) { + states.add(new Params(bridge, DEFAULT_OBFS4, stats, false)); + } + for (String bridge : provider.getBridges(NON_DEFAULT_OBFS4)) { + states.add(new Params(bridge, NON_DEFAULT_OBFS4, stats, false)); + } + for (String bridge : provider.getBridges(MEEK)) { + states.add(new Params(bridge, MEEK, stats, true)); + } } return states; } - private final static long TIMEOUT = MINUTES.toMillis(5); - private final static int NUM_FAILURES_ALLOWED = 1; + private final static long OBFS4_TIMEOUT = MINUTES.toMillis(2); + private final static long MEEK_TIMEOUT = MINUTES.toMillis(5); + private final static int UNREACHABLE_BRIDGES_ALLOWED = 1; + private final static int ATTEMPTS_PER_BRIDGE = 3; private final static Logger LOG = getLogger(BridgeTest.class.getName()); @@ -175,18 +180,16 @@ public class BridgeTest extends BrambleTestCase { try { plugin.start(); long start = clock.currentTimeMillis(); - while (clock.currentTimeMillis() - start < TIMEOUT) { + long timeout = params.bridgeType == MEEK + ? MEEK_TIMEOUT : OBFS4_TIMEOUT; + while (clock.currentTimeMillis() - start < timeout) { if (plugin.getState() == ACTIVE) return; clock.sleep(500); } if (plugin.getState() != ACTIVE) { - LOG.warning("Could not connect to Tor within timeout"); - if (params.failures.incrementAndGet() > NUM_FAILURES_ALLOWED) { - fail(params.failures.get() + " bridges are unreachable"); - } - if (params.mustSucceed) { - fail("essential bridge is unreachable"); - } + LOG.warning("Could not connect to Tor within timeout: " + + params.bridge); + params.stats.countFailure(params.bridge, params.essential); } } finally { plugin.stop(); @@ -197,15 +200,39 @@ public class BridgeTest extends BrambleTestCase { private final String bridge; private final BridgeType bridgeType; - private final AtomicInteger failures; - private final boolean mustSucceed; + private final Stats stats; + private final boolean essential; private Params(String bridge, BridgeType bridgeType, - AtomicInteger failures, boolean mustSucceed) { + Stats stats, boolean essential) { this.bridge = bridge; this.bridgeType = bridgeType; - this.failures = failures; - this.mustSucceed = mustSucceed; + this.stats = stats; + this.essential = essential; + } + } + + private static class Stats { + + @GuardedBy("this") + private final Multiset failures = new Multiset<>(); + @GuardedBy("this") + private final List unreachable = new ArrayList<>(); + + private synchronized void countFailure(String bridge, + boolean essential) { + if (failures.add(bridge) == ATTEMPTS_PER_BRIDGE) { + LOG.warning("Bridge is unreachable after " + + ATTEMPTS_PER_BRIDGE + " attempts: " + bridge); + unreachable.add(bridge); + if (unreachable.size() > UNREACHABLE_BRIDGES_ALLOWED) { + fail(unreachable.size() + " bridges are unreachable: " + + unreachable); + } + if (essential) { + fail("essential bridge is unreachable"); + } + } } } } From e3682bb331ad9532edf660846d4975ec3d37c490 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 9 Mar 2022 12:54:34 +0000 Subject: [PATCH 3/6] Make more attempts per bridge to try to get stable results. --- .../org/briarproject/bramble/plugin/tor/BridgeTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java index f2bfd6304..d9ab1d41c 100644 --- a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java +++ b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java @@ -29,6 +29,8 @@ import org.junit.runners.Parameterized.Parameters; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -80,9 +82,9 @@ public class BridgeTest extends BrambleTestCase { } private final static long OBFS4_TIMEOUT = MINUTES.toMillis(2); - private final static long MEEK_TIMEOUT = MINUTES.toMillis(5); + private final static long MEEK_TIMEOUT = MINUTES.toMillis(6); private final static int UNREACHABLE_BRIDGES_ALLOWED = 1; - private final static int ATTEMPTS_PER_BRIDGE = 3; + private final static int ATTEMPTS_PER_BRIDGE = 5; private final static Logger LOG = getLogger(BridgeTest.class.getName()); @@ -217,7 +219,7 @@ public class BridgeTest extends BrambleTestCase { @GuardedBy("this") private final Multiset failures = new Multiset<>(); @GuardedBy("this") - private final List unreachable = new ArrayList<>(); + private final Set unreachable = new TreeSet<>(); private synchronized void countFailure(String bridge, boolean essential) { From 2d62deb2db65c50e8bf7e06ff3853a38b6387e3c Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 9 Mar 2022 12:57:20 +0000 Subject: [PATCH 4/6] Increase CI timeout for BridgeTest. --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6d06e8f6a..7ca9a4efc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -98,6 +98,7 @@ bridge test: allow_failure: true script: - OPTIONAL_TESTS=org.briarproject.bramble.plugin.tor.BridgeTest ./gradlew --info bramble-java:test --tests BridgeTest + timeout: 3h mailbox integration test: extends: .optional_tests From bf0f99277a1a4106e6812ea4b6b0ebbc598b2195 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 10 Mar 2022 10:02:00 +0000 Subject: [PATCH 5/6] Remove four consistently failing bridges. --- bramble-core/src/main/resources/bridges | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bramble-core/src/main/resources/bridges b/bramble-core/src/main/resources/bridges index 8b8f8933b..180d16c2a 100644 --- a/bramble-core/src/main/resources/bridges +++ b/bramble-core/src/main/resources/bridges @@ -4,15 +4,11 @@ d Bridge obfs4 38.229.33.83:80 0BAC39417268B96B9F514E7F63FA6FBA1A788955 cert=VwE d Bridge obfs4 37.218.245.14:38224 D9A82D2F9C2F65A18407B1D2B764F130847F8B5D cert=bjRaMrr1BRiAW8IE9U5z27fQaYgOhX1UCmOpg2pFpoMvo6ZgQMzLsaTzzQNTlm7hNcb+Sg iat-mode=0 d Bridge obfs4 85.31.186.98:443 011F2599C0E9B27EE74B353155E244813763C3E5 cert=ayq0XzCwhpdysn5o0EyDUbmSOx3X/oTEbzDMvczHOdBJKlvIdHHLJGkZARtT4dcBFArPPg iat-mode=0 d Bridge obfs4 85.31.186.26:443 91A6354697E6B02A386312F68D82CF86824D3606 cert=PBwr+S8JTVZo6MPdHnkTwXJPILWADLqfMGoVvhZClMq/Urndyd42BwX9YFJHZnBB3H0XCw iat-mode=0 -d Bridge obfs4 144.217.20.138:80 FB70B257C162BF1038CA669D568D76F5B7F0BABB cert=vYIV5MgrghGQvZPIi1tJwnzorMgqgmlKaB77Y3Z9Q/v94wZBOAXkW+fdx4aSxLVnKO+xNw iat-mode=0 d Bridge obfs4 193.11.166.194:27015 2D82C2E354D531A68469ADF7F878FA6060C6BACA cert=4TLQPJrTSaDffMK7Nbao6LC7G9OW/NHkUwIdjLSS3KYf0Nv4/nQiiI8dY2TcsQx01NniOg iat-mode=0 d Bridge obfs4 193.11.166.194:27020 86AC7B8D430DAC4117E9F42C9EAED18133863AAF cert=0LDeJH4JzMDtkJJrFphJCiPqKx7loozKN7VNfuukMGfHO0Z8OGdzHVkhVAOfo1mUdv9cMg iat-mode=0 d Bridge obfs4 193.11.166.194:27025 1AE2C08904527FEA90C4C4F8C1083EA59FBC6FAF cert=ItvYZzW5tn6v3G4UnQa6Qz04Npro6e81AP70YujmK/KXwDFPTs3aHXcHp4n8Vt6w/bv8cA iat-mode=0 d Bridge obfs4 209.148.46.65:443 74FAD13168806246602538555B5521A0383A1875 cert=ssH+9rP8dG2NLDN2XuFw63hIO/9MNNinLmxQDpVa+7kTOa9/m+tGWT1SmSYpQ9uTBGa6Hw iat-mode=0 -d Bridge obfs4 146.57.248.225:22 10A6CD36A537FCE513A322361547444B393989F0 cert=K1gDtDAIcUfeLqbstggjIw2rtgIKqdIhUlHp82XRqNSq/mtAjp1BIC9vHKJ2FAEpGssTPw iat-mode=0 -d Bridge obfs4 45.145.95.6:27015 C5B7CD6946FF10C5B3E89691A7D3F2C122D2117C cert=TD7PbUO0/0k6xYHMPW3vJxICfkMZNdkRrb63Zhl5j9dW3iRGiCx0A7mPhe5T2EDzQ35+Zw iat-mode=0 d Bridge obfs4 51.222.13.177:80 5EDAC3B810E12B01F6FD8050D2FD3E277B289A08 cert=2uplIpLQ0q9+0qMFrK5pkaYRDOe460LL9WHBvatgkuRr/SL31wBOEupaMMJ6koRE6Ld0ew iat-mode=0 -d Bridge obfs4 185.100.85.3:443 5B403DFE34F4872EB027059CECAE30B0C864B3A2 cert=bWUdFUe8io9U6JkSLoGAvSAUDcB779/shovCYmYAQb/pW/iEAMZtO/lCd94OokOF909TPA iat-mode=2 n Bridge obfs4 46.226.107.197:10300 A38FD6BDFD902882F5F5B9B7CCC95602A20B0BC4 cert=t8tA9q2AeGlmp/dO6oW9bkY5RqqmvqjArCEM9wjJoDnk6XtnaejkF0JTA7VamdyOzcvuBg iat-mode=0 n Bridge obfs4 23.88.49.56:443 1CDA1660823AE2565D7F50DE8EB99DFDDE96074B cert=4bwNXedHutVD0ZqCm6ph90Vik9dRY4n9qnBHiLiqQOSsIvui4iHwuMFQK6oqiK8tyhVcDw iat-mode=0 n Bridge obfs4 185.181.11.86:443 A961609729E7FDF520B4E81F1F1B8FA1045285C3 cert=e5faG9Zk4Ni+e7z2YgGfevyKPQlMvkVGi4ublSsHYjaBovKeNXpOhbeFxzbZZoAzxAoGUQ iat-mode=0 From a256027916b102d8169ef62d48736892e1ca623e Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 10 Mar 2022 10:03:06 +0000 Subject: [PATCH 6/6] Tolerate up to 4 unreachable bridges per run. --- .../java/org/briarproject/bramble/plugin/tor/BridgeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java index d9ab1d41c..c5cc1f51f 100644 --- a/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java +++ b/bramble-java/src/test/java/org/briarproject/bramble/plugin/tor/BridgeTest.java @@ -83,7 +83,7 @@ public class BridgeTest extends BrambleTestCase { private final static long OBFS4_TIMEOUT = MINUTES.toMillis(2); private final static long MEEK_TIMEOUT = MINUTES.toMillis(6); - private final static int UNREACHABLE_BRIDGES_ALLOWED = 1; + private final static int UNREACHABLE_BRIDGES_ALLOWED = 4; private final static int ATTEMPTS_PER_BRIDGE = 5; private final static Logger LOG = getLogger(BridgeTest.class.getName());