// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stdint.h>
#include <zircon/status.h>

#include <zxtest/zxtest.h>

#include "src/sys/bin/psutils/ps_internal.h"

// Last character koid of deepest entry was getting dropped, see
// https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=7014#c48.
TEST(PsUtilsPrintTable, FullKoid) {
  char buf[4096];
  FILE* f = fmemopen(buf, sizeof(buf), "w");
  ASSERT_TRUE(f != NULL);

  ps_options_t options = {.also_show_threads = false, .only_show_jobs = false, .format_unit = 0};
  task_entry_t entries[] = {
      {
          .type = 'j',
          .koid_str = "123456",
          .parent_koid_str = "0",
          .depth = 0,
          .name = "root",
          .state_str = "",
          .pss_bytes = 1234 * 1024 * 1024,
          .private_bytes = 1234 * 1024 * 1024,
          .shared_bytes = 1234 * 1024 * 1024,
      },
      {
          .type = 'j',
          .koid_str = "7894567",
          .parent_koid_str = "123456",
          .depth = 1,
          .name = "my-job",
          .state_str = "",
          .pss_bytes = 1234 * 1024 * 1024,
          .private_bytes = 1234 * 1024 * 1024,
          .shared_bytes = 1234 * 1024 * 1024,
      },
      {
          .type = 'p',
          .koid_str = "123456789",
          .parent_koid_str = "7894567",
          .depth = 2,
          .name = "my-proc",
          .state_str = "",
          .pss_bytes = 1234 * 1024 * 1024,
          .private_bytes = 1234 * 1024 * 1024,
          .shared_bytes = 1234 * 1024 * 1024,
      },
  };
  task_table_t table = {.entries = entries, .num_entries = 3, .capacity = 3};
  print_table(&table, &options, f);
  fclose(f);
  EXPECT_EQ(strcmp(buf,
                   "TASK                 PSS PRIVATE  SHARED   STATE NAME\n"
                   "j: 123456          1234M   1234M                 root\n"
                   "  j: 7894567       1234M   1234M                 my-job\n"
                   "    p: 123456789   1234M   1234M   1234M         my-proc\n"
                   "TASK                 PSS PRIVATE  SHARED   STATE NAME\n"),
            0);
}

TEST(PsUtilsPs, PrintAll) {
  ps_options_t options = {.also_show_threads = false, .only_show_jobs = false, .format_unit = 0};
  ASSERT_OK(show_all_jobs(&options));
}

TEST(PsUtilsPs, PrintAllThreads) {
  ps_options_t options = {.also_show_threads = true, .only_show_jobs = false, .format_unit = 0};
  ASSERT_OK(show_all_jobs(&options));
}

TEST(PsUtilsPs, PrintAllJobs) {
  ps_options_t options = {.also_show_threads = false, .only_show_jobs = true, .format_unit = 0};
  ASSERT_OK(show_all_jobs(&options));
}
