gtest_main.cpp revision be7ec66eaa4f995bd9068637f7c7d5718173922c
1323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui/*
2323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui * Copyright (C) 2015 The Android Open Source Project
3323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui *
4323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui * Licensed under the Apache License, Version 2.0 (the "License");
5323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui * you may not use this file except in compliance with the License.
6323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui * You may obtain a copy of the License at
7323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui *
8323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui *      http://www.apache.org/licenses/LICENSE-2.0
9323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui *
10323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui * Unless required by applicable law or agreed to in writing, software
11323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui * distributed under the License is distributed on an "AS IS" BASIS,
12323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui * See the License for the specific language governing permissions and
14323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui * limitations under the License.
15323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui */
16323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui
17323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui#include <gtest/gtest.h>
18323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui
19be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#include <memory>
20be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui
21be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#include <android-base/file.h>
2266dd09e8e2407082ce93bf0784de641298131912Elliott Hughes#include <android-base/logging.h>
23be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#include <android-base/test_utils.h>
24be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#include <ziparchive/zip_archive.h>
25323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui
26569f64afd3db2b43003978765b833669f99477d2Yabin Cui#include "get_test_data.h"
27be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#include "read_elf.h"
28569f64afd3db2b43003978765b833669f99477d2Yabin Cui#include "utils.h"
29569f64afd3db2b43003978765b833669f99477d2Yabin Cui
30569f64afd3db2b43003978765b833669f99477d2Yabin Cuistatic std::string testdata_dir;
31569f64afd3db2b43003978765b833669f99477d2Yabin Cui
32be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#if defined(IN_CTS_TEST)
33be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cuistatic const std::string testdata_section = ".testzipdata";
34be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui
35be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cuistatic bool ExtractTestDataFromElfSection() {
36be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  if (!MkdirWithParents(testdata_dir)) {
37be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    PLOG(ERROR) << "failed to create testdata_dir " << testdata_dir;
38be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    return false;
39be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  }
40be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  std::string content;
41be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  if (!ReadSectionFromElfFile("/proc/self/exe", testdata_section, &content)) {
42be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    LOG(ERROR) << "failed to read section " << testdata_section;
43be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    return false;
44be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  }
45be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  TemporaryFile tmp_file;
46be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  if (!android::base::WriteStringToFile(content, tmp_file.path)) {
47be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    PLOG(ERROR) << "failed to write file " << tmp_file.path;
48be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    return false;
49be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  }
50be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  ArchiveHelper ahelper(tmp_file.fd, tmp_file.path);
51be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  if (!ahelper) {
52be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    LOG(ERROR) << "failed to open archive " << tmp_file.path;
53be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    return false;
54be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  }
55be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  ZipArchiveHandle& handle = ahelper.archive_handle();
56be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  void* cookie;
57be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  int ret = StartIteration(handle, &cookie, nullptr, nullptr);
58be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  if (ret != 0) {
59be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    LOG(ERROR) << "failed to start iterating zip entries";
60be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    return false;
61be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  }
62be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  ZipEntry entry;
63be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  ZipString name;
64be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  while (Next(cookie, &entry, &name) == 0) {
65be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    std::string entry_name(name.name, name.name + name.name_length);
66be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    std::string path = testdata_dir + entry_name;
67be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    // Skip dir.
68be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    if (path.back() == '/') {
69be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      continue;
70be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    }
71be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    if (!MkdirWithParents(path)) {
72be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      LOG(ERROR) << "failed to create dir for " << path;
73be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      return false;
74be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    }
75be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    FileHelper fhelper = FileHelper::OpenWriteOnly(path);
76be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    if (!fhelper) {
77be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      PLOG(ERROR) << "failed to create file " << path;
78be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      return false;
79be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    }
80be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    std::vector<uint8_t> data(entry.uncompressed_length);
81be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    if (ExtractToMemory(handle, &entry, data.data(), data.size()) != 0) {
82be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      LOG(ERROR) << "failed to extract entry " << entry_name;
83be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      return false;
84be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    }
85be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    if (!android::base::WriteFully(fhelper.fd(), data.data(), data.size())) {
86be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      LOG(ERROR) << "failed to write file " << path;
87be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      return false;
88be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    }
89be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  }
90be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  EndIteration(cookie);
91be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  return true;
92be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui}
93be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#endif  // defined(IN_CTS_TEST)
94be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui
95323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cuiint main(int argc, char** argv) {
96323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui  InitLogging(argv, android::base::StderrLogger);
97323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui  testing::InitGoogleTest(&argc, argv);
98be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui
99569f64afd3db2b43003978765b833669f99477d2Yabin Cui  for (int i = 1; i < argc; ++i) {
100569f64afd3db2b43003978765b833669f99477d2Yabin Cui    if (strcmp(argv[i], "-t") == 0 && i + 1 < argc) {
101569f64afd3db2b43003978765b833669f99477d2Yabin Cui      testdata_dir = argv[i + 1];
102be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      i++;
103569f64afd3db2b43003978765b833669f99477d2Yabin Cui    }
104569f64afd3db2b43003978765b833669f99477d2Yabin Cui  }
105be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui
106be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#if defined(IN_CTS_TEST)
107be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  std::unique_ptr<TemporaryDir> tmp_dir;
108be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  if (!::testing::GTEST_FLAG(list_tests) && testdata_dir.empty()) {
109be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    tmp_dir.reset(new TemporaryDir);
110be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    testdata_dir = std::string(tmp_dir->path) + "/";
111be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    if (!ExtractTestDataFromElfSection()) {
112be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      LOG(ERROR) << "failed to extract test data from elf section";
113be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui      return 1;
114be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    }
115be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  }
116be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#endif
117be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  if (!::testing::GTEST_FLAG(list_tests) && testdata_dir.empty()) {
118be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    printf("Usage: %s -t <testdata_dir>\n", argv[0]);
119569f64afd3db2b43003978765b833669f99477d2Yabin Cui    return 1;
120569f64afd3db2b43003978765b833669f99477d2Yabin Cui  }
121569f64afd3db2b43003978765b833669f99477d2Yabin Cui  if (testdata_dir.back() != '/') {
122569f64afd3db2b43003978765b833669f99477d2Yabin Cui    testdata_dir.push_back('/');
123569f64afd3db2b43003978765b833669f99477d2Yabin Cui  }
124be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  LOG(INFO) << "testdata is in " << testdata_dir;
125323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui  return RUN_ALL_TESTS();
126323e945313b190373b3fcfe578e25ee8390a76d3Yabin Cui}
127569f64afd3db2b43003978765b833669f99477d2Yabin Cui
128569f64afd3db2b43003978765b833669f99477d2Yabin Cuistd::string GetTestData(const std::string& filename) {
129569f64afd3db2b43003978765b833669f99477d2Yabin Cui  return testdata_dir + filename;
130569f64afd3db2b43003978765b833669f99477d2Yabin Cui}
131b1a885b014540a2f7798b5a35ea0f0ec150d93eeYabin Cui
132b1a885b014540a2f7798b5a35ea0f0ec150d93eeYabin Cuiconst std::string& GetTestDataDir() {
133b1a885b014540a2f7798b5a35ea0f0ec150d93eeYabin Cui  return testdata_dir;
134b1a885b014540a2f7798b5a35ea0f0ec150d93eeYabin Cui}
135be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui
136be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cuibool IsRoot() {
137be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  static int is_root = -1;
138be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  if (is_root == -1) {
139be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#if defined(__linux__)
140be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    is_root = (getuid() == 0) ? 1 : 0;
141be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#else
142be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui    is_root = 0;
143be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui#endif
144be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  }
145be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui  return is_root == 1;
146be7ec66eaa4f995bd9068637f7c7d5718173922cYabin Cui}
147