# Copyright 2017 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.

"""Test utilities for cygprofile scripts."""

import collections

import process_profiles

# Used by ProfileFile to generate unique file names.
_FILE_COUNTER = 0

SimpleTestSymbol = collections.namedtuple(
    'SimpleTestSymbol', ['name', 'offset', 'size'])


class TestSymbolOffsetProcessor(process_profiles.SymbolOffsetProcessor):
  def __init__(self, symbol_infos):
    super(TestSymbolOffsetProcessor, self).__init__(None)
    self._symbol_infos = symbol_infos


class TestProfileManager(process_profiles.ProfileManager):
  def __init__(self, filecontents_mapping):
    super(TestProfileManager, self).__init__(filecontents_mapping.keys())
    self._filecontents_mapping = filecontents_mapping

  def _ReadOffsets(self, filename):
    return self._filecontents_mapping[filename]

  def _ReadJSON(self, filename):
    return self._filecontents_mapping[filename]


def ProfileFile(timestamp_sec, phase, process_name=None):
  global _FILE_COUNTER
  _FILE_COUNTER += 1
  if process_name:
    name_str = process_name + '-'
  else:
    name_str = ''
  return 'test-directory/profile-hitmap-{}{}-{}.txt_{}'.format(
      name_str, _FILE_COUNTER, timestamp_sec * 1000 * 1000 * 1000, phase)
