# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

AUTHOR = 'pstew, kathrelkeld'
NAME = 'documentscan_AppTestWithFakeLorgnette'
TIME = 'SHORT'
TEST_TYPE = 'client'


DOC = """
This test verifies that the Chrome APIs work correctly to acquire
image data from a mocked version of the lorgnette document image
capture daemon.  This test fails if:

  - The test extension cannot be installed
  - The extension is unable to interact with the Chrome scanning API
  - The Chrome scanning API cannot interact with the mock lorgnette

This test is built up out of a number of interlocking components:

  - A chrome app that accesses the Document Scan API (in the
    "document_scan_test_app" directory).  The test launches this
    app in fullscreen mode.

  - An emulated mouse, implemented by subclassing touch_playback_test_base
    and using the "amazon_mouse.prop" file.

  - A mouse move and button click event stream stored in the
    "button_click.event" file.  The pair of this and the emulated mouse
    allows us to provide a gesture when clicking on the "Scan" button
    within the App.  Since the Chrome document scan API requires a user
    gesture, this method provides a viable option as opposed to
    triggering the scan from javascript.

  - The "mock_lorgnette" module that provides a fake lorgnette daemon
    that the Chrome process will communicate with for the purposes of
    this test.  It will accept the D-Bus RPC calls that Chrome makes
    and provide the "lorgnette-test.png" image in response to a scan
    request.

"""

job.run_test('documentscan_AppTestWithFakeLorgnette', iface_name='all', tag='all')
