def test_botevents_invalid_page_size(self):
   msg = swarming_pb2.BotEventsRequest(bot_id=u'bot1', page_size=-1)
   raw_resp = self.app.post(
       '/prpc/swarming.v1.BotAPI/Events', _encode(msg), self._headers,
       expect_errors=True)
   self.assertEqual(raw_resp.status, '400 Bad Request')
   self.assertEqual(raw_resp.body, 'page_size must be positive')
 def test_botevents_invalid_bot_id(self):
   # Missing bot_id
   msg = swarming_pb2.BotEventsRequest()
   raw_resp = self.app.post(
       '/prpc/swarming.v1.BotAPI/Events', _encode(msg), self._headers,
       expect_errors=True)
   self.assertEqual(raw_resp.status, '400 Bad Request')
   self.assertEqual(raw_resp.body, 'specify bot_id')
 def test_botevents_missing(self):
   # No such bot.
   msg = swarming_pb2.BotEventsRequest(bot_id=u'unknown')
   raw_resp = self.app.post(
       '/prpc/swarming.v1.BotAPI/Events', _encode(msg), self._headers,
       expect_errors=True)
   self.assertEqual(raw_resp.status, '404 Not Found')
   self.assertEqual(raw_resp.body, 'Bot does not exist')
 def test_botevents_start_end(self):
   msg = swarming_pb2.BotEventsRequest(bot_id=u'bot1')
   msg.start_time.FromDatetime(self.now)
   msg.end_time.FromDatetime(self.now)
   raw_resp = self.app.post(
       '/prpc/swarming.v1.BotAPI/Events', _encode(msg), self._headers,
       expect_errors=True)
   self.assertEqual(raw_resp.status, '400 Bad Request')
   self.assertEqual(raw_resp.body, 'start_time must be before end_time')
  def test_botevents(self):
    # Run one task.
    self.mock(random, 'getrandbits', lambda _: 0x88)

    self.set_as_bot()
    self.mock_now(self.now, 0)
    params = self.do_handshake()
    self.mock_now(self.now, 30)
    self.bot_poll(params=params)
    self.set_as_user()
    now_60 = self.mock_now(self.now, 60)
    self.client_create_task_raw()
    self.set_as_bot()
    self.mock_now(self.now, 120)
    res = self.bot_poll(params=params)
    now_180 = self.mock_now(self.now, 180)
    response = self.bot_complete_task(task_id=res['manifest']['task_id'])
    self.assertEqual({u'must_stop': False, u'ok': True}, response)
    self.mock_now(self.now, 240)
    params['event'] = 'bot_rebooting'
    params['message'] = 'for the best'
    # TODO(maruel): https://crbug.com/913953
    response = self.post_json('/swarming/api/v1/bot/event', params)
    self.assertEqual({}, response)

    # Do not filter by time.
    self.set_as_privileged_user()
    msg = swarming_pb2.BotEventsRequest(bot_id=u'bot1', page_size=1001)
    raw_resp = self.app.post(
        '/prpc/swarming.v1.BotAPI/Events', _encode(msg), self._headers)
    resp = swarming_pb2.BotEventsResponse()
    _decode(raw_resp.body, resp)

    dimensions = [
      swarming_pb2.StringListPair(key='id', values=['bot1']),
      swarming_pb2.StringListPair(key='os', values=['Amiga']),
      swarming_pb2.StringListPair(key='pool', values=['default']),
    ]
    common_info = swarming_pb2.BotInfo(
        supplemental=struct_pb2.Struct(
            fields={
              'bot_group_cfg_version': struct_pb2.Value(string_value='default'),
              'running_time': struct_pb2.Value(number_value=1234.0),
              'sleep_streak': struct_pb2.Value(number_value=0),
              'started_ts': struct_pb2.Value(number_value=1410990411.11),
            }),
        external_ip='192.168.2.2',
        authenticated_as='bot:whitelisted-ip',
        version=self.bot_version,
    )
    events = [
      swarming_pb2.BotEvent(
          event_time=timestamp_pb2.Timestamp(seconds=1262401685),
          bot=swarming_pb2.Bot(
              bot_id='bot1',
              pools=[u'default'],
              status=swarming_pb2.BOT_STATUS_UNSPECIFIED,
              info=common_info,
              dimensions=dimensions),
          event=swarming_pb2.BOT_REBOOTING_HOST,
          event_msg='for the best',
      ),
      swarming_pb2.BotEvent(
          event_time=timestamp_pb2.Timestamp(seconds=1262401625),
          bot=swarming_pb2.Bot(
              bot_id='bot1',
              pools=[u'default'],
              status=swarming_pb2.BUSY,
              current_task_id='5cfcee8008811',
              info=common_info,
              dimensions=dimensions),
          event=swarming_pb2.TASK_COMPLETED,
      ),
      swarming_pb2.BotEvent(
          event_time=timestamp_pb2.Timestamp(seconds=1262401565),
          bot=swarming_pb2.Bot(
              bot_id='bot1',
              pools=[u'default'],
              current_task_id='5cfcee8008811',
              status=swarming_pb2.BUSY,
              info=common_info,
              dimensions=dimensions),
          event=swarming_pb2.INSTRUCT_START_TASK,
      ),
      swarming_pb2.BotEvent(
          event_time=timestamp_pb2.Timestamp(seconds=1262401475),
          bot=swarming_pb2.Bot(
              bot_id='bot1',
              pools=[u'default'],
              info=common_info,
              dimensions=dimensions),
          event=swarming_pb2.INSTRUCT_IDLE,
      ),
      swarming_pb2.BotEvent(
          event_time=timestamp_pb2.Timestamp(seconds=1262401445),
          bot=swarming_pb2.Bot(
              bot_id='bot1',
              pools=[u'default'],
              status=swarming_pb2.BOT_STATUS_UNSPECIFIED,
              info=swarming_pb2.BotInfo(
                  supplemental=struct_pb2.Struct(
                      fields={
                        'running_time': struct_pb2.Value(number_value=1234.0),
                        'sleep_streak': struct_pb2.Value(number_value=0),
                        'started_ts': struct_pb2.Value(
                            number_value=1410990411.11),
                      }),
                  external_ip='192.168.2.2',
                  authenticated_as='bot:whitelisted-ip',
                  version='123',
              ),
              dimensions=dimensions),
          event=swarming_pb2.BOT_NEW_SESSION,
      ),
    ]
    self.assertEqual(len(events), len(resp.events))
    for i, event in enumerate(events):
      self.assertEqual(unicode(event), unicode(resp.events[i]))

    # Now test with a subset. It will retrieve events 1 and 2.
    msg = swarming_pb2.BotEventsRequest(bot_id=u'bot1')
    msg.start_time.FromDatetime(now_60)
    msg.end_time.FromDatetime(now_180 + datetime.timedelta(seconds=1))
    raw_resp = self.app.post(
        '/prpc/swarming.v1.BotAPI/Events', _encode(msg), self._headers)
    resp = swarming_pb2.BotEventsResponse()
    _decode(raw_resp.body, resp)
    self.assertEqual(
        unicode(swarming_pb2.BotEventsResponse(events=events[1:3])),
        unicode(resp))
 def test_botevents_empty_time(self):
   msg = swarming_pb2.BotEventsRequest(bot_id=u'bot1')
   msg.start_time.FromDatetime(self.now)
   msg.end_time.FromDatetime(self.now + datetime.timedelta(seconds=1))
   self._test_bot_events_simple(msg)
 def test_botevents_empty(self):
   # Minimum request, all optional fields left out.
   self._test_bot_events_simple(swarming_pb2.BotEventsRequest(bot_id=u'bot1'))