1 /**
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <stdlib.h>
17 #include <sys/stat.h>
18 #include "functionalext.h"
19
20 #define DIR_MODE 0700
21 /**
22 * @tc.name : mkdtemp_0100
23 * @tc.desc : Create a temporary directory with the correct parameters
24 * @tc.level : Level 0
25 */
mkdtemp_0100(void)26 void mkdtemp_0100(void)
27 {
28 char temp_dir[] = "test-XXXXXX";
29 char *ret = mkdtemp(temp_dir);
30 EXPECT_PTRNE("mkdtemp_0100", ret, NULL);
31 if (ret) {
32 EXPECT_NE("mkdtemp_0100", ret[0], CMPFLAG);
33 rmdir(ret);
34 }
35 }
36
37 /**
38 * @tc.name : mkdtemp_0200
39 * @tc.desc : Create temp directory with wrong template parameter
40 * @tc.level : Level 2
41 */
mkdtemp_0200(void)42 void mkdtemp_0200(void)
43 {
44 char temp_dir[] = "test";
45 char *ret = mkdtemp(temp_dir);
46 EXPECT_PTREQ("mkdtemp_0200", ret, NULL);
47 }
48
49 /**
50 * @tc.name : mkdtemp_0300
51 * @tc.desc : Create temp directory with wrong template argument (wrong template length)
52 * @tc.level : Level 2
53 */
mkdtemp_0300(void)54 void mkdtemp_0300(void)
55 {
56 char temp_dir[] = "test-XX";
57 char *ret = mkdtemp(temp_dir);
58 EXPECT_PTREQ("mkdtemp_0300", ret, NULL);
59 }
60
61 /**
62 * @tc.name : mkdtemp_0400
63 * @tc.desc : Template with 'XXXXXX' not at the end
64 * @tc.level : Level 2
65 */
mkdtemp_0400(void)66 void mkdtemp_0400(void)
67 {
68 char temp_dir[] = "test-XXXXXX-dir";
69 char *ret = mkdtemp(temp_dir);
70 //XXXXXX is not at the end, mkdtemp() will fail and return NULL. Now template is unchanged.
71 EXPECT_PTREQ("mkdtemp_0400", ret, NULL);
72 if (ret == NULL) {
73 EXPECT_EQ("mkdtemp_0400", errno, EINVAL);
74 EXPECT_STREQ("mkdtemp_0400", temp_dir, "test-XXXXXX-dir");
75 }
76 }
77
78 /**
79 * @tc.name : mkdtemp_0500
80 * @tc.desc : Repeated calls generate unique directories
81 * @tc.level : Level 1
82 */
mkdtemp_0500(void)83 void mkdtemp_0500(void)
84 {
85 char temp_dir1[] = "test-XXXXXX";
86 char temp_dir2[] = "test-XXXXXX";
87 char *ret1 = mkdtemp(temp_dir1);
88 char *ret2 = mkdtemp(temp_dir2);
89 EXPECT_PTRNE("mkdtemp_0500", ret1, NULL);
90 EXPECT_PTRNE("mkdtemp_0500", ret2, NULL);
91 if (ret1 && ret2) {
92 EXPECT_STRNE("mkdtemp_0500", ret1, ret2); // The two results should be different
93 rmdir(ret1);
94 rmdir(ret2);
95 }
96 }
97
98 /**
99 * @tc.name : mkdtemp_0600
100 * @tc.desc : Check directory permissions (should be 0700)
101 * @tc.level : Level 2
102 */
mkdtemp_0600(void)103 void mkdtemp_0600(void)
104 {
105 char temp_dir[] = "test-XXXXXX";
106 char *ret = mkdtemp(temp_dir);
107 EXPECT_PTRNE("mkdtemp_0600", ret, NULL);
108 if (ret) {
109 struct stat st;
110 stat(ret, &st);
111 EXPECT_EQ("mkdtemp_0600", st.st_mode & DIR_MODE, DIR_MODE);
112 rmdir(ret);
113 }
114 }
115
main(void)116 int main(void)
117 {
118 mkdtemp_0100();
119 mkdtemp_0200();
120 mkdtemp_0300();
121 mkdtemp_0400();
122 mkdtemp_0500();
123 mkdtemp_0600();
124 return t_status;
125 }