setting to exclude proxy from global routing
This commit is contained in:
+170
-1
@@ -1,6 +1,7 @@
|
||||
import 'dart:async';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:drift/native.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:flutter_tor/flutter_tor.dart';
|
||||
@@ -9,6 +10,8 @@ import 'package:weblibre/data/database/functions/lexo_rank_functions.dart';
|
||||
import 'package:weblibre/data/database/functions/url_functions.dart';
|
||||
import 'package:weblibre/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart';
|
||||
import 'package:weblibre/features/geckoview/features/tabs/data/database/database.dart';
|
||||
import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_mode.dart';
|
||||
import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_source.dart';
|
||||
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
|
||||
import 'package:weblibre/features/geckoview/features/tabs/data/models/site_assignment.dart';
|
||||
import 'package:weblibre/features/geckoview/features/tabs/data/providers.dart';
|
||||
@@ -82,12 +85,168 @@ void main() {
|
||||
]);
|
||||
},
|
||||
);
|
||||
|
||||
test('bypassed containers sync explicit direct routing', () async {
|
||||
final bypassedContainer = _container(
|
||||
id: 'container-1',
|
||||
contextId: 'context-a',
|
||||
bypassGlobalProxy: true,
|
||||
);
|
||||
final db = TabDatabase(
|
||||
NativeDatabase.memory(
|
||||
setup: (database) {
|
||||
registerLexorankFunctions(database);
|
||||
registerUrlFunctions(database);
|
||||
},
|
||||
),
|
||||
);
|
||||
final containerProxyRepository = _FakeContainerProxyRepository();
|
||||
final containerRepository = _FakeContainerRepository([bypassedContainer]);
|
||||
final container = ProviderContainer(
|
||||
overrides: [
|
||||
tabDatabaseProvider.overrideWith((ref) => db),
|
||||
containerProxyRepositoryProvider.overrideWith(
|
||||
() => containerProxyRepository,
|
||||
),
|
||||
containerRepositoryProvider.overrideWith(() => containerRepository),
|
||||
torProxyServiceProvider.overrideWith(_FakeTorProxyService.new),
|
||||
proxyRoutingSettingsWithDefaultsProvider.overrideWith(
|
||||
(ref) => ProxyRoutingSettings.withDefaults(
|
||||
regularTabsMode: ProxyRegularTabRoutingMode.all,
|
||||
regularTabsProxyConnectionId: const TorProxyConnectionId(),
|
||||
),
|
||||
),
|
||||
watchContainersWithCountProvider.overrideWith(
|
||||
(ref) => Stream.value([bypassedContainer]),
|
||||
),
|
||||
watchAllAssignedSitesProvider.overrideWith(
|
||||
(ref) => Stream.value(const <SiteAssignment>[]),
|
||||
),
|
||||
watchIsolatedContextContainerMapProvider.overrideWith(
|
||||
(ref) => Stream.value(const <String, Set<String>>{}),
|
||||
),
|
||||
],
|
||||
);
|
||||
addTearDown(() async {
|
||||
container.dispose();
|
||||
await db.close();
|
||||
});
|
||||
|
||||
final subscription = container.listen<void>(
|
||||
proxySettingsReplicationProvider,
|
||||
(previous, next) {},
|
||||
fireImmediately: true,
|
||||
);
|
||||
addTearDown(subscription.close);
|
||||
await pumpEventQueue();
|
||||
|
||||
expect(containerProxyRepository.setContainerDirectConnectionCalls, [
|
||||
('context-a', 'context-a'),
|
||||
]);
|
||||
expect(containerProxyRepository.setContainerProxyCalls, [
|
||||
('general', const TorProxyConnectionId().encode()),
|
||||
]);
|
||||
});
|
||||
|
||||
test(
|
||||
'mixed bypassed and inherited isolated containers do not bypass globally',
|
||||
() async {
|
||||
final bypassedContainer = _container(
|
||||
id: 'container-direct',
|
||||
contextId: 'context-direct',
|
||||
bypassGlobalProxy: true,
|
||||
);
|
||||
final inheritedContainer = _container(
|
||||
id: 'container-inherit',
|
||||
contextId: 'context-inherit',
|
||||
);
|
||||
final db = TabDatabase(
|
||||
NativeDatabase.memory(
|
||||
setup: (database) {
|
||||
registerLexorankFunctions(database);
|
||||
registerUrlFunctions(database);
|
||||
},
|
||||
),
|
||||
);
|
||||
await db.containerDao.addContainer(bypassedContainer);
|
||||
await db.containerDao.addContainer(inheritedContainer);
|
||||
await db.tabDao.insertTab(
|
||||
'tab-direct',
|
||||
source: TabSource.manual,
|
||||
parentId: const Value(null),
|
||||
containerId: const Value('container-direct'),
|
||||
tabMode: Value(TabMode.isolated('isolation-a')),
|
||||
);
|
||||
await db.tabDao.insertTab(
|
||||
'tab-inherit',
|
||||
source: TabSource.manual,
|
||||
parentId: const Value(null),
|
||||
containerId: const Value('container-inherit'),
|
||||
tabMode: Value(TabMode.isolated('isolation-a')),
|
||||
);
|
||||
final containerProxyRepository = _FakeContainerProxyRepository();
|
||||
final containers = [bypassedContainer, inheritedContainer];
|
||||
final containerRepository = _FakeContainerRepository(containers);
|
||||
final container = ProviderContainer(
|
||||
overrides: [
|
||||
tabDatabaseProvider.overrideWith((ref) => db),
|
||||
containerProxyRepositoryProvider.overrideWith(
|
||||
() => containerProxyRepository,
|
||||
),
|
||||
containerRepositoryProvider.overrideWith(() => containerRepository),
|
||||
torProxyServiceProvider.overrideWith(_FakeTorProxyService.new),
|
||||
proxyRoutingSettingsWithDefaultsProvider.overrideWith(
|
||||
(ref) => ProxyRoutingSettings.withDefaults(
|
||||
regularTabsMode: ProxyRegularTabRoutingMode.all,
|
||||
regularTabsProxyConnectionId: const TorProxyConnectionId(),
|
||||
),
|
||||
),
|
||||
watchContainersWithCountProvider.overrideWith(
|
||||
(ref) => Stream.value(containers),
|
||||
),
|
||||
watchAllAssignedSitesProvider.overrideWith(
|
||||
(ref) => Stream.value(const <SiteAssignment>[]),
|
||||
),
|
||||
watchIsolatedContextContainerMapProvider.overrideWith(
|
||||
(ref) => Stream.value(const {
|
||||
'isolation-a': {'container-direct', 'container-inherit'},
|
||||
}),
|
||||
),
|
||||
],
|
||||
);
|
||||
addTearDown(() async {
|
||||
container.dispose();
|
||||
await db.close();
|
||||
});
|
||||
|
||||
final subscription = container.listen<void>(
|
||||
proxySettingsReplicationProvider,
|
||||
(previous, next) {},
|
||||
fireImmediately: true,
|
||||
);
|
||||
addTearDown(subscription.close);
|
||||
await pumpEventQueue();
|
||||
|
||||
expect(containerProxyRepository.setContainerDirectConnectionCalls, [
|
||||
('context-direct', 'context-direct'),
|
||||
]);
|
||||
expect(
|
||||
containerProxyRepository.setContainerProxyCalls,
|
||||
contains(('general', const TorProxyConnectionId().encode())),
|
||||
);
|
||||
expect(
|
||||
containerProxyRepository.setContainerDirectConnectionCalls,
|
||||
isNot(contains(('isolation-a', 'context-direct'))),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
ContainerDataWithCount _container({
|
||||
required String id,
|
||||
required String contextId,
|
||||
required ProxyConnectionId proxyConnectionId,
|
||||
ProxyConnectionId? proxyConnectionId,
|
||||
bool bypassGlobalProxy = false,
|
||||
}) {
|
||||
return ContainerDataWithCount(
|
||||
id: id,
|
||||
@@ -97,6 +256,7 @@ ContainerDataWithCount _container({
|
||||
metadata: ContainerMetadata.withDefaults(
|
||||
contextualIdentity: contextId,
|
||||
proxyConnectionId: proxyConnectionId,
|
||||
bypassGlobalProxy: bypassGlobalProxy,
|
||||
),
|
||||
tabCount: 0,
|
||||
);
|
||||
@@ -104,6 +264,7 @@ ContainerDataWithCount _container({
|
||||
|
||||
class _FakeContainerProxyRepository extends ContainerProxyRepository {
|
||||
final setContainerProxyCalls = <(String, String)>[];
|
||||
final setContainerDirectConnectionCalls = <(String, String)>[];
|
||||
|
||||
@override
|
||||
Future<void> setTorProxyPort(int? port) async {}
|
||||
@@ -116,6 +277,14 @@ class _FakeContainerProxyRepository extends ContainerProxyRepository {
|
||||
setContainerProxyCalls.add((contextId, proxyId));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> setContainerDirectConnection(
|
||||
String contextId, {
|
||||
required String scopeId,
|
||||
}) async {
|
||||
setContainerDirectConnectionCalls.add((contextId, scopeId));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> clearContainerProxy(String contextId) async {}
|
||||
|
||||
|
||||
+3
@@ -9,6 +9,7 @@ void main() {
|
||||
final metadata = ContainerMetadata.withDefaults(
|
||||
proxyConnectionId: const SingboxProxyConnectionId('profile-1'),
|
||||
clearDataOnExit: true,
|
||||
bypassGlobalProxy: true,
|
||||
);
|
||||
|
||||
final json = metadata.toJson();
|
||||
@@ -19,7 +20,9 @@ void main() {
|
||||
const SingboxProxyConnectionId('profile-1').encode(),
|
||||
);
|
||||
expect(json['clearDataOnExit'], isTrue);
|
||||
expect(json['bypassGlobalProxy'], isTrue);
|
||||
expect(restored.proxyConnectionId, metadata.proxyConnectionId);
|
||||
expect(restored.bypassGlobalProxy, isTrue);
|
||||
expect(restored.usesTorProxy, isFalse);
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user