# 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 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)
