blob: a8875b8ef0d9acf217aa10f06286972d15534770 [file] [log] [blame] [view]
# Calculator Example
Calculator provides an interface for client components to request compute
operations over IPC using FIDL. The calculator sample has three parts:
the engine, a client, and a library defining a FIDL communication protocol
between the components.
## Source layout
- `fidl/`: Contains the definition of a Fuchsia interprocess communication (IPC)
protocol (`fuchsia.examples.calculator.Calculator`) defined as a
Fuchsia Interface Definition Language (FIDL) library.
The `BUILD.gn` file describes how to build the FIDL library that can be used
as a dependency for the client and engine.
- `engine/`: Contains the source for the calculator engine that accepts compute
operations and sends the results back.
The engine handles incoming requests as FIDL messages received from the client.
- `client/`: Contains the source for the client that sends compute requests to
the calculator engine then prints the results to the system log.
- `meta/`: Top-level component realm to perform capability routing between the
engine and client components.
## Before you begin
1. Start a FEMU instance:
```
$ ./third_party/fuchsia-sdk/bin/femu.sh -N
```
1. Start a local package repository instance:
```
$ ./third_party/fuchsia-sdk/tools/x64/fserve --image qemu-x64
```
## Build the sample
1. Run the build script to compile and package the sample:
```
$ ./scripts/build.sh
```
1. Publish the FAR package to your local package repository:
```
$ ./third_party/fuchsia-sdk/tools/x64/fpublish out/x64/calculator-example.far
```
## Run the sample
1. Launch the sample component using `ffx component run`. This resolves the
component from the package repository and starts it:
```
$ ./third_party/fuchsia-sdk/tools/x64/ffx component run fuchsia-pkg://fuchsia.com/calculator-example#meta/calculator_realm.cm
```
1. View the result messages in the system log using `ffx target log`:
```
$ ./third_party/fuchsia-sdk/tools/x64/ffx target log watch
[calculator_realm/client] INFO: Request: 2 + 2
[calculator_realm/client] INFO: Result: 4
```
## Run the unit tests
1. Execute the unit test suite using `ffx test run`. This resolves the
component from the package repository and executes the tests:
```
$ ./third_party/fuchsia-sdk/tools/x64/ffx test run fuchsia-pkg://fuchsia.com/engine_unittest#meta/engine_unittest.cm
```
1. Verify that the test cases pass:
```
Running test 'fuchsia-pkg://fuchsia.com/engine_unittest#meta/engine_unittest.cm'
[RUNNING] main
[stdout - main]
Running main() from ../../third_party/googletest/src/googletest/src/gtest_main.cc
[==========] Running 5 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 5 tests from EngineUnitTest
[ RUN ] EngineUnitTest.Negate
[ OK ] EngineUnitTest.Negate (11 ms)
[ RUN ] EngineUnitTest.Add
[ OK ] EngineUnitTest.Add (12 ms)
[ RUN ] EngineUnitTest.Subtract
[ OK ] EngineUnitTest.Subtract (12 ms)
[ RUN ] EngineUnitTest.Multiply
[ OK ] EngineUnitTest.Multiply (11 ms)
[ RUN ] EngineUnitTest.Divide
[ OK ] EngineUnitTest.Divide (11 ms)
[----------] 5 tests from EngineUnitTest (60 ms total)
[----------] Global test environment tear-down
[==========] 5 tests from 1 test suite ran. (66 ms total)
[ PASSED ] 5 tests.
[PASSED] main
1 out of 1 tests passed...
fuchsia-pkg://fuchsia.com/engine_unittest#meta/engine_unittest.cm completed with result: PASSED
```