1 /* 2 * Copyright (C) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <gtest/gtest.h> 17 #include <stdint.h> 18 #include <stdbool.h> 19 #include "dhcp_define.h" 20 #include "dhcp_ipv4.h" 21 #include "dhcp_message.h" 22 #include "dhcp_option.h" 23 #include "address_utils.h" 24 25 using namespace testing::ext; 26 27 class DhcpOptionTest : public testing::Test { 28 public: SetUpTestCase()29 static void SetUpTestCase() 30 {} TearDownTestCase()31 static void TearDownTestCase() 32 {} SetUp()33 virtual void SetUp() 34 { 35 if (InitOptionList(&options)) { 36 printf("failed to initialized hash table.\n"); 37 } 38 } TearDown()39 virtual void TearDown() 40 { 41 FreeOptionList(&options); 42 } 43 public: 44 DhcpOptionList options = {0}; 45 }; 46 47 HWTEST_F(DhcpOptionTest, InitOptionListTest, TestSize.Level1) 48 { 49 DhcpOptionList testOpts = {0}; 50 EXPECT_EQ(RET_SUCCESS, InitOptionList(&testOpts)); 51 FreeOptionList(&testOpts); 52 EXPECT_EQ(RET_SUCCESS, InitOptionList(&options)); 53 } 54 55 HWTEST_F(DhcpOptionTest, HasInitializedTest, TestSize.Level1) 56 { 57 DhcpOptionList testOpts = {0}; 58 EXPECT_EQ(0, HasInitialized(NULL)); 59 EXPECT_EQ(0, HasInitialized(&testOpts)); 60 ASSERT_EQ(RET_SUCCESS, InitOptionList(&testOpts)); 61 EXPECT_EQ(1, HasInitialized(&testOpts)); 62 FreeOptionList(&testOpts); 63 } 64 65 HWTEST_F(DhcpOptionTest, PushBackOptionTest, TestSize.Level1) 66 { 67 DhcpOption optRouter = {ROUTER_OPTION, 0, {0}}; 68 EXPECT_EQ(RET_SUCCESS, PushBackOption(&options, &optRouter)); 69 70 DhcpOption optMsgType = {DHCP_MESSAGE_TYPE_OPTION, 1, {DHCPOFFER, 0}}; 71 EXPECT_EQ(RET_ERROR, PushBackOption(NULL, &optMsgType)); 72 EXPECT_EQ(RET_ERROR, PushBackOption(&options, NULL)); 73 EXPECT_EQ(RET_SUCCESS, PushBackOption(&options, &optMsgType)); 74 EXPECT_TRUE(options.size == 2); 75 ClearOptions(&options); 76 EXPECT_TRUE(options.size == 0); 77 } 78 79 HWTEST_F(DhcpOptionTest, PushFrontOptionTest, TestSize.Level1) 80 { 81 DhcpOption optRouter = {ROUTER_OPTION, 0, {0}}; 82 EXPECT_EQ(RET_SUCCESS, PushFrontOption(&options, &optRouter)); 83 84 DhcpOption optMsgType = {DHCP_MESSAGE_TYPE_OPTION, 1, {DHCPOFFER, 0}}; 85 EXPECT_EQ(RET_ERROR, PushFrontOption(NULL, &optMsgType)); 86 EXPECT_EQ(RET_ERROR, PushFrontOption(&options, NULL)); 87 EXPECT_EQ(RET_SUCCESS, PushFrontOption(&options, &optMsgType)); 88 EXPECT_TRUE(options.size == 2); 89 ClearOptions(&options); 90 EXPECT_TRUE(options.size == 0); 91 } 92 93 HWTEST_F(DhcpOptionTest, GetOptionNodeTest, TestSize.Level1) 94 { 95 DhcpOption optRouter = {ROUTER_OPTION, 0, {0}}; 96 EXPECT_EQ(RET_SUCCESS, PushFrontOption(&options, &optRouter)); 97 DhcpOption optMsgType = {DHCP_MESSAGE_TYPE_OPTION, 1, {DHCPOFFER, 0}}; 98 EXPECT_EQ(RET_SUCCESS, PushFrontOption(&options, &optMsgType)); 99 EXPECT_TRUE(options.size == 2); 100 101 DhcpOptionNode *node = GetOptionNode(&options, DHCP_MESSAGE_TYPE_OPTION); 102 EXPECT_TRUE(node!=NULL); 103 ClearOptions(&options); 104 EXPECT_TRUE(options.size == 0); 105 } 106 107 HWTEST_F(DhcpOptionTest, GetOptionTest, TestSize.Level1) 108 { 109 DhcpOption optRouter = {ROUTER_OPTION, 0, {0}}; 110 EXPECT_EQ(RET_SUCCESS, PushFrontOption(&options, &optRouter)); 111 DhcpOption optMsgType = {DHCP_MESSAGE_TYPE_OPTION, 1, {DHCPOFFER, 0}}; 112 EXPECT_EQ(RET_SUCCESS, PushFrontOption(&options, &optMsgType)); 113 EXPECT_TRUE(options.size == 2); 114 115 DhcpOption *node = GetOption(&options, DHCP_MESSAGE_TYPE_OPTION); 116 EXPECT_TRUE(node!=NULL); 117 ClearOptions(&options); 118 EXPECT_TRUE(options.size == 0); 119 } 120 121 122 HWTEST_F(DhcpOptionTest, RemoveOptionTest, TestSize.Level1) 123 { 124 DhcpOption optRouter = {ROUTER_OPTION, 0, {0}}; 125 EXPECT_EQ(RET_SUCCESS, PushFrontOption(&options, &optRouter)); 126 EXPECT_TRUE(options.size == 1); 127 EXPECT_EQ(RET_ERROR, RemoveOption(NULL, DOMAIN_NAME_SERVER_OPTION)); 128 EXPECT_EQ(RET_FAILED, RemoveOption(&options, DOMAIN_NAME_SERVER_OPTION)); 129 EXPECT_EQ(RET_SUCCESS, RemoveOption(&options, ROUTER_OPTION)); 130 EXPECT_EQ(RET_FAILED, RemoveOption(&options, ROUTER_OPTION)); 131 EXPECT_TRUE(options.size == 0); 132 ClearOptions(&options); 133 } 134 135 HWTEST_F(DhcpOptionTest, FillOptionTest, TestSize.Level1) 136 { 137 const char *serverInfo = "dhcp server 1.0"; 138 DhcpOption optVendorInfo = {VENDOR_SPECIFIC_INFO_OPTION, 0, {0}}; 139 EXPECT_EQ(RET_FAILED, FillOption(&optVendorInfo, NULL, 0)); 140 EXPECT_EQ(RET_ERROR, FillOption(NULL, serverInfo, strlen(serverInfo))); 141 EXPECT_EQ(RET_SUCCESS, FillOption(&optVendorInfo, serverInfo, strlen(serverInfo))); 142 } 143 144 HWTEST_F(DhcpOptionTest, FillOptionDataTest, TestSize.Level1) 145 { 146 uint8_t testData[] = {192, 168, 100, 254}; 147 DhcpOption optRouter = {ROUTER_OPTION, 0, {0}}; 148 EXPECT_EQ(RET_ERROR, FillOptionData(NULL, testData, sizeof(testData))); 149 EXPECT_EQ(RET_FAILED, FillOptionData(&optRouter, NULL, sizeof(testData))); 150 EXPECT_EQ(RET_SUCCESS, FillOptionData(&optRouter, testData, sizeof(testData))); 151 } 152 153 HWTEST_F(DhcpOptionTest, FillU32OptionTest, TestSize.Level1) 154 { 155 uint32_t testIp = ParseIpAddr("192.168.100.254"); 156 EXPECT_TRUE(testIp != 0); 157 DhcpOption optRouter = {ROUTER_OPTION, 0, {0}}; 158 EXPECT_EQ(RET_SUCCESS, FillU32Option(&optRouter, testIp)); 159 EXPECT_EQ(RET_ERROR, FillU32Option(NULL, testIp)); 160 } 161 162 HWTEST_F(DhcpOptionTest, AppendAddressOptionTest, TestSize.Level1) 163 { 164 uint32_t testDns1 = ParseIpAddr("192.168.100.1"); 165 EXPECT_TRUE(testDns1 != 0); 166 uint32_t testDns2 = ParseIpAddr("192.168.100.2"); 167 EXPECT_TRUE(testDns2 != 0); 168 uint32_t testDns3 = ParseIpAddr("192.168.100.3"); 169 EXPECT_TRUE(testDns3 != 0); 170 171 DhcpOption optDns = {DOMAIN_NAME_SERVER_OPTION, 0, {0}}; 172 EXPECT_EQ(RET_ERROR, AppendAddressOption(NULL, testDns1)); 173 EXPECT_EQ(RET_SUCCESS, AppendAddressOption(&optDns, testDns1)); 174 EXPECT_EQ(RET_SUCCESS, AppendAddressOption(&optDns, testDns2)); 175 EXPECT_EQ(RET_SUCCESS, AppendAddressOption(&optDns, testDns3)); 176 EXPECT_EQ(12, optDns.length); 177 } 178