CommandLineTest.cpp revision b7ad33b7195cb99b0cbb1c5308324d328650ca45
1//===- llvm/unittest/Support/CommandLineTest.cpp - CommandLine tests ------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/Support/CommandLine.h"
11#include "llvm/Config/config.h"
12#include "gtest/gtest.h"
13#include <stdlib.h>
14#include <string>
15
16using namespace llvm;
17
18namespace {
19
20class TempEnvVar {
21 public:
22  TempEnvVar(const char *name, const char *value)
23      : name(name) {
24    const char *old_value = getenv(name);
25    EXPECT_EQ(NULL, old_value) << old_value;
26#if HAVE_SETENV
27    setenv(name, value, true);
28#else
29#   define SKIP_ENVIRONMENT_TESTS
30#endif
31  }
32
33  ~TempEnvVar() {
34#if HAVE_SETENV
35    // Assume setenv and unsetenv come together.
36    unsetenv(name);
37#endif
38  }
39
40 private:
41  const char *const name;
42};
43
44#ifndef SKIP_ENVIRONMENT_TESTS
45
46const char test_env_var[] = "LLVM_TEST_COMMAND_LINE_FLAGS";
47
48cl::opt<std::string> EnvironmentTestOption("env-test-opt");
49TEST(CommandLineTest, ParseEnvironment) {
50  TempEnvVar TEV(test_env_var, "-env-test-opt=hello");
51  EXPECT_EQ("", EnvironmentTestOption);
52  cl::ParseEnvironmentOptions("CommandLineTest", test_env_var);
53  EXPECT_EQ("hello", EnvironmentTestOption);
54}
55
56// This test used to make valgrind complain
57// ("Conditional jump or move depends on uninitialised value(s)")
58TEST(CommandLineTest, ParseEnvironmentToLocalVar) {
59  // Put cl::opt on stack to check for proper initialization of fields.
60  cl::opt<std::string> EnvironmentTestOptionLocal("env-test-opt-local");
61  TempEnvVar TEV(test_env_var, "-env-test-opt-local=hello-local");
62  EXPECT_EQ("", EnvironmentTestOptionLocal);
63  cl::ParseEnvironmentOptions("CommandLineTest", test_env_var);
64  EXPECT_EQ("hello-local", EnvironmentTestOptionLocal);
65}
66
67#endif  // SKIP_ENVIRONMENT_TESTS
68
69TEST(CommandLineTest, UseOptionCategory) {
70  cl::OptionCategory TestCategory("Test Options", "Description");
71  cl::opt<int> TestOption("test-option", cl::cat(TestCategory));
72
73  ASSERT_EQ(&TestCategory,TestOption.Category) << "Failed to assign Option "
74                                                  "Category.";
75}
76
77}  // anonymous namespace
78