You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2014/08/05 00:09:40 UTC

[19/43] git commit: Be more mock friendly in MockDockerContainerizer.

Be more mock friendly in MockDockerContainerizer.

Rather than having the MockDockerContainerizer store local variables
when certain events occur we can make the tests store what ever things
they need by mocking out the methods.


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/5e7c4a4d
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/5e7c4a4d
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/5e7c4a4d

Branch: refs/heads/master
Commit: 5e7c4a4d36d93caf0cecb0c5a55432978923dde7
Parents: a54dda8
Author: Benjamin Hindman <be...@gmail.com>
Authored: Tue Jul 1 07:45:53 2014 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Mon Aug 4 15:08:16 2014 -0700

----------------------------------------------------------------------
 src/tests/docker_containerizer_tests.cpp | 103 ++++++++++++++++----------
 1 file changed, 64 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/5e7c4a4d/src/tests/docker_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/docker_containerizer_tests.cpp b/src/tests/docker_containerizer_tests.cpp
index 274eee7..5e41529 100644
--- a/src/tests/docker_containerizer_tests.cpp
+++ b/src/tests/docker_containerizer_tests.cpp
@@ -45,42 +45,57 @@ using std::string;
 
 using testing::_;
 using testing::DoDefault;
-using testing::Eq;
+using testing::Invoke;
 using testing::Return;
 
 class DockerContainerizerTest : public MesosTest {};
 
-class MockDockerContainerizer : public slave::DockerContainerizer {
+class MockDockerContainerizer : public DockerContainerizer {
 public:
   MockDockerContainerizer(
-    const slave::Flags& flags,
-    bool local,
-    const Docker& docker) : DockerContainerizer(flags, local, docker) {}
-
-  process::Future<bool> launch(
-    const ContainerID& containerId,
-    const TaskInfo& taskInfo,
-    const ExecutorInfo& executorInfo,
-    const std::string& directory,
-    const Option<std::string>& user,
-    const SlaveID& slaveId,
-    const process::PID<Slave>& slavePid,
-    bool checkpoint)
+      const slave::Flags& flags,
+      bool local,
+      const Docker& docker)
+    : DockerContainerizer(flags, local, docker)
   {
-    // Keeping the last launched container id.
-    lastContainerId = containerId;
-    return slave::DockerContainerizer::launch(
-             containerId,
-             taskInfo,
-             executorInfo,
-             directory,
-             user,
-             slaveId,
-             slavePid,
-             checkpoint);
+    EXPECT_CALL(*this, launch(_, _, _, _, _, _, _, _))
+      .WillRepeatedly(Invoke(this, &MockDockerContainerizer::_launch));
   }
 
-  ContainerID lastContainerId;
+  MOCK_METHOD8(
+      launch,
+      process::Future<bool>(
+          const ContainerID&,
+          const TaskInfo&,
+          const ExecutorInfo&,
+          const std::string&,
+          const Option<std::string>&,
+          const SlaveID&,
+          const process::PID<slave::Slave>&,
+          bool checkpoint));
+
+  // Default 'launch' implementation (necessary because we can't just
+  // use &DockerContainerizer::launch with 'Invoke').
+  process::Future<bool> _launch(
+      const ContainerID& containerId,
+      const TaskInfo& taskInfo,
+      const ExecutorInfo& executorInfo,
+      const string& directory,
+      const Option<string>& user,
+      const SlaveID& slaveId,
+      const PID<Slave>& slavePid,
+      bool checkpoint)
+  {
+    return DockerContainerizer::launch(
+        containerId,
+        taskInfo,
+        executorInfo,
+        directory,
+        user,
+        slaveId,
+        slavePid,
+        checkpoint);
+  }
 };
 
 
@@ -138,12 +153,20 @@ TEST_F(DockerContainerizerTest, DOCKER_Launch)
   vector<TaskInfo> tasks;
   tasks.push_back(task);
 
+  Future<ContainerID> containerId;
+  EXPECT_CALL(dockerContainerizer, launch(_, _, _, _, _, _, _, _))
+    .WillOnce(DoAll(FutureArg<0>(&containerId),
+                    Invoke(&dockerContainerizer,
+                           &MockDockerContainerizer::_launch)));
+
   EXPECT_CALL(sched, statusUpdate(&driver, _))
     .WillOnce(FutureArg<1>(&statusRunning))
     .WillRepeatedly(DoDefault());
 
   driver.launchTasks(offers.get()[0].id(), tasks);
 
+  AWAIT_READY(containerId);
+
   AWAIT_READY_FOR(statusRunning, Seconds(60));
   EXPECT_EQ(TASK_RUNNING, statusRunning.get().state());
 
@@ -154,8 +177,7 @@ TEST_F(DockerContainerizerTest, DOCKER_Launch)
   ASSERT_TRUE(containers.get().size() > 0);
 
   bool foundContainer = false;
-  string expectedName =
-    slave::DOCKER_NAME_PREFIX + dockerContainerizer.lastContainerId.value();
+  string expectedName = slave::DOCKER_NAME_PREFIX + containerId.get().value();
 
   foreach (const Docker::Container& container, containers.get()) {
     // Docker inspect name contains an extra slash in the beginning.
@@ -167,7 +189,7 @@ TEST_F(DockerContainerizerTest, DOCKER_Launch)
 
   ASSERT_TRUE(foundContainer);
 
-  dockerContainerizer.destroy(dockerContainerizer.lastContainerId);
+  dockerContainerizer.destroy(containerId.get());
 
   driver.stop();
   driver.join();
@@ -231,29 +253,32 @@ TEST_F(DockerContainerizerTest, DOCKER_Usage)
   vector<TaskInfo> tasks;
   tasks.push_back(task);
 
+  Future<ContainerID> containerId;
+  EXPECT_CALL(dockerContainerizer, launch(_, _, _, _, _, _, _, _))
+    .WillOnce(DoAll(FutureArg<0>(&containerId),
+                    Invoke(&dockerContainerizer,
+                           &MockDockerContainerizer::_launch)));
+
   EXPECT_CALL(sched, statusUpdate(&driver, _))
     .WillOnce(FutureArg<1>(&statusRunning))
     .WillRepeatedly(DoDefault());
 
-  // Usage() should fail since the container is not launched.
-  Future<ResourceStatistics> usage =
-    dockerContainerizer.usage(dockerContainerizer.lastContainerId);
-
-  AWAIT_FAILED(usage);
-
   driver.launchTasks(offers.get()[0].id(), tasks);
 
+  AWAIT_READY(containerId);
+
   AWAIT_READY_FOR(statusRunning, Seconds(60));
   EXPECT_EQ(TASK_RUNNING, statusRunning.get().state());
 
-  usage = dockerContainerizer.usage(dockerContainerizer.lastContainerId);
+  Future<ResourceStatistics> usage =
+    dockerContainerizer.usage(containerId.get());
   AWAIT_READY(usage);
   // TODO(yifan): Verify the usage.
 
-  dockerContainerizer.destroy(dockerContainerizer.lastContainerId);
+  dockerContainerizer.destroy(containerId.get());
 
   // Usage() should fail again since the container is destroyed.
-  usage = dockerContainerizer.usage(dockerContainerizer.lastContainerId);
+  usage = dockerContainerizer.usage(containerId.get());
   AWAIT_FAILED(usage);
 
   driver.stop();