xref: /openbsd-src/gnu/llvm/compiler-rt/lib/gwp_asan/tests/options.cpp (revision d89ec533011f513df1010f142a111086a0785f09)
1*d89ec533Spatrick //===-- options.cpp ---------------------------------------------*- C++ -*-===//
2*d89ec533Spatrick //
3*d89ec533Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*d89ec533Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*d89ec533Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*d89ec533Spatrick //
7*d89ec533Spatrick //===----------------------------------------------------------------------===//
8*d89ec533Spatrick 
9*d89ec533Spatrick #include "gwp_asan/tests/harness.h"
10*d89ec533Spatrick 
11*d89ec533Spatrick #include "gwp_asan/optional/options_parser.h"
12*d89ec533Spatrick #include "gwp_asan/options.h"
13*d89ec533Spatrick 
14*d89ec533Spatrick #include <stdarg.h>
15*d89ec533Spatrick 
16*d89ec533Spatrick static char Message[1024];
MessageRecorder(const char * Format,...)17*d89ec533Spatrick void MessageRecorder(const char *Format, ...) {
18*d89ec533Spatrick   va_list Args;
19*d89ec533Spatrick   va_start(Args, Format);
20*d89ec533Spatrick   vsprintf(Message + strlen(Message), Format, Args);
21*d89ec533Spatrick   va_end(Args);
22*d89ec533Spatrick }
23*d89ec533Spatrick 
TEST(GwpAsanOptionsTest,Basic)24*d89ec533Spatrick TEST(GwpAsanOptionsTest, Basic) {
25*d89ec533Spatrick   Message[0] = '\0';
26*d89ec533Spatrick   gwp_asan::options::initOptions("Enabled=0:SampleRate=4:"
27*d89ec533Spatrick                                  "InstallSignalHandlers=false",
28*d89ec533Spatrick                                  MessageRecorder);
29*d89ec533Spatrick   gwp_asan::options::Options Opts = gwp_asan::options::getOptions();
30*d89ec533Spatrick   EXPECT_EQ('\0', Message[0]);
31*d89ec533Spatrick   EXPECT_FALSE(Opts.Enabled);
32*d89ec533Spatrick   EXPECT_FALSE(Opts.InstallSignalHandlers);
33*d89ec533Spatrick   EXPECT_EQ(4, Opts.SampleRate);
34*d89ec533Spatrick }
35*d89ec533Spatrick 
RunErrorTest(const char * OptionsStr,const char * ErrorNeedle)36*d89ec533Spatrick void RunErrorTest(const char *OptionsStr, const char *ErrorNeedle) {
37*d89ec533Spatrick   Message[0] = '\0';
38*d89ec533Spatrick   gwp_asan::options::initOptions(OptionsStr, MessageRecorder);
39*d89ec533Spatrick   EXPECT_NE('\0', Message[0])
40*d89ec533Spatrick       << "Options string \"" << OptionsStr << "\" didn't generate an error.";
41*d89ec533Spatrick   EXPECT_NE(nullptr, strstr(Message, ErrorNeedle))
42*d89ec533Spatrick       << "Couldn't find error needle \"" << ErrorNeedle
43*d89ec533Spatrick       << "\" in haystack created by options string \"" << OptionsStr
44*d89ec533Spatrick       << "\". Error was: \"" << Message << "\".";
45*d89ec533Spatrick }
46*d89ec533Spatrick 
TEST(GwpAsanOptionsTest,FailureModes)47*d89ec533Spatrick TEST(GwpAsanOptionsTest, FailureModes) {
48*d89ec533Spatrick   RunErrorTest("Enabled=2", "Invalid boolean value '2' for option 'Enabled'");
49*d89ec533Spatrick   RunErrorTest("Enabled=1:MaxSimultaneousAllocations=0",
50*d89ec533Spatrick                "MaxSimultaneousAllocations must be > 0");
51*d89ec533Spatrick   RunErrorTest("Enabled=1:MaxSimultaneousAllocations=-1",
52*d89ec533Spatrick                "MaxSimultaneousAllocations must be > 0");
53*d89ec533Spatrick   RunErrorTest("Enabled=1:SampleRate=0", "SampleRate must be > 0");
54*d89ec533Spatrick   RunErrorTest("Enabled=1:SampleRate=-1", "SampleRate must be > 0");
55*d89ec533Spatrick   RunErrorTest("Enabled=", "Invalid boolean value '' for option 'Enabled'");
56*d89ec533Spatrick   RunErrorTest("==", "Unknown option '=='");
57*d89ec533Spatrick   RunErrorTest("Enabled==0", "Invalid boolean value '=0' for option 'Enabled'");
58*d89ec533Spatrick   RunErrorTest("Enabled:", "Expected '=' when parsing option 'Enabled:'");
59*d89ec533Spatrick   RunErrorTest("Enabled:=", "Expected '=' when parsing option 'Enabled:='");
60*d89ec533Spatrick   RunErrorTest("SampleRate=NOT_A_NUMBER",
61*d89ec533Spatrick                "Invalid integer value 'NOT_A_NUMBER' for option 'SampleRate'");
62*d89ec533Spatrick   RunErrorTest("NOT_A_VALUE=0", "Unknown option 'NOT_A_VALUE");
63*d89ec533Spatrick }
64