/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 <string>

#include "utility/NetworkUtil.hpp"

#include "gflags/gflags_declare.h"
#include "gtest/gtest.h"

using std::string;

namespace quickstep {

DECLARE_bool(use_ethernet_ip);

TEST(NetworkUtilTest, LoopbackTest) {
  string lo_ip_address = GetIpv4Address();
  EXPECT_STREQ(kLocalIpv4Address, lo_ip_address.c_str());
}

TEST(NetworkUtilTest, EthernetTest) {
  FLAGS_use_ethernet_ip = true;
  string ethernet_ip_address = GetIpv4Address();
  EXPECT_STRNE(kLocalIpv4Address, ethernet_ip_address.c_str());
}

}  // namespace quickstep
