diff --git a/phosphor-regulators/src/actions/i2c_compare_bytes_action.cpp b/phosphor-regulators/src/actions/i2c_compare_bytes_action.cpp
new file mode 100644
index 0000000..c7f56f0
--- /dev/null
+++ b/phosphor-regulators/src/actions/i2c_compare_bytes_action.cpp
@@ -0,0 +1,78 @@
+/**
+ * Copyright © 2020 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.
+ */
+
+#include "i2c_compare_bytes_action.hpp"
+
+#include "action_error.hpp"
+#include "i2c_interface.hpp"
+
+#include <exception>
+#include <ios>
+#include <sstream>
+
+namespace phosphor::power::regulators
+{
+
+bool I2CCompareBytesAction::execute(ActionEnvironment& environment)
+{
+    bool isEqual{true};
+    try
+    {
+        // Read actual device register values.  Use I2C mode where the number of
+        // bytes to read is explicitly specified.
+        i2c::I2CInterface& interface = getI2CInterface(environment);
+        uint8_t size = values.size();
+        uint8_t actualValues[UINT8_MAX];
+        interface.read(reg, size, actualValues, i2c::I2CInterface::Mode::I2C);
+
+        // Compare actual byte values to expected byte values
+        for (unsigned int i = 0; i < values.size(); ++i)
+        {
+            if ((actualValues[i] & masks[i]) != values[i])
+            {
+                isEqual = false;
+                break;
+            }
+        }
+    }
+    catch (const i2c::I2CException& e)
+    {
+        // Nest I2CException within an ActionError so caller will have both the
+        // low level I2C error information and the action information
+        std::throw_with_nested(ActionError(*this));
+    }
+    return isEqual;
+}
+
+std::string I2CCompareBytesAction::toString() const
+{
+    std::ostringstream ss;
+    ss << "i2c_compare_bytes: { register: 0x" << std::hex << std::uppercase
+       << static_cast<uint16_t>(reg) << ", values: [ ";
+    for (unsigned int i = 0; i < values.size(); ++i)
+    {
+        ss << ((i > 0) ? ", " : "") << "0x" << static_cast<uint16_t>(values[i]);
+    }
+    ss << " ], masks: [ ";
+    for (unsigned int i = 0; i < masks.size(); ++i)
+    {
+        ss << ((i > 0) ? ", " : "") << "0x" << static_cast<uint16_t>(masks[i]);
+    }
+    ss << " ] }";
+    return ss.str();
+}
+
+} // namespace phosphor::power::regulators
diff --git a/phosphor-regulators/src/actions/i2c_compare_bytes_action.hpp b/phosphor-regulators/src/actions/i2c_compare_bytes_action.hpp
new file mode 100644
index 0000000..3f0ec83
--- /dev/null
+++ b/phosphor-regulators/src/actions/i2c_compare_bytes_action.hpp
@@ -0,0 +1,183 @@
+/**
+ * Copyright © 2020 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_environment.hpp"
+#include "i2c_action.hpp"
+
+#include <cstdint>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+namespace phosphor::power::regulators
+{
+
+/**
+ * @class I2CCompareBytesAction
+ *
+ * Compares device register bytes to a list of expected values.  Communicates
+ * with the device directly using the I2C interface.
+ *
+ * Implements the i2c_compare_bytes action in the JSON config file.
+ */
+class I2CCompareBytesAction : public I2CAction
+{
+  public:
+    // Specify which compiler-generated methods we want
+    I2CCompareBytesAction() = delete;
+    I2CCompareBytesAction(const I2CCompareBytesAction&) = delete;
+    I2CCompareBytesAction(I2CCompareBytesAction&&) = delete;
+    I2CCompareBytesAction& operator=(const I2CCompareBytesAction&) = delete;
+    I2CCompareBytesAction& operator=(I2CCompareBytesAction&&) = delete;
+    virtual ~I2CCompareBytesAction() = default;
+
+    /**
+     * Constructor.
+     *
+     * Throws an exception if any of the input parameters are invalid.
+     *
+     * @param reg Device register address.  Note: named 'reg' because 'register'
+     *            is a reserved keyword.
+     * @param values One or more expected byte values.  The bytes must be
+     *               specified in the same order as they will be received from
+     *               the device (e.g. in little-endian order).
+     */
+    explicit I2CCompareBytesAction(uint8_t reg,
+                                   const std::vector<uint8_t>& values) :
+        I2CCompareBytesAction(reg, values,
+                              std::vector<uint8_t>(values.size(), 0xFF))
+    {
+    }
+
+    /**
+     * Constructor.
+     *
+     * Throws an exception if any of the input parameters are invalid.
+     *
+     * @param reg Device register address.  Note: named 'reg' because 'register'
+     *            is a reserved keyword.
+     * @param values One or more expected byte values.  The bytes must be
+     *               specified in the same order as they will be received from
+     *               the device (e.g. in little-endian order).
+     * @param masks One or more bit masks.  The number of bit masks must match
+     *              the number of expected byte values.  Each mask specifies
+     *              which bits should be compared within the corresponding byte
+     *              value.  Only the bits with a value of 1 in the mask will be
+     *              compared.
+     */
+    explicit I2CCompareBytesAction(uint8_t reg,
+                                   const std::vector<uint8_t>& values,
+                                   const std::vector<uint8_t>& masks) :
+        reg{reg},
+        values{values}, masks{masks}
+    {
+        // Values vector must not be empty
+        if (values.size() < 1)
+        {
+            throw std::invalid_argument{"Values vector is empty"};
+        }
+
+        // Masks vector must have same size as values vector
+        if (masks.size() != values.size())
+        {
+            throw std::invalid_argument{"Masks vector has invalid size"};
+        }
+    }
+
+    /**
+     * Executes this action.
+     *
+     * Compares device register bytes to a list of expected values using the
+     * I2C interface.
+     *
+     * All of the bytes will be read in a single I2C operation.
+     *
+     * The device register, byte values, and bit masks (if any) were specified
+     * in the constructor.
+     *
+     * The device is obtained from the specified action environment.
+     *
+     * Throws an exception if an error occurs.
+     *
+     * @param environment action execution environment
+     * @return true if the register bytes contained the expected values,
+     *         otherwise returns false.
+     */
+    virtual bool execute(ActionEnvironment& environment) override;
+
+    /**
+     * Returns the device register address.
+     *
+     * @return register address
+     */
+    uint8_t getRegister() const
+    {
+        return reg;
+    }
+
+    /**
+     * Returns the expected byte values.
+     *
+     * @return expected values
+     */
+    const std::vector<uint8_t>& getValues() const
+    {
+        return values;
+    }
+
+    /**
+     * Returns the bit masks.
+     *
+     * Each mask specifies which bits should be compared within the
+     * corresponding byte value.  Only the bits with a value of 1 in the mask
+     * will be compared.
+     *
+     * @return bit masks
+     */
+    const std::vector<uint8_t>& getMasks() const
+    {
+        return masks;
+    }
+
+    /**
+     * Returns a string description of this action.
+     *
+     * @return description of action
+     */
+    virtual std::string toString() const override;
+
+  private:
+    /**
+     * Device register address.  Note: named 'reg' because 'register' is a
+     * reserved keyword.
+     */
+    const uint8_t reg{0x00};
+
+    /**
+     * Expected byte values.
+     */
+    const std::vector<uint8_t> values{};
+
+    /**
+     * Bit masks.  Each mask specifies which bits should be compared within the
+     * corresponding byte value.  Only the bits with a value of 1 in the mask
+     * will be compared.
+     */
+    const std::vector<uint8_t> masks{};
+};
+
+} // namespace phosphor::power::regulators
diff --git a/phosphor-regulators/src/meson.build b/phosphor-regulators/src/meson.build
index f100d77..2cc8347 100644
--- a/phosphor-regulators/src/meson.build
+++ b/phosphor-regulators/src/meson.build
@@ -8,7 +8,8 @@
 
     'actions/if_action.cpp',
     'actions/i2c_compare_bit_action.cpp',
-    'actions/i2c_compare_byte_action.cpp'
+    'actions/i2c_compare_byte_action.cpp',
+    'actions/i2c_compare_bytes_action.cpp'
 ]
 
 phosphor_regulators_library = static_library(
diff --git a/phosphor-regulators/test/actions/i2c_compare_bytes_action_tests.cpp b/phosphor-regulators/test/actions/i2c_compare_bytes_action_tests.cpp
new file mode 100644
index 0000000..d03b358
--- /dev/null
+++ b/phosphor-regulators/test/actions/i2c_compare_bytes_action_tests.cpp
@@ -0,0 +1,428 @@
+/**
+ * Copyright © 2020 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.
+ */
+#include "action_environment.hpp"
+#include "action_error.hpp"
+#include "device.hpp"
+#include "i2c_compare_bytes_action.hpp"
+#include "i2c_interface.hpp"
+#include "id_map.hpp"
+#include "mocked_i2c_interface.hpp"
+
+#include <cstdint>
+#include <memory>
+#include <stdexcept>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using namespace phosphor::power::regulators;
+
+using ::testing::NotNull;
+using ::testing::Return;
+using ::testing::SetArrayArgument;
+using ::testing::Throw;
+using ::testing::TypedEq;
+
+// Test for I2CCompareBytesAction(uint8_t reg,
+//                                const std::vector<uint8_t>& values)
+TEST(I2CCompareBytesActionTests, Constructor1)
+{
+    // Test where works
+    try
+    {
+        std::vector<uint8_t> values{0x56, 0x14, 0xDA};
+        I2CCompareBytesAction action{0x7C, values};
+
+        EXPECT_EQ(action.getRegister(), 0x7C);
+
+        EXPECT_EQ(action.getValues().size(), 3);
+        EXPECT_EQ(action.getValues()[0], 0x56);
+        EXPECT_EQ(action.getValues()[1], 0x14);
+        EXPECT_EQ(action.getValues()[2], 0xDA);
+
+        EXPECT_EQ(action.getMasks().size(), 3);
+        EXPECT_EQ(action.getMasks()[0], 0xFF);
+        EXPECT_EQ(action.getMasks()[1], 0xFF);
+        EXPECT_EQ(action.getMasks()[2], 0xFF);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where fails: Values vector is empty
+    try
+    {
+        std::vector<uint8_t> values{};
+        I2CCompareBytesAction action{0x7C, values};
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const std::invalid_argument& e)
+    {
+        EXPECT_STREQ(e.what(), "Values vector is empty");
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+}
+
+// Test for I2CCompareBytesAction(uint8_t reg,
+//                                const std::vector<uint8_t>& values,
+//                                const std::vector<uint8_t>& masks)
+TEST(I2CCompareBytesActionTests, Constructor2)
+{
+    // Test where works
+    try
+    {
+        std::vector<uint8_t> values{0x56, 0x14};
+        std::vector<uint8_t> masks{0x7E, 0x3C};
+        I2CCompareBytesAction action{0xA0, values, masks};
+
+        EXPECT_EQ(action.getRegister(), 0xA0);
+
+        EXPECT_EQ(action.getValues().size(), 2);
+        EXPECT_EQ(action.getValues()[0], 0x56);
+        EXPECT_EQ(action.getValues()[1], 0x14);
+
+        EXPECT_EQ(action.getMasks().size(), 2);
+        EXPECT_EQ(action.getMasks()[0], 0x7E);
+        EXPECT_EQ(action.getMasks()[1], 0x3C);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where fails: Values vector is empty
+    try
+    {
+        std::vector<uint8_t> values{};
+        std::vector<uint8_t> masks{};
+        I2CCompareBytesAction action{0xA0, values, masks};
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const std::invalid_argument& e)
+    {
+        EXPECT_STREQ(e.what(), "Values vector is empty");
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where fails: Masks vector different size than values vector
+    try
+    {
+        std::vector<uint8_t> values{0x56, 0x14, 0xFE};
+        std::vector<uint8_t> masks{0x7E, 0x3C};
+        I2CCompareBytesAction action{0x7C, values, masks};
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const std::invalid_argument& e)
+    {
+        EXPECT_STREQ(e.what(), "Masks vector has invalid size");
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+}
+
+TEST(I2CCompareBytesActionTests, Execute)
+{
+    // Test where works: Equal: Mask specified
+    try
+    {
+        // Create mock I2CInterface: read() returns values 0xD7, 0x96
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        uint8_t actualValues[] = {0xD7, 0x96};
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface, read(0xA0, TypedEq<uint8_t&>(2), NotNull(),
+                                        i2c::I2CInterface::Mode::I2C))
+            .Times(1)
+            .WillOnce(SetArrayArgument<2>(actualValues, actualValues + 2));
+
+        // Create Device, IDMap, and ActionEnvironment
+        Device device{"reg1", true, "/system/chassis/motherboard/reg1",
+                      std::move(i2cInterface)};
+        IDMap idMap{};
+        idMap.addDevice(device);
+        ActionEnvironment env{idMap, "reg1"};
+
+        // Actual values: 0xD7 = 1101 0111   0x96 = 1001 0110
+        // Masks        : 0x7E = 0111 1110   0x3C = 0011 1100
+        // Results      : 0x56 = 0101 0110   0x14 = 0001 0100
+        const std::vector<uint8_t> values{0x56, 0x14};
+        const std::vector<uint8_t> masks{0x7E, 0x3C};
+        I2CCompareBytesAction action{0xA0, values, masks};
+        EXPECT_EQ(action.execute(env), true);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where works: Equal: Mask not specified
+    try
+    {
+        // Create mock I2CInterface: read() returns values 0x56, 0x14, 0xDA
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        uint8_t actualValues[] = {0x56, 0x14, 0xDA};
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface, read(0x7C, TypedEq<uint8_t&>(3), NotNull(),
+                                        i2c::I2CInterface::Mode::I2C))
+            .Times(1)
+            .WillOnce(SetArrayArgument<2>(actualValues, actualValues + 3));
+
+        // Create Device, IDMap, and ActionEnvironment
+        Device device{"reg1", true, "/system/chassis/motherboard/reg1",
+                      std::move(i2cInterface)};
+        IDMap idMap{};
+        idMap.addDevice(device);
+        ActionEnvironment env{idMap, "reg1"};
+
+        std::vector<uint8_t> values{0x56, 0x14, 0xDA};
+        I2CCompareBytesAction action{0x7C, values};
+        EXPECT_EQ(action.execute(env), true);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where works: Not equal: Mask specified
+    try
+    {
+        // Create mock I2CInterface: read() returns values 0xD7, 0x96
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        uint8_t actualValues[] = {0xD7, 0x96};
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface, read(0xA0, TypedEq<uint8_t&>(2), NotNull(),
+                                        i2c::I2CInterface::Mode::I2C))
+            .Times(1)
+            .WillOnce(SetArrayArgument<2>(actualValues, actualValues + 2));
+
+        // Create Device, IDMap, and ActionEnvironment
+        Device device{"reg1", true, "/system/chassis/motherboard/reg1",
+                      std::move(i2cInterface)};
+        IDMap idMap{};
+        idMap.addDevice(device);
+        ActionEnvironment env{idMap, "reg1"};
+
+        // Actual values: 0xD7 = 1101 0111   0x96 = 1001 0110
+        // Masks        : 0x7E = 0111 1110   0x3C = 0011 1100
+        // Results      : 0x56 = 0101 0110   0x14 = 0001 0100
+        const std::vector<uint8_t> values{0x56, 0x13};
+        const std::vector<uint8_t> masks{0x7E, 0x3C};
+        I2CCompareBytesAction action{0xA0, values, masks};
+        EXPECT_EQ(action.execute(env), false);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where works: Not equal: Mask not specified
+    try
+    {
+        // Create mock I2CInterface: read() returns values 0x56, 0x14, 0xDA
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        uint8_t actualValues[] = {0x56, 0x14, 0xDA};
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface, read(0x7C, TypedEq<uint8_t&>(3), NotNull(),
+                                        i2c::I2CInterface::Mode::I2C))
+            .Times(1)
+            .WillOnce(SetArrayArgument<2>(actualValues, actualValues + 3));
+
+        // Create Device, IDMap, and ActionEnvironment
+        Device device{"reg1", true, "/system/chassis/motherboard/reg1",
+                      std::move(i2cInterface)};
+        IDMap idMap{};
+        idMap.addDevice(device);
+        ActionEnvironment env{idMap, "reg1"};
+
+        std::vector<uint8_t> values{0x56, 0x14, 0xDB};
+        I2CCompareBytesAction action{0x7C, values};
+        EXPECT_EQ(action.execute(env), false);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where works: Single byte
+    try
+    {
+        // Create mock I2CInterface: read() returns value 0xD7
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        uint8_t actualValues[] = {0xD7};
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface, read(0xA0, TypedEq<uint8_t&>(1), NotNull(),
+                                        i2c::I2CInterface::Mode::I2C))
+            .Times(1)
+            .WillOnce(SetArrayArgument<2>(actualValues, actualValues + 1));
+
+        // Create Device, IDMap, and ActionEnvironment
+        Device device{"reg1", true, "/system/chassis/motherboard/reg1",
+                      std::move(i2cInterface)};
+        IDMap idMap{};
+        idMap.addDevice(device);
+        ActionEnvironment env{idMap, "reg1"};
+
+        // Actual values: 0xD7 = 1101 0111
+        // Masks        : 0x7E = 0111 1110
+        // Results      : 0x56 = 0101 0110
+        std::vector<uint8_t> values{0x56};
+        std::vector<uint8_t> masks{0x7E};
+        I2CCompareBytesAction action{0xA0, values, masks};
+        EXPECT_EQ(action.execute(env), true);
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where fails: Getting I2CInterface fails
+    try
+    {
+        // Create IDMap and ActionEnvironment
+        IDMap idMap{};
+        ActionEnvironment env{idMap, "reg1"};
+
+        std::vector<uint8_t> values{0x56, 0x14, 0xDB};
+        I2CCompareBytesAction action{0x7C, values};
+        action.execute(env);
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const std::invalid_argument& e)
+    {
+        EXPECT_STREQ(e.what(), "Unable to find device with ID \"reg1\"");
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+
+    // Test where fails: Reading bytes fails
+    try
+    {
+        // Create mock I2CInterface: read() throws an I2CException
+        std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
+            std::make_unique<i2c::MockedI2CInterface>();
+        EXPECT_CALL(*i2cInterface, isOpen).Times(1).WillOnce(Return(true));
+        EXPECT_CALL(*i2cInterface, read(0x7C, TypedEq<uint8_t&>(2), NotNull(),
+                                        i2c::I2CInterface::Mode::I2C))
+            .Times(1)
+            .WillOnce(Throw(i2c::I2CException{"Failed to read i2c block data",
+                                              "/dev/i2c-1", 0x70}));
+
+        // Create Device, IDMap, and ActionEnvironment
+        Device device{"reg1", true, "/system/chassis/motherboard/reg1",
+                      std::move(i2cInterface)};
+        IDMap idMap{};
+        idMap.addDevice(device);
+        ActionEnvironment env{idMap, "reg1"};
+
+        std::vector<uint8_t> values{0x56, 0x14};
+        I2CCompareBytesAction action{0x7C, values};
+        action.execute(env);
+        ADD_FAILURE() << "Should not have reached this line.";
+    }
+    catch (const ActionError& e)
+    {
+        EXPECT_STREQ(e.what(),
+                     "ActionError: i2c_compare_bytes: { register: "
+                     "0x7C, values: [ 0x56, 0x14 ], masks: [ 0xFF, 0xFF ] }");
+        try
+        {
+            // Re-throw inner I2CException
+            std::rethrow_if_nested(e);
+            ADD_FAILURE() << "Should not have reached this line.";
+        }
+        catch (const i2c::I2CException& ie)
+        {
+            EXPECT_STREQ(ie.what(),
+                         "I2CException: Failed to read i2c block data: bus "
+                         "/dev/i2c-1, addr 0x70");
+        }
+        catch (...)
+        {
+            ADD_FAILURE() << "Should not have caught exception.";
+        }
+    }
+    catch (...)
+    {
+        ADD_FAILURE() << "Should not have caught exception.";
+    }
+}
+
+TEST(I2CCompareBytesActionTests, GetRegister)
+{
+    std::vector<uint8_t> values{0x56, 0x14};
+    I2CCompareBytesAction action{0xA0, values};
+    EXPECT_EQ(action.getRegister(), 0xA0);
+}
+
+TEST(I2CCompareBytesActionTests, GetValues)
+{
+    std::vector<uint8_t> values{0x56, 0x14};
+    std::vector<uint8_t> masks{0x7E, 0x3C};
+    I2CCompareBytesAction action{0xA0, values, masks};
+    EXPECT_EQ(action.getValues().size(), 2);
+    EXPECT_EQ(action.getValues()[0], 0x56);
+    EXPECT_EQ(action.getValues()[1], 0x14);
+}
+
+TEST(I2CCompareBytesActionTests, GetMasks)
+{
+    // Test where masks were not specified
+    {
+        std::vector<uint8_t> values{0x56, 0x14, 0xDA};
+        I2CCompareBytesAction action{0x7C, values};
+        EXPECT_EQ(action.getMasks().size(), 3);
+        EXPECT_EQ(action.getMasks()[0], 0xFF);
+        EXPECT_EQ(action.getMasks()[1], 0xFF);
+        EXPECT_EQ(action.getMasks()[2], 0xFF);
+    }
+
+    // Test where masks were specified
+    {
+        std::vector<uint8_t> values{0x56, 0x14};
+        std::vector<uint8_t> masks{0x7E, 0x3C};
+        I2CCompareBytesAction action{0xA0, values, masks};
+        EXPECT_EQ(action.getMasks().size(), 2);
+        EXPECT_EQ(action.getMasks()[0], 0x7E);
+        EXPECT_EQ(action.getMasks()[1], 0x3C);
+    }
+}
+
+TEST(I2CCompareBytesActionTests, ToString)
+{
+    std::vector<uint8_t> values{0x56, 0x14};
+    std::vector<uint8_t> masks{0x7E, 0x3C};
+    I2CCompareBytesAction action{0xA0, values, masks};
+    EXPECT_EQ(action.toString(), "i2c_compare_bytes: { register: 0xA0, values: "
+                                 "[ 0x56, 0x14 ], masks: [ 0x7E, 0x3C ] }");
+}
diff --git a/phosphor-regulators/test/meson.build b/phosphor-regulators/test/meson.build
index 92a18c8..9e2b5bc 100644
--- a/phosphor-regulators/test/meson.build
+++ b/phosphor-regulators/test/meson.build
@@ -16,6 +16,7 @@
     'actions/i2c_action_tests.cpp',
     'actions/i2c_compare_bit_action_tests.cpp',
     'actions/i2c_compare_byte_action_tests.cpp',
+    'actions/i2c_compare_bytes_action_tests.cpp',
     'actions/if_action_tests.cpp',
     'actions/not_action_tests.cpp',
     'actions/or_action_tests.cpp',
