/*
 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_TEST_TEST_SUPPORT_TRACE_TO_STDERR_H_
#define WEBRTC_TEST_TEST_SUPPORT_TRACE_TO_STDERR_H_

#include "webrtc/system_wrappers/interface/trace.h"

namespace webrtc {
namespace test {

// Upon constructing an instance of this class, all traces will be redirected
// to stderr. At destruction, redirection is halted.
class TraceToStderr : public TraceCallback {
 public:
  TraceToStderr();
  // Set |override_time| to true to control the time printed with each trace
  // through SetTimeSeconds(). Otherwise, the trace's usual wallclock time is
  // used.
  //
  // This is useful for offline test tools, where the file time is much more
  // informative than the real time.
  explicit TraceToStderr(bool override_time);
  virtual ~TraceToStderr();

  // Every subsequent trace printout will use |time|. Has no effect if
  // |override_time| in the constructor was set to false.
  //
  // No attempt is made to ensure thread-safety between the trace writing and
  // time updating. In tests, since traces will normally be triggered by the
  // main thread doing the time updating, this should be of no concern.
  virtual void SetTimeSeconds(float time);

  // Implements TraceCallback.
  virtual void Print(TraceLevel level,
                     const char* msg_array,
                     int length) OVERRIDE;

 private:
  bool override_time_;
  float time_seconds_;
};

}  // namespace test
}  // namespace webrtc

#endif  // WEBRTC_TEST_TEST_SUPPORT_TRACE_TO_STDERR_H_
