eth: Support looking up alternate interace channels

This makes it possible to use the GetEthDevice command to look up
interfaces other than the default NCSI interface.

Change-Id: I3a5563743a28b39adc753d8957f68f0bc330cf3a
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/test/common.cpp b/test/common.cpp
index 08c3eaa..f8f635f 100644
--- a/test/common.cpp
+++ b/test/common.cpp
@@ -3,8 +3,8 @@
 
 namespace ipmi
 {
-std::uint8_t getChannelByName(const std::string&)
+std::uint8_t getChannelByName(const std::string& chName)
 {
-    return 1;
+    return chName.size() + 10;
 }
 } // namespace ipmi
diff --git a/test/eth_unittest.cpp b/test/eth_unittest.cpp
index 1053d4b..9807c91 100644
--- a/test/eth_unittest.cpp
+++ b/test/eth_unittest.cpp
@@ -27,10 +27,10 @@
     size_t dataLen = request.size();
     std::uint8_t reply[MAX_IPMI_BUFFER];
     const std::uint8_t expectedAnswer[4] = {'e', 't', 'h', '0'};
-    const std::uint8_t expectedChannel = 1;
+    const std::uint8_t expectedChannel = 14;
 
     HandlerMock hMock;
-    EXPECT_CALL(hMock, getEthDetails())
+    EXPECT_CALL(hMock, getEthDetails(""))
         .WillOnce(Return(std::make_tuple(
             expectedChannel,
             std::string(expectedAnswer,
@@ -47,5 +47,30 @@
                              sizeof(expectedAnswer)));
 }
 
+TEST(EthCommandTest, ValidPopulatedReturnsSuccess)
+{
+    std::vector<std::uint8_t> request = {SysOEMCommands::SysGetEthDevice, 'e'};
+    size_t dataLen = request.size();
+    std::uint8_t reply[MAX_IPMI_BUFFER];
+    const std::uint8_t expectedAnswer[1] = {'e'};
+    const std::uint8_t expectedChannel = 11;
+
+    HandlerMock hMock;
+    EXPECT_CALL(hMock, getEthDetails("e"))
+        .WillOnce(Return(std::make_tuple(
+            expectedChannel,
+            std::string(expectedAnswer,
+                        expectedAnswer + sizeof(expectedAnswer)))));
+
+    EXPECT_EQ(IPMI_CC_OK,
+              getEthDevice(request.data(), &reply[0], &dataLen, &hMock));
+    struct EthDeviceReply check;
+    std::memcpy(&check, &reply[0], sizeof(check));
+    EXPECT_EQ(check.subcommand, SysOEMCommands::SysGetEthDevice);
+    EXPECT_EQ(check.channel, expectedChannel);
+    EXPECT_EQ(check.ifNameLength, sizeof(expectedAnswer));
+    EXPECT_EQ(0, std::memcmp(expectedAnswer, &reply[sizeof(check)],
+                             sizeof(expectedAnswer)));
+}
 } // namespace ipmi
 } // namespace google
diff --git a/test/handler_mock.hpp b/test/handler_mock.hpp
index edd2aec..841d986 100644
--- a/test/handler_mock.hpp
+++ b/test/handler_mock.hpp
@@ -20,7 +20,8 @@
   public:
     ~HandlerMock() = default;
 
-    MOCK_CONST_METHOD0(getEthDetails, std::tuple<std::uint8_t, std::string>());
+    MOCK_CONST_METHOD1(getEthDetails,
+                       std::tuple<std::uint8_t, std::string>(std::string));
     MOCK_CONST_METHOD1(getRxPackets, std::int64_t(const std::string&));
     MOCK_CONST_METHOD1(getCpldVersion,
                        std::tuple<std::uint8_t, std::uint8_t, std::uint8_t,
diff --git a/test/handler_unittest.cpp b/test/handler_unittest.cpp
index 99782fa..b93e877 100644
--- a/test/handler_unittest.cpp
+++ b/test/handler_unittest.cpp
@@ -16,12 +16,10 @@
 
 TEST(HandlerTest, EthCheckValidHappy)
 {
-    // The code returns compiled-in information, and therefore cannot really
-    // fail.
     Handler h;
-    std::tuple<std::uint8_t, std::string> result = h.getEthDetails();
-    EXPECT_EQ(1, std::get<0>(result));
-    EXPECT_STREQ("eth0", std::get<1>(result).c_str());
+    std::tuple<std::uint8_t, std::string> result = h.getEthDetails("et");
+    EXPECT_EQ(12, std::get<0>(result));
+    EXPECT_STREQ("et", std::get<1>(result).c_str());
 }
 
 TEST(HandlerTest, CableCheckIllegalPath)