[network/tests] Increase GetAdmin coverage

Test `fuchsia.net.debug/Interfaces` "GetAdmin" against Loopback,
Ethernet, and NetDevice.

Bug: 88797

Change-Id: I9d18533fc8768ddfe0adbecb9bf05405d098fcaf
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/690767
Reviewed-by: Bruno Dal Bo <brunodalbo@google.com>
Commit-Queue: Jeff Martin <martinjeffrey@google.com>
diff --git a/src/connectivity/network/tests/fidl/debug/src/lib.rs b/src/connectivity/network/tests/fidl/debug/src/lib.rs
index 0af1c32..12fc20e 100644
--- a/src/connectivity/network/tests/fidl/debug/src/lib.rs
+++ b/src/connectivity/network/tests/fidl/debug/src/lib.rs
@@ -33,9 +33,10 @@
 
 #[fuchsia::test]
 async fn get_admin_unknown() {
+    // TODO(https://fxbug.dev/88797): Test against Netstack3.
+    type N = Netstack2;
     let sandbox = netemul::TestSandbox::new().expect("create sandbox");
-    let realm =
-        sandbox.create_netstack_realm::<Netstack2, _>("get_admin_unknown").expect("create realm");
+    let realm = sandbox.create_netstack_realm::<N, _>("get_admin_unknown").expect("create realm");
 
     let id = get_loopback_id(&realm).await;
 
@@ -50,10 +51,54 @@
     assert_matches!(
         admin_control.take_event_stream().try_collect::<Vec<_>>().await.as_ref().map(Vec::as_slice),
         // TODO(https://fxbug.dev/8018): Sending epitaphs not supported in Go.
+        // TODO(https://fxbug.dev/88797): Verify epitaph from Nestack3 (Rust).
         Ok([])
     );
 }
 
+#[fuchsia::test]
+async fn get_admin_loopback() {
+    // TODO(https://fxbug.dev/88797): Test against Netstack3.
+    type N = Netstack2;
+    let sandbox = netemul::TestSandbox::new().expect("create sandbox");
+    let realm = sandbox.create_netstack_realm::<N, _>("get_admin_loopback").expect("create realm");
+    let debug_interfaces =
+        realm.connect_to_protocol::<fnet_debug::InterfacesMarker>().expect("connect to protocol");
+
+    let (admin_control, server_end) =
+        fidl::endpoints::create_proxy::<fnet_interfaces_admin::ControlMarker>()
+            .expect("create proxy");
+    let id = get_loopback_id(&realm).await;
+    debug_interfaces.get_admin(id, server_end).expect("get admin failed");
+
+    // Actuate the admin API to verify it's hooked up correctly.
+    assert_eq!(admin_control.get_id().await.expect("get id"), id);
+}
+
+#[variants_test]
+async fn get_admin_netemul_endpoint<E: netemul::Endpoint>(name: &str) {
+    // TODO(https://fxbug.dev/88797): Test against Netstack3.
+    type N = Netstack2;
+    let sandbox = netemul::TestSandbox::new().expect("create sandbox");
+    let realm = sandbox.create_netstack_realm::<N, _>(name).expect("create realm");
+    let debug_interfaces =
+        realm.connect_to_protocol::<fnet_debug::InterfacesMarker>().expect("connect to protocol");
+    let device = sandbox.create_endpoint::<E, _>(name).await.expect("create netemul endpoint");
+    // Retain `_control` and `_device_control` to keep the FIDL channel open.
+    let (id, _control, _device_control) = device
+        .add_to_stack(&realm, netemul::InterfaceConfig::default())
+        .await
+        .expect("add to stack");
+    let (admin_control, server_end) =
+        fidl::endpoints::create_proxy::<fnet_interfaces_admin::ControlMarker>()
+            .expect("create proxy");
+
+    debug_interfaces.get_admin(id, server_end).expect("get admin failed");
+
+    // Actuate the admin API to verify it's hooked up correctly.
+    assert_eq!(admin_control.get_id().await.expect("get id"), id);
+}
+
 // Retrieve the MAC address for the given device id, expecting no FIDL errors.
 //
 // This helper extracts the MAC from its `Box` making matching easier. See