blob: 515735e788d0dae8b09984eac8804fe05b6c82b4 [file]
//===- JSONFormatTest.h -----------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Test fixture and helpers for SSAF JSON serialization format unit tests.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_UNITTESTS_SCALABLESTATICANALYSISFRAMEWORK_SERIALIZATION_JSONFORMATTEST_JSONFORMATTEST_H
#define LLVM_CLANG_UNITTESTS_SCALABLESTATICANALYSISFRAMEWORK_SERIALIZATION_JSONFORMATTEST_JSONFORMATTEST_H
#include "TestFixture.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/JSON.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include <functional>
#include <string>
namespace clang::ssaf {
// ============================================================================
// Test Fixture
// ============================================================================
class JSONFormatTest : public TestFixture {
public:
using PathString = llvm::SmallString<128>;
protected:
llvm::SmallString<128> TestDir;
void SetUp() override;
void TearDown() override;
PathString makePath(llvm::StringRef FileOrDirectoryName) const;
PathString makePath(llvm::StringRef Dir, llvm::StringRef FileName) const;
llvm::Expected<PathString> makeDirectory(llvm::StringRef DirectoryName) const;
llvm::Expected<PathString> makeSymlink(llvm::StringRef TargetFileName,
llvm::StringRef SymlinkFileName) const;
llvm::Error setPermission(llvm::StringRef FileName,
llvm::sys::fs::perms Perms) const;
// Returns true if Unix file permission checks are enforced in this
// environment. Returns false if running as root (uid 0), or if a probe
// file with read permission removed can still be opened, indicating that
// permission checks are not enforced (e.g. certain container setups).
// Tests that rely on permission-based failure conditions should skip
// themselves when this returns false.
bool permissionsAreEnforced() const;
llvm::Expected<llvm::json::Value>
readJSONFromFile(llvm::StringRef FileName) const;
llvm::Expected<PathString> writeJSON(llvm::StringRef JSON,
llvm::StringRef FileName) const;
};
// ============================================================================
// SummaryOps - Parameterization struct for TUSummary/LUSummary test suites
// ============================================================================
struct SummaryOps {
// Suffix appended to the test name by GTest to identify this parameter
// instantiation (e.g. "Resolved", "Encoding").
std::string GTestInstantiationSuffix;
// Human-readable name of the summary class under test (e.g. "TUSummary").
// Used in diagnostic messages to identify which summary type an error
// originated from.
std::string SummaryClassName;
std::function<llvm::Error(llvm::StringRef FilePath)> ReadFromFile;
std::function<llvm::Error(llvm::StringRef FilePath)> WriteEmpty;
std::function<llvm::Error(llvm::StringRef InputFilePath,
llvm::StringRef OutputFilePath)>
ReadWriteRoundTrip;
};
// ============================================================================
// SummaryTest Test Fixture
// ============================================================================
class SummaryTest : public JSONFormatTest,
public ::testing::WithParamInterface<SummaryOps> {
protected:
llvm::Error readFromString(llvm::StringRef JSON,
llvm::StringRef FileName = "test.json") const;
llvm::Error readFromFile(llvm::StringRef FileName) const;
llvm::Error writeEmpty(llvm::StringRef FileName) const;
llvm::Error readWriteRoundTrip(llvm::StringRef InputFileName,
llvm::StringRef OutputFileName) const;
void readWriteCompare(llvm::StringRef JSON) const;
};
// ============================================================================
// First Test Analysis - Simple analysis for testing JSON serialization.
// ============================================================================
struct PairsEntitySummaryForJSONFormatTest final : EntitySummary {
SummaryName getSummaryName() const override {
return SummaryName("PairsEntitySummaryForJSONFormatTest");
}
std::vector<std::pair<EntityId, EntityId>> Pairs;
};
// ============================================================================
// Second Test Analysis - Simple analysis for multi-summary round-trip tests.
// ============================================================================
struct TagsEntitySummaryForJSONFormatTest final : EntitySummary {
SummaryName getSummaryName() const override {
return SummaryName("TagsEntitySummaryForJSONFormatTest");
}
std::vector<std::string> Tags;
};
// ============================================================================
// NullEntitySummaryForJSONFormatTest - For null data checks
// ============================================================================
struct NullEntitySummaryForJSONFormatTest final : EntitySummary {
SummaryName getSummaryName() const override {
return SummaryName("NullEntitySummaryForJSONFormatTest");
}
};
// ============================================================================
// UnregisteredEntitySummaryForJSONFormatTest - For missing FormatInfo checks
// ============================================================================
struct UnregisteredEntitySummaryForJSONFormatTest final : EntitySummary {
SummaryName getSummaryName() const override {
return SummaryName("UnregisteredEntitySummaryForJSONFormatTest");
}
};
// ============================================================================
// MismatchedEntitySummaryForJSONFormatTest - For mismatched SummaryName checks
// ============================================================================
struct MismatchedEntitySummaryForJSONFormatTest final : EntitySummary {
SummaryName getSummaryName() const override {
return SummaryName("MismatchedEntitySummaryForJSONFormatTest_WrongName");
}
};
} // namespace clang::ssaf
#endif // LLVM_CLANG_UNITTESTS_SCALABLESTATICANALYSISFRAMEWORK_SERIALIZATION_JSONFORMATTEST_JSONFORMATTEST_H