This guide provides step-by-step instructions on setting up the Fuchsia SDK development environment on your host machine. The guide then walks you through the basic workflows of building, running, debugging, and testing Fuchsia components using the Fuchsia SDK.
Complete the following sections:
- Prerequisites
- Clone the SDK samples repository
- Start the emulator
- Create a local package repository
- Build and run the sample component
- View symbolized logs
- Debug the sample component
- Inspect components
- Run tests
Found an issue? Please let us know.
1. Prerequisites
Before you begin, complete the prerequisite steps below:
Check host machine requirements
This guide requires that your host machine meets the following criteria:
- A Linux machine. macOS is not supported yet.
- Has at least 15 GB of storage space.
- Supports KVM (Kernel Virtual Machine) for running a QEMU-based emulator.
- IPv6 is enabled.
Install dependencies
git
and bazel
need to be installed on the host machine.
You need Bazel 5.1 or higher.
Do the following:
Install Bazel – the easiest install option is to download the Bazelisk binary and rename it to
bazel
in a convenient place on your path.
Generate Fuchsia-specific SSH keys
The ffx
tool requires that Fuchsia-specific SSH keys are stored
on the host machine for connecting to Fuchsia devices (including the Fuchsia emulator).
To check if your host machine already has Fuchsia SSH keys, do the following:
Scan the
$HOME/.ssh
directory for Fuchsia SSH keys:ls $HOME/.ssh | grep fuchsia
Verify that the following
fuchsia_*
files are present:$ ls $HOME/.ssh | grep fuchsia fuchsia_authorized_keys fuchsia_ed25519 fuchsia_ed25519.pub
If you don’t see these files, you need to generate Fuchsia SSH keys on the host machine:
Generate a new private and public SSH key pair:
[[ -f "${HOME}/.ssh/fuchsia_ed25519" ]] || ssh-keygen -P "" -t ed25519 -f "${HOME}/.ssh/fuchsia_ed25519" -C "${USER}@$(hostname -f) Shared SSH Key for Fuchsia"
Generate a
fuchsia_authorized_keys
file:[[ -f "${HOME}/.ssh/fuchsia_authorized_keys" ]] || ssh-keygen -y -f "${HOME}/.ssh/fuchsia_ed25519" > "${HOME}/.ssh/fuchsia_authorized_keys"
Verify that Fuchsia SSH keys are generated:
ls $HOME/.ssh | grep fuchsia
This command prints output similar to the following:
$ ls $HOME/.ssh | grep fuchsia fuchsia_authorized_keys fuchsia_ed25519 fuchsia_ed25519.pub
2. Clone the SDK samples repository
Clone the SDK samples repository on your host machine. This repository contains the Bazel-based Fuchsia SDK and sample components.
The tasks include:
- Bootstrap the SDK samples repository.
- Verify that you can build the sample components and run
ffx
commands.
Do the following:
In a terminal, change to your home directory:
cd $HOME
Clone the Fuchsia samples repository:
git clone https://fuchsia.googlesource.com/sdk-samples/getting-started --recurse-submodules
This creates a new directory named
getting-started
, which clones the content of the SDK samples repository.Go to the new directory:
cd getting-started
To verify the Fuchsia SDK environment setup, build the sample components:
bazel build --config=fuchsia_x64 //src/hello_world:pkg --publish_to=$HOME/.package_repos/sdk-samples
The first build may take a few minutes to download dependencies, such as Clang and Fuchsia IDK (which includes the
ffx
tool).When finished successfully, it prints output similar to the following in the end:
$ bazel build --config=fuchsia_x64 //src/hello_world:pkg --publish_to=$HOME/.package_repos/sdk-samples ... INFO: Elapsed time: 70.715s, Critical Path: 1.87s INFO: 43 processes: 28 internal, 13 linux-sandbox, 2 local. INFO: Build completed successfully, 43 total actions
To verify that you can use the
ffx
tool in your environment, run the following command:tools/ffx version -v
This command prints output similar to the following:
$ tools/ffx version -v ffx: abi-revision: 0xA56735A6690E09D8 api-level: 8 build-version: 2022-04-25T14:46:40+00:00 integration-commit-hash: 41e415830c1649b9c09ef570bb3620cf923cdfac integration-commit-time: Mon, 25 Apr 2022 14:46:40 +0000 daemon: abi-revision: 0xA56735A6690E09D8 api-level: 8 build-version: 2022-04-25T14:46:40+00:00 integration-commit-hash: 41e415830c1649b9c09ef570bb3620cf923cdfac integration-commit-time: Mon, 25 Apr 2022 14:46:40 +0000
At this point, you only need to confirm that you can run this
ffx
command without any errors.
3. Start the emulator
Start the Fuchsia emulator on the host machine.
The tasks include:
- Download one of Fuchsia's prebuilt images from Google Cloud Storage.
- Start the Fuchsia emulator to run the downloaded Fuchsia prebuilt image.
- Set the emulator instance as the default target device.
- Verify that various
ffx
commands can connect to the emulator instance.
Do the following:
Download the latest Fuchsia Workstation prebuilt image for the emulator (
workstation.qemu-x64
):tools/ffx product-bundle get workstation.qemu-x64
This command may take a few minutes to download the image and product metadata.
(Optional) Stop all running emulator instances:
tools/ffx emu stop --all
Start a new Fuchsia emulator instance:
tools/ffx emu start workstation.qemu-x64 --headless
This command starts a headless emulator instance running a Fuchsia prebuilt image.
When the instance is up and running, the command prints output similar to the following:
$ tools/ffx emu start workstation.qemu-x64 --headless Logging to "/home/alice/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log" Waiting for Fuchsia to start (up to 60 seconds)........... Emulator is ready.
Verify that the new emulator instance is running:
tools/ffx emu list
This command prints output similar to the following:
$ tools/ffx emu list [Active] fuchsia-emulator
Verify that the emulator instance is detected as a device:
tools/ffx target list
This command prints output similar to the following:
$ tools/ffx target list NAME SERIAL TYPE STATE ADDRS/IP RCS fuchsia-emulator <unknown> Unknown Product [fe80::d4e3:9a5b:c2e:2534%qemu] Y
Set this emulator instance to be the default device:
tools/ffx target default set fuchsia-emulator
This command exits silently without output.
Verify that the default device is set:
tools/ffx target default get
This command prints output similar to the following:
$ tools/ffx target default get fuchsia-emulator
To verify that you can establish an SSH connection to the emulator instance, run the following command:
tools/ffx target show
This command prints output similar to the following:
$ tools/ffx target show Target: Name: "fuchsia-emulator" SSH Address: "[fe80::9597:e5fb:4746:a7b1%3]:22" Board: Name: "default-board" Revision: "1" Instruction set: "x64" Device: ... Build: Version: "7.20220330.2.1" Product: "workstation" Board: "qemu-x64" Commit: "2022-03-30T14:02:43+00:00" Last Reboot: Graceful: "false" Reason: "Cold"
The example output above shows that the target device is running a
workstation.qemu-x64
prebuilt image whose version is7.20220330.2.1
(which indicates that this image was built and published on March 30, 2022).Verify that you can stream the device logs:
tools/ffx log
This command prints output similar to the following:
$ tools/ffx log ... [33.698][core/cobalt][cobalt,fidl_service,core][I] LocalAggregation: Enabling local aggregation. [33.698][core/cobalt][cobalt,fidl_service,core][I] ClearcutV1ShippingManager: Disabling observation uploading. [34.818][core/network/netstack][netstack,DHCP][W] client.go(692): ethp0004: recv timeout waiting for dhcpOFFER; retransmitting dhcpDISCOVER [34.818][core/network/netstack][netstack,DHCP][I] client.go(891): ethp0004: send dhcpDISCOVER from :68 to 255.255.255.255:67 on NIC:2 (broadcast_flag=false ciaddr=false) [35.654][core/remote-control][remote_control,remote-control][I] attempting to connect hub_path="/discovery_root/children/bootstrap/resolved/expose/fuchsia.diagnostics.LogSettings" ...
Press
CTRL+C
to exit.
4. Create a local package repository
Create a local Fuchsia package repository and register it to a Fuchsia device. This package repository is used for storing and serving Fuchsia packages in this guide.
The tasks include:
- Create a new Fuchsia package repository.
- Start the Fuchsia package server.
- Register the new local package repository to the target device (that is, the emulator instance).
- Register the system package repository to the target device.
Do the following:
Create a new Fuchsia package repository (and map it to the
$HOME/.package_repos/sdk-samples
directory):tools/ffx repository add-from-pm -r fuchsiasamples.com $HOME/.package_repos/sdk-samples
This command prints output similar to the following:
$ tools/ffx repository add-from-pm -r fuchsiasamples.com $HOME/.package_repos/sdk-samples added repository fuchsiasamples.com
Verify that the new package repository (
fuchsiasamples.com
) is created:tools/ffx repository list
This command prints output similar to the following:
$ tools/ffx repository list +----------------------+------+-----------------------------------------------+ | NAME | TYPE | EXTRA | +======================+======+===============================================+ | fuchsiasamples.com | pm | /home/alice/.package_repos/sdk-samples | +----------------------+------+-----------------------------------------------+ | workstation.qemu-x64 | pm | /home/alice/.local/share/Fuchsia/.../packages | +----------------------+------+-----------------------------------------------+
The
workstation.qemu-x64
repository is created when you run theffx product-bundle get
command (previously in the Start the emulator section above). This repository contains additional system packages for theworkstation.qemu-x64
prebuilt image.Start the Fuchsia package server:
tools/ffx repository server start
This command prints output similar to the following:
$ tools/ffx repository server start ffx repository server is listening on [::]:8083
Register the
fuchsiasamples.com
repository to the target device (that is, the emulator instance):tools/ffx target repository register -r fuchsiasamples.com
This command exits silently without output.
Register the
workstation.qemu-x64
repository to the target device asfuchsia.com
:tools/ffx target repository register -r workstation.qemu-x64 --alias fuchsia.com
This command exits silently without output.
Verify that the repositories are registered to the target device:
tools/ffx target repository list
This command prints output similar to the following:
$ tools/ffx target repository list +----------------------+----------------------+ | REPO | TARGET | +======================+======================+ | fuchsiasamples.com | fuchsia-emulator | +----------------------+----------------------+ | workstation.qemu-x64 | fuchsia-emulator | | | alias: fuchsia.com | +----------------------+----------------------+
5. Build and run the sample component
Build and run the C++ Hello World component included in the SDK samples repository. Components are the basic unit of executable software on Fuchsia.
The tasks include:
- Build and publish the sample Hello World component.
- Run the component.
- Make a change to the component.
- Repeat the build and run steps.
- Verify the change.
Do the following:
Build the sample component:
bazel build --config=fuchsia_x64 //src/hello_world:pkg --publish_to=$HOME/.package_repos/sdk-samples
When the build is successful, it publishes the build artifacts to the
$HOME/.package_repos/sdk-samples
directory, which is associated with your new local Fuchsia package repository.Run the sample component:
tools/ffx component run "fuchsia-pkg://fuchsiasamples.com/hello_world#meta/hello_world.cm"
This command prints output similar to the following:
$ tools/ffx component run "fuchsia-pkg://fuchsiasamples.com/hello_world#meta/hello_world.cm" URL: fuchsia-pkg://fuchsiasamples.com/hello_world#meta/hello_world.cm Moniker: /core/ffx-laboratory:hello_world Creating component instance... Starting component instance... Success! The component instance has been started.
Check the status of the
hello_world
component:tools/ffx component show hello_world
This command prints output similar to the following:
$ tools/ffx component show hello_world Moniker: /core/ffx-laboratory:hello_world URL: fuchsia-pkg://fuchsiasamples.com/hello_world#meta/hello_world.cm Type: CML dynamic component Component State: Resolved Incoming Capabilities: fuchsia.logger.LogSink pkg Merkle root: b44de670cf30c77c55823af0fea67d19e0fabc86ddd0946646512be12eeb8dc0 Execution State: Stopped
The output shows that the
hello_world
component has run and is now terminated (Stopped
).Verify the
Hello, World!
message in the device logs:tools/ffx log --filter hello_world dump
This command prints output similar to the following:
$ tools/ffx log --filter hello_world dump ... [1702.331][core/pkg-resolver][pkg-resolver][I] Fetching blobs for fuchsia-pkg://fuchsiasamples.com/hello_world: [] [1702.331][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://fuchsiasamples.com/hello_world as fuchsia-pkg://fuchsiasamples.com/hello_world to dbdc177180730f521849484c7a0e11dbe763b75804a7d1b97158a668b463526c with TUF [1702.405][core/ffx-laboratory:hello_world][][I] Hello, World!
Use a text editor to edit the
src/hello_world/hello_world.cc
file, for example:nano src/hello_world/hello_world.cc
Change the message to
"Hello again, World!"
.The
main()
method should look like below:int main() { std::cout << "Hello again, World!\n"; return 0; }
Save the file and exit the text editor.
Build the sample component again:
bazel build --config=fuchsia_x64 //src/hello_world:pkg --publish_to=$HOME/.package_repos/sdk-samples
Run the sample component again (notice the
--recreate
flag this time):tools/ffx component run "fuchsia-pkg://fuchsiasamples.com/hello_world#meta/hello_world.cm" --recreate
Verify the
Hello again, World!
message in the device logs:tools/ffx log --filter hello_world dump
This command prints output similar to the following;
$ tools/ffx log --filter hello_world dump ... [2013.380][core/pkg-resolver][pkg-resolver][I] Fetching blobs for fuchsia-pkg://fuchsiasamples.com/hello_world: [] [2013.380][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://fuchsiasamples.com/hello_world as fuchsia-pkg://fuchsiasamples.com/hello_world to da1c95e829ec32f78e7b4e8eb845b697679d9cb82432da3cc85763dbc3269395 with TUF [2013.418][core/ffx-laboratory:hello_world][][I] Hello again, World!
6. View symbolized logs
Examine the symbolized logs (that is, human readable stack traces) of a crashed component.
The tasks include:
- Update the sample component to crash when it's started.
- Build the sample component, which generates and registers the debug symbols of the component.
- Run the updated sample component.
- Verify that the crashed component's logs are in symbolized format.
Do the following:
Use a text editor to edit the
src/hello_world/hello_world.cc
file, for example:nano src/hello_world/hello_world.cc
Just above the line
return 0;
, add the following line:abort();
The
main()
method should look like below:int main() { std::cout << "Hello again, World!\n"; abort(); return 0; }
This update will cause the component to crash immediately after printing a message.
Save the file and exit the text editor.
Rebuild the sample component:
bazel build --config=fuchsia_x64 //src/hello_world:pkg --publish_to=$HOME/.package_repos/sdk-samples
Building a component automatically generates and registers the component’s debug symbols in your development environment.
Run the updated sample component:
tools/ffx component run "fuchsia-pkg://fuchsiasamples.com/hello_world#meta/hello_world.cm" --recreate
Verify that the sample component's crash stack is symbolized in the kernel logs:
tools/ffx log --kernel dump
This command prints output similar to the following:
$ tools/ffx log --kernel dump ... [174978.449][klog][klog][I] [[[ELF module #0x6 "libzircon.so" BuildID=5679a47f32c6fa7b 0x422808b26000]]] [174978.449][klog][klog][I] [[[ELF module #0x7 "libc.so" BuildID=1c3e8dded0fc94eb 0x428049099000]]] [174978.450][klog][klog][I] #0 0x00004280490fd74b in abort() ../../zircon/third_party/ulib/musl/src/exit/abort.c:7 <libc.so>+0x6474b sp 0x11d191bcf70 [174978.450][klog][klog][I] #1 0x000001d56b552047 in main() src/hello_world/hello_world.cc:9 <<VMO#32996646=blob-a4c56246>>+0x2047 sp 0x11d191bcf80 [174978.450][klog][klog][I] #2 0x00004280490fcef2 in start_main(const start_params*) ../../zircon/third_party/ulib/musl/src/env/__libc_start_main.c:140 <libc.so>+0x63ef2 sp 0x11d191bcfa0 [174978.450][klog][klog][I] #3 0x00004280490fd145 in __libc_start_main(zx_handle_t, int (*)(int, char**, char**)) ../../zircon/third_party/ulib/musl/src/env/__libc_start_main.c:215 <libc.so>+0x64145 sp 0x11d191bcff0 [174978.450][klog][klog][I] #4 0x000001d56b552011 in _start(zx_handle_t) ../../zircon/system/ulib/c/Scrt1.cc:7 <<VMO#32996646=blob-a4c56246>>+0x2011 sp 0x42d5c7089fe0 [174978.450][klog][klog][I] #5 0x0000000000000000 is not covered by any module sp 0x42d5c7089ff0 [174978.457][klog][klog][I] KERN: terminating process 'hello_world.cm' (32996655)
Verify that the lines in the kernel logs show the exact filenames and line numbers (for example,
main() src/hello_world/hello_world.cc:9
) that might've caused the component to crash.
7. Debug the sample component
Launch the Fuchsia debugger (zxdb
) for debugging the sample
component, which is now updated to crash when it's started.
The tasks include:
- Start the Fuchsia debugger and connect it to the emulator instance.
- Attach the debugger to the sample component.
- Set a breakpoint.
- Run the sample component and step through the code.
Do the following:
Start the Fuchsia debugger:
tools/ffx debug connect
This command automatically connects the debugger to the default target device, which is the emulator instance.
When connected to the device, this command starts the
zxdb
terminal, for example:$ tools/ffx debug connect Connecting (use "disconnect" to cancel)... Connected successfully. 👉 To get started, try "status" or "help". [zxdb]
In the
zxdb
terminal, attach the debugger to thehello_world.cm
component:[zxdb] attach hello_world.cm
This command prints output similar to the following:
[zxdb] attach hello_world.cm Waiting for process matching "hello_world.cm". Type "filter" to see the current filters.
In the
zxdb
terminal, set a breakpoint at themain()
method:[zxdb] break main
This command prints output similar to the following:
[zxdb] break main Created Breakpoint 1 @ main Pending: No current matches for location. It will be matched against new processes and shared libraries.
In a different terminal, run the sample component:
tools/ffx component run "fuchsia-pkg://fuchsiasamples.com/hello_world#meta/hello_world.cm" --recreate
In the
zxdb
terminal, the sample component is paused at the breakpoint:Attached Process 1 state=Running koid=17658651 name=hello_world.cm Downloading symbols... Breakpoint 1 now matching 1 addrs for main Could not load symbols for "<vDSO>" because there was no mapping for build ID "1dbd2861a642d61b". Symbol downloading complete. 0 succeeded, 1 failed. 🛑 on bp 1, 2 main() • hello_world.cc:8 6 7 int main() { ▶ 8 std::cout << "Hello again, World!\n"; 9 abort(); 10 return 0; [zxdb]
In the new terminal, monitor device logs for the
hello_world
component:tools/ffx log --filter hello_world
This comment prints output similar to the following:
$ tools/ffx log --filter hello_world ... [5538.385][core/pkg-resolver][pkg-resolver][I] Fetching blobs for fuchsia-pkg://fuchsiasamples.com/hello_world: [] [5538.385][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://fuchsiasamples.com/hello_world as fuchsia-pkg://fuchsiasamples.com/hello_world to 940cbd84428125a90e1fbeba7033af7cb0f857f8f0bb2879d6b07cd1001f2225 with TUF [5538.408][core/pkg-resolver][pkg-resolver][I] Fetching blobs for fuchsia-pkg://fuchsiasamples.com/hello_world: [] [5538.409][core/pkg-resolver][pkg-resolver][I] resolved fuchsia-pkg://fuchsiasamples.com/hello_world as fuchsia-pkg://fuchsiasamples.com/hello_world to 940cbd84428125a90e1fbeba7033af7cb0f857f8f0bb2879d6b07cd1001f2225 with TUF
Notice the
Hello again, World!
line is not printed yet.In the
zxdb
terminal, usenext
to step through the code:[zxdb] next
In the
zxdb
terminal, the code get executed line by line, for example:... 🛑 on bp 1 main() • hello_world.cc:8 6 7 int main() { ▶ 8 std::cout << "Hello again, World!\n"; 9 abort(); 10 return 0; [zxdb] next 🛑 main() • hello_world.cc:9 7 int main() { 8 std::cout << "Hello again, World!\n"; ▶ 9 abort(); 10 return 0; 11 }
In the device logs terminal, verify that the
Hello again, World!
line is now printed:[5694.479][core/ffx-laboratory:hello_world][][I] Hello again, World!
To exit the
zxdb
terminal, typeexit
or pressCtrl-D
.This causes the component to finish the execution of the rest of the code.
8. Inspect components
Retrieve a component's data exposed by Fuchsia's Inspect API. This data can be any set of specialized information that a Fuchsia component is programmed to collect while it is running on the device.
The tasks include:
- Scan the list of components on the device that expose inspect data (for
example, the
bootstrap/archivist
component). - Scan the list of selectors provided by the
bootstrap/archivist
component. - Inspect a specific set of data from the
bootstrap/archivist
component.
Do the following:
View the list of components on the device that expose inspect data:
tools/ffx inspect list
This command prints output similar to the following:
$ tools/ffx inspect list <component_manager> audio_core.cmx bootstrap/archivist bootstrap/driver_manager bootstrap/fshost ... core/wlandevicemonitor core/wlanstack crash_reports.cmx feedback_data.cmx httpsdate_time_source.cmx scenic.cmx timekeeper.cmx
Notice that the
bootstrap/archivist
component is on the list.View all available selectors for the
bootstrap/archivist
component:tools/ffx inspect selectors bootstrap/archivist
This command prints output similar to the following:
$ tools/ffx inspect selectors bootstrap/archivist bootstrap/archivist:root/archive_accessor_stats/all/inspect/batch_iterator/get_next:errors bootstrap/archivist:root/archive_accessor_stats/all/inspect/batch_iterator/get_next:requests bootstrap/archivist:root/archive_accessor_stats/all/inspect/batch_iterator/get_next:responses ...
Each of these selectors represents a different type of data you can inspect.
Inspect the
bootstrap/archivist
component for the recent events data:tools/ffx inspect show bootstrap/archivist:root/events/recent_events
This command prints output similar to the following:
$ tools/ffx inspect show bootstrap/archivist:root/events/recent_events bootstrap/archivist: metadata: filename = fuchsia.inspect.Tree component_url = fuchsia-boot:///#meta/archivist.cm timestamp = 531685168169295 payload: root: events: recent_events: 319: @time = 7730479794 event = log_sink_requested moniker = core/memory_monitor 320: @time = 7782621023 event = log_sink_requested moniker = core/bt-a2dp 321: ... 516: @time = 5538432236492 event = log_sink_requested moniker = core/ffx-laboratory:hello_world 517: @time = 5825449627765 event = component_stopped moniker = debug_agent_channel.cmx:1064825 518: @time = 5825475597828 event = component_stopped moniker = core/ffx-laboratory:hello_world
This data records all the events triggered by components on the device so far.
9. Run tests
Run tests on the device by launching test components, which are included in the SDK samples repository.
The tasks include:
- Build and run the sample test components.
- Verify that the tests are passing.
- Update one of the tests to fail.
- Verify the failure in the test results.
Do the following:
Build the sample test components:
bazel build --config=fuchsia_x64 //src/hello_world:test_pkg --publish_to=$HOME/.package_repos/sdk-samples
When the build is successful, this command prints output similar to the following in the end:
$ bazel build --config=fuchsia_x64 //src/hello_world:test_pkg --publish_to=$HOME/.package_repos/sdk-samples ... INFO: Elapsed time: 5.027s, Critical Path: 4.53s INFO: 98 processes: 44 internal, 52 linux-sandbox, 2 local. INFO: Build completed successfully, 98 total actions
Verify that the basic
hello_test
passes:tools/ffx test run "fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_test.cm"
This command prints output similar to the following:
$ tools/ffx test run "fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_test.cm" Running test 'fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_test.cm' [RUNNING] main [stdout - main] Example stdout. [PASSED] main 1 out of 1 tests passed... fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_test.cm completed with result: PASSED
Verify that the GoogleTest (
gtest
) test passes:tools/ffx test run "fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_gtest.cm"
This command prints output similar to the following:
$ tools/ffx test run "fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_gtest.cm" Running test 'fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_gtest.cm' [RUNNING] HelloTest.BasicAssertions [stdout - HelloTest.BasicAssertions] Running main() from gmock_main.cc Example stdout. [PASSED] HelloTest.BasicAssertions 1 out of 1 tests passed... fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_gtest.cm completed with result: PASSED
Use a text editor to edit the
src/hello_world/hello_gtest.cc
file, for example:nano src/hello_world/hello_gtest.cc
Replace
EXPECT_STRNE()
withEXPECT_STREQ()
:The test should look like below:
TEST(HelloTest, BasicAssertions) { // Expect two strings not to be equal. EXPECT_STREQ("hello", "world"); // Expect equality. EXPECT_EQ(7 * 6, 42); }
This change will cause the
gtest
test to fail.Save the file and exit the text editor.
Rebuild the sample test components:
bazel build --config=fuchsia_x64 //src/hello_world:test_pkg --publish_to=$HOME/.package_repos/sdk-samples
Verify that the
gtest
test now fails:tools/ffx test run "fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_gtest.cm"
This command prints output similar to the following:
$ tools/ffx test run "fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_gtest.cm" Running test 'fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_gtest.cm' [RUNNING] HelloTest.BasicAssertions [stdout - HelloTest.BasicAssertions] Running main() from gmock_main.cc Example stdout. src/hello_world/hello_gtest.cc:14: Failure Expected equality of these values: "hello" "world" [FAILED] HelloTest.BasicAssertions Failed tests: HelloTest.BasicAssertions 0 out of 1 tests passed... fuchsia-pkg://fuchsiasamples.com/hello_test#meta/hello_gtest.cm completed with result: FAILED One or more test runs failed. Tests failed
Congratulations! You're now all set with the Fuchsia SDK!
Next steps
Learn more about the Fuchsia platform and tools in Fuchsia SDK Fundamentals.
Appendices
Clean up the environment
If you run into a problem while following this guide and decide to start over from the beginning, consider running the commands below to clean up your development environment (that is, to clean up directories, build artifacts, downloaded files, symlinks, configuration settings, and more).
Remove the package repositories created in this guide:
tools/ffx repository remove fuchsiasamples.com
tools/ffx repository remove workstation.qemu-x64
tools/ffx repository server stop
rm -rf $HOME/.package_repos/sdk-samples
Remove the getting-started
directory and its artifacts:
rm -rf $HOME/getting-started
When Bazel fails to build, try the commands below:
bazel clean --expunge
bazel shutdown && rm -rf $HOME/.cache/bazel
Other clean up commands:
killall ffx
killall pm
Update the firewall rules
When you launch the sample component (for instance, using the command
tools/ffx component run "fuchsia-pkg://fuchsiasamples.com/hello_world#meta/hello_world.cm"
),
you might run into an issue where the command hangs for a long time and
eventually fails with the following error:
Lifecycle protocol could not start the component instance: InstanceCannotResolve
In that case, you may need to update the firewall rules on your host machine.
If you’re using the ufw
firewall, run the following commands:
sudo ufw allow proto tcp from fe80::/10 to any port 8083 comment 'Fuchsia Package Server'
sudo ufw allow proto tcp from fc00::/7 to any port 8083 comment 'Fuchsia Package Server'
However, for other non-ufw
-based firewalls, you will need to ensure that port 8083
is available for the Fuchsia package server.