|  | // 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. | 
|  |  | 
|  | library fuchsia.netemul.guest; | 
|  |  | 
|  | using fuchsia.io; | 
|  | using zx; | 
|  |  | 
|  | const uint32 GUEST_INTERACTION_MAX_LENGTH = 1024; | 
|  | const string DEFAULT_REALM = "gis_default"; | 
|  |  | 
|  | /// Enables discovery of guest VM's for control in tests. | 
|  | [Discoverable] | 
|  | protocol GuestDiscovery { | 
|  | /// Finds the guest VM specified by realm name/guest name pair and connects to it to enable | 
|  | /// file transfers and execution of commands.  If `realm_name` is null, `DEFAULT_REALM` is | 
|  | /// used instead. | 
|  | GetGuest(string:GUEST_INTERACTION_MAX_LENGTH? realm_name, | 
|  | string:GUEST_INTERACTION_MAX_LENGTH guest_name, | 
|  | request<GuestInteraction> guest); | 
|  | }; | 
|  |  | 
|  | /// Represents a key/value pair to be injected into an environment where a command is executed. | 
|  | struct EnvironmentVariable { | 
|  | string:GUEST_INTERACTION_MAX_LENGTH key; | 
|  | string:GUEST_INTERACTION_MAX_LENGTH value; | 
|  | }; | 
|  |  | 
|  | protocol CommandListener { | 
|  | /// Signal to a client that is attempting to exec inside of a guest whether | 
|  | /// or not the subprocess was successfully started. | 
|  | -> OnStarted(zx.status status); | 
|  |  | 
|  | /// Signal to a client that the Exec request has completed. | 
|  | -> OnTerminated(zx.status status, int32 return_code); | 
|  | }; | 
|  |  | 
|  | protocol GuestInteraction { | 
|  | /// Take a local file from the Fuchsia host and transfer it to a destination | 
|  | /// location on the guest under test. | 
|  | PutFile(fuchsia.io.File local_file, string:GUEST_INTERACTION_MAX_LENGTH remote_path) | 
|  | -> (zx.status status); | 
|  |  | 
|  | /// Pull a file from the guest under test and copy it to the specified | 
|  | /// location on the Fuchsia host. | 
|  | GetFile(string:GUEST_INTERACTION_MAX_LENGTH remote_path, fuchsia.io.File local_file) | 
|  | -> (zx.status status); | 
|  |  | 
|  | /// Execute command on the guest under test and return the resulting output, | 
|  | /// error, and return code. | 
|  | ExecuteCommand(string:GUEST_INTERACTION_MAX_LENGTH command, | 
|  | vector<EnvironmentVariable>:GUEST_INTERACTION_MAX_LENGTH env, | 
|  | zx.handle:SOCKET? stdin, | 
|  | zx.handle:SOCKET? stdout, | 
|  | zx.handle:SOCKET? stderr, | 
|  | request<CommandListener> command_listener); | 
|  | }; |