// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. @TestOn('!browser') library usage.usage_impl_io_test; import 'dart:async'; import 'dart:io'; import 'package:test/test.dart'; import 'package:usage/src/usage_impl_io.dart'; void main() => defineTests(); void defineTests() { group('IOPostHandler', () { test('sendPost', () async { var mockClient = MockHttpClient(); var postHandler = IOPostHandler(client: mockClient); var args = [ {'utv': 'varName', 'utt': '123'}, ]; await postHandler.sendPost( 'http://www.google.com', args.map(postHandler.encodeHit).toList()); expect(mockClient.requests.single.buffer.toString(), ''' Request to http://www.google.com with ${createUserAgent()} utv=varName&utt=123'''); expect(mockClient.requests.single.response.drained, isTrue); }); }); group('IOPersistentProperties', () { test('add', () { var props = IOPersistentProperties('foo_props'); props['foo'] = 'bar'; expect(props['foo'], 'bar'); }); test('remove', () { var props = IOPersistentProperties('foo_props'); props['foo'] = 'bar'; expect(props['foo'], 'bar'); props['foo'] = null; expect(props['foo'], null); }); }); group('usage_impl_io', () { test('getDartVersion', () { expect(getDartVersion(), isNotNull); }); test('getPlatformLocale', () { expect(getPlatformLocale(), isNotNull); }); }); group('batching', () { test('with 0 batch-delay hits from the same sync span are batched together', () async { var mockClient = MockHttpClient(); final analytics = AnalyticsIO(' requests = []; @override String? userAgent; bool closed = false; MockHttpClient(); @override Future postUrl(Uri uri) async { if (closed) throw StateError('Posting after close'); final request = MockHttpClientRequest(); request.buffer.writeln('Request to $uri with $userAgent'); requests.add(request); return request; } @override void close({bool force = false}) { if (closed) throw StateError('Double close'); closed = true; } @override dynamic noSuchMethod(Invocation invocation) { throw UnimplementedError('Unexpected call'); } } class MockHttpClientRequest implements HttpClientRequest { final buffer = StringBuffer(); final MockHttpClientResponse response = MockHttpClientResponse(); bool closed = false; MockHttpClientRequest(); @override void write(Object? o) { buffer.write(o); } @override Future close() async { if (closed) throw StateError('Double close'); closed = true; return response; } @override dynamic noSuchMethod(Invocation invocation) { throw UnimplementedError('Unexpected call'); } } class MockHttpClientResponse implements HttpClientResponse { bool drained = false; MockHttpClientResponse(); @override Future drain([E? futureValue]) async { drained = true; return futureValue as E; } @override dynamic noSuchMethod(Invocation invocation) { throw UnimplementedError('Unexpected call'); } }