Skip to content

Commit

Permalink
added llvm toolchain integration test
Browse files Browse the repository at this point in the history
  • Loading branch information
LeFrosch committed Oct 18, 2024
1 parent c1a3c5a commit 9fedf0b
Show file tree
Hide file tree
Showing 14 changed files with 240 additions and 35 deletions.
4 changes: 2 additions & 2 deletions .bazelrc
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ build --tool_java_language_version=17 --tool_java_runtime_version=17

# Delete test data packages, needed for bazel integration tests. Update by running the following command:
# bazel run @rules_bazel_integration_test//tools:update_deleted_packages
build --deleted_packages=aspect/testing/tests/src/com/google/idea/blaze/aspect/integration/testdata,clwb/tests/projects/simple/main,clwb/tests/projects/virtual_includes/lib/strip_absolut,clwb/tests/projects/virtual_includes/lib/strip_relative,clwb/tests/projects/virtual_includes/main
query --deleted_packages=aspect/testing/tests/src/com/google/idea/blaze/aspect/integration/testdata,clwb/tests/projects/simple/main,clwb/tests/projects/virtual_includes/lib/strip_absolut,clwb/tests/projects/virtual_includes/lib/strip_relative,clwb/tests/projects/virtual_includes/main
build --deleted_packages=aspect/testing/tests/src/com/google/idea/blaze/aspect/integration/testdata,clwb/tests/projects/simple/main,clwb/tests/projects/virtual_includes/lib/strip_absolut,clwb/tests/projects/virtual_includes/lib/strip_relative,clwb/tests/projects/virtual_includes/main,clwb/tests/projects/llvm_toolchain/main
query --deleted_packages=aspect/testing/tests/src/com/google/idea/blaze/aspect/integration/testdata,clwb/tests/projects/simple/main,clwb/tests/projects/virtual_includes/lib/strip_absolut,clwb/tests/projects/virtual_includes/lib/strip_relative,clwb/tests/projects/virtual_includes/main,clwb/tests/projects/llvm_toolchain/main

common --enable_bzlmod
common --enable_workspace # to load rules_scala from WORKSPACE.bzlmod
Expand Down
5 changes: 5 additions & 0 deletions base/src/com/google/idea/blaze/base/scope/BlazeContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.google.idea.blaze.common.Output;
import com.google.idea.blaze.common.PrintOutput;
import com.google.idea.blaze.exception.BuildException;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProcessCanceledException;
import java.util.Collections;
Expand Down Expand Up @@ -262,6 +263,10 @@ public synchronized <T extends Output> void output(T output) {
break;
}
}

// propagate all the way to the root in tests
continuePropagation |= ApplicationManager.getApplication().isUnitTestMode();

if (continuePropagation && parentContext != null) {
parentContext.output(output);
}
Expand Down
9 changes: 8 additions & 1 deletion clwb/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,17 @@ clwb_integration_test(
srcs = ["tests/integrationtests/com/google/idea/blaze/clwb/VirtualIncludesTest.java"],
)

clwb_integration_test(
name = "llvm_toolchain_integration_test",
project = "llvm_toolchain",
srcs = ["tests/integrationtests/com/google/idea/blaze/clwb/LlvmToolchainTest.java"],
)

test_suite(
name = "integration_tests",
tests = [
":llvm_toolchain_integration_test",
":simple_integration_test",
":virtual_includes_integration_test",
],
)
)
10 changes: 7 additions & 3 deletions clwb/test_defs.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,16 @@ def clwb_integration_test(name, project, srcs, deps = []):
bazel_version = version,
test_runner = ":" + runner,
workspace_path = "tests/projects/" + project,
# disables automatic conversion of bazel target names to absolut windows paths by msys
env = {"MSYS_NO_PATHCONV": "true"},
env = {
# disables automatic conversion of bazel target names to absolut windows paths by msys
"MSYS_NO_PATHCONV": "true",
# pass the bazel version to the test for RuleBazelVersion
"BIT_BAZEL_VERSION": version,
},
# inherit bash shell and visual studio path from host for windows
additional_env_inherit = ["BAZEL_SH", "BAZEL_VC"],
# add version specific arguments, since some older versions cannot handle newer flags
**version_specific_args.get(version, {}),
**version_specific_args.get(version, {})
)

