PARQUET-1255: Fix error message when PARQUET_TEST_DATA isn't defined

Author: Antoine Pitrou <antoine@python.org>

Closes #448 from pitrou/PARQUET-1255 and squashes the following commits:

b162511 [Antoine Pitrou] PARQUET-1255: Fix error message when PARQUET_TEST_DATA isn't defined
diff --git a/src/parquet/arrow/arrow-reader-writer-test.cc b/src/parquet/arrow/arrow-reader-writer-test.cc
index 46218be..79a393f 100644
--- a/src/parquet/arrow/arrow-reader-writer-test.cc
+++ b/src/parquet/arrow/arrow-reader-writer-test.cc
@@ -39,6 +39,8 @@
 
 #include "parquet/file_writer.h"
 
+#include "parquet/util/test-common.h"
+
 #include "arrow/api.h"
 #include "arrow/test-util.h"
 #include "arrow/type_traits.h"
@@ -2100,8 +2102,7 @@
 
 TEST(TestArrowReaderAdHoc, Int96BadMemoryAccess) {
   // PARQUET-995
-  const char* data_dir = std::getenv("PARQUET_TEST_DATA");
-  std::string dir_string(data_dir);
+  std::string dir_string(test::get_data_dir());
   std::stringstream ss;
   ss << dir_string << "/"
      << "alltypes_plain.parquet";
@@ -2121,7 +2122,7 @@
           std::tuple<std::string, std::shared_ptr<::DataType>>> {};
 
 TEST_P(TestArrowReaderAdHocSpark, ReadDecimals) {
-  std::string path(std::getenv("PARQUET_TEST_DATA"));
+  std::string path(test::get_data_dir());
 
   std::string filename;
   std::shared_ptr<::DataType> decimal_type;
diff --git a/src/parquet/reader-test.cc b/src/parquet/reader-test.cc
index c536fdc..d628f47 100644
--- a/src/parquet/reader-test.cc
+++ b/src/parquet/reader-test.cc
@@ -30,6 +30,7 @@
 #include "parquet/file_reader.h"
 #include "parquet/printer.h"
 #include "parquet/util/memory.h"
+#include "parquet/util/test-common.h"
 
 using std::string;
 
@@ -37,10 +38,8 @@
 
 using ReadableFile = ::arrow::io::ReadableFile;
 
-const char* data_dir = std::getenv("PARQUET_TEST_DATA");
-
 std::string alltypes_plain() {
-  std::string dir_string(data_dir);
+  std::string dir_string(test::get_data_dir());
   std::stringstream ss;
   ss << dir_string << "/"
      << "alltypes_plain.parquet";
@@ -48,7 +47,7 @@
 }
 
 std::string nation_dict_truncated_data_page() {
-  std::string dir_string(data_dir);
+  std::string dir_string(test::get_data_dir());
   std::stringstream ss;
   ss << dir_string << "/"
      << "nation.dict-malformed.parquet";
@@ -171,7 +170,7 @@
 class TestLocalFile : public ::testing::Test {
  public:
   void SetUp() {
-    std::string dir_string(data_dir);
+    std::string dir_string(test::get_data_dir());
 
     std::stringstream ss;
     ss << dir_string << "/"
diff --git a/src/parquet/util/test-common.h b/src/parquet/util/test-common.h
index ebf4851..22b748e 100644
--- a/src/parquet/util/test-common.h
+++ b/src/parquet/util/test-common.h
@@ -23,6 +23,7 @@
 #include <random>
 #include <vector>
 
+#include "parquet/exception.h"
 #include "parquet/types.h"
 
 using std::vector;
@@ -35,6 +36,20 @@
                          DoubleType, ByteArrayType, FLBAType>
     ParquetTypes;
 
+class ParquetTestException : public parquet::ParquetException {
+  using ParquetException::ParquetException;
+};
+
+const char* get_data_dir() {
+  const auto result = std::getenv("PARQUET_TEST_DATA");
+  if (!result || !result[0]) {
+    throw ParquetTestException(
+        "Please point the PARQUET_TEST_DATA environment "
+        "variable to the test data directory");
+  }
+  return result;
+}
+
 template <typename T>
 static inline void assert_vector_equal(const vector<T>& left, const vector<T>& right) {
   ASSERT_EQ(left.size(), right.size());