Add unit tests for memory pressure events. PiperOrigin-RevId: 415110987
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index 7c1d276..98f9877 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -40,6 +40,7 @@ "//src/test/java/com/google/devtools/build/lib/packages/metrics:srcs", "//src/test/java/com/google/devtools/build/lib/packages/semantics:srcs", "//src/test/java/com/google/devtools/build/lib/platform:srcs", + "//src/test/java/com/google/devtools/build/lib/platform/darwin:srcs", "//src/test/java/com/google/devtools/build/lib/profiler:srcs", "//src/test/java/com/google/devtools/build/lib/profiler/callcounts:srcs", "//src/test/java/com/google/devtools/build/lib/profiler/memory:srcs",
diff --git a/src/test/java/com/google/devtools/build/lib/platform/BUILD b/src/test/java/com/google/devtools/build/lib/platform/BUILD index 58a49ad..9d711f2 100644 --- a/src/test/java/com/google/devtools/build/lib/platform/BUILD +++ b/src/test/java/com/google/devtools/build/lib/platform/BUILD
@@ -39,3 +39,27 @@ "//third_party:truth", ], ) + +java_test( + name = "SystemMemoryPressureEventTest", + timeout = "short", + srcs = ["SystemMemoryPressureEventTest.java"], + data = select({ + "//src/conditions:darwin": [ + "//src/test/java/com/google/devtools/build/lib/platform/darwin:notifier", + ], + "//conditions:default": [ + ], + }), + deps = [ + "//src/main/java/com/google/devtools/build/lib:runtime", + "//src/main/java/com/google/devtools/build/lib/platform:system_memory_pressure_module", + "//src/main/java/com/google/devtools/build/lib/platform:system_memory_pressure_monitor", + "//src/main/java/com/google/devtools/build/lib/util:os", + "//src/test/java/com/google/devtools/build/lib/buildtool/util", + "//third_party:guava", + "//third_party:junit4", + "//third_party:truth", + "@bazel_tools//tools/java/runfiles", + ], +)
diff --git a/src/test/java/com/google/devtools/build/lib/platform/SystemMemoryPressureEventTest.java b/src/test/java/com/google/devtools/build/lib/platform/SystemMemoryPressureEventTest.java new file mode 100644 index 0000000..12c23d6 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/platform/SystemMemoryPressureEventTest.java
@@ -0,0 +1,92 @@ +// Copyright 2021 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.platform; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.eventbus.Subscribe; +import com.google.devtools.build.lib.buildtool.util.BuildIntegrationTestCase; +import com.google.devtools.build.lib.runtime.BlazeModule; +import com.google.devtools.build.lib.runtime.BlazeRuntime; +import com.google.devtools.build.lib.runtime.CommandEnvironment; +import com.google.devtools.build.lib.util.OS; +import com.google.devtools.build.runfiles.Runfiles; +import org.junit.Assume; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests {@link SystemMemoryPressureEvent} by sending fake notifications. */ +@RunWith(JUnit4.class) +public final class SystemMemoryPressureEventTest extends BuildIntegrationTestCase { + static class SystemMemoryPressureEventListener extends BlazeModule { + public int memoryPressureWarningEventCount = 0; + public int memoryPressureCriticalEventCount = 0; + + @Override + public void beforeCommand(CommandEnvironment env) { + env.getEventBus().register(this); + } + + @Subscribe + public void memoryPressureEvent(SystemMemoryPressureEvent event) { + switch (event.level()) { + case WARNING: + ++memoryPressureWarningEventCount; + assertThat(event.logString()).isEqualTo("SystemMemoryPressureEvent: Warning"); + break; + + case CRITICAL: + ++memoryPressureCriticalEventCount; + assertThat(event.logString()).isEqualTo("SystemMemoryPressureEvent: Critical"); + break; + } + } + } + + private final SystemMemoryPressureEventListener eventListener = + new SystemMemoryPressureEventListener(); + + @Override + protected BlazeRuntime.Builder getRuntimeBuilder() throws Exception { + return super.getRuntimeBuilder() + .addBlazeModule(eventListener) + .addBlazeModule(new SystemMemoryPressureModule()); + } + + @Test + public void testMemoryPressure() throws Exception { + Assume.assumeTrue(OS.getCurrent() == OS.DARWIN); + Runfiles runfiles = Runfiles.create(); + String notifierFilePath = + runfiles.rlocation( + "io_bazel/src/test/java/com/google/devtools/build/lib/platform/darwin/notifier"); + write( + "system_suspension_event/BUILD", + "genrule(", + " name = 'fire_memory_pressure_notifications',", + " outs = ['fire_memory_pressure_notifications.out'],", + " cmd = '" + + notifierFilePath + + " com.google.bazel.test.memorypressurelevel.warning 0 > $@; ' + ", + " '" + + notifierFilePath + + " com.google.bazel.test.memorypressurelevel.critical 0 >> $@',", + ")"); + buildTarget("//system_suspension_event:fire_memory_pressure_notifications"); + assertThat(eventListener.memoryPressureWarningEventCount).isGreaterThan(0); + assertThat(eventListener.memoryPressureCriticalEventCount).isGreaterThan(0); + } +}
diff --git a/src/test/java/com/google/devtools/build/lib/platform/darwin/BUILD b/src/test/java/com/google/devtools/build/lib/platform/darwin/BUILD index 7cc3d36..c676fbc 100644 --- a/src/test/java/com/google/devtools/build/lib/platform/darwin/BUILD +++ b/src/test/java/com/google/devtools/build/lib/platform/darwin/BUILD
@@ -7,6 +7,13 @@ licenses(["notice"]) +filegroup( + name = "srcs", + testonly = 0, + srcs = glob(["**"]), + visibility = ["//src:__subpackages__"], +) + # Utility for sending notifications. It expects one arg which is the # notification to send using the notify_post (3) api. cc_binary(