1 // Copyright 2014 The Chromium 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 "gn/visibility.h"
6 #include "gn/err.h"
7 #include "gn/label.h"
8 #include "gn/scope.h"
9 #include "gn/value.h"
10 #include "util/test/test.h"
11 
TEST(Visibility, CanSeeMe)12 TEST(Visibility, CanSeeMe) {
13   Value list(nullptr, Value::LIST);
14   list.list_value().push_back(Value(nullptr, "//rec/*"));    // Recursive.
15   list.list_value().push_back(Value(nullptr, "//dir:*"));    // One dir.
16   list.list_value().push_back(Value(nullptr, "//my:name"));  // Exact match.
17 
18   Err err;
19   Visibility vis;
20   ASSERT_TRUE(vis.Set(SourceDir("//"), std::string_view(), list, &err));
21 
22   EXPECT_FALSE(vis.CanSeeMe(Label(SourceDir("//random/"), "thing")));
23   EXPECT_FALSE(vis.CanSeeMe(Label(SourceDir("//my/"), "notname")));
24 
25   EXPECT_TRUE(vis.CanSeeMe(Label(SourceDir("//my/"), "name")));
26   EXPECT_TRUE(vis.CanSeeMe(Label(SourceDir("//rec/"), "anything")));
27   EXPECT_TRUE(vis.CanSeeMe(Label(SourceDir("//rec/a/"), "anything")));
28   EXPECT_TRUE(vis.CanSeeMe(Label(SourceDir("//rec/b/"), "anything")));
29   EXPECT_TRUE(vis.CanSeeMe(Label(SourceDir("//dir/"), "anything")));
30   EXPECT_FALSE(vis.CanSeeMe(Label(SourceDir("//dir/a/"), "anything")));
31   EXPECT_FALSE(vis.CanSeeMe(Label(SourceDir("//directory/"), "anything")));
32 }
33 
TEST(Visibility, Public)34 TEST(Visibility, Public) {
35   Err err;
36   Visibility vis;
37 
38   Value list(nullptr, Value::LIST);
39   list.list_value().push_back(Value(nullptr, "*"));
40   ASSERT_TRUE(vis.Set(SourceDir("//"), std::string_view(), list, &err));
41 
42   EXPECT_TRUE(vis.CanSeeMe(Label(SourceDir("//random/"), "thing")));
43   EXPECT_TRUE(vis.CanSeeMe(Label(SourceDir("//"), "")));
44 }
45 
TEST(Visibility, Private)46 TEST(Visibility, Private) {
47   Err err;
48   Visibility vis;
49   ASSERT_TRUE(vis.Set(SourceDir("//"), std::string_view(),
50                       Value(nullptr, Value::LIST), &err));
51 
52   EXPECT_FALSE(vis.CanSeeMe(Label(SourceDir("//random/"), "thing")));
53   EXPECT_FALSE(vis.CanSeeMe(Label(SourceDir("//"), "")));
54 }
55 
TEST(Visibility, AboveSourceDir)56 TEST(Visibility, AboveSourceDir) {
57   std::string source_root = "/foo/bar/baz/";
58   SourceDir cur_dir("//");
59 
60   Err err;
61   Visibility vis;
62 
63   Value list(nullptr, Value::LIST);
64   list.list_value().push_back(Value(nullptr, "../../*"));
65   ASSERT_TRUE(vis.Set(cur_dir, source_root, list, &err));
66 
67   EXPECT_FALSE(vis.CanSeeMe(Label(SourceDir("//random/"), "thing")));
68   EXPECT_TRUE(vis.CanSeeMe(Label(SourceDir("/foo/"), "foo")));
69   EXPECT_TRUE(vis.CanSeeMe(Label(SourceDir("/foo/bar/"), "bar")));
70   EXPECT_FALSE(vis.CanSeeMe(Label(SourceDir("/nowhere/"), "foo")));
71 }
72