# Elements

Reviewed on: 2020-02-04

This directory contains an example implementation of a session that instantiates a single [element proposer](./element_proposer/README.md).

The element proposer connects to the [`ElementManager`](//sdk/fidl/fuchsia.session/element_manager.fidl) service offered by the session, and uses that service to add a [`simple_element`](./simple_element/README.md) to the session.

The `simple_element` then connects to the `ElementPing` service exposed to it by the session notifies the session that it has been successfully instantiated.

## Element Session

The element session is configured to:

  1. Declare a static child: the [`element_proposer`](./element_proposer/README.md).
  2. Declare a child collection with a name which matches the one passed to the `ElementManagement` library.
  3. Expose the `ElementManager` service.
  4. Expose the `ElementPing` service.
  5. Offer the `ElementManager` service to the `element_proposer` child.
  6. Offer the `ElementPing` service to the child collection mentioned above.

Details of how this is done can be found in the [`element_session.cml`](./element_session/meta/element_session.cml) file.

Once the session is launched, it exposes the aforementioned services and starts
handling requests.

## Element Proposer

The element proposer is configured to use the `ElementManager` service. Details of how this is done can be found in the [`element_proposer.cml`]() file.

Once the element proposer is started it connects to the `ElementManager` service
and attempts to add an element (`simple_element`) to the session.

## Simple Element

The simple element is configured to use the `ElementPing` service. Details of how this is done can be found in the [`simple_element.cml`](./simple_element/meta/simple_element.cml) file.

Once the simple element is started, it will call `ElementPing::Ping()`. The
session receives the ping and log a confirmation.

## Building `element_session`

The example sessions are included in the build when you include `//src/session` with your `fx set`:

```
fx set <PRODUCT>.<BOARD> --with-base=//src/session,//src/session/bin/session_manager:session_manager.config
```

To see a list of possible products, run: `fx list-products`.

To see a list of possible boards, run: `fx list-boards`.

## Running `element_session`
### Boot into `element_session`

To boot into `element_session`, edit the [session manager cml](//src/session/bin/session_manager/meta/session_manager.cml) file to set the element session's component url as the argument:
```
"args": [ "-s", "fuchsia-pkg://fuchsia.com/element_session#meta/element_session.cm" ],
```
and run
```
fx update
```

To build the relevant components and boot into the session, follow the
instructions in [//src/session/README.md](//src/session/README.md).

### Launch `element_session` from Command Line

To instruct a running `session_manager` to launch the session, run:
```
fx shell session_control launch fuchsia-pkg://fuchsia.com/element_session#meta/element_session.cm
```

The last command should output a message stating that the session was launched.
`fx log` should show a message saying element's ping has been received:

```
[00016.031278][25622][25624][element_session] INFO: Element did ping session.
```

## Testing

Add `--with //src/session:tests` to your existing `fx set` command will include  the `element_session` unit tests in the build. The resulting `fx set` looks like:
```
fx set <PRODUCT>.<BOARD> --with-base=//src/session,//src/session/bin/session_manager:session_manager.config --with //src/session:tests
```
To see a list of possible products, run: `fx list-products`.

To see a list of possible boards, run: `fx list-boards`.

The tests are available in the `element_session_tests`, `element_proposer_tests`, and `simple_element_tests` packages.
```
$ fx test element_session_tests
$ fx test element_proposer_tests
$ fx test simple_element_tests
```

## Source Layout

The entry point and session units tests are located in `src/main.rs`.