native.test_suite(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.google.idea.blaze.clwb;

import static com.google.common.truth.Truth.assertThat;
import static com.google.idea.blaze.clwb.base.Assertions.assertContainsHeader;
import static com.google.idea.blaze.clwb.base.Assertions.assertDefine;

import com.google.idea.blaze.clwb.base.BazelVersionRule;
import com.google.idea.blaze.clwb.base.ClwbIntegrationTestCase;
import com.google.idea.blaze.clwb.base.OSRule;
import com.intellij.util.system.OS;
import com.jetbrains.cidr.lang.workspace.compiler.ClangCompilerKind;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
public class LlvmToolchainTest extends ClwbIntegrationTestCase {

// llvm toolchain currently does not support windows, otherwise this test should be fine to run on windows
@Rule
public final OSRule osRule = new OSRule(OS.Linux, OS.macOS);

// llvm toolchain currently only supports bazel 7+
@Rule
public final BazelVersionRule bazelRule = new BazelVersionRule(7, 0);

@Test
public void testClwb() {
final var errors = runSync(defaultSyncParams().build());
errors.assertNoErrors();

checkCompiler();
}

private void checkCompiler() {
final var compilerSettings = findFileCompilerSettings("main/hello-world.cc");

assertThat(compilerSettings.getCompilerKind()).isEqualTo(ClangCompilerKind.INSTANCE);
assertDefine("__llvm__", compilerSettings).isNotEmpty();
assertDefine("__VERSION__", compilerSettings).startsWith("\"Clang 19.1.0");

assertContainsHeader("iostream", compilerSettings);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@ private void checkCompiler() {
assertThat(compilerSettings.getCompilerKind()).isEqualTo(MSVCCompilerKind.INSTANCE);
}

final var headersSearchRoots = compilerSettings.getHeadersSearchRoots().getAllRoots();
assertThat(headersSearchRoots).isNotEmpty();

assertContainsHeader("iostream", headersSearchRoots);
assertContainsHeader("iostream", compilerSettings);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,8 @@
import static com.google.idea.blaze.clwb.base.Assertions.assertContainsHeader;

import com.google.idea.blaze.clwb.base.ClwbIntegrationTestCase;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.VirtualFile;
import com.jetbrains.cidr.lang.workspace.compiler.ClangCompilerKind;
import com.jetbrains.cidr.lang.workspace.compiler.GCCCompilerKind;
import com.jetbrains.cidr.lang.workspace.compiler.MSVCCompilerKind;
import com.jetbrains.cidr.lang.workspace.headerRoots.HeadersSearchRoot;
import java.util.List;
import com.jetbrains.cidr.lang.workspace.OCCompilerSettings;
import org.jetbrains.annotations.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand All @@ -27,7 +22,9 @@ public void testClwb() {
checkIncludes();
}

private @Nullable VirtualFile findHeader(String fileName, List<HeadersSearchRoot> roots) {
private @Nullable VirtualFile findHeader(String fileName, OCCompilerSettings settings) {
final var roots = settings.getHeadersSearchRoots().getAllRoots();

for (final var root : roots) {
final var rootFile = root.getVirtualFile();
if (rootFile == null) continue;
Expand All @@ -44,17 +41,14 @@ public void testClwb() {
private void checkIncludes() {
final var compilerSettings = findFileCompilerSettings("main/hello-world.cc");

final var headersSearchRoots = compilerSettings.getHeadersSearchRoots().getAllRoots();
assertThat(headersSearchRoots).isNotEmpty();

assertContainsHeader("strip_absolut/strip_absolut.h", headersSearchRoots);
assertContainsHeader("strip_absolut/generated.h", headersSearchRoots);
assertContainsHeader("strip_relative.h", headersSearchRoots);
assertContainsHeader("strip_absolut/strip_absolut.h", compilerSettings);
assertContainsHeader("strip_absolut/generated.h", compilerSettings);
assertContainsHeader("strip_relative.h", compilerSettings);

assertThat(findProjectFile("lib/strip_absolut/strip_absolut.h"))
.isEqualTo(findHeader("strip_absolut/strip_absolut.h", headersSearchRoots));
.isEqualTo(findHeader("strip_absolut/strip_absolut.h", compilerSettings));

assertThat(findProjectFile("lib/strip_relative/include/strip_relative.h"))
.isEqualTo(findHeader("strip_relative.h", headersSearchRoots));
.isEqualTo(findHeader("strip_relative.h", compilerSettings));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,29 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;

import com.google.common.truth.StringSubject;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFileSystemItem;
import com.jetbrains.cidr.lang.workspace.OCCompilerSettings;
import com.jetbrains.cidr.lang.workspace.headerRoots.HeadersSearchRoot;
import com.jetbrains.cidr.lang.workspace.headerRoots.HeadersSearchRootProcessor;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import java.util.regex.Pattern;

public class Assertions {
private final static Pattern defineRx = Pattern.compile("#define ([^ ]+) ?(.*)");

public static void assertContainsHeader(String fileName, List<HeadersSearchRoot> roots) {
assertContainsHeader(fileName, true, roots);
public static void assertContainsHeader(String fileName, OCCompilerSettings settings) {
assertContainsHeader(fileName, true, settings);
}

public static void assertDoesntContainHeader(String fileName, List<HeadersSearchRoot> roots) {
assertContainsHeader(fileName, false, roots);
public static void assertDoesntContainHeader(String fileName, OCCompilerSettings settings) {
assertContainsHeader(fileName, false, settings);
}

private static void assertContainsHeader(String fileName, boolean shouldContain, List<HeadersSearchRoot> roots) {
private static void assertContainsHeader(String fileName, boolean shouldContain, OCCompilerSettings settings) {
final var roots = settings.getHeadersSearchRoots().getAllRoots();
assertThat(roots).isNotEmpty();

final var found = new Ref<VirtualFile>();
final var foundIn = new Ref<HeadersSearchRoot>();

Expand All @@ -50,4 +52,26 @@ private static void assertContainsHeader(String fileName, boolean shouldContain,
.isTrue();
}
}

public static StringSubject assertDefine(String symbol, OCCompilerSettings settings) {
final var defines = settings.getPreprocessorDefines();
assertThat(defines).isNotEmpty();

for (final var define : defines) {
final var matcher = defineRx.matcher(define);
if (!matcher.find()) {
continue;
}

final var defineSymbol = matcher.group(1);
if (defineSymbol == null || !defineSymbol.equals(symbol)) {
continue;
}

final var defineValue = matcher.group(2);
return assertWithMessage(define).that(defineValue);
}

return assertWithMessage("symbol is not defined: " + symbol).that((String) null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.google.idea.blaze.clwb.base;

import com.google.idea.blaze.base.bazel.BazelVersion;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

public class BazelVersionRule implements TestRule {

private final BazelVersion min;

public BazelVersionRule(int major, int minor) {
this.min = new BazelVersion(major, minor, 0);
}

@Override
public Statement apply(Statement base, Description description) {
final var bitBazelVersion = System.getenv("BIT_BAZEL_VERSION");
if (bitBazelVersion == null) {
return Statements.fail("Could not find BIT_BAZEL_VERSION");
}

final var version = BazelVersion.parseVersion(bitBazelVersion);
if (version.isAtLeast(999, 0, 0)) {
return Statements.fail("Invalid BIT_BAZEL_VERSION: %s", bitBazelVersion);
}

if (version.isAtLeast(min)) {
return base;
} else {
return Statements.message(
"Test '%s' does not run on bazel version %s",
description.getDisplayName(),
bitBazelVersion
);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.google.idea.blaze.clwb.base;

import java.util.Arrays;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import com.intellij.util.system.OS;

public class OSRule implements TestRule {

private final OS[] supportedOS;

public OSRule(OS... supportedOS) {
this.supportedOS = supportedOS;
}

@Override
public Statement apply(Statement base, Description description) {
if (Arrays.stream(supportedOS).anyMatch(it -> it == OS.CURRENT)) {
return base;
}

return Statements.message(
"Test '%s' does not run on %s",
description.getDisplayName(),
OS.CURRENT.name()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.google.idea.blaze.clwb.base;

import org.junit.runners.model.Statement;

public class Statements {

public static Statement message(String format, Object... args) {
final var message = String.format(format, args);

return new Statement() {
@Override
public void evaluate() {
System.out.println(message);
}
};
}

public static Statement fail(String format, Object... args) {
final var message = String.format(format, args);

return new Statement() {
@Override
public void evaluate() {
throw new AssertionError(message);
}
};
}
}
21 changes: 21 additions & 0 deletions clwb/tests/projects/llvm_toolchain/WORKSPACE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
name = "toolchains_llvm",
canonical_id = "v1.2.0",
sha256 = "e3fb6dc6b77eaf167cb2b0c410df95d09127cbe20547e5a329c771808a816ab4",
strip_prefix = "toolchains_llvm-v1.2.0",
url = "https://github.com/bazel-contrib/toolchains_llvm/releases/download/v1.2.0/toolchains_llvm-v1.2.0.tar.gz",
)

load("@toolchains_llvm//toolchain:deps.bzl", "bazel_toolchain_dependencies")
bazel_toolchain_dependencies()

load("@toolchains_llvm//toolchain:rules.bzl", "llvm_toolchain")
llvm_toolchain(
name = "llvm_toolchain",
llvm_version = "19.1.0",
)

load("@llvm_toolchain//:toolchains.bzl", "llvm_register_toolchains")
llvm_register_toolchains()
7 changes: 7 additions & 0 deletions clwb/tests/projects/llvm_toolchain/main/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
load("@rules_cc//cc:defs.bzl", "cc_binary")

cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
visibility = ["//visibility:public"],
)
6 changes: 6 additions & 0 deletions clwb/tests/projects/llvm_toolchain/main/hello-world.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include <iostream>

int main() {
std::cout << "Hello, there!" << std::endl;
return 0;
}

0 comments on commit 9fedf0b

Please sign in to comment.