blob: fc3122796a4851319bba0352ffa6582e944aee65 [file] [log] [blame]
/**
* 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 "hdfspp/hdfs_ext.h"
#include "configuration_test.h"
#include <google/protobuf/stubs/common.h>
#include <cstring>
#include <chrono>
#include <exception>
static const char *hdfs_11294_core_site_txt =
"<configuration>\n"
" <property name=\"fs.defaultFS\" value=\"hdfs://NAMESERVICE1\"/>\n"
" <property name=\"hadoop.security.authentication\" value=\"simple\"/>\n"
" <property name=\"ipc.client.connect.retry.interval\" value=\"1\">\n"
"</configuration>\n";
static const char *hdfs_11294_hdfs_site_txt =
"<configuration>\n"
" <property>\n"
" <name>dfs.nameservices</name>\n"
" <value>NAMESERVICE1</value>\n"
" </property>\n"
" <property>\n"
" <name>dfs.ha.namenodes.NAMESERVICE1</name>\n"
" <value>nn1, nn2</value>\n"
" </property>\n"
" <property>\n"
" <name>dfs.namenode.rpc-address.NAMESERVICE1.nn1</name>\n"
" <value>nonesuch1.apache.org:8020</value>\n"
" </property>\n"
" <property>\n"
" <name>dfs.namenode.servicerpc-address.NAMESERVICE1.nn1</name>\n"
" <value>nonesuch1.apache.org:8040</value>\n"
" </property>\n"
" <property>\n"
" <name>dfs.namenode.http-address.NAMESERVICE1.nn1</name>\n"
" <value>nonesuch1.apache.org:50070</value>\n"
" </property>\n"
" <property>\n"
" <name>dfs.namenode.rpc-address.NAMESERVICE1.nn2</name>\n"
" <value>nonesuch2.apache.org:8020</value>\n"
" </property>\n"
" <property>\n"
" <name>dfs.namenode.servicerpc-address.NAMESERVICE1.nn2</name>\n"
" <value>nonesuch2.apache.org:8040</value>\n"
" </property>\n"
" <property>\n"
" <name>dfs.namenode.http-address.NAMESERVICE1.nn2</name>\n"
" <value>nonesuch2.apache.org:50070</value>\n"
" </property>\n"
"</configuration>\n";
namespace hdfs {
// Make sure we can set up a mini-cluster and connect to it
TEST(ConfigConnectBugs, Test_HDFS_11294) {
// Directory for hdfs config
TempDir td;
const std::string& tempDirPath = td.path;
const std::string coreSitePath = tempDirPath + "/core-site.xml";
const std::string hdfsSitePath = tempDirPath + "/hdfs-site.xml";
// Write configs
FILE *coreSite = fopen(coreSitePath.c_str(), "w");
EXPECT_NE(coreSite, nullptr);
int coreSiteLength = strlen(hdfs_11294_core_site_txt);
size_t res = fwrite(hdfs_11294_core_site_txt, 1, coreSiteLength, coreSite);
EXPECT_EQ(res, coreSiteLength);
EXPECT_EQ(fclose(coreSite), 0);
FILE *hdfsSite = fopen(hdfsSitePath.c_str(), "w");
EXPECT_NE(hdfsSite, nullptr);
int hdfsSiteLength = strlen(hdfs_11294_hdfs_site_txt);
res = fwrite(hdfs_11294_hdfs_site_txt, 1, hdfsSiteLength, hdfsSite);
EXPECT_EQ(res, hdfsSiteLength);
EXPECT_EQ(fclose(hdfsSite), 0);
// Load configs with new FS
hdfsBuilder *bld = hdfsNewBuilderFromDirectory(tempDirPath.c_str());
hdfsBuilderSetNameNode(bld, "NAMESERVICE1");
// In HDFS-11294 connecting would crash because DNS couldn't resolve
// endpoints but the RpcEngine would attempt to dereference a non existant
// element in a std::vector and crash. Test passes if connect doesn't crash.
hdfsFS fileSystem = hdfsBuilderConnect(bld);
// FS shouldn't be created if it can't connect.
EXPECT_EQ(fileSystem, nullptr);
// Verify it got to endpoint check
char errMsgBuf[100];
memset(errMsgBuf, 0, 100);
EXPECT_EQ( hdfsGetLastError(errMsgBuf, 100), 0);
EXPECT_STREQ(errMsgBuf, "Exception:No endpoints found for namenode");
// remove config files
EXPECT_EQ(remove(coreSitePath.c_str()), 0);
EXPECT_EQ(remove(hdfsSitePath.c_str()), 0);
}
} // end namespace hdfs
int main(int argc, char *argv[]) {
// The following line must be executed to initialize Google Mock
// (and Google Test) before running the tests.
::testing::InitGoogleMock(&argc, argv);
int exit_code = RUN_ALL_TESTS();
google::protobuf::ShutdownProtobufLibrary();
return exit_code;
}