82 lines · cpp
1//===- YAML2ObjTest.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 "llvm/ObjectYAML/yaml2obj.h"10#include "llvm/ADT/SmallString.h"11#include "llvm/Object/ObjectFile.h"12#include "llvm/Support/Error.h"13#include "llvm/Support/YAMLTraits.h"14#include "llvm/Testing/Support/Error.h"15#include "gtest/gtest.h"16 17using namespace llvm;18using namespace object;19using namespace yaml;20 21TEST(yaml2ObjectFile, ELF) {22 bool ErrorReported = false;23 auto ErrHandler = [&](const Twine &Msg) { ErrorReported = true; };24 25 SmallString<0> Storage;26 std::unique_ptr<ObjectFile> Obj = yaml2ObjectFile(Storage, R"(27--- !ELF28FileHeader:29 Class: ELFCLASS6430 Data: ELFDATA2LSB31 Type: ET_REL32 Machine: EM_X86_64)", ErrHandler);33 34 ASSERT_FALSE(ErrorReported);35 ASSERT_TRUE(Obj);36 ASSERT_TRUE(Obj->isELF());37 ASSERT_TRUE(Obj->isRelocatableObject());38}39 40TEST(yaml2ObjectFile, Errors) {41 std::vector<std::string> Errors;42 auto ErrHandler = [&](const Twine &Msg) {43 Errors.push_back("ObjectYAML: " + Msg.str());44 };45 46 SmallString<0> Storage;47 StringRef Yaml = R"(48--- !ELF49FileHeader:50 Class: ELFCLASS6451 Data: ELFDATA2LSB52 Type: ET_REL53 Machine: EM_X86_6454Symbols:55 - Name: foo56 - Name: foo57 - Name: foo58)";59 60 // 1. Test yaml2ObjectFile().61 62 std::unique_ptr<ObjectFile> Obj = yaml2ObjectFile(Storage, Yaml, ErrHandler);63 64 ASSERT_FALSE(Obj);65 ASSERT_TRUE(Errors.size() == 2);66 ASSERT_TRUE(Errors[0] == "ObjectYAML: repeated symbol name: 'foo'");67 ASSERT_TRUE(Errors[1] == Errors[0]);68 69 // 2. Test convertYAML(). 70 71 Errors.clear();72 Storage.clear();73 raw_svector_ostream OS(Storage);74 75 yaml::Input YIn(Yaml);76 bool Res = convertYAML(YIn, OS, ErrHandler);77 ASSERT_FALSE(Res);78 ASSERT_TRUE(Errors.size() == 2);79 ASSERT_TRUE(Errors[0] == "ObjectYAML: repeated symbol name: 'foo'");80 ASSERT_TRUE(Errors[1] == Errors[0]);81}82