[identity] Add unit tests for account manager inspection

This is possible now we have a get method on the metric, yey!

AUTH-209 #comment

Change-Id: Ic27429ba02d317a62b6879663249057c31c6670e
diff --git a/src/identity/bin/account_manager/src/account_event_emitter.rs b/src/identity/bin/account_manager/src/account_event_emitter.rs
index 51182a3..4a3d701 100644
--- a/src/identity/bin/account_manager/src/account_event_emitter.rs
+++ b/src/identity/bin/account_manager/src/account_event_emitter.rs
@@ -303,20 +303,27 @@
         };
 
         let request_fut = async move {
+            assert_eq!(account_event_emitter.inspect.active.get().unwrap(), 0);
             assert!(await!(account_event_emitter.add_listener(
                 listener_1,
                 options_1,
                 &AUTH_STATES
             ))
             .is_ok());
+            assert_eq!(account_event_emitter.inspect.active.get().unwrap(), 1);
             assert!(await!(account_event_emitter.add_listener(
                 listener_2,
                 options_2,
                 &AUTH_STATES
             ))
             .is_ok());
+            assert_eq!(account_event_emitter.inspect.active.get().unwrap(), 2);
+
+            assert_eq!(account_event_emitter.inspect.events.get().unwrap(), 0);
             await!(account_event_emitter.publish(&EVENT_ADDED));
+            assert_eq!(account_event_emitter.inspect.events.get().unwrap(), 1);
             await!(account_event_emitter.publish(&EVENT_REMOVED));
+            assert_eq!(account_event_emitter.inspect.events.get().unwrap(), 2);
         };
         await!(join3(serve_fut_1, serve_fut_2, request_fut));
     }
@@ -344,6 +351,7 @@
                 panic!("Unexpected message received");
             };
         };
+
         let request_fut = async move {
             await!(account_event_emitter.publish(&EVENT_ADDED)); // Normal event
             {
diff --git a/src/identity/bin/account_manager/src/account_manager.rs b/src/identity/bin/account_manager/src/account_manager.rs
index 58e3b8d..2677f13 100644
--- a/src/identity/bin/account_manager/src/account_manager.rs
+++ b/src/identity/bin/account_manager/src/account_manager.rs
@@ -467,9 +467,9 @@
         static ref AUTH_PROVIDER_CONFIG: Vec<AuthProviderConfig> = {vec![]};
     }
 
-    fn request_stream_test<TestFn, Fut>(test_object: AccountManager, test_fn: TestFn)
+    fn request_stream_test<TestFn, Fut>(account_manager: AccountManager, test_fn: TestFn)
     where
-        TestFn: FnOnce(AccountManagerProxy) -> Fut,
+        TestFn: FnOnce(AccountManagerProxy, Arc<AccountManager>) -> Fut,
         Fut: Future<Output = Result<(), Error>>,
     {
         let mut executor = fasync::Executor::new().expect("Failed to create executor");
@@ -479,12 +479,16 @@
             fasync::Channel::from_channel(server_chan).unwrap(),
         );
 
+        let account_manager_arc = Arc::new(account_manager);
+        let account_manager_clone = Arc::clone(&account_manager_arc);
         fasync::spawn(async move {
-            await!(test_object.handle_requests_from_stream(request_stream))
+            await!(account_manager_clone.handle_requests_from_stream(request_stream))
                 .unwrap_or_else(|err| panic!("Fatal error handling test request: {:?}", err))
         });
 
-        executor.run_singlethreaded(test_fn(proxy)).expect("Executor run failed.")
+        executor
+            .run_singlethreaded(test_fn(proxy, account_manager_arc))
+            .expect("Executor run failed.")
     }
 
     // Manually contructs an account manager initialized with the supplied set of accounts.
@@ -529,10 +533,9 @@
     fn test_new() {
         let inspector = Inspector::new().unwrap();
         let data_dir = TempDir::new().unwrap();
-
         request_stream_test(
             AccountManager::new(data_dir.path().into(), &AUTH_PROVIDER_CONFIG, &inspector).unwrap(),
-            async move |proxy| {
+            async move |proxy, _| {
                 assert_eq!(await!(proxy.get_account_ids())?, vec![]);
                 assert_eq!(await!(proxy.get_account_auth_states())?, (Status::Ok, vec![]));
                 Ok(())
@@ -543,24 +546,32 @@
     #[test]
     fn test_initially_empty() {
         let data_dir = TempDir::new().unwrap();
-        request_stream_test(create_accounts(vec![], data_dir.path()), async move |proxy| {
-            assert_eq!(await!(proxy.get_account_ids())?, vec![]);
-            assert_eq!(await!(proxy.get_account_auth_states())?, (Status::Ok, vec![]));
-            Ok(())
-        });
+        request_stream_test(
+            create_accounts(vec![], data_dir.path()),
+            async move |proxy, test_object| {
+                assert_eq!(await!(proxy.get_account_ids())?, vec![]);
+                assert_eq!(await!(proxy.get_account_auth_states())?, (Status::Ok, vec![]));
+                assert_eq!(test_object.accounts_inspect.total.get().unwrap(), 0);
+                assert_eq!(test_object.accounts_inspect.active.get().unwrap(), 0);
+                Ok(())
+            },
+        );
     }
 
     #[test]
     fn test_remove_missing_account() {
         // Manually create an account manager with one account.
         let data_dir = TempDir::new().unwrap();
-        let test_object = create_accounts(vec![1], data_dir.path());
-        request_stream_test(test_object, async move |proxy| {
+        let stored_account_list =
+            StoredAccountList::new(vec![StoredAccountMetadata::new(LocalAccountId::new(1))]);
+        stored_account_list.save(data_dir.path()).unwrap();
+        request_stream_test(read_accounts(data_dir.path()), async move |proxy, test_object| {
             // Try to delete a very different account from the one we added.
             assert_eq!(
                 await!(proxy.remove_account(LocalAccountId::new(42).as_mut()))?,
                 Status::NotFound
             );
+            assert_eq!(test_object.accounts_inspect.total.get().unwrap(), 1);
             Ok(())
         });
     }
@@ -574,10 +585,11 @@
         ]);
         stored_account_list.save(data_dir.path()).unwrap();
         // Manually create an account manager from an account_list_dir with two pre-populated dirs.
-        let account_manager = read_accounts(data_dir.path());
-        request_stream_test(account_manager, async move |proxy| {
+        request_stream_test(read_accounts(data_dir.path()), async move |proxy, test_object| {
             // Try to remove the first account.
+            assert_eq!(test_object.accounts_inspect.total.get().unwrap(), 2);
             assert_eq!(await!(proxy.remove_account(LocalAccountId::new(1).as_mut()))?, Status::Ok);
+            assert_eq!(test_object.accounts_inspect.total.get().unwrap(), 1);
 
             // Verify that the second account is present.
             assert_eq!(await!(proxy.get_account_ids())?, fidl_local_id_vec(vec![2]));
@@ -585,9 +597,9 @@
         });
         // Now create another account manager using the same directory, which should pick up the new
         // state from the operations of the first account manager.
-        let account_manager = read_accounts(data_dir.path());
-        request_stream_test(account_manager, async move |proxy| {
+        request_stream_test(read_accounts(data_dir.path()), async move |proxy, test_object| {
             // Verify the only the second account is present.
+            assert_eq!(test_object.accounts_inspect.total.get().unwrap(), 1);
             assert_eq!(await!(proxy.get_account_ids())?, fidl_local_id_vec(vec![2]));
             Ok(())
         });
@@ -604,9 +616,8 @@
         };
 
         let data_dir = TempDir::new().unwrap();
-        let test_object = create_accounts(vec![1, 2], data_dir.path());
         // TODO(dnordstrom): Use run_until_stalled macro instead.
-        request_stream_test(test_object, async move |proxy| {
+        request_stream_test(create_accounts(vec![1, 2], data_dir.path()), async move |proxy, _| {
             let (client_end, mut stream) =
                 create_request_stream::<AccountListenerMarker>().unwrap();
             let serve_fut = async move {
@@ -664,5 +675,4 @@
             Ok(())
         });
     }
-
 }