1b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org// Copyright (c) 2011, Google Inc.
244af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// All rights reserved.
344af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com//
444af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// Redistribution and use in source and binary forms, with or without
544af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// modification, are permitted provided that the following conditions are
644af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// met:
744af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com//
844af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com//     * Redistributions of source code must retain the above copyright
944af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// notice, this list of conditions and the following disclaimer.
1044af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com//     * Redistributions in binary form must reproduce the above
1144af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// copyright notice, this list of conditions and the following disclaimer
1244af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// in the documentation and/or other materials provided with the
1344af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// distribution.
1444af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com//     * Neither the name of Google Inc. nor the names of its
1544af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// contributors may be used to endorse or promote products derived from
1644af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// this software without specific prior written permission.
1744af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com//
1844af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1944af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2044af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2144af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2244af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2344af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2444af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2544af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2644af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2744af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2844af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2944af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
3044af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// Utility class for creating a temporary directory for unit tests
3144af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com// that is deleted in the destructor.
32b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org#ifndef GOOGLE_BREAKPAD_COMMON_TESTS_AUTO_TEMPDIR
33b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org#define GOOGLE_BREAKPAD_COMMON_TESTS_AUTO_TEMPDIR
3444af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
3544af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com#include <dirent.h>
3644af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com#include <sys/types.h>
3744af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
3844af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com#include <string>
3944af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
40b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org#include "breakpad_googletest_includes.h"
414e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com#include "common/using_std_string.h"
42b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org
43b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org#if !defined(__ANDROID__)
44b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org#define TEMPDIR "/tmp"
45b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org#else
46b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org#define TEMPDIR "/data/local/tmp"
474ac3c240983991b6358baad732e2fbe3fd4f7245digit@chromium.org#include "common/android/testing/mkdtemp.h"
48b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org#endif
49b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org
5044af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.comnamespace google_breakpad {
5144af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
5244af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.comclass AutoTempDir {
5344af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com public:
5444af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com  AutoTempDir() {
55e751dcaed67b71fa950d1f2c54cd0ddc365248f8jcivelli@chromium.org    char temp_dir[] = TEMPDIR "/breakpad.XXXXXX";
56b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org    EXPECT_TRUE(mkdtemp(temp_dir) != NULL);
57b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org    path_.assign(temp_dir);
5844af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com  }
5944af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
6044af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com  ~AutoTempDir() {
61b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org    DeleteRecursively(path_);
62b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org  }
63b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org
644e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com  const string& path() const {
6586cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org    return path_;
6686cbb1e5cc967853dfc2b10f8fc8da43fc734c77benchan@chromium.org  }
67b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org
68b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org private:
694e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com  void DeleteRecursively(const string& path) {
7044af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com    // First remove any files in the dir
7144af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com    DIR* dir = opendir(path.c_str());
7244af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com    if (!dir)
7344af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com      return;
7444af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
7544af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com    dirent* entry;
7644af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com    while ((entry = readdir(dir)) != NULL) {
7744af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com      if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
78b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org        continue;
794e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com      string entry_path = path + "/" + entry->d_name;
80b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org      struct stat stats;
81b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org      EXPECT_TRUE(lstat(entry_path.c_str(), &stats) == 0);
82b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org      if (S_ISDIR(stats.st_mode))
83b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org        DeleteRecursively(entry_path);
84b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org      else
85b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org        EXPECT_TRUE(unlink(entry_path.c_str()) == 0);
8644af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com    }
87b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org    EXPECT_TRUE(closedir(dir) == 0);
88b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org    EXPECT_TRUE(rmdir(path.c_str()) == 0);
8944af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com  }
9044af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
91b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org  // prevent copy construction and assignment
92b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org  AutoTempDir(const AutoTempDir&);
93b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org  AutoTempDir& operator=(const AutoTempDir&);
94b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org
954e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com  string path_;
9644af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com};
9744af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
9844af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com}  // namespace google_breakpad
9944af96cd2d1218224ac4258fee102891bd3f25d0ted.mielczarek@gmail.com
100b12089f06d061d1ae393f208d37dc17e003d21c4qsr@chromium.org#endif  // GOOGLE_BREAKPAD_COMMON_TESTS_AUTO_TEMPDIR
101