Admin Panel

import logging
from amitools.vamos.profiler import MainProfiler, Profiler
from amitools.vamos.cfgcore import ConfigDict


def profiler_main_disabled_test(caplog):
  mp = MainProfiler()
  assert mp.parse_config(None)
  assert not mp.add_profiler(Profiler())
  mp.setup()
  mp.shutdown()
  assert caplog.record_tuples == []


def profiler_main_config_test(caplog, tmpdir):
  path = str(tmpdir.join("prof.json"))
  mp = MainProfiler()
  cfg = ConfigDict({
      'enabled': True,
      'output': {
          'dump': True,
          'file': path,
          'append': True
      }
  })
  assert mp.parse_config(cfg)
  assert mp.enabled
  assert mp.file == path
  assert mp.append
  mp.setup()
  mp.shutdown()
  assert caplog.record_tuples == []


def profiler_main_def_profiler_test(caplog):
  caplog.set_level(logging.INFO)
  p = Profiler()
  mp = MainProfiler(enabled=True)
  cfg = ConfigDict({
      'enabled': True,
      'output': {
          'dump': True,
          'file': None,
          'append': True
      }
  })
  assert mp.parse_config(cfg)
  assert mp.add_profiler(p)
  mp.setup()
  mp.shutdown()
  assert caplog.record_tuples == [
    ('prof', logging.INFO, '---------- Profiling Results ----------'),
    ('prof', logging.INFO, "----- profiler 'foo' -----")
  ]


def profiler_main_file_test(caplog, tmpdir):
  caplog.set_level(logging.DEBUG)
  path = str(tmpdir.join("prof.json"))
  p = Profiler()
  mp = MainProfiler(enabled=True)
  cfg = ConfigDict({
      'enabled': True,
      'output': {
          'dump': False,
          'file': path,
          'append': True
      }
  })
  assert mp.parse_config(cfg)
  assert mp.add_profiler(p)
  mp.setup()
  mp.shutdown()
  assert caplog.record_tuples == [
    ('prof', logging.DEBUG, "added profiler 'foo'"),
    ('prof', logging.DEBUG, "saving profile data to '%s'" % path),
    ('prof', logging.DEBUG, "done saving.")
  ]
  caplog.clear()
  # now repeat setup to test appending
  p = Profiler()
  mp = MainProfiler(enabled=True)
  assert mp.parse_config(cfg)
  assert mp.add_profiler(p)
  mp.setup()
  mp.shutdown()
  assert caplog.record_tuples == [
    ('prof', logging.DEBUG, "added profiler 'foo'"),
    ('prof', logging.DEBUG, "loading profile data from '%s'" % path),
    ('prof', logging.DEBUG, "done loading."),
    ('prof', logging.DEBUG, "saving profile data to '%s'" % path),
    ('prof', logging.DEBUG, "done saving.")
  ]


class MyProfiler(Profiler):
  def __init__(self):
    self.foo = 0
    self.bar = 'baz'
    self.got_setup = False
    self.got_shutdown = False

  def get_name(self):
    return "test"

  def parse_config(self, cfg):
    self.foo = cfg.foo
    self.bar = cfg.bar
    return True

  def set_data(self, data_dict):
    self.foo = data_dict.foo
    self.bar = data_dict.bar

  def get_data(self):
    return {
      'foo': self.foo,
      'bar': self.bar
    }

  def setup(self):
    self.got_setup = True

  def shutdown(self):
    self.got_shutdown = True

  def dump(self, write):
    write("foo=%d, bar='%s'", self.foo, self.bar)


def profiler_main_test_prof_cfg_test():
  p = MyProfiler()
  mp = MainProfiler(enabled=True)
  cfg = ConfigDict({
      'enabled': True,
      'output': {
          'dump': True,
          'file': None,
          'append': True
      },
      'test': {
        'foo': 42,
        'bar': 'hello'
      }
  })
  assert mp.parse_config(cfg)
  assert mp.add_profiler(p)
  assert p.foo == 42
  assert p.bar == 'hello'


def profiler_main_test_prof_load_test(tmpdir):
  path = str(tmpdir.join("prof.json"))
  cfg = ConfigDict({
      'enabled': True,
      'output': {
          'dump': True,
          'file': path,
          'append': True
      }
  })
  p = MyProfiler()
  mp = MainProfiler(enabled=True)
  assert mp.parse_config(cfg)
  assert mp.add_profiler(p)
  mp.setup()
  assert p.foo == 0
  assert p.bar == 'baz'
  p.foo = 42
  p.bar = 'hello'
  mp.shutdown()
  # load again
  p = MyProfiler()
  mp = MainProfiler(enabled=True)
  assert mp.parse_config(cfg)
  assert mp.add_profiler(p)
  mp.setup()
  assert p.foo == 42
  assert p.bar == 'hello'
  mp.shutdown()


def profiler_main_test_prof_dump_test(caplog):
  caplog.set_level(logging.INFO)
  cfg = ConfigDict({
      'enabled': True,
      'output': {
          'dump': True,
          'file': None,
          'append': True
      }
  })
  p = MyProfiler()
  mp = MainProfiler(enabled=True)
  assert mp.parse_config(cfg)
  assert mp.add_profiler(p)
  mp.setup()
  assert p.foo == 0
  assert p.bar == 'baz'
  p.foo = 42
  p.bar = 'hello'
  mp.shutdown()
  assert caplog.record_tuples == [
    ('prof', logging.INFO, '---------- Profiling Results ----------'),
    ('prof', logging.INFO, "----- profiler 'test' -----"),
    ('prof', logging.INFO, "foo=42, bar='hello'")
  ]