blob: 901aea696d696d13b6e5c766e5fa793aca3dae0b [file] [log] [blame] [view]
# ROT13 Example
rot13 (“rotate by 13 places”) takes a message a replaces each letter in the
message with the letter 13th places after it in the alphabet. The rot13 sample
has three parts: a client, a server, 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.rot13.Rot13`) for a rot13 server and client
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 server.
- `server/`: Contains the source for the rot13 echo server that takes rot13
encoded messages, decodes each message, then sends the decoded response back.
The server handles incoming requests as FIDL messages received from the client.
- `client/`: Contains the source for the rot13 echo client that sends string
messages to a rot13 server for encoding and prints the results to the system
log.
- `meta/`: Top-level component realm to perform capability routing between the
server and client components.
## Before you begin
1. Start an emulator instance:
```
$ ./third_party/fuchsia-sdk/tools/x64/ffx product-bundle get workstation_eng.qemu-x64
$ ./third_party/fuchsia-sdk/tools/x64/ffx emu start workstation_eng.qemu-x64
```
1. Start a local package repository instance:
```
$ ./third_party/fuchsia-sdk/tools/x64/fserve --image workstation_eng.qemu-x64-release
```
## Build the sample
1. Run the build script to compile and package the sample:
```
$ ./scripts/build.sh
```
1. Publish the FAR packages to your local package repository:
```
$ ./third_party/fuchsia-sdk/tools/x64/fpublish out/x64/rot13-example.far
$ ./third_party/fuchsia-sdk/tools/x64/fpublish out/x64/rot13_unittests.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/rot13-example#meta/rot13_realm.cm
```
1. View the result messages in the system log using `ffx log`:
```
$ ./third_party/fuchsia-sdk/tools/x64/ffx log --filter rot13
[rot13_realm/rot13_client] INFO: ***** Message: hello fuchsia has checksum of 1303
[rot13_realm/rot13_client] INFO: Rotated message is uryyb shpufvn
[rot13_realm/rot13_client] INFO: unrotated message = hello fuchsia
```
1. Edit the client message using the `args` field in `rot13_client.cml`
component manifest:
```
{
program: {
// ...
// Program arguments
args: [
"-m",
"hello fuchsia",
],
},
// ...
}
```
## 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/rot13_unittests#meta/rot13_unittests.cm
```
1. Verify that the test cases pass:
```
Running test 'fuchsia-pkg://fuchsia.com/rot13_unittests#meta/rot13_unittests.cm'
[RUNNING] Rot13Test.TrueTest
[stdout - Rot13Test.TrueTest]
Running main() from ../../third_party/googletest/src/googletest/src/gtest_main.cc
[PASSED] Rot13Test.TrueTest
[RUNNING] Rot13Test.Encrypt_EdgeCases
[stdout - Rot13Test.Encrypt_EdgeCases]
Running main() from ../../third_party/googletest/src/googletest/src/gtest_main.cc
[PASSED] Rot13Test.Encrypt_EdgeCases
[RUNNING] Rot13Test.Encrypt_HelloWorld
[stdout - Rot13Test.Encrypt_HelloWorld]
Running main() from ../../third_party/googletest/src/googletest/src/gtest_main.cc
[PASSED] Rot13Test.Encrypt_HelloWorld
[RUNNING] Rot13Test.Encrypt_Empty
[stdout - Rot13Test.Encrypt_Empty]
Running main() from ../../third_party/googletest/src/googletest/src/gtest_main.cc
[PASSED] Rot13Test.Encrypt_Empty
[RUNNING] Rot13Test.Checksum_Empty
[stdout - Rot13Test.Checksum_Empty]
Running main() from ../../third_party/googletest/src/googletest/src/gtest_main.cc
[PASSED] Rot13Test.Checksum_Empty
[RUNNING] Rot13Test.Checksum_HelloWorld
[stdout - Rot13Test.Checksum_HelloWorld]
Running main() from ../../third_party/googletest/src/googletest/src/gtest_main.cc
[PASSED] Rot13Test.Checksum_HelloWorld
6 out of 6 tests passed...
fuchsia-pkg://fuchsia.com/rot13_unittests#meta/rot13_unittests.cm completed with result: PASSED
```