OSDN Git Service

ModuleRegistry: Start() injected modules
authorHansong Zhang <hsz@google.com>
Tue, 7 May 2019 23:40:45 +0000 (16:40 -0700)
committerHansong Zhang <hsz@google.com>
Wed, 8 May 2019 00:21:57 +0000 (17:21 -0700)
Call Start() on injected modules, and set registry_ and handler_
properly

Test: atest --host bluetooth_test_gd
Change-Id: Id655d537982eab285549ff797a907dabb15ca64d

gd/module.cc
gd/module.h

index 10ab72d..7f2dd32 100644 (file)
@@ -94,4 +94,13 @@ void ModuleRegistry::StopAll() {
   ASSERT(started_modules_.empty());
   start_order_.clear();
 }
+
+void ModuleRegistry::inject_test_module(const ModuleFactory* module, Module* instance, os::Thread* thread) {
+  instance->registry_ = this;
+  instance->handler_ = new Handler(thread);
+  start_order_.push_back(module);
+  started_modules_[module] = instance;
+  instance->Start();
+}
+
 }  // namespace bluetooth
index 7df6334..33e0325 100644 (file)
@@ -115,23 +115,20 @@ class ModuleRegistry {
   // Stop all running modules in reverse order of start
   void StopAll();
 
- protected:
-  Module* Get(const ModuleFactory* module) const;
+  // Helper for dependency injection in test code. DO NOT USE in prod code!
+  // Ownership of |instance| is transferred to the registry.
+  void inject_test_module(const ModuleFactory* module, Module* instance, os::Thread* thread);
 
-  std::map<const ModuleFactory*, Module*> started_modules_;
-  std::vector<const ModuleFactory*> start_order_;
-};
-
-class TestModuleRegistry : public ModuleRegistry {
- public:
-  void InjectTestModule(const ModuleFactory* module, Module* instance) {
-    start_order_.push_back(module);
-    started_modules_[module] = instance;
+  // Helper for dependency injection in test code. DO NOT USE in prod code!
+  template <class T>
+  T* get_module_under_test() const {
+    return static_cast<T*>(Get(&T::Factory));
   }
 
-  Module* GetModuleUnderTest(const ModuleFactory* module) const {
-    return Get(module);
-  }
+ private:
+  Module* Get(const ModuleFactory* module) const;
+  std::map<const ModuleFactory*, Module*> started_modules_;
+  std::vector<const ModuleFactory*> start_order_;
 };
 
 }  // namespace bluetooth