diff --git a/power-supply/test/Makefile.am b/power-supply/test/Makefile.am
new file mode 100644
index 0000000..95fbca0
--- /dev/null
+++ b/power-supply/test/Makefile.am
@@ -0,0 +1,24 @@
+AM_CPPFLAGS = -I$(top_srcdir)
+
+# Run all 'check' test programs
+TESTS = $(check_PROGRAMS)
+
+check_PROGRAMS = test_records
+
+test_records_CPPFLAGS = -Igtest $(GTEST_CPPFLAGS) $(AM_CPPFLAGS)
+
+test_records_CXXFLAGS = $(PTHREAD_CFLAGS) \
+	$(PHOSPHOR_DBUS_INTERFACES_CFLAGS) \
+	$(PHOSPHOR_LOGGING_CFLAGS) \
+	$(SDBUSPLUS_CFLAGS)
+
+test_records_LDFLAGS = -lgtest_main -lgtest \
+	$(PTHREAD_LIBS) $(OESDK_TESTCASE_FLAGS) \
+	$(PHOSPHOR_DBUS_INTERFACES_LIBS) \
+	$(PHOSPHOR_LOGGING_LIBS) \
+	$(SDBUSPLUS_LIBS)
+
+test_records_SOURCES = test_records.cpp
+
+test_records_LDADD = ../record_manager.o
+
diff --git a/power-supply/test/test_records.cpp b/power-supply/test/test_records.cpp
new file mode 100644
index 0000000..20b638b
--- /dev/null
+++ b/power-supply/test/test_records.cpp
@@ -0,0 +1,182 @@
+/**
+ * Copyright © 2017 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 <gtest/gtest.h>
+#include <iostream>
+#include "names_values.hpp"
+#include "../record_manager.hpp"
+
+using namespace witherspoon::power::history;
+
+/**
+ * Test the linearToInteger function with different
+ * combinations of positive and negative mantissas and
+ * exponents.
+ *
+ * Value = mantissa * 2**exponent
+ */
+TEST(LinearFormatTest, TestConversions)
+{
+    //Mantissa > 0, exponent = 0
+    EXPECT_EQ(0, RecordManager::linearToInteger(0));
+    EXPECT_EQ(1, RecordManager::linearToInteger(1));
+    EXPECT_EQ(38, RecordManager::linearToInteger(0x26));
+    EXPECT_EQ(1023, RecordManager::linearToInteger(0x3FF));
+
+    //Mantissa < 0, exponent = 0
+    EXPECT_EQ(-1, RecordManager::linearToInteger(0x7FF));
+    EXPECT_EQ(-20, RecordManager::linearToInteger(0x7EC));
+    EXPECT_EQ(-769, RecordManager::linearToInteger(0x4FF));
+    EXPECT_EQ(-989, RecordManager::linearToInteger(0x423));
+    EXPECT_EQ(-1024, RecordManager::linearToInteger(0x400));
+
+    //Mantissa >= 0, exponent > 0
+    //M = 1, E = 2
+    EXPECT_EQ(4, RecordManager::linearToInteger(0x1001));
+
+    //M = 1000, E = 10
+    EXPECT_EQ(1024000, RecordManager::linearToInteger(0x53E8));
+
+    //M = 10, E = 15
+    EXPECT_EQ(327680, RecordManager::linearToInteger(0x780A));
+
+    //Mantissa >= 0, exponent < 0
+    //M = 0, E = -1
+    EXPECT_EQ(0, RecordManager::linearToInteger(0xF800));
+
+    //M = 100, E = -2
+    EXPECT_EQ(25, RecordManager::linearToInteger(0xF064));
+
+    //Mantissa < 0, exponent < 0
+    //M = -100, E = -1
+    EXPECT_EQ(-50, RecordManager::linearToInteger(0xFF9C));
+
+    //M = -1024, E = -7
+    EXPECT_EQ(-8, RecordManager::linearToInteger(0xCC00));
+}
+
+/**
+ * @brief Helper function to create a record buffer
+ *
+ * @param sequenceID - the ID to use
+ * @param avgPower - the average power, in linear format
+ * @param maxPower - the max power, in linear format
+ *
+ * @return vector<uint8_t> the record buffer
+ */
+std::vector<uint8_t> makeRawRecord(
+        uint8_t sequenceID,
+        uint16_t avgPower,
+        uint16_t maxPower)
+{
+    std::vector<uint8_t> record;
+
+    record.push_back(sequenceID);
+    record.push_back(avgPower & 0xFF);
+    record.push_back(avgPower >> 8);
+    record.push_back(maxPower & 0xFF);
+    record.push_back(maxPower >> 8);
+
+    return record;
+}
+
+
+/**
+ * Test record queue management
+ */
+TEST(ManagerTest, TestRecordAdds)
+{
+    //Hold 5 max records.  IDs roll over at 8.
+    RecordManager mgr{5, 8};
+
+    EXPECT_EQ(0, mgr.getNumRecords());
+
+    mgr.add(makeRawRecord(0, 0, 0));
+    EXPECT_EQ(1, mgr.getNumRecords());
+
+    mgr.add(makeRawRecord(1, 0, 0));
+    EXPECT_EQ(2, mgr.getNumRecords());
+
+    mgr.add(makeRawRecord(2, 0, 0));
+    EXPECT_EQ(3, mgr.getNumRecords());
+
+    mgr.add(makeRawRecord(3, 0, 0));
+    EXPECT_EQ(4, mgr.getNumRecords());
+
+    mgr.add(makeRawRecord(4, 0, 0));
+    EXPECT_EQ(5, mgr.getNumRecords());
+
+    //start pruning
+    mgr.add(makeRawRecord(5, 0, 0));
+    EXPECT_EQ(5, mgr.getNumRecords());
+
+    mgr.add(makeRawRecord(6, 0, 0));
+    EXPECT_EQ(5, mgr.getNumRecords());
+
+    mgr.add(makeRawRecord(7, 0, 0));
+    EXPECT_EQ(5, mgr.getNumRecords());
+
+    mgr.add(makeRawRecord(8, 0, 0));
+    EXPECT_EQ(5, mgr.getNumRecords());
+
+    //rollover
+    mgr.add(makeRawRecord(0, 0, 0));
+    EXPECT_EQ(5, mgr.getNumRecords());
+
+    mgr.add(makeRawRecord(1, 0, 0));
+    EXPECT_EQ(5, mgr.getNumRecords());
+
+    //nonsequential ID, clear previous
+    mgr.add(makeRawRecord(4, 0, 10));
+    EXPECT_EQ(1, mgr.getNumRecords());
+
+    //back to normal
+    mgr.add(makeRawRecord(5, 1, 11));
+    EXPECT_EQ(2, mgr.getNumRecords());
+
+    //One more good record
+    mgr.add(makeRawRecord(6, 2, 12));
+    EXPECT_EQ(3, mgr.getNumRecords());
+
+    //Add a garbage length record. No size change
+    mgr.add(std::vector<uint8_t>(6, 0));
+    EXPECT_EQ(3, mgr.getNumRecords());
+
+    //Test the DBus Records
+    auto avgRecords = mgr.getAverageRecords();
+    EXPECT_EQ(3, avgRecords.size());
+
+    auto maxRecords = mgr.getMaximumRecords();
+    EXPECT_EQ(3, maxRecords.size());
+
+    auto avg = 2;
+    for (const auto& r : avgRecords)
+    {
+        EXPECT_EQ(avg, std::get<1>(r));
+        avg--;
+    }
+
+    auto max = 12;
+    for (const auto& r : maxRecords)
+    {
+        EXPECT_EQ(max, std::get<1>(r));
+        max--;
+    }
+
+    //Add a zero length record. Records cleared.
+    mgr.add(std::vector<uint8_t>{});
+    EXPECT_EQ(0, mgr.getNumRecords());
+}
+
