Backed out changeset 4d4271a0ccad (bug 1565332) for Android Mochitest failures on a CLOSED TREE.

This commit is contained in:
Gurzau Raul 2019-08-31 01:54:22 +03:00
parent 8d53b63ee8
commit 2bdd678c48
15 changed files with 23 additions and 609 deletions

View File

@ -22,8 +22,6 @@ jobs:
symbol: I(ib)
desktop1604-test:
symbol: I(dt16t)
debian10-test:
symbol: I(deb10-test)
# Neither the debian7-*raw nor the debian7-*packages images can have
# packages dependencies.
debian7-raw:

View File

@ -1,113 +0,0 @@
# The base image is a last known working snapshot of this image. We do this
# to work around problems rebuilding desktop1604-test. See bug 1503756 for
# the ugly details. Bug 1511527 tracks undoing this hack and building from
# a fresh ubuntu image.
FROM debian:buster
MAINTAINER Edwin Takahashi <egao@mozilla.com>
RUN mkdir -p /builds
RUN id worker || useradd -d /builds/worker -s /bin/bash -m worker
WORKDIR /builds/worker
# We need to declare all potentially cache volumes as caches. Also,
# making high I/O paths volumes increase I/O throughput because of
# AUFS slowness.
VOLUME /builds/worker/.cache
VOLUME /builds/worker/checkouts
VOLUME /builds/worker/tooltool-cache
VOLUME /builds/worker/workspace
# %include python/mozbuild/mozbuild/action/tooltool.py
ADD topsrcdir/python/mozbuild/mozbuild/action/tooltool.py /setup/tooltool.py
# %include testing/mozharness/external_tools/robustcheckout.py
ADD topsrcdir/testing/mozharness/external_tools/robustcheckout.py /usr/local/mercurial/robustcheckout.py
# %include taskcluster/docker/recipes/hgrc
COPY topsrcdir/taskcluster/docker/recipes/hgrc /etc/mercurial/hgrc.d/mozilla.rc
# %include taskcluster/docker/recipes/common.sh
ADD topsrcdir/taskcluster/docker/recipes/common.sh /setup/common.sh
# %include taskcluster/docker/recipes/install-mercurial.sh
ADD topsrcdir/taskcluster/docker/recipes/install-mercurial.sh /setup/install-mercurial.sh
# %include taskcluster/docker/recipes/install-node.sh
ADD topsrcdir/taskcluster/docker/recipes/install-node.sh /setup/install-node.sh
# %include taskcluster/docker/recipes/debian-test-system-setup.sh
ADD topsrcdir/taskcluster/docker/recipes/debian-test-system-setup.sh /setup/system-setup.sh
RUN bash /setup/system-setup.sh
# Add wrapper scripts for xvfb allowing tasks to easily retry starting up xvfb
# %include taskcluster/docker/recipes/xvfb.sh
ADD topsrcdir/taskcluster/docker/recipes/xvfb.sh /builds/worker/scripts/xvfb.sh
# %include taskcluster/scripts/run-task
ADD topsrcdir/taskcluster/scripts/run-task /builds/worker/bin/run-task
# %include taskcluster/scripts/misc/fetch-content
ADD topsrcdir/taskcluster/scripts/misc/fetch-content /builds/worker/bin/fetch-content
# %include taskcluster/scripts/tester/test-linux.sh
ADD topsrcdir/taskcluster/scripts/tester/test-linux.sh /builds/worker/bin/test-linux.sh
ADD topsrcdir/python/mozbuild/mozbuild/action/tooltool.py /builds/worker/scripts/tooltool.py
# Locale related setup for debian:buster
RUN echo "LC_ALL=en_US.UTF-8" >> /etc/environment
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
RUN echo "LANG=en_US.UTF-8" > /etc/locale.conf
RUN locale-gen en_US.UTF-8
# Set variable normally configured at login, by the shells parent process, these
# are taken from GNU su manual
ENV HOME /builds/worker
ENV SHELL /bin/bash
ENV USER worker
ENV LOGNAME worker
ENV HOSTNAME taskcluster-worker
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
# Add utilities and configuration
COPY dot-files/config /builds/worker/.config
COPY dot-files/pulse /builds/worker/.pulse
RUN chmod +x bin/*
# allow the worker user to access video devices
RUN usermod -a -G video worker
RUN mkdir -p artifacts
ENV PATH $PATH:/builds/worker/bin
# In test.sh we accept START_VNC to start a vnc daemon.
# Exposing this port allows it to work.
EXPOSE 5900
# This helps not forgetting setting DISPLAY=:0 when running
# tests outside of test.sh
ENV DISPLAY :0
# Disable apport (app crash reporter) to avoid stealing focus from test runs
ADD apport /etc/default/apport
# Disable font antialiasing for now to match releng's setup
ADD fonts.conf /builds/worker/.fonts.conf
# Set up first-run experience for interactive mode
ADD motd /etc/taskcluster-motd
ADD taskcluster-interactive-shell /bin/taskcluster-interactive-shell
RUN chmod +x /bin/taskcluster-interactive-shell
RUN chown -R worker:worker /builds/worker
# gnome-keyring-daemon is configured to have the IPC_LOCK capability (to lock pages with secrets in
# memory), but docker isn't run with that capability granted. So, if we were to try running
# gnome-keyring-daemon without first clearing the capability, it would just exit with the message
# "Operation not permitted". Luckily it doesn't actually require the capability.
RUN setcap -r /usr/bin/gnome-keyring-daemon
# Set a default command useful for debugging
CMD ["/bin/bash", "--login"]

View File

@ -1 +0,0 @@
enabled=0

View File

@ -1,2 +0,0 @@
[global]
disable-pip-version-check = true

View File

@ -1,15 +0,0 @@
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"

View File

@ -1 +0,0 @@
autospawn = no

View File

@ -1,164 +0,0 @@
#!/usr/bin/pulseaudio -nF
#
# This file is part of PulseAudio.
#
# PulseAudio is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# PulseAudio is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with PulseAudio; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
# This startup script is used only if PulseAudio is started per-user
# (i.e. not in system mode)
.nofail
### Load something into the sample cache
#load-sample-lazy x11-bell /usr/share/sounds/gtk-events/activate.wav
#load-sample-lazy pulse-hotplug /usr/share/sounds/startup3.wav
#load-sample-lazy pulse-coldplug /usr/share/sounds/startup3.wav
#load-sample-lazy pulse-access /usr/share/sounds/generic.wav
.fail
### Automatically restore the volume of streams and devices
load-module module-device-restore
load-module module-stream-restore
load-module module-card-restore
### Automatically augment property information from .desktop files
### stored in /usr/share/application
load-module module-augment-properties
### Load audio drivers statically
### (it's probably better to not load these drivers manually, but instead
### use module-udev-detect -- see below -- for doing this automatically)
#load-module module-alsa-sink
#load-module module-alsa-source device=hw:1,0
#load-module module-oss device="/dev/dsp" sink_name=output source_name=input
#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input
#load-module module-null-sink
#load-module module-pipe-sink
### Automatically load driver modules depending on the hardware available
.ifexists module-udev-detect.so
load-module module-udev-detect
.else
### Use the static hardware detection module (for systems that lack udev/hal support)
load-module module-detect
.endif
### Automatically connect sink and source if JACK server is present
.ifexists module-jackdbus-detect.so
.nofail
load-module module-jackdbus-detect
.fail
.endif
### Automatically load driver modules for Bluetooth hardware
# This module causes a pulseaudio startup failure on "gecko-tester"
#.ifexists module-bluetooth-discover.so
#load-module module-bluetooth-discover
#.endif
### Load several protocols
.ifexists module-esound-protocol-unix.so
load-module module-esound-protocol-unix
.endif
load-module module-native-protocol-unix
### Network access (may be configured with paprefs, so leave this commented
### here if you plan to use paprefs)
#load-module module-esound-protocol-tcp
#load-module module-native-protocol-tcp
#load-module module-zeroconf-publish
### Load the RTP receiver module (also configured via paprefs, see above)
#load-module module-rtp-recv
### Load the RTP sender module (also configured via paprefs, see above)
#load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 sink_properties="device.description='RTP Multicast Sink'"
#load-module module-rtp-send source=rtp.monitor
### Load additional modules from GConf settings. This can be configured with the paprefs tool.
### Please keep in mind that the modules configured by paprefs might conflict with manually
### loaded modules.
.ifexists module-gconf.so
.nofail
load-module module-gconf
.fail
.endif
### Automatically restore the default sink/source when changed by the user
### during runtime
### NOTE: This should be loaded as early as possible so that subsequent modules
### that look up the default sink/source get the right value
load-module module-default-device-restore
### Automatically move streams to the default sink if the sink they are
### connected to dies, similar for sources
load-module module-rescue-streams
### Make sure we always have a sink around, even if it is a null sink.
load-module module-always-sink
### Honour intended role device property
load-module module-intended-roles
### Automatically suspend sinks/sources that become idle for too long
load-module module-suspend-on-idle
### If autoexit on idle is enabled we want to make sure we only quit
### when no local session needs us anymore.
# This module causes a pulseaudio startup failure on "gecko-tester"
#.ifexists module-console-kit.so
#load-module module-console-kit
#.endif
### Enable positioned event sounds
load-module module-position-event-sounds
### Cork music streams when a phone stream is active
#load-module module-cork-music-on-phone
### Modules to allow autoloading of filters (such as echo cancellation)
### on demand. module-filter-heuristics tries to determine what filters
### make sense, and module-filter-apply does the heavy-lifting of
### loading modules and rerouting streams.
load-module module-filter-heuristics
load-module module-filter-apply
### Load DBus protocol
#.ifexists module-dbus-protocol.so
#load-module module-dbus-protocol
#.endif
# X11 modules should not be started from default.pa so that one daemon
# can be shared by multiple sessions.
### Load X11 bell module
#load-module module-x11-bell sample=bell-windowing-system
### Register ourselves in the X11 session manager
#load-module module-x11-xsmp
### Publish connection data in the X11 root window
#.ifexists module-x11-publish.so
#.nofail
#load-module module-x11-publish
#.fail
#.endif
load-module module-switch-on-port-available
### Make some devices default
#set-default-sink output
#set-default-source input

View File

@ -1,5 +0,0 @@
<match target="font">
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>

View File

@ -1,6 +0,0 @@
Welcome to your taskcluster interactive shell! The regularly scheduled task
has been paused to give you a chance to set up your debugging environment.
For your convenience, the exact mozharness command needed for this task can
be invoked using the 'run-mozharness' command.

View File

@ -1,22 +0,0 @@
#!/usr/bin/env bash
download() {
name=`basename $1`
url=${GECKO_HEAD_REPOSITORY}/raw-file/${GECKO_HEAD_REV}/$1
if ! curl --fail --silent -o ./$name --retry 10 $url; then
fail "failed downloading $1 from ${GECKO_HEAD_REPOSITORY}"
fi
}
cd $HOME/bin;
download taskcluster/scripts/tester/run-wizard;
chmod +x run-wizard;
./run-wizard;
SPAWN="$SHELL";
if [ "$SHELL" = "bash" ]; then
SPAWN="bash -li";
fi;
cd $HOME;
exec $SPAWN;

View File

@ -1,205 +0,0 @@
#!/usr/bin/env bash
set -ve
test "$(whoami)" == 'root'
mkdir -p /setup
cd /setup
# enable i386 packages
dpkg --add-architecture i386
apt_packages=()
apt_packages+=('autoconf2.13')
apt_packages+=('bluez-cups')
apt_packages+=('build-essential')
apt_packages+=('ca-certificates')
apt_packages+=('ccache')
apt_packages+=('compiz')
apt_packages+=('compizconfig-settings-manager')
apt_packages+=('curl')
apt_packages+=('dbus')
apt_packages+=('dbus-x11')
apt_packages+=('fonts-kacst')
apt_packages+=('fonts-kacst-one')
apt_packages+=('fonts-liberation')
apt_packages+=('fonts-stix')
apt_packages+=('fonts-unfonts-core')
apt_packages+=('fonts-unfonts-extra')
apt_packages+=('fonts-vlgothic')
apt_packages+=('g++-multilib')
apt_packages+=('gcc-multilib')
apt_packages+=('gir1.2-gnomebluetooth-1.0')
apt_packages+=('git')
apt_packages+=('gnome-keyring')
apt_packages+=('libasound2-dev')
apt_packages+=('libcanberra-pulse')
apt_packages+=('libcurl4-openssl-dev')
apt_packages+=('libdbus-1-dev')
apt_packages+=('libdbus-glib-1-dev')
apt_packages+=('libgconf2-dev')
apt_packages+=('libgtk2.0-dev')
apt_packages+=('libiw-dev')
apt_packages+=('libnotify-dev')
apt_packages+=('libpulse-dev')
apt_packages+=('libsox-fmt-alsa')
apt_packages+=('libxt-dev')
apt_packages+=('libxxf86vm1')
apt_packages+=('llvm')
apt_packages+=('llvm-dev')
apt_packages+=('llvm-runtime')
apt_packages+=('locales')
apt_packages+=('locales-all')
apt_packages+=('nano')
apt_packages+=('net-tools')
apt_packages+=('pulseaudio')
apt_packages+=('pulseaudio-utils')
apt_packages+=('qemu-kvm')
apt_packages+=('rlwrap')
apt_packages+=('screen')
apt_packages+=('software-properties-common')
apt_packages+=('sudo')
apt_packages+=('tar')
apt_packages+=('task-gnome-desktop')
apt_packages+=('ttf-dejavu')
apt_packages+=('unzip')
apt_packages+=('uuid')
apt_packages+=('vim')
apt_packages+=('wget')
apt_packages+=('xvfb')
apt_packages+=('x11-common')
apt_packages+=('yasm')
apt_packages+=('zip')
apt_packages+=('libsecret-1-0:i386')
# Make sure we have X libraries for 32-bit tests
apt_packages+=('libxt6:i386')
apt_packages+=('libpulse0:i386')
apt_packages+=('libasound2:i386')
apt_packages+=('libxtst6:i386')
apt_packages+=('libgtk2.0-0:i386')
# get xvinfo for test-linux.sh to monitor Xvfb startup
apt_packages+=('x11-utils')
# Bug 1232407 - this allows the user to start vnc
apt_packages+=('x11vnc')
# Bug 1176031: need `xset` to disable screensavers
apt_packages+=('x11-xserver-utils')
# use Ubuntu's Python-2.7 (2.7.3 on Precise)
apt_packages+=('python-dev')
apt_packages+=('python-pip')
apt-get update
# This allows packages to be installed without human interaction
export DEBIAN_FRONTEND=noninteractive
apt-get install -y -f "${apt_packages[@]}"
dpkg-reconfigure locales
. /setup/common.sh
. /setup/install-mercurial.sh
# first upgrade debian:buster built-in pip, then install older pip
pip install --upgrade pip
pip install pip==9.0.3
hash -r
pip install virtualenv==15.2.0
. /setup/install-node.sh
# Install Valgrind (trunk, late Jan 2016) and do some crude sanity
# checks. It has to go in /usr/local, otherwise it won't work. Copy
# the launcher binary to /usr/bin, though, so that direct invokations
# of /usr/bin/valgrind also work. Also install libc6-dbg since
# Valgrind won't work at all without the debug symbols for libc.so and
# ld.so being available.
tooltool_fetch <<'EOF'
[
{
"size": 41331092,
"visibility": "public",
"digest": "a89393c39171b8304fc262094a650df9a756543ffe9fbec935911e7b86842c4828b9b831698f97612abb0eca95cf7f7b3ff33ea7a9b0313b30c9be413a5efffc",
"algorithm": "sha512",
"filename": "valgrind-15775-3206-ubuntu1204.tgz"
}
]
EOF
cp valgrind-15775-3206-ubuntu1204.tgz /tmp
(cd / && tar xzf /tmp/valgrind-15775-3206-ubuntu1204.tgz)
rm /tmp/valgrind-15775-3206-ubuntu1204.tgz
cp /usr/local/bin/valgrind /usr/bin/valgrind
apt-get install -y libc6-dbg
valgrind --version
valgrind date
# Until bug 1511527 is fixed, remove the file from the image to ensure it's not there.
rm -f /usr/local/bin/linux64-minidump_stackwalk
# install gstreamer0.10 from jessie
cp /etc/apt/sources.list sources.list.bak
echo 'deb http://ftp.de.debian.org/debian jessie main' >> /etc/apt/sources.list
apt-get update
apt-get install -f
apt-get install -y -f -q \
libtag1-vanilla \
libtag1c2a \
libsidplay1
apt-get install -y -f -q \
gstreamer0.10-plugins-base \
gstreamer0.10-plugins-good \
gstreamer0.10-pulseaudio \
gstreamer0.10-tools \
gstreamer0.10-tools \
libgstreamer-plugins-base0.10-dev \
libgstreamer0.10-dev \
gstreamer0.10-plugins-ugly
# TEMPORARY: we do not want flash installed, but the above pulls it in (bug 1349208)
rm -f /usr/lib/flashplugin-installer/libflashplayer.so
apt-get -q -y -f install \
libxcb1 \
libxcb-render0 \
libxcb-shm0 \
libxcb-glx0 \
libxcb-shape0
apt-get -q -y -f install \
libgl1-mesa-dri \
libgl1-mesa-glx \
mesa-common-dev
# additional packages for linux32 tests
# including fc-cache:i386 to pre-build the font cache for i386 binaries
apt-get update
apt-get -q -y -f install \
libavcodec-extra58:i386 \
libgtk-3-0:i386 \
libdbus-glib-1-2:i386 \
fontconfig:i386
# libavcodec-extra58 uninstalls pulseaudio-module-gsettings
# reinstall it now.
apt-get -q -y -f install \
pulseaudio-module-gsettings
# revert the addition of jessie repos
cp sources.list.bak /etc/apt/sources.list
# clean up
apt-get -y autoremove
# We don't need no docs!
rm -rf /usr/share/help /usr/share/doc /usr/share/man
cd /
rm -rf /setup ~/.ccache ~/.cache ~/.npm
apt-get clean
apt-get autoclean
rm -f "$0"

View File

@ -5,13 +5,10 @@ set -x -e
echo "running as" $(id)
# Detect release version.
. /etc/os-release
if [ "${ID}" == "ubuntu" ]; then
DISTRIBUTION="Ubuntu"
elif [ "${ID}" == "debian" ]; then
DISTRIBUTION="Debian"
else
DISTRIBUTION="Unknown"
. /etc/lsb-release
if [ "${DISTRIB_RELEASE}" != "16.04" ]; then
echo "Ubuntu 16.04 required"
exit 1
fi
####
@ -46,36 +43,10 @@ fail() {
exit 1
}
# start pulseaudio
maybe_start_pulse() {
if $NEED_PULSEAUDIO; then
# call pulseaudio with varying parameters
if [ $DISTRIBUTION == "Ubuntu" ]; then
pulseaudio --fail --daemonize --start
elif [ $DISTRIBUTION == "Debian" ]; then
# kill existing daemons/processes if exist
set +e
pulseaudio --kill
# Debian needs additional stabilization and debugging
# turn off errexit temporarily
ps ax | grep 'pulseaudio'
ps -ef | grep 'pulseaudio' | grep -v grep | awk '{print $2}' | xargs -r kill -9
ps ax | grep 'pulseaudio'
# check and start pulseaudio (debugging)
pulseaudio --check; echo $?
pulseaudio --fail --daemonize --start -vvvv --exit-idle-time=-1 --log-level=4 --log-time=1
else
:
fi
pulseaudio --check
if [ $? -eq 0 ]; then
echo "Pulseaudio successfully initialized"
else
echo "Pulseaudio failed to initialize, trying again"
fi
pulseaudio --fail --daemonize --start
pactl load-module module-null-sink
fi
}
@ -177,25 +148,16 @@ if $NEED_WINDOW_MANAGER; then
# This starts the gnome-keyring-daemon with an unlocked login keyring. libsecret uses this to
# store secrets. Firefox uses libsecret to store a key that protects sensitive information like
# credit card numbers.
if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
# if not found, launch a new one
eval `dbus-launch --sh-syntax`
fi
eval `dbus-launch --sh-syntax`
eval `echo '' | /usr/bin/gnome-keyring-daemon -r -d --unlock --components=secrets`
fi
if $NEED_COMPIZ; then
if [ $DISTRIBUTION == "Ubuntu" ]; then
compiz 2>&1 &
fi
compiz 2>&1 &
fi
maybe_start_pulse
# Load null-sink using pactl
pactl load-module module-null-sink
pactl list modules short
# For telemetry purposes, the build process wants information about the
# source it is running
export MOZ_SOURCE_REPO="${GECKO_HEAD_REPOSITORY}"

View File

@ -811,13 +811,12 @@ class MochitestArguments(ArgumentContainer):
'--use-test-media-devices is only supported on Linux currently')
gst01 = spawn.find_executable("gst-launch-0.1")
gst010 = spawn.find_executable("gst-launch-0.10")
gst10 = spawn.find_executable("gst-launch-1.0")
pactl = spawn.find_executable("pactl")
if not (gst01 or gst10 or gst010):
if not (gst01 or gst10):
parser.error(
'Missing gst-launch-{0.1,0.10,1.0}, required for '
'Missing gst-launch-{0.1,1.0}, required for '
'--use-test-media-devices')
if not pactl:

View File

@ -791,12 +791,9 @@ def findTestMediaDevices(log):
# Feed it a frame of output so it has something to display
gst01 = spawn.find_executable("gst-launch-0.1")
gst010 = spawn.find_executable("gst-launch-0.10")
gst10 = spawn.find_executable("gst-launch-1.0")
if gst01:
gst = gst01
if gst010:
gst = gst010
else:
gst = gst10
subprocess.check_call([gst, 'videotestsrc',
@ -804,29 +801,22 @@ def findTestMediaDevices(log):
'v4l2sink', 'device=%s' % device])
info['video'] = name
if platform.linux_distribution()[0] == 'debian':
# Debian 10 doesn't seem to appreciate starting pactl here.
# Still WIP (bug 1565332)
pass
else:
# Use pactl to see if the PulseAudio module-null-sink module is loaded.
pactl = spawn.find_executable("pactl")
pactl = spawn.find_executable("pactl")
def null_sink_loaded():
o = subprocess.check_output(
[pactl, 'list', 'short', 'modules'])
return filter(lambda x: 'module-null-sink' in x, o.splitlines())
# Use pactl to see if the PulseAudio module-null-sink module is loaded.
def null_sink_loaded():
o = subprocess.check_output(
[pactl, 'list', 'short', 'modules'])
return filter(lambda x: 'module-null-sink' in x, o.splitlines())
if not null_sink_loaded():
subprocess.check_call([
pactl,
'load-module',
'module-null-sink'
])
if not null_sink_loaded():
# Load module-null-sink
subprocess.check_call([pactl, 'load-module',
'module-null-sink'])
if not null_sink_loaded():
log.error('Couldn\'t load module-null-sink')
return None
if not null_sink_loaded():
log.error('Couldn\'t load module-null-sink')
return None
# Hardcode the name since it's always the same.
info['audio'] = 'Monitor of Null Output'