Opensource some basic client tests.

RELNOTES: None.
PiperOrigin-RevId: 189938838
diff --git a/src/test/shell/integration/BUILD b/src/test/shell/integration/BUILD
index e05060b..5f53479 100644
--- a/src/test/shell/integration/BUILD
+++ b/src/test/shell/integration/BUILD
@@ -284,9 +284,16 @@
 )
 
 sh_test(
-    name = "logging_test",
+    name = "server_logging_test",
     size = "medium",
-    srcs = ["logging_test.sh"],
+    srcs = ["server_logging_test.sh"],
+    data = [":test-deps"],
+)
+
+sh_test(
+    name = "client_test",
+    size = "medium",
+    srcs = ["client_test.sh"],
     data = [":test-deps"],
 )
 
diff --git a/src/test/shell/integration/client_test.sh b/src/test/shell/integration/client_test.sh
new file mode 100755
index 0000000..0fddd39
--- /dev/null
+++ b/src/test/shell/integration/client_test.sh
@@ -0,0 +1,166 @@
+#!/bin/bash
+# Copyright 2018 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.
+#
+# Tests of the bazel client.
+
+CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+source "${CURRENT_DIR}/../integration_test_setup.sh" \
+  || { echo "integration_test_setup.sh not found!" >&2; exit 1; }
+
+add_to_bazelrc "startup --nobatch"
+
+function tear_down() {
+  bazel --nobatch shutdown
+}
+
+#### TESTS #############################################################
+
+function test_client_debug() {
+  # Test that --client_debug sends log statements to stderr.
+  bazel --client_debug version >&$TEST_log || fail "'bazel version' failed"
+  expect_log "Debug logging active"
+  bazel --client_debug --batch version >&$TEST_log || fail "'bazel version' failed"
+  expect_log "Debug logging active"
+
+  # Test that --client_debug is off by default.
+  bazel version >&$TEST_log || fail "'bazel version' failed"
+  expect_not_log "Debug logging active"
+  bazel --batch version >&$TEST_log || fail "'bazel version' failed"
+  expect_not_log "Debug logging active"
+}
+
+function test_client_debug_change_does_not_restart_server() {
+  PID1=$(bazel --client_debug info server_pid)
+  PID2=$(bazel info server_pid)
+  if [[ $PID1 != $PID2 ]]; then
+    fail "Server restarted due to change in --client_debug"
+  fi
+}
+
+function test_multiple_requests_same_server() {
+    local server_pid1=$(bazel info server_pid 2>$TEST_log)
+    local server_pid2=$(bazel info server_pid 2>$TEST_log)
+    assert_equals "$server_pid1" "$server_pid2"
+}
+
+function test_shutdown() {
+    local server_pid1=$(bazel info server_pid 2>$TEST_log)
+    bazel shutdown >& $TEST_log || fail "Expected success"
+    local server_pid2=$(bazel info server_pid 2>$TEST_log)
+    assert_not_equals "$server_pid1" "$server_pid2"
+}
+
+function test_exit_code() {
+    bazel query not_a_query >/dev/null &>$TEST_log &&
+        fail "bazel query: expected nonzero exit"
+    expect_log "'not_a_query'"
+}
+
+function test_output_base() {
+    out=$(bazel --output_base=$TEST_TMPDIR/output info output_base 2>$TEST_log)
+    assert_equals $TEST_TMPDIR/output "$out"
+}
+
+function test_output_base_is_file() {
+    bazel --output_base=/dev/null &>$TEST_log && fail "Expected non-zero exit"
+    expect_log "Error: Output base directory '/dev/null' could not be created.*exists"
+}
+
+function test_cannot_create_output_base() {
+    bazel --output_base=/foo &>$TEST_log && fail "Expected non-zero exit"
+    expect_log "Error: Output base directory '/foo' could not be created"
+}
+
+function test_nonwritable_output_base() {
+    bazel --output_base=/ &>$TEST_log && fail "Expected non-zero exit"
+    expect_log "Output base directory '/' must be readable and writable."
+}
+
+function test_no_arguments() {
+    bazel >&$TEST_log || fail "Expected zero exit"
+    expect_log "Usage: b\\(laze\\|azel\\)"
+}
+
+
+function test_max_idle_secs() {
+    local server_pid1=$(bazel --max_idle_secs=1 info server_pid 2>$TEST_log)
+    sleep 5
+    local server_pid2=$(bazel info server_pid 2>$TEST_log)
+    assert_not_equals "$server_pid1" "$server_pid2" # pid changed.
+}
+
+function test_dashdash_before_command() {
+    bazel -- info &>$TEST_log && "Expected failure"
+    exitcode=$?
+    assert_equals 2 $exitcode
+    expect_log "Unknown startup option: '--'."
+}
+
+function test_dashdash_after_command() {
+    bazel info -- &>$TEST_log || fail "info -- failed"
+}
+
+function test_nobatch() {
+    local pid1=$(bazel --batch --nobatch info server_pid 2> $TEST_log)
+    local pid2=$(bazel --batch --nobatch info server_pid 2> $TEST_log)
+    assert_equals "$pid1" "$pid2"
+}
+
+# Regression test for #1875189, "bazel client should pass through '--help' like
+# a command".
+function test_bazel_dash_dash_help_is_passed_through() {
+    bazel --help >&$TEST_log
+    expect_log "Usage: b\\(azel\\|laze\\) <command> <options> ..."
+    expect_not_log "Unknown startup option: '--help'."
+}
+
+function test_bazel_dash_help() {
+    bazel -help >&$TEST_log
+    expect_log "Usage: b\\(azel\\|laze\\) <command> <options> ..."
+}
+
+function test_bazel_dash_h() {
+    bazel -h >&$TEST_log
+    expect_log "Usage: b\\(azel\\|laze\\) <command> <options> ..."
+}
+
+function test_bazel_dash_s_is_not_parsed() {
+    bazel -s --help >&$TEST_log && fail "Expected failure"
+    expect_log "Unknown startup option: '-s'."
+}
+
+function test_cmdline_not_written_in_batch_mode() {
+  OUTPUT_BASE=$(bazel --batch info output_base 2> $TEST_log)
+  rm -f $OUTPUT_BASE/server/cmdline
+  OUTPUT_BASE2=$(bazel --batch info output_base 2> $TEST_log)
+  assert_equals "$OUTPUT_BASE" "$OUTPUT_BASE2"
+  [[ ! -e $OUTPUT_BASE/server/cmdline ]] || fail "Command line file written."
+}
+
+function test_bad_command_batch() {
+  bazel --batch notacommand &> $TEST_log && "Expected failure"
+  exitcode=$?
+  assert_equals 2 "$exitcode"
+  expect_log "Command 'notacommand' not found."
+}
+
+function test_bad_command_nobatch() {
+  bazel --nobatch notacommand &> $TEST_log && "Expected failure"
+  exitcode=$?
+  assert_equals 2 "$exitcode"
+  expect_log "Command 'notacommand' not found."
+}
+
+run_suite "Tests of the bazel client."
diff --git a/src/test/shell/integration/logging_test.sh b/src/test/shell/integration/server_logging_test.sh
similarity index 100%
rename from src/test/shell/integration/logging_test.sh
rename to src/test/shell/integration/server_logging_test.sh