diff --git a/garnet/packages/tests/BUILD.gn b/garnet/packages/tests/BUILD.gn index f9331fb2e6cd2031f64310d04acb9bda7d9fed1b..c2d34d506cc65702fc5adc5748cde801f4e77fbe 100644 --- a/garnet/packages/tests/BUILD.gn +++ b/garnet/packages/tests/BUILD.gn @@ -413,6 +413,7 @@ group("all") { "//garnet/packages/tests:scpi", "//garnet/packages/tests:setui_client", "//garnet/packages/tests:setui_service", + "//garnet/packages/tests:sl4f", "//garnet/packages/tests:sse", "//garnet/packages/tests:stash", "//garnet/packages/tests:svc", @@ -1296,3 +1297,10 @@ group("catapult_converter") { "//garnet/bin/catapult_converter:host_catapult_converter_test($host_toolchain)", ] } + +group("sl4f") { + testonly = true + public_deps = [ + "//sdk/testing/sl4f/client:tests", + ] +} diff --git a/sdk/testing/sl4f/client/BUILD.gn b/sdk/testing/sl4f/client/BUILD.gn index 74ea35d6017d935a8dfaa21fb77c6c4845948486..9b3cc5214abdd38be9be570dfdf794ba4ec3ad18 100644 --- a/sdk/testing/sl4f/client/BUILD.gn +++ b/sdk/testing/sl4f/client/BUILD.gn @@ -3,6 +3,8 @@ # found in the LICENSE file. import("//build/dart/dart_library.gni") +import("//build/dart/test.gni") +import("//build/testing/environments.gni") dart_library("client") { package_name = "sl4f" @@ -26,3 +28,26 @@ dart_library("client") { "//third_party/dart-pkg/pub/meta", ] } + +dart_test("sl4f_client_tests") { + sources = [ + "scenic_test.dart", + ] + + deps = [ + ":client", + "//third_party/dart-pkg/pub/image", + "//third_party/dart-pkg/pub/mockito", + "//third_party/dart-pkg/pub/test", + ] + + environments = [ linux_env ] +} + +group("tests") { + testonly = true + + deps = [ + ":sl4f_client_tests($host_toolchain)", + ] +} diff --git a/sdk/testing/sl4f/client/lib/src/scenic.dart b/sdk/testing/sl4f/client/lib/src/scenic.dart index 285909ba6a34f619b51337fb29e48a4409589988..79d7b0abff473820da6971f11438919f69e5883a 100644 --- a/sdk/testing/sl4f/client/lib/src/scenic.dart +++ b/sdk/testing/sl4f/client/lib/src/scenic.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. import 'dart:convert' show base64Decode; -import 'dart:typed_data' show Uint8List; import 'package:image/image.dart' show encodePng, Image; @@ -30,8 +29,8 @@ class Scenic { /// Captures the screen of the device. /// - /// Returns an Image in RGBA format. If a [dumpName] is provided, the picture - /// is also dumped with that name as prefix. + /// Returns the screenshot as an [Image]. If a [dumpName] is provided, the + /// PNG is also dumped with that name as prefix. Future<Image> takeScreenshot({String dumpName}) async { final Map<String, dynamic> response = await _sl4f.request('scenic_facade.TakeScreenshot'); @@ -39,16 +38,8 @@ class Scenic { assert(info['pixel_format'], 'Bgra8'); - final Uint8List bytes = base64Decode(response['data']); - - // Image only takes RGB/RGBA so we need to reverse from BGRA - for (int quad = 0; quad < bytes.length; quad += 4) { - final blue = bytes[quad]; - bytes[quad] = bytes[quad + 2]; - bytes[quad + 2] = blue; - } - - final image = Image.fromBytes(info['width'], info['height'], bytes); + final image = Image.fromBytes( + info['width'], info['height'], base64Decode(response['data'])); if (dumpName != null) { _dump.writeAsBytes(dumpName, 'png', encodePng(image)); diff --git a/sdk/testing/sl4f/client/test/scenic_test.dart b/sdk/testing/sl4f/client/test/scenic_test.dart new file mode 100644 index 0000000000000000000000000000000000000000..bf3c031305f3ab220a418e4575d026f10b9745de --- /dev/null +++ b/sdk/testing/sl4f/client/test/scenic_test.dart @@ -0,0 +1,35 @@ +// Copyright 2019 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 'dart:convert'; + +import 'package:image/image.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; + +import 'package:sl4f/sl4f.dart'; + +class MockSl4f extends Mock implements Sl4f {} + +void main(List<String> args) { + // This is mostly an integration test against the Image package. + test('screenshot decodes to correct colors', () async { + final color = Color.fromRgba(12, 34, 56, 78); + + final sl4f = MockSl4f(); + when(sl4f.request('scenic_facade.TakeScreenshot')) + .thenAnswer((_) => Future.value({ + 'info': {'pixel_format': 'Bgra8', 'width': 1, 'height': 1}, + 'data': base64Encode([ + getBlue(color), + getGreen(color), + getRed(color), + getAlpha(color) + ]) + })); + + final Image image = await Scenic(sl4f).takeScreenshot(); + expect(image[0], color); + }); +}