1cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//===- SpecialCaseListTest.cpp - Unit tests for SpecialCaseList -----------===//
2cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//
3cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//                     The LLVM Compiler Infrastructure
4cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//
5cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// This file is distributed under the University of Illinois Open Source
6cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// License. See LICENSE.TXT for details.
7cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//
8cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//===----------------------------------------------------------------------===//
9cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
10cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Support/MemoryBuffer.h"
11cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Support/SpecialCaseList.h"
12cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "gtest/gtest.h"
13cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
14cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesusing namespace llvm;
15cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
16cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesnamespace {
17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass SpecialCaseListTest : public ::testing::Test {
19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesprotected:
20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SpecialCaseList *makeSpecialCaseList(StringRef List, std::string &Error) {
21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    std::unique_ptr<MemoryBuffer> MB(MemoryBuffer::getMemBuffer(List));
22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return SpecialCaseList::create(MB.get(), Error);
23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
24cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SpecialCaseList *makeSpecialCaseList(StringRef List) {
26cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    std::string Error;
27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    SpecialCaseList *SCL = makeSpecialCaseList(List, Error);
28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    assert(SCL);
29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    assert(Error == "");
30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return SCL;
31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines};
33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST_F(SpecialCaseListTest, Basic) {
35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::unique_ptr<SpecialCaseList> SCL(
36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      makeSpecialCaseList("# This is a comment.\n"
37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                          "\n"
38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                          "src:hello\n"
39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                          "src:bye\n"
40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                          "src:hi=category\n"
41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                          "src:z*=category\n"));
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("src", "hello"));
43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("src", "bye"));
44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("src", "hi", "category"));
45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("src", "zzzz", "category"));
46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("src", "hi"));
47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("fun", "hello"));
48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("src", "hello", "category"));
49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST_F(SpecialCaseListTest, GlobalInitCompat) {
52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::unique_ptr<SpecialCaseList> SCL(
53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      makeSpecialCaseList("global:foo=init\n"));
54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("global", "foo"));
55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("global", "bar"));
56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("global", "foo", "init"));
57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("global", "bar", "init"));
58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SCL.reset(makeSpecialCaseList("global-init:foo\n"));
60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("global", "foo"));
61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("global", "bar"));
62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("global", "foo", "init"));
63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("global", "bar", "init"));
64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SCL.reset(makeSpecialCaseList("type:t2=init\n"));
66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("type", "t1"));
67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("type", "t2"));
68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("type", "t1", "init"));
69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("type", "t2", "init"));
70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SCL.reset(makeSpecialCaseList("global-init-type:t2\n"));
72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("type", "t1"));
73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("type", "t2"));
74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("type", "t1", "init"));
75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("type", "t2", "init"));
76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SCL.reset(makeSpecialCaseList("src:hello=init\n"));
78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("src", "hello"));
79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("src", "bye"));
80cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("src", "hello", "init"));
81cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("src", "bye", "init"));
82cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
83cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SCL.reset(makeSpecialCaseList("global-init-src:hello\n"));
84cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("src", "hello"));
85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("src", "bye"));
86cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("src", "hello", "init"));
87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("src", "bye", "init"));
88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST_F(SpecialCaseListTest, Substring) {
91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::unique_ptr<SpecialCaseList> SCL(makeSpecialCaseList("src:hello\n"
92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                                           "fun:foo\n"
93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                                           "global:bar\n"));
94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("src", "othello"));
95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("fun", "tomfoolery"));
96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("global", "bartender"));
97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  SCL.reset(makeSpecialCaseList("fun:*foo*\n"));
99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("fun", "tomfoolery"));
100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_TRUE(SCL->inSection("fun", "foobar"));
101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST_F(SpecialCaseListTest, InvalidSpecialCaseList) {
104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::string Error;
105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(nullptr, makeSpecialCaseList("badline", Error));
106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ("Malformed line 1: 'badline'", Error);
107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(nullptr, makeSpecialCaseList("src:bad[a-", Error));
108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ("Malformed regex in line 1: 'bad[a-': invalid character range",
109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Error);
110cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(nullptr, makeSpecialCaseList("src:a.c\n"
111cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                   "fun:fun(a\n",
112cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                   Error));
113cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ("Malformed regex in line 2: 'fun(a': parentheses not balanced",
114cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines            Error);
115cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(nullptr, SpecialCaseList::create("unexisting", Error));
116cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(0U, Error.find("Can't open file 'unexisting':"));
117cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
118cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
119cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesTEST_F(SpecialCaseListTest, EmptySpecialCaseList) {
120cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  std::unique_ptr<SpecialCaseList> SCL(makeSpecialCaseList(""));
121cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_FALSE(SCL->inSection("foo", "bar"));
122cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
123cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
124cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
125cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
126cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
127