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