Compare commits
No commits in common. "b49658784b2ce27dae209ad55079d3f802014cac" and "85995d51e4d9e1518ee8647ea684631a5d927129" have entirely different histories.
b49658784b
...
85995d51e4
@ -5,7 +5,7 @@ import 'package:moxxmpp/moxxmpp.dart';
|
|||||||
import 'package:moxxmpp_socket_tcp/moxxmpp_socket_tcp.dart';
|
import 'package:moxxmpp_socket_tcp/moxxmpp_socket_tcp.dart';
|
||||||
|
|
||||||
class ExampleTcpSocketWrapper extends TCPSocketWrapper {
|
class ExampleTcpSocketWrapper extends TCPSocketWrapper {
|
||||||
ExampleTcpSocketWrapper() : super();
|
ExampleTcpSocketWrapper() : super(false);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<MoxSrvRecord>> srvQuery(String domain, bool dnssec) async {
|
Future<List<MoxSrvRecord>> srvQuery(String domain, bool dnssec) async {
|
||||||
@ -64,7 +64,7 @@ class _MyHomePageState extends State<MyHomePage> {
|
|||||||
// The below causes the app to crash.
|
// The below causes the app to crash.
|
||||||
//ExampleTcpSocketWrapper(),
|
//ExampleTcpSocketWrapper(),
|
||||||
// In a production app, the below should be false.
|
// In a production app, the below should be false.
|
||||||
TCPSocketWrapper(),
|
TCPSocketWrapper(true),
|
||||||
);
|
);
|
||||||
TextEditingController jidController = TextEditingController();
|
TextEditingController jidController = TextEditingController();
|
||||||
TextEditingController passwordController = TextEditingController();
|
TextEditingController passwordController = TextEditingController();
|
||||||
|
@ -397,9 +397,6 @@ class XmppConnection {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close the socket
|
|
||||||
_socket.close();
|
|
||||||
|
|
||||||
if (!error.isRecoverable()) {
|
if (!error.isRecoverable()) {
|
||||||
// We cannot recover this error
|
// We cannot recover this error
|
||||||
_log.severe(
|
_log.severe(
|
||||||
|
@ -5,7 +5,7 @@ import 'package:test/test.dart';
|
|||||||
|
|
||||||
Future<void> _runTest(String domain) async {
|
Future<void> _runTest(String domain) async {
|
||||||
var gotTLSException = false;
|
var gotTLSException = false;
|
||||||
final socket = TCPSocketWrapper();
|
final socket = TCPSocketWrapper(false);
|
||||||
final log = Logger('TestLogger');
|
final log = Logger('TestLogger');
|
||||||
socket.getEventStream().listen((event) {
|
socket.getEventStream().listen((event) {
|
||||||
if (event is XmppSocketTLSFailedEvent) {
|
if (event is XmppSocketTLSFailedEvent) {
|
||||||
@ -15,17 +15,18 @@ Future<void> _runTest(String domain) async {
|
|||||||
});
|
});
|
||||||
|
|
||||||
final connection = XmppConnection(
|
final connection = XmppConnection(
|
||||||
TestingReconnectionPolicy(),
|
ExponentialBackoffReconnectionPolicy(),
|
||||||
AlwaysConnectedConnectivityManager(),
|
|
||||||
socket,
|
socket,
|
||||||
)..registerFeatureNegotiators([
|
);
|
||||||
|
connection.registerFeatureNegotiators([
|
||||||
StartTlsNegotiator(),
|
StartTlsNegotiator(),
|
||||||
]);
|
]);
|
||||||
await connection.registerManagers([
|
connection.registerManagers([
|
||||||
DiscoManager([]),
|
DiscoManager(),
|
||||||
RosterManager(TestingRosterStateManager('', [])),
|
RosterManager(),
|
||||||
|
PingManager(),
|
||||||
MessageManager(),
|
MessageManager(),
|
||||||
PresenceManager(),
|
PresenceManager('http://moxxmpp.example'),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
connection.setConnectionSettings(
|
connection.setConnectionSettings(
|
||||||
@ -33,22 +34,18 @@ Future<void> _runTest(String domain) async {
|
|||||||
jid: JID.fromString('testuser@$domain'),
|
jid: JID.fromString('testuser@$domain'),
|
||||||
password: 'abc123',
|
password: 'abc123',
|
||||||
useDirectTLS: true,
|
useDirectTLS: true,
|
||||||
|
allowPlainAuth: true,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final result = await connection.connect(
|
final result = await connection.connectAwaitable();
|
||||||
shouldReconnect: false,
|
expect(result.success, false);
|
||||||
waitUntilLogin: true,
|
|
||||||
enableReconnectOnSuccess: false,
|
|
||||||
);
|
|
||||||
expect(result.isType<XmppError>(), false);
|
|
||||||
expect(gotTLSException, true);
|
expect(gotTLSException, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
Logger.root.level = Level.ALL;
|
Logger.root.level = Level.ALL;
|
||||||
Logger.root.onRecord.listen((record) {
|
Logger.root.onRecord.listen((record) {
|
||||||
// ignore: avoid_print
|
|
||||||
print('${record.level.name}: ${record.time}: ${record.message}');
|
print('${record.level.name}: ${record.time}: ${record.message}');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -6,27 +6,25 @@ import 'package:test/test.dart';
|
|||||||
void main() {
|
void main() {
|
||||||
Logger.root.level = Level.ALL;
|
Logger.root.level = Level.ALL;
|
||||||
Logger.root.onRecord.listen((record) {
|
Logger.root.onRecord.listen((record) {
|
||||||
// ignore: avoid_print
|
|
||||||
print('${record.level.name}: ${record.time}: ${record.message}');
|
print('${record.level.name}: ${record.time}: ${record.message}');
|
||||||
});
|
});
|
||||||
final log = Logger('FailureReconnectionTest');
|
final log = Logger('FailureReconnectionTest');
|
||||||
|
|
||||||
test(
|
test('Failing an awaited connection with TestingSleepReconnectionPolicy', () async {
|
||||||
'Failing an awaited connection with TestingSleepReconnectionPolicy',
|
|
||||||
() async {
|
|
||||||
var errors = 0;
|
var errors = 0;
|
||||||
final connection = XmppConnection(
|
final connection = XmppConnection(
|
||||||
TestingSleepReconnectionPolicy(10),
|
TestingSleepReconnectionPolicy(10),
|
||||||
AlwaysConnectedConnectivityManager(),
|
TCPSocketWrapper(false),
|
||||||
TCPSocketWrapper(),
|
);
|
||||||
)..registerFeatureNegotiators([
|
connection.registerFeatureNegotiators([
|
||||||
StartTlsNegotiator(),
|
StartTlsNegotiator(),
|
||||||
]);
|
]);
|
||||||
await connection.registerManagers([
|
connection.registerManagers([
|
||||||
DiscoManager([]),
|
DiscoManager(),
|
||||||
RosterManager(TestingRosterStateManager('', [])),
|
RosterManager(),
|
||||||
|
PingManager(),
|
||||||
MessageManager(),
|
MessageManager(),
|
||||||
PresenceManager(),
|
PresenceManager('http://moxxmpp.example'),
|
||||||
]);
|
]);
|
||||||
connection.asBroadcastStream().listen((event) {
|
connection.asBroadcastStream().listen((event) {
|
||||||
if (event is ConnectionStateChangedEvent) {
|
if (event is ConnectionStateChangedEvent) {
|
||||||
@ -41,41 +39,35 @@ void main() {
|
|||||||
jid: JID.fromString('testuser@no-sasl.badxmpp.eu'),
|
jid: JID.fromString('testuser@no-sasl.badxmpp.eu'),
|
||||||
password: 'abc123',
|
password: 'abc123',
|
||||||
useDirectTLS: true,
|
useDirectTLS: true,
|
||||||
|
allowPlainAuth: true,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final result = await connection.connect(
|
final result = await connection.connectAwaitable();
|
||||||
shouldReconnect: false,
|
|
||||||
waitUntilLogin: true,
|
|
||||||
enableReconnectOnSuccess: false,
|
|
||||||
);
|
|
||||||
log.info('Connection failed as expected');
|
log.info('Connection failed as expected');
|
||||||
expect(result.isType<XmppError>(), false);
|
expect(result.success, false);
|
||||||
expect(errors, 1);
|
expect(errors, 1);
|
||||||
|
|
||||||
log.info('Waiting 20 seconds for unexpected reconnections');
|
log.info('Waiting 20 seconds for unexpected reconnections');
|
||||||
await Future<void>.delayed(const Duration(seconds: 20));
|
await Future.delayed(const Duration(seconds: 20));
|
||||||
expect(errors, 1);
|
expect(errors, 1);
|
||||||
},
|
}, timeout: Timeout.factor(2));
|
||||||
timeout: const Timeout.factor(2),
|
|
||||||
);
|
|
||||||
|
|
||||||
test(
|
test('Failing an awaited connection with ExponentialBackoffReconnectionPolicy', () async {
|
||||||
'Failing an awaited connection with ExponentialBackoffReconnectionPolicy',
|
|
||||||
() async {
|
|
||||||
var errors = 0;
|
var errors = 0;
|
||||||
final connection = XmppConnection(
|
final connection = XmppConnection(
|
||||||
TestingReconnectionPolicy(),
|
ExponentialBackoffReconnectionPolicy(1),
|
||||||
AlwaysConnectedConnectivityManager(),
|
TCPSocketWrapper(false),
|
||||||
TCPSocketWrapper(),
|
);
|
||||||
)..registerFeatureNegotiators([
|
connection.registerFeatureNegotiators([
|
||||||
StartTlsNegotiator(),
|
StartTlsNegotiator(),
|
||||||
]);
|
]);
|
||||||
await connection.registerManagers([
|
connection.registerManagers([
|
||||||
DiscoManager([]),
|
DiscoManager(),
|
||||||
RosterManager(TestingRosterStateManager('', [])),
|
RosterManager(),
|
||||||
|
PingManager(),
|
||||||
MessageManager(),
|
MessageManager(),
|
||||||
PresenceManager(),
|
PresenceManager('http://moxxmpp.example'),
|
||||||
]);
|
]);
|
||||||
connection.asBroadcastStream().listen((event) {
|
connection.asBroadcastStream().listen((event) {
|
||||||
if (event is ConnectionStateChangedEvent) {
|
if (event is ConnectionStateChangedEvent) {
|
||||||
@ -90,22 +82,17 @@ void main() {
|
|||||||
jid: JID.fromString('testuser@no-sasl.badxmpp.eu'),
|
jid: JID.fromString('testuser@no-sasl.badxmpp.eu'),
|
||||||
password: 'abc123',
|
password: 'abc123',
|
||||||
useDirectTLS: true,
|
useDirectTLS: true,
|
||||||
|
allowPlainAuth: true,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final result = await connection.connect(
|
final result = await connection.connectAwaitable();
|
||||||
shouldReconnect: false,
|
|
||||||
waitUntilLogin: true,
|
|
||||||
enableReconnectOnSuccess: false,
|
|
||||||
);
|
|
||||||
log.info('Connection failed as expected');
|
log.info('Connection failed as expected');
|
||||||
expect(result.isType<XmppError>(), false);
|
expect(result.success, false);
|
||||||
expect(errors, 1);
|
expect(errors, 1);
|
||||||
|
|
||||||
log.info('Waiting 20 seconds for unexpected reconnections');
|
log.info('Waiting 20 seconds for unexpected reconnections');
|
||||||
await Future<void>.delayed(const Duration(seconds: 20));
|
await Future.delayed(const Duration(seconds: 20));
|
||||||
expect(errors, 1);
|
expect(errors, 1);
|
||||||
},
|
}, timeout: Timeout.factor(2));
|
||||||
timeout: const Timeout.factor(2),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@ import 'package:moxxmpp_socket_tcp/src/rfc_2782.dart';
|
|||||||
|
|
||||||
/// TCP socket implementation for XmppConnection
|
/// TCP socket implementation for XmppConnection
|
||||||
class TCPSocketWrapper extends BaseSocketWrapper {
|
class TCPSocketWrapper extends BaseSocketWrapper {
|
||||||
|
TCPSocketWrapper(this._logData);
|
||||||
|
|
||||||
/// The underlying Socket/SecureSocket instance.
|
/// The underlying Socket/SecureSocket instance.
|
||||||
Socket? _socket;
|
Socket? _socket;
|
||||||
|
|
||||||
@ -29,6 +31,9 @@ class TCPSocketWrapper extends BaseSocketWrapper {
|
|||||||
/// Logger
|
/// Logger
|
||||||
final Logger _log = Logger('TCPSocketWrapper');
|
final Logger _log = Logger('TCPSocketWrapper');
|
||||||
|
|
||||||
|
/// Flag to indicate if incoming and outgoing data should get logged.
|
||||||
|
final bool _logData;
|
||||||
|
|
||||||
/// Indiacted whether the connection is secure.
|
/// Indiacted whether the connection is secure.
|
||||||
bool _secure = false;
|
bool _secure = false;
|
||||||
|
|
||||||
@ -212,7 +217,9 @@ class TCPSocketWrapper extends BaseSocketWrapper {
|
|||||||
_socketSubscription = _socket!.listen(
|
_socketSubscription = _socket!.listen(
|
||||||
(List<int> event) {
|
(List<int> event) {
|
||||||
final data = utf8.decode(event);
|
final data = utf8.decode(event);
|
||||||
|
if (_logData) {
|
||||||
_log.finest('<== $data');
|
_log.finest('<== $data');
|
||||||
|
}
|
||||||
_dataStream.add(data);
|
_dataStream.add(data);
|
||||||
},
|
},
|
||||||
onError: (Object error) {
|
onError: (Object error) {
|
||||||
@ -289,17 +296,19 @@ class TCPSocketWrapper extends BaseSocketWrapper {
|
|||||||
_eventStream.stream.asBroadcastStream();
|
_eventStream.stream.asBroadcastStream();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void write(String data, {String? redact}) {
|
void write(Object? data, {String? redact}) {
|
||||||
if (_socket == null) {
|
if (_socket == null) {
|
||||||
_log.severe('Failed to write to socket as _socket is null');
|
_log.severe('Failed to write to socket as _socket is null');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data != null && data is String && _logData) {
|
||||||
if (redact != null) {
|
if (redact != null) {
|
||||||
_log.finest('**> $redact');
|
_log.finest('**> $redact');
|
||||||
} else {
|
} else {
|
||||||
_log.finest('==> $data');
|
_log.finest('==> $data');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
_socket!.write(data);
|
_socket!.write(data);
|
||||||
|
Loading…
Reference in New Issue
Block a user