blob: b0c34baa1bfea74674a0cfffed9f1ba05404146a [file] [edit]
#!/usr/bin/env vpython
# -*- coding: utf-8 -*-
# Copyright 2013 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.
from __future__ import print_function
import logging
import os
import StringIO
import sys
import traceback
# Mutates sys.path.
import test_env
# third_party/
from depot_tools import auto_stub
import net_utils
import auth
import swarming
from utils import logging_utils
def main(args):
"""Bypasses swarming.main()'s exception handling.
It gets in the way when debugging test failures.
"""
dispatcher = swarming.subcommand.CommandDispatcher("swarming")
return dispatcher.execute(swarming.OptionParserSwarming(), args)
class Common:
# pylint: disable=no-member
def setUp(self):
self.mock(auth, "ensure_logged_in", lambda _: None)
self.mock(sys, "stdout", StringIO.StringIO())
self.mock(sys, "stderr", StringIO.StringIO())
self.mock(logging_utils, "prepare_logging", lambda *args: None)
self.mock(logging_utils, "set_console_level", lambda *args: None)
def tearDown(self):
if not self.has_failed():
self._check_output("", "")
maxDiff = None
def _check_output(self, out, err):
self.assertMultiLineEqual(out, sys.stdout.getvalue())
self.assertMultiLineEqual(err, sys.stderr.getvalue())
# Flush their content by mocking them again.
self.mock(sys, "stdout", StringIO.StringIO())
self.mock(sys, "stderr", StringIO.StringIO())
def main_safe(self, args):
"""Bypasses swarming.main()'s exception handling.
It gets in the way when debugging test failures.
"""
# pylint: disable=bare-except
try:
return main(args)
except:
data = "%s\nSTDOUT:\n%s\nSTDERR:\n%s" % (
traceback.format_exc(),
sys.stdout.getvalue(),
sys.stderr.getvalue(),
)
self.fail(data)
class NetTestCase(net_utils.TestCase, Common):
# These test fail when running in parallel
# Need to run in sequential_test_runner.py as an executable
no_run = 1
"""Base class that defines the url_open mock."""
def setUp(self):
net_utils.TestCase.setUp(self)
Common.setUp(self)
class TestMain(NetTestCase):
# Tests calling main().
def test_query_base(self):
self.expected_requests(
[
(
"https://localhost:1/_ah/api/swarming/v1/bot/botid/tasks?limit=200",
{},
{"yo": "dawg"},
),
]
)
ret = self.main_safe(
[
"query",
"--swarming",
"https://localhost:1",
"bot/botid/tasks",
]
)
self._check_output('{\n "yo": "dawg"\n}\n', "")
self.assertEqual(0, ret)
def test_query_cursor(self):
self.expected_requests(
[
(
"https://localhost:1/_ah/api/swarming/v1/bot/botid/tasks?"
"foo=bar&limit=2",
{},
{
"cursor": "%",
"extra": False,
"items": ["A"],
},
),
(
"https://localhost:1/_ah/api/swarming/v1/bot/botid/tasks?"
"foo=bar&cursor=%25&limit=1",
{},
{
"cursor": None,
"items": ["B"],
"ignored": True,
},
),
]
)
ret = self.main_safe(
[
"query",
"--swarming",
"https://localhost:1",
"bot/botid/tasks?foo=bar",
"--limit",
"2",
]
)
expected = (
'{\n "extra": false, \n "items": [\n "A", \n "B"\n ]\n}\n'
)
self._check_output(expected, "")
self.assertEqual(0, ret)
if __name__ == "__main__":
for env_var_to_remove in ("SWARMING_TASK_ID", "SWARMING_SERVER"):
os.environ.pop(env_var_to_remove, None)
test_env.main()