// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "platform/assert.h"

#include "include/dart_api.h"
#include "platform/globals.h"
#include "platform/syslog.h"

#if defined(HOST_OS_ANDROID)
extern "C" __attribute__((weak)) void android_set_abort_message(const char*);
#endif  // defined(HOST_OS_ANDROID)

namespace dart {

bool Expect::failed_ = false;

void DynamicAssertionHelper::Print(const char* format,
                                   va_list arguments,
                                   bool will_abort /* = false */) {
  // Take only the last 1KB of the file name if it is longer.
  const intptr_t file_len = strlen(file_);
  const intptr_t file_offset = (file_len > (1 * KB)) ? file_len - (1 * KB) : 0;
  const char* file = file_ + file_offset;

  // Print the file and line number into the buffer.
  char buffer[4 * KB];
  MSAN_UNPOISON(buffer, sizeof(buffer));
  intptr_t file_and_line_length =
      snprintf(buffer, sizeof(buffer), "%s: %d: error: ", file, line_);

  // Print the error message into the buffer.
  vsnprintf(buffer + file_and_line_length,
            sizeof(buffer) - file_and_line_length, format, arguments);

  // Print the buffer on stderr and/or syslog.
  Syslog::PrintErr("%s\n", buffer);
#if defined(HOST_OS_ANDROID)
  if (will_abort && (&android_set_abort_message != nullptr)) {
    android_set_abort_message(buffer);
  }
#endif  // defined(HOST_OS_ANDROID)
}

void Assert::Fail(const char* format, ...) {
  va_list arguments;
  va_start(arguments, format);
  Print(format, arguments, /*will_abort=*/true);
  va_end(arguments);

  // Abort right away.
  Dart_DumpNativeStackTrace(NULL);
  Dart_PrepareToAbort();
  abort();
}

void Expect::Fail(const char* format, ...) {
  va_list arguments;
  va_start(arguments, format);
  Print(format, arguments);
  va_end(arguments);

  // Wait until the program is exiting before producing a non-zero exit
  // code through abort.
  failed_ = true;
}

}  // namespace dart
