tree: 7a68c627b74fd1e9fd1ace6222770baf1402ba54 [path history] [tgz]
  1. BUILD.gn
  2. OWNERS
  3. README.md
  4. devmgr_manifest.gni
  5. isolated_devmgr.cc
  6. isolated_devmgr.cmx
  7. isolated_devmgr.h
  8. isolated_devmgr_tests.cc
  9. isolated_devmgr_tests.cmx
  10. isolated_devmgr_virtual_audio.cmx
  11. main.cc
  12. usb-virtual-bus-helper.cc
  13. usb-virtual-bus-helper.h
  14. usb-virtual-bus.cc
  15. usb-virtual-bus.h
src/lib/isolated_devmgr/README.md

Isolated Devmgr

This library contains a set of tools to streamline the creation of components that expose isolated devmgrs.

Usage

To create your own version of an isolated devmgr, you first need to define a build rule for it, which will look like:

import("//src/lib/isolated_devmgr/devmgr_manifest.gni")

# declare our own manifest
devmgr_manifest("devmgr-manifest") {
}

# declare our isolated devmgr component
package("my_devmgr") {
  testonly = true

  deps = [
    ":devmgr-manifest",
    "//src/lib/isolated-devmgr",
  ]

  extra = [ "$target_gen_dir/devmgr.manifest" ]

  binaries = [
    {
      name = "isolated_devmgr"
    },
  ]

  meta = [
    {
      dest = "my_devmgr.cmx"
      path = dest
    },
  ]
}

Then we need to also provide a cmx manifest for that new component, called my_devmgr.cmx. The arguments passed to isolated_devmgr configure its behavior for your own use case. You can see all the supported arguments here. The main arguments you typically will provide are svc_name and load_driver. svc_name configures the name of the devfs namespace that will be exposed to the component's directory request and load_driver (which can be expressed multiple times) lists drivers to load when it is launched. device_vid_pid_did is optional argument which can be used to create a device.

{
    "program": {
        "args": [
            "--svc_name=fuchsia.example.MyDevmgr",
            "--load_driver=/boot/driver/my_driver1.so",
            "--load_driver=/boot/driver/my_driver2.so",
            "--wait_for=sys/my_driver"
        ],
        "binary": "bin/isolated_devmgr"
    },
    "sandbox": {
        "boot": [
            "bin",
            "driver",
            "lib"
        ],
        "services": [
            "fuchsia.process.Launcher",
            "fuchsia.sys.Launcher",
            "fuchsia.exception.Handler"
        ]
    }
}

With this custom isolated devmgr, you can then use it in test cases by either launching it manually using the fuchsia-url for your package (in this example fuchsia-pkg://fuchsia.com/my_devmgr#meta/my_devmgr.cmx) or you can inject it as a service and use service injection in your test component's manifest, like so:

{
    "facets": {
      "fuchsia.test": {
       "injected-services" : {
         "fuchsia.example.MyDevmgr": "fuchsia-pkg://fuchsia.com/my_devmgr#meta/my_devmgr.cmx"
       }
      }
    },
    "program": {
        "binary": "test/my_devmgr_test"
    },
    "sandbox": {
        "services": [
           "fuchsia.example.MyDevmgr"
        ]
    }
}