1 /*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef ANDROID_TEST_HELPERS_H_
18 #define ANDROID_TEST_HELPERS_H_
19
20 #include <future>
21 #include <thread>
22
23 namespace android {
24
25 /**
26 * Runs the given function after the specified delay.
27 * NOTE: if the std::future returned from std::async is not bound, this function
28 * will block until the task completes. This is almost certainly NOT what you
29 * want, so save the return value from delay_async into a variable:
30 *
31 * auto f = delay_async(100ms, []{ ALOGD("Hello world"); });
32 */
33 template<class Function, class Duration>
decltype(auto)34 decltype(auto) delay_async(Duration&& delay, Function&& task)
35 {
36 return std::async(std::launch::async, [=]{ std::this_thread::sleep_for(delay); task(); });
37 }
38
39 /**
40 * Creates and opens a temporary file at the given path. The file is unlinked
41 * and closed in the destructor.
42 */
43 class TempFile {
44 public:
45 explicit TempFile(const char* path);
46 ~TempFile();
47
48 // No copy or assign
49 TempFile(const TempFile&) = delete;
50 TempFile& operator=(const TempFile&) = delete;
51
getName()52 const char* getName() const { return mName; }
getFd()53 int getFd() const { return mFd; }
54
55 private:
56 char* mName;
57 int mFd;
58 };
59
60 /**
61 * Creates a temporary directory that can create temporary files. The directory
62 * is emptied and deleted in the destructor.
63 */
64 class TempDir {
65 public:
66 TempDir();
67 ~TempDir();
68
69 // No copy or assign
70 TempDir(const TempDir&) = delete;
71 TempDir& operator=(const TempDir&) = delete;
72
getName()73 const char* getName() const { return mName; }
74
75 TempFile* newTempFile();
76
77 private:
78 char* mName;
79 };
80
81 } // namespace android
82
83 #endif // ANDROID_TEST_HELPERS_H_
84