diff --git a/src/app/main/subsysmgr.c b/src/app/main/subsysmgr.c
index bd9af11444..4189519cad 100644
--- a/src/app/main/subsysmgr.c
+++ b/src/app/main/subsysmgr.c
@@ -335,6 +335,54 @@ subsystems_register_state_formats(config_mgr_t *mgr)
return 0;
}
+#ifdef TOR_UNIT_TESTS
+/**
+ * Helper: look up the index for sys. Return -1 if the subsystem
+ * is not recognized.
+ **/
+static int
+subsys_get_idx(const subsys_fns_t *sys)
+{
+ for (unsigned i = 0; i < n_tor_subsystems; ++i) {
+ if (sys == tor_subsystems[i])
+ return (int)i;
+ }
+ return -1;
+}
+
+/**
+ * Return the current state-manager's index for any state held by the
+ * subsystem sys. If sys has no options, return -1.
+ *
+ * Using raw indices can be error-prone: only do this from the unit
+ * tests. If you need a way to access another subsystem's configuration,
+ * that subsystem should provide access functions.
+ **/
+int
+subsystems_get_options_idx(const subsys_fns_t *sys)
+{
+ int i = subsys_get_idx(sys);
+ tor_assert(i >= 0);
+ return sys_status[i].options_idx;
+}
+
+/**
+ * Return the current state-manager's index for any state held by the
+ * subsystem sys. If sys has no state, return -1.
+ *
+ * Using raw indices can be error-prone: only do this from the unit
+ * tests. If you need a way to access another subsystem's state
+ * that subsystem should provide access functions.
+ **/
+int
+subsystems_get_state_idx(const subsys_fns_t *sys)
+{
+ int i = subsys_get_idx(sys);
+ tor_assert(i >= 0);
+ return sys_status[i].state_idx;
+}
+#endif
+
/**
* Call all appropriate set_options() methods to tell the various subsystems
* about a new set of torrc options. Return 0 on success, -1 on
diff --git a/src/app/main/subsysmgr.h b/src/app/main/subsysmgr.h
index 7e5fe76362..c1138e1ff3 100644
--- a/src/app/main/subsysmgr.h
+++ b/src/app/main/subsysmgr.h
@@ -43,4 +43,9 @@ int subsystems_set_state(const struct config_mgr_t *mgr,
int subsystems_flush_state(const struct config_mgr_t *mgr,
struct or_state_t *state);
+#ifdef TOR_UNIT_TESTS
+int subsystems_get_options_idx(const subsys_fns_t *sys);
+int subsystems_get_state_idx(const subsys_fns_t *sys);
+#endif
+
#endif /* !defined(TOR_SUBSYSMGR_T) */