1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <dirent.h>
6 #include <errno.h>
7 #include <fcntl.h>
8 #include <limits.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <sys/stat.h>
12 #include <unistd.h>
13 
14 #include <fbl/auto_call.h>
15 #include <fbl/string.h>
16 #include <fbl/string_buffer.h>
17 #include <fbl/unique_fd.h>
18 #include <fbl/unique_ptr.h>
19 #include <fbl/vector.h>
20 #include <runtests-utils/fuchsia-run-test.h>
21 #include <runtests-utils/runtests-utils.h>
22 #include <unittest/unittest.h>
23 
24 #include "runtests-utils-test-globals.h"
25 #include "runtests-utils-test-utils.h"
26 
27 namespace runtests {
28 namespace {
29 
TestFileComponentInfoTest()30 bool TestFileComponentInfoTest() {
31     BEGIN_TEST;
32     fbl::String component_url;
33     fbl::String cmx_file_path;
34 
35     component_url = "";
36     cmx_file_path = "";
37     TestFileComponentInfo("", &component_url, &cmx_file_path);
38     EXPECT_STR_EQ("", component_url.c_str());
39     EXPECT_STR_EQ("", cmx_file_path.c_str());
40 
41     component_url = "";
42     cmx_file_path = "";
43     TestFileComponentInfo("/", &component_url, &cmx_file_path);
44     EXPECT_STR_EQ("", component_url.c_str());
45     EXPECT_STR_EQ("", cmx_file_path.c_str());
46 
47     component_url = "";
48     cmx_file_path = "";
49     TestFileComponentInfo("/system/test", &component_url, &cmx_file_path);
50     EXPECT_STR_EQ("", component_url.c_str());
51     EXPECT_STR_EQ("", cmx_file_path.c_str());
52 
53     component_url = "";
54     cmx_file_path = "";
55     TestFileComponentInfo("/pkgfs", &component_url, &cmx_file_path);
56     EXPECT_STR_EQ("", component_url.c_str());
57     EXPECT_STR_EQ("", cmx_file_path.c_str());
58 
59     component_url = "";
60     cmx_file_path = "";
61     TestFileComponentInfo("/pkgfs/packages", &component_url, &cmx_file_path);
62     EXPECT_STR_EQ("", component_url.c_str());
63     EXPECT_STR_EQ("", cmx_file_path.c_str());
64 
65     component_url = "";
66     cmx_file_path = "";
67     TestFileComponentInfo("/pkgfs/packages/", &component_url,
68                           &cmx_file_path);
69     EXPECT_STR_EQ("", component_url.c_str());
70     EXPECT_STR_EQ("", cmx_file_path.c_str());
71 
72     component_url = "";
73     cmx_file_path = "";
74     TestFileComponentInfo("/pkgfs/packages/foo", &component_url,
75                           &cmx_file_path);
76     EXPECT_STR_EQ("", component_url.c_str());
77     EXPECT_STR_EQ("", cmx_file_path.c_str());
78 
79     component_url = "";
80     cmx_file_path = "";
81     TestFileComponentInfo("/pkgfs/packages/foo/", &component_url,
82                           &cmx_file_path);
83     EXPECT_STR_EQ("", component_url.c_str());
84     EXPECT_STR_EQ("", cmx_file_path.c_str());
85 
86     component_url = "";
87     cmx_file_path = "";
88     TestFileComponentInfo("/pkgfs/packages/foo/bar", &component_url,
89                           &cmx_file_path);
90     EXPECT_STR_EQ("", component_url.c_str());
91     EXPECT_STR_EQ("", cmx_file_path.c_str());
92 
93     component_url = "";
94     cmx_file_path = "";
95     TestFileComponentInfo("/pkgfs/packages/foo/bar/", &component_url,
96                           &cmx_file_path);
97     EXPECT_STR_EQ("", component_url.c_str());
98     EXPECT_STR_EQ("", cmx_file_path.c_str());
99 
100     component_url = "";
101     cmx_file_path = "";
102     TestFileComponentInfo("/pkgfs/packages/pname/foo/bar/", &component_url,
103                           &cmx_file_path);
104     EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/bar.cmx",
105                   component_url.c_str());
106     EXPECT_STR_EQ("/pkgfs/packages/pname/meta/bar.cmx", cmx_file_path.c_str());
107 
108     component_url = "";
109     cmx_file_path = "";
110     TestFileComponentInfo("/pkgfs/packages/pname/foo/bar/test_file",
111                           &component_url, &cmx_file_path);
112     EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/test_file.cmx",
113                   component_url.c_str());
114     EXPECT_STR_EQ("/pkgfs/packages/pname/foo/meta/test_file.cmx",
115                   cmx_file_path.c_str());
116 
117     component_url = "";
118     cmx_file_path = "";
119     TestFileComponentInfo("/pkgfs/packages/pname/foo/bar/test/file",
120                           &component_url, &cmx_file_path);
121     EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/file.cmx",
122                   component_url.c_str());
123     EXPECT_STR_EQ("/pkgfs/packages/pname/foo/bar/meta/file.cmx",
124                   cmx_file_path.c_str());
125 
126     component_url = "";
127     cmx_file_path = "";
128     TestFileComponentInfo("/pkgfs/packages/pname/foo/bar/test/file/",
129                           &component_url, &cmx_file_path);
130     EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/file.cmx",
131                   component_url.c_str());
132     EXPECT_STR_EQ("/pkgfs/packages/pname/foo/bar/meta/file.cmx",
133                   cmx_file_path.c_str());
134 
135     component_url = "";
136     cmx_file_path = "";
137     TestFileComponentInfo("/pkgfs/packages/pname/0/test/disabled/test_name",
138                           &component_url, &cmx_file_path);
139     EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/test_name.cmx",
140                   component_url.c_str());
141     EXPECT_STR_EQ("/pkgfs/packages/pname/0/meta/test_name.cmx",
142                   cmx_file_path.c_str());
143 
144     END_TEST;
145 }
146 
RunTestDontPublishData()147 bool RunTestDontPublishData() {
148     BEGIN_TEST;
149 
150     ScopedTestDir test_dir;
151     fbl::String test_name = JoinPath(test_dir.path(), "publish-data-helper");
152     ScopedTestFile file(test_name.c_str(), "/boot/bin/publish-data-helper");
153 
154     const char* argv[] = {test_name.c_str(), nullptr};
155     fbl::unique_ptr<Result> result = PlatformRunTest(argv, nullptr, nullptr);
156     EXPECT_STR_EQ(argv[0], result->name.c_str());
157     EXPECT_EQ(SUCCESS, result->launch_status);
158     EXPECT_EQ(0, result->return_code);
159     EXPECT_EQ(0, result->data_sinks.size());
160 
161     END_TEST;
162 }
163 
RunTestsPublishData()164 bool RunTestsPublishData() {
165     BEGIN_TEST;
166 
167     ScopedTestDir test_dir;
168     fbl::String test_name = JoinPath(test_dir.path(), "publish-data-helper");
169     ScopedTestFile file(test_name.c_str(), "/boot/bin/publish-data-helper");
170     int num_failed = 0;
171     fbl::Vector<fbl::unique_ptr<Result>> results;
172     const signed char verbosity = 77;
173     const fbl::String output_dir = JoinPath(test_dir.path(), "output");
174     const char output_file_base_name[] = "output.txt";
175     ASSERT_EQ(0, MkDirAll(output_dir));
176     EXPECT_TRUE(RunTests(PlatformRunTest, {test_name}, {},
177                          output_dir.c_str(), output_file_base_name, verbosity,
178                          &num_failed, &results));
179     EXPECT_EQ(0, num_failed);
180     EXPECT_EQ(1, results.size());
181     EXPECT_LE(1, results[0]->data_sinks.size());
182 
183     END_TEST;
184 }
185 
RunAllTestsPublishData()186 bool RunAllTestsPublishData() {
187     BEGIN_TEST;
188 
189     ScopedTestDir test_dir;
190     fbl::String test_name = JoinPath(test_dir.path(), "publish-data-helper");
191     ScopedTestFile file(test_name.c_str(), "/boot/bin/publish-data-helper");
192 
193     const fbl::String output_dir =
194         JoinPath(test_dir.path(), "run-all-tests-output-1");
195     EXPECT_EQ(0, MkDirAll(output_dir));
196 
197     const char* const argv[] = {"./runtests", "-o", output_dir.c_str(),
198                                 test_dir.path()};
199     TestStopwatch stopwatch;
200     EXPECT_EQ(EXIT_SUCCESS, DiscoverAndRunTests(PlatformRunTest, 4, argv, {},
201                                                 &stopwatch, ""));
202 
203     // Prepare the expected output.
204     fbl::String test_output_rel_path;
205     ASSERT_TRUE(GetOutputFileRelPath(output_dir, test_name,
206                                      &test_output_rel_path));
207 
208     fbl::StringBuffer<1024> expected_output_buf;
209     expected_output_buf.AppendPrintf(
210         "      \"name\": \"%s\",\n"
211         "      \"output_file\": \"%s\",\n"
212         "      \"result\": \"PASS\"",
213         test_name.c_str(),
214         test_output_rel_path.c_str() + 1); // +1 to discard the leading slash.
215 
216     fbl::String test_data_sink_rel_path;
217     ASSERT_TRUE(GetOutputFileRelPath(output_dir, JoinPath(test_name, "test"),
218                                      &test_data_sink_rel_path));
219 
220     fbl::StringBuffer<1024> expected_data_sink_buf;
221     expected_data_sink_buf.AppendPrintf(
222         "        \"test\": [\n"
223         "          {\n"
224         "            \"name\": \"test\",\n"
225         "            \"file\": \"%s\"\n"
226         "          }\n"
227         "        ]",
228         test_data_sink_rel_path.c_str() + 1); // +1 to discard the leading slash.
229 
230     // Extract the actual output.
231     const fbl::String output_path = JoinPath(output_dir, "summary.json");
232     FILE* output_file = fopen(output_path.c_str(), "r");
233     ASSERT_TRUE(output_file);
234     char buf[1024];
235     memset(buf, 0, sizeof(buf));
236     EXPECT_LT(0, fread(buf, sizeof(buf[0]), sizeof(buf), output_file));
237     fclose(output_file);
238 
239     EXPECT_NONNULL(strstr(buf, expected_output_buf.c_str()));
240     EXPECT_NONNULL(strstr(buf, expected_data_sink_buf.c_str()));
241 
242     END_TEST;
243 }
244 
245 BEGIN_TEST_CASE(FuchsiaComponentInfo)
246 RUN_TEST_SMALL(TestFileComponentInfoTest)
247 END_TEST_CASE(FuchsiaComponentInfo)
248 
249 BEGIN_TEST_CASE(PublishDataTests)
250 RUN_TEST(RunTestDontPublishData)
251 RUN_TEST_MEDIUM(RunTestsPublishData)
252 RUN_TEST_MEDIUM(RunAllTestsPublishData)
253 END_TEST_CASE(PublishDataTests)
254 
255 } // namespace
256 } // namespace runtests
257