Create regulators StubAction class

Created the StubAction class to aid in unit testing the
phosphor-regulators application.  This simple 'stub' will either return
a predefined return value or throw a predefined exception.

Updated the meson.build file to search for includes in the test
tree.  This is where stub classes will be located.

Signed-off-by: Shawn McCarney <shawnmm@us.ibm.com>
Change-Id: I78030d29f3bc6a94db998c5a1712a3b4a03c3e90
diff --git a/phosphor-regulators/meson.build b/phosphor-regulators/meson.build
index 6d04d87..774868c 100644
--- a/phosphor-regulators/meson.build
+++ b/phosphor-regulators/meson.build
@@ -1,4 +1,2 @@
-phosphor_regulators_includes = include_directories('src', 'src/actions')
-
 subdir('src')
 subdir('test')
diff --git a/phosphor-regulators/src/meson.build b/phosphor-regulators/src/meson.build
index 19f1bb5..23266b0 100644
--- a/phosphor-regulators/src/meson.build
+++ b/phosphor-regulators/src/meson.build
@@ -1 +1,4 @@
-# subdir('actions')
+phosphor_regulators_include_directories = include_directories(
+    '.',
+    'actions'
+)
diff --git a/phosphor-regulators/test/actions/meson.build b/phosphor-regulators/test/actions/meson.build
index d6821de..8809eb4 100644
--- a/phosphor-regulators/test/actions/meson.build
+++ b/phosphor-regulators/test/actions/meson.build
@@ -7,6 +7,9 @@
                     gtest,
                 ],
                 implicit_include_directories: false,
-                include_directories: phosphor_regulators_includes,
+                include_directories: [
+                    phosphor_regulators_include_directories,
+                    phosphor_regulators_tests_include_directories
+                ]
      )
 )
diff --git a/phosphor-regulators/test/actions/stub_action.hpp b/phosphor-regulators/test/actions/stub_action.hpp
new file mode 100644
index 0000000..ea346ba
--- /dev/null
+++ b/phosphor-regulators/test/actions/stub_action.hpp
@@ -0,0 +1,153 @@
+/**
+ * Copyright © 2019 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "action.hpp"
+#include "action_environment.hpp"
+
+#include <cstddef> // for size_t
+#include <exception>
+#include <memory>
+#include <utility>
+
+namespace phosphor
+{
+namespace power
+{
+namespace regulators
+{
+
+/**
+ * @class StubAction
+ *
+ * Stub action used for unit tests.
+ *
+ * The action allows you to do one of the following when execute() is called:
+ *   - return a predefined return value
+ *   - throw an exception
+ *
+ * The action also tracks the following:
+ *   - number of times action has been executed
+ *   - number of exceptions thrown
+ */
+class StubAction : public Action
+{
+  public:
+    // Specify which compiler-generated methods we want
+    StubAction() = delete;
+    StubAction(const StubAction&) = delete;
+    StubAction(StubAction&&) = delete;
+    StubAction& operator=(const StubAction&) = delete;
+    StubAction& operator=(StubAction&&) = delete;
+    virtual ~StubAction() = default;
+
+    /**
+     * Constructor.
+     *
+     * @param returnValue value to return when execute() is called
+     */
+    explicit StubAction(bool returnValue) : returnValue{returnValue}
+    {
+    }
+
+    /**
+     * Executes this action.
+     *
+     * Throws an exception if setException() was called.  Otherwise returns the
+     * return value specified in the constructor or with setReturnValue().
+     *
+     * @param environment action execution environment
+     * @return value of returnValue data member
+     */
+    virtual bool execute(ActionEnvironment& environment) override
+    {
+        ++executeCount;
+
+        if (except)
+        {
+            ++exceptionCount;
+            throw *except;
+        }
+
+        return returnValue;
+    }
+
+    /**
+     * Returns the number of exceptions that have been thrown when execute() was
+     * called.
+     *
+     * @return number of exceptions thrown
+     */
+    size_t getExceptionCount() const
+    {
+        return exceptionCount;
+    }
+
+    /**
+     * Returns the number of times execute() has been called.
+     *
+     * @return number of times execute() called
+     */
+    size_t getExecuteCount() const
+    {
+        return executeCount;
+    }
+
+    /**
+     * Sets the value that will be returned when execute() is called.
+     *
+     * @param returnValue value to return from execute()
+     */
+    void setReturnValue(bool returnValue)
+    {
+        this->returnValue = returnValue;
+    }
+
+    /**
+     * Sets the exception that will be thrown when execute() is called.
+     *
+     * @param except exception to throw, or nullptr to throw no exception
+     */
+    void setException(std::unique_ptr<std::exception> except)
+    {
+        this->except = std::move(except);
+    }
+
+  private:
+    /**
+     * Value that will be returned when execute() is called.
+     */
+    bool returnValue{true};
+
+    /**
+     * Exception to throw (if any) when execute() is called.
+     */
+    std::unique_ptr<std::exception> except{nullptr};
+
+    /**
+     * Number of times execute() has been called on this action.
+     */
+    size_t executeCount{0};
+
+    /**
+     * Number of times an exception was thrown when execute() was called.
+     */
+    size_t exceptionCount{0};
+};
+
+} // namespace regulators
+} // namespace power
+} // namespace phosphor
diff --git a/phosphor-regulators/test/meson.build b/phosphor-regulators/test/meson.build
index fdf8c00..ee880f0 100644
--- a/phosphor-regulators/test/meson.build
+++ b/phosphor-regulators/test/meson.build
@@ -1,3 +1,8 @@
+phosphor_regulators_tests_include_directories = include_directories(
+    '.',
+    'actions'
+)
+
 test('phosphor-regulators-tests',
      executable('phosphor-regulators-tests',
                 'device_tests.cpp',
@@ -9,7 +14,10 @@
                     gtest,
                 ],
                 implicit_include_directories: false,
-                include_directories: phosphor_regulators_includes,
+                include_directories: [
+                    phosphor_regulators_include_directories,
+                    phosphor_regulators_tests_include_directories
+                ]
      )
 )