|  | // Copyright 2016 The Bazel Authors. All rights reserved. | 
|  | // | 
|  | // Licensed 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 <dirent.h> | 
|  | #include <errno.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "src/tools/singlejar/input_jar.h" | 
|  |  | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | static const char kJarsDirPath[] = | 
|  | "third_party/bazel/src/tools/singlejar/jars_to_test"; | 
|  |  | 
|  | TEST(InputJarRandomJarsTest, ScanAllJars) { | 
|  | int processed_jars = 0; | 
|  | DIR *dirp = opendir(kJarsDirPath); | 
|  | ASSERT_NE(nullptr, dirp); | 
|  |  | 
|  | struct dirent *dirent; | 
|  | InputJar input_jar; | 
|  | while ((dirent = readdir(dirp)) != nullptr) { | 
|  | if (dirent->d_type != DT_REG && dirent->d_type != DT_LNK) { | 
|  | continue; | 
|  | } | 
|  | std::string path = std::string(kJarsDirPath) + "/" + dirent->d_name; | 
|  | if (dirent->d_type == DT_LNK) { | 
|  | struct stat st; | 
|  | if (stat(path.c_str(), &st)) { | 
|  | perror(path.c_str()); | 
|  | continue; | 
|  | } else if (!S_ISREG(st.st_mode)) { | 
|  | continue; | 
|  | } | 
|  | } | 
|  | EXPECT_TRUE(input_jar.Open(path)); | 
|  | const LH *lh; | 
|  | const CDH *cdh; | 
|  | int file_count = 0; | 
|  | int entry_count = 0; | 
|  | for (; (cdh = input_jar.NextEntry(&lh)); ++entry_count) { | 
|  | ASSERT_TRUE(cdh->is()); | 
|  | ASSERT_NE(nullptr, lh); | 
|  | ASSERT_TRUE(lh->is()); | 
|  | EXPECT_EQ(lh->file_name_string(), cdh->file_name_string()); | 
|  | if ('/' != lh->file_name()[lh->file_name_length() - 1]) { | 
|  | ++file_count; | 
|  | } | 
|  | } | 
|  | input_jar.Close(); | 
|  | fprintf(stderr, "%s: %d files, %d entries\n", dirent->d_name, file_count, | 
|  | entry_count); | 
|  | ++processed_jars; | 
|  | } | 
|  | closedir(dirp); | 
|  | EXPECT_LT(0, processed_jars); | 
|  | } | 
|  |  | 
|  | }  // namespace |