#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""A simple host test module.

This module runs on the host machine and is responsible for creating 2
task machines, waiting for them, and running RPC calls on them.
"""

import argparse
import logging
import os
import sys
import time

# Map the testing directory so we can import legion.legion_test.
TESTING_DIR = os.path.join(
    os.path.dirname(os.path.abspath(__file__)),
    '..', '..', '..', '..', 'testing')
sys.path.append(TESTING_DIR)

from legion import legion_test_case


class ExampleTestController(legion_test_case.TestCase):
  """A simple example controller for a test."""

  @classmethod
  def CreateTestTask(cls):
    """Create a new task."""
    parser = argparse.ArgumentParser()
    parser.add_argument('--task-hash')
    parser.add_argument('--os', default='Ubuntu-14.04')
    args, _ = parser.parse_known_args()

    task = cls.CreateTask(
        isolated_hash=args.task_hash,
        dimensions={'os': args.os},
        idle_timeout_secs=90,
        connection_timeout_secs=90,
        verbosity=logging.DEBUG)
    task.Create()
    return task

  @classmethod
  def setUpClass(cls):
    """Creates the task machines and waits until they connect."""
    cls.task1 = cls.CreateTestTask()
    cls.task2 = cls.CreateTestTask()
    cls.task1.WaitForConnection()
    cls.task2.WaitForConnection()

  def testCallEcho(self):
    """Tests rpc.Echo on a task."""
    logging.info('Calling Echo on %s', self.task2.name)
    self.assertEqual(self.task2.rpc.Echo('foo'), 'echo foo')

  def testLaunchTaskBinary(self):
    """Call task_test.py 'name' on the tasks."""
    self.VerifyTaskBinaryLaunched(self.task1)
    self.VerifyTaskBinaryLaunched(self.task2)

  def VerifyTaskBinaryLaunched(self, task):
    logging.info(
        'Calling Process to run "task_test.py %s"', task.name)
    proc = task.Process(['python', 'task_test.py', task.name])
    proc.Wait()
    self.assertEqual(proc.GetReturncode(), 0)
    self.assertIn(task.name, proc.ReadStdout())
    self.assertEquals(proc.ReadStderr(), '')
    proc.Delete()


if __name__ == '__main__':
  legion_test_case.main()
