// 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.

#ifndef BASE_TRACE_EVENT_TRACE_CONFIG_MEMORY_TEST_UTIL_H_
#define BASE_TRACE_EVENT_TRACE_CONFIG_MEMORY_TEST_UTIL_H_

#include "base/strings/stringprintf.h"
#include "base/trace_event/memory_dump_manager.h"

namespace base {
namespace trace_event {

class TraceConfigMemoryTestUtil {
 public:
  static std::string GetTraceConfig_PeriodicTriggers(int light_period,
                                                     int heavy_period) {
    return StringPrintf(
        "{"
          "\"enable_argument_filter\":false,"
          "\"enable_sampling\":false,"
          "\"enable_systrace\":false,"
          "\"included_categories\":["
            "\"%s\""
          "],"
          "\"memory_dump_config\":{"
             "\"allowed_dump_modes\":[\"background\",\"light\",\"detailed\"],"
             "\"heap_profiler_options\":{"
               "\"breakdown_threshold_bytes\":2048"
             "},"
             "\"triggers\":["
              "{"
                "\"mode\":\"light\","
                "\"periodic_interval_ms\":%d"
              "},"
              "{"
                "\"mode\":\"detailed\","
                "\"periodic_interval_ms\":%d"
              "}"
            "]"
          "},"
          "\"record_mode\":\"record-until-full\""
        "}", MemoryDumpManager::kTraceCategory, light_period, heavy_period);
  }

  static std::string GetTraceConfig_EmptyTriggers() {
    return StringPrintf(
        "{"
          "\"enable_argument_filter\":false,"
          "\"enable_sampling\":false,"
          "\"enable_systrace\":false,"
          "\"included_categories\":["
            "\"%s\""
          "],"
          "\"memory_dump_config\":{"
            "\"allowed_dump_modes\":[\"background\",\"light\",\"detailed\"],"
            "\"triggers\":["
            "]"
          "},"
          "\"record_mode\":\"record-until-full\""
        "}", MemoryDumpManager::kTraceCategory);
  }

  static std::string GetTraceConfig_NoTriggers() {
    return StringPrintf(
        "{"
          "\"enable_argument_filter\":false,"
          "\"enable_sampling\":false,"
          "\"enable_systrace\":false,"
          "\"included_categories\":["
            "\"%s\""
          "],"
          "\"record_mode\":\"record-until-full\""
        "}", MemoryDumpManager::kTraceCategory);
  }

  static std::string GetTraceConfig_BackgroundTrigger(int period_ms) {
    return StringPrintf(
        "{"
          "\"enable_argument_filter\":false,"
          "\"enable_sampling\":false,"
          "\"enable_systrace\":false,"
          "\"included_categories\":["
            "\"%s\""
          "],"
          "\"memory_dump_config\":{"
             "\"allowed_dump_modes\":[\"background\"],"
             "\"triggers\":["
              "{"
                "\"mode\":\"background\","
                "\"periodic_interval_ms\":%d"
              "}"
            "]"
          "},"
          "\"record_mode\":\"record-until-full\""
        "}", MemoryDumpManager::kTraceCategory, period_ms);
  }
};

}  // namespace trace_event
}  // namespace base

#endif  // BASE_TRACE_EVENT_TRACE_CONFIG_MEMORY_TEST_UTIL_H_
