blob: 35d33a41ff159fa9e18debbc780d804aaa0e0c2d [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:test/test.dart';
import 'package:logging/logging.dart';
import 'package:sl4f/sl4f.dart' as sl4f;
import 'package:sl4f/trace_processing.dart' as trace_processing;
final _log = Logger('encode-camera');
const _timeout = Duration(seconds: 60);
const List<String> _defaultCategories = [
'camera',
'memory_monitor',
'media',
];
const String _catapultConverterPath = 'runtime_deps/catapult_converter';
const String _trace2jsonPath = 'runtime_deps/trace2json';
void main() {
sl4f.Sl4f sl4fDriver;
sl4f.Performance performance;
setUp(() async {
Logger.root
..level = Level.ALL
..onRecord.listen((rec) => print('[${rec.level}]: ${rec.message}'));
sl4fDriver = sl4f.Sl4f.fromEnvironment();
await sl4fDriver.startServer();
performance = sl4f.Performance(sl4fDriver);
await performance.terminateExistingTraceSession();
});
tearDown(() async {
await performance.terminateExistingTraceSession();
await sl4fDriver.stopServer();
sl4fDriver.close();
});
group(sl4f.Sl4f, () {
const testCase = 'fuchsia.media.encode-camera';
test(testCase, () async {
const traceDuration = 10;
final traceSession =
await performance.initializeTracing(categories: _defaultCategories);
await sl4f.Component(sl4fDriver).launch(
'fuchsia-pkg://fuchsia.com/encode-camera#meta/encode_camera.cmx',
['--duration=20']);
await Future.delayed(Duration(seconds: 5));
await traceSession.start();
await Future.delayed(Duration(seconds: traceDuration));
await traceSession.stop();
final traceFile = await traceSession.terminateAndDownload(testCase);
expect(traceFile.path, matches(RegExp('-$testCase-trace.fxt\$')));
final jsonTraceFile =
await performance.convertTraceFileToJson(_trace2jsonPath, traceFile);
_log.info('downloaded trace');
final metricsSpecs = [sl4f.MetricsSpec(name: 'memory')];
final metricsSpecSet =
sl4f.MetricsSpecSet(testName: testCase, metricsSpecs: metricsSpecs);
await performance.processTrace(metricsSpecSet, jsonTraceFile,
converterPath: _catapultConverterPath);
_log.info('processed trace');
final traceModel =
await trace_processing.createModelFromFilePath(jsonTraceFile.path);
expect(traceModel, isNotNull);
_processEncodeTrace(traceModel, traceDuration);
});
}, timeout: Timeout(_timeout));
}
void _processEncodeTrace(trace_processing.Model traceModel, int duration) {
const String category = 'media';
const String packetSentEventName = 'Media:PacketSent';
const String packetRecvEventName = 'Media:PacketReceived';
// verify an appropriate number of frames were encoded
// encode_camera selects a camera configuration that produces 30 fps
// TODO(fxbug.dev/55279) Re-enable more exact frame count checking when it's determined
// why it was flaky
//const int frameRate = 30;
int packetSentCount = 0;
int packetRecvCount = 0;
for (final p in traceModel.processes) {
for (final t in p.threads) {
for (final e in t.events) {
if (e.category == category && e.name == packetSentEventName) {
packetSentCount++;
}
if (e.category == category && e.name == packetRecvEventName) {
packetRecvCount++;
}
}
}
}
_log.info('encoder packets sent $packetSentCount recv $packetRecvCount');
expect(packetSentCount, greaterThan(0));
}