ml: Add Clone method

MachineLearningServiceImpl gains a separate BindingSet for cloned
connections. Unlike the primordial D-Bus connection, the ml_service
won't quit if these connections are closed.

This CL is part of the work to allow Chrome-side clients to get their
own bound MachineLearningServicePtrs (on a thread of their choice).

BUG=chromium:916760
TEST=Added new unit tests, ebuild ... clean test

Change-Id: I58f58848ee97e802571dbef2f8464fde0fa2492a
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2289231
Tested-by: Andrew Moylan <amoylan@chromium.org>
Reviewed-by: Honglin Yu <honglinyu@chromium.org>
Commit-Queue: Andrew Moylan <amoylan@chromium.org>
diff --git a/ml/machine_learning_service_impl.h b/ml/machine_learning_service_impl.h
index fbde979..c21b6fa 100644
--- a/ml/machine_learning_service_impl.h
+++ b/ml/machine_learning_service_impl.h
@@ -12,6 +12,7 @@
 #include <base/callback_forward.h>
 #include <base/macros.h>
 #include <mojo/public/cpp/bindings/binding.h>
+#include <mojo/public/cpp/bindings/binding_set.h>
 
 #include "ml/model_metadata.h"
 #include "ml/mojom/machine_learning_service.mojom.h"
@@ -40,28 +41,22 @@
 
  private:
   // chromeos::machine_learning::mojom::MachineLearningService:
+  void Clone(chromeos::machine_learning::mojom::MachineLearningServiceRequest
+                 request) override;
   void LoadBuiltinModel(
       chromeos::machine_learning::mojom::BuiltinModelSpecPtr spec,
       chromeos::machine_learning::mojom::ModelRequest request,
       LoadBuiltinModelCallback callback) override;
-
-  // chromeos::machine_learning::mojom::MachineLearningService:
   void LoadFlatBufferModel(
       chromeos::machine_learning::mojom::FlatBufferModelSpecPtr spec,
       chromeos::machine_learning::mojom::ModelRequest request,
       LoadFlatBufferModelCallback callback) override;
-
-  // chromeos::machine_learning::mojom::MachineLearningService:
   void LoadTextClassifier(
       chromeos::machine_learning::mojom::TextClassifierRequest request,
       LoadTextClassifierCallback callback) override;
-
-  // chromeos::machine_learning::mojom::MachineLearningService:
   void LoadHandwritingModel(
       chromeos::machine_learning::mojom::HandwritingRecognizerRequest request,
       LoadHandwritingModelCallback callback) override;
-
-  // chromeos::machine_learning::mojom::MachineLearningService:
   void LoadHandwritingModelWithSpec(
       chromeos::machine_learning::mojom::HandwritingRecognizerSpecPtr spec,
       chromeos::machine_learning::mojom::HandwritingRecognizerRequest request,
@@ -82,9 +77,14 @@
 
   const std::string model_dir_;
 
+  // Primordial binding bootstrapped over D-Bus. Once opened, is never closed.
   mojo::Binding<chromeos::machine_learning::mojom::MachineLearningService>
       binding_;
 
+  // Additional bindings obtained via `Clone`.
+  mojo::BindingSet<chromeos::machine_learning::mojom::MachineLearningService>
+      clone_bindings_;
+
   DISALLOW_COPY_AND_ASSIGN(MachineLearningServiceImpl);
 };