130 lines · cpp
1//===-- ExpressionTest.cpp ------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "gmock/gmock.h"10#include "gtest/gtest.h"11 12#include "TestingSupport/TestUtilities.h"13#include "lldb/Expression/Expression.h"14#include "llvm/Testing/Support/Error.h"15 16using namespace lldb_private;17 18struct LabelTestCase {19 llvm::StringRef encoded;20 FunctionCallLabel label;21 llvm::SmallVector<llvm::StringRef> error_pattern;22};23 24static LabelTestCase g_label_test_cases[] = {25 // Failure modes26 {"bar:blah:0x0:0x0:_Z3foov",27 {},28 {"expected function call label prefix '$__lldb_func' but found 'bar' "29 "instead."}},30 {"$__lldb_func :blah:0x0:0x0:_Z3foov",31 {},32 {"expected function call label prefix '$__lldb_func' but found "33 "'$__lldb_func ' instead."}},34 {"$__lldb_funcc:blah:0x0:0x0:_Z3foov",35 {},36 {"expected function call label prefix '$__lldb_func' but found "37 "'$__lldb_funcc' instead."}},38 {"", {}, {"malformed function call label."}},39 {"foo", {}, {"malformed function call label."}},40 {"$__lldb_func", {}, {"malformed function call label."}},41 {"$__lldb_func:", {}, {"malformed function call label."}},42 {"$__lldb_func:blah", {}, {"malformed function call label."}},43 {"$__lldb_func:blah:0x0", {}, {"malformed function call label."}},44 {"$__lldb_func:111:0x0:0x0", {}, {"malformed function call label."}},45 {"$__lldb_func:111:abc:0x0:_Z3foov",46 {},47 {"failed to parse module ID from 'abc'."}},48 {"$__lldb_func:111:-1:0x0:_Z3foov",49 {},50 {"failed to parse module ID from '-1'."}},51 {"$__lldb_func:111:0x0invalid:0x0:_Z3foov",52 {},53 {"failed to parse module ID from '0x0invalid'."}},54 {"$__lldb_func:111:0x0 :0x0:_Z3foov",55 {},56 {"failed to parse module ID from '0x0 '."}},57 {"$__lldb_func:blah:0x0:abc:_Z3foov",58 {},59 {"failed to parse symbol ID from 'abc'."}},60 {"$__lldb_func:blah:0x5:-1:_Z3foov",61 {},62 {"failed to parse symbol ID from '-1'."}},63 {"$__lldb_func:blah:0x5:0x0invalid:_Z3foov",64 {},65 {"failed to parse symbol ID from '0x0invalid'."}},66 {"$__lldb_func:blah:0x5:0x0 :_Z3foov",67 {},68 {"failed to parse symbol ID from '0x0 '."}},69 {"$__lldb_func:blah:0x0:0x0:_Z3foov",70 {71 /*.discriminator=*/"blah",72 /*.module_id=*/0x0,73 /*.symbol_id=*/0x0,74 /*.lookup_name=*/"_Z3foov",75 },76 {}},77 {"$__lldb_func::0x0:0x0:abc:def:::a",78 {79 /*.discriminator=*/"",80 /*.module_id=*/0x0,81 /*.symbol_id=*/0x0,82 /*.lookup_name=*/"abc:def:::a",83 },84 {}},85 {"$__lldb_func:0x45:0xd2:0xf0:$__lldb_func",86 {87 /*.discriminator=*/"0x45",88 /*.module_id=*/0xd2,89 /*.symbol_id=*/0xf0,90 /*.lookup_name=*/"$__lldb_func",91 },92 {}},93};94 95struct ExpressionTestFixture : public testing::TestWithParam<LabelTestCase> {};96 97TEST_P(ExpressionTestFixture, FunctionCallLabel) {98 const auto &[encoded, label, errors] = GetParam();99 100 auto decoded_or_err = FunctionCallLabel::fromString(encoded);101 if (!errors.empty()) {102 EXPECT_THAT_EXPECTED(103 decoded_or_err,104 llvm::FailedWithMessageArray(testing::ElementsAreArray(errors)));105 return;106 }107 108 EXPECT_THAT_EXPECTED(decoded_or_err, llvm::Succeeded());109 110 auto label_str = label.toString();111 EXPECT_EQ(decoded_or_err->toString(), encoded);112 EXPECT_EQ(label_str, encoded);113 114 EXPECT_EQ(decoded_or_err->discriminator, label.discriminator);115 EXPECT_EQ(decoded_or_err->module_id, label.module_id);116 EXPECT_EQ(decoded_or_err->symbol_id, label.symbol_id);117 EXPECT_EQ(decoded_or_err->lookup_name, label.lookup_name);118 119 auto roundtrip_or_err = FunctionCallLabel::fromString(label_str);120 EXPECT_THAT_EXPECTED(roundtrip_or_err, llvm::Succeeded());121 122 EXPECT_EQ(roundtrip_or_err->discriminator, label.discriminator);123 EXPECT_EQ(roundtrip_or_err->module_id, label.module_id);124 EXPECT_EQ(roundtrip_or_err->symbol_id, label.symbol_id);125 EXPECT_EQ(roundtrip_or_err->lookup_name, label.lookup_name);126}127 128INSTANTIATE_TEST_SUITE_P(FunctionCallLabelTest, ExpressionTestFixture,129 testing::ValuesIn(g_label_test_cases));130