// Copyright 2016 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 "thread_action_list.h"

#include "gtest/gtest.h"
#include "lib/fxl/arraysize.h"

namespace debugserver {
namespace {

constexpr size_t kMaxActions = 4;
constexpr zx_koid_t kCurProc = 42;
constexpr zx_koid_t kMinusOne = ~0ull;

struct Action {
  ThreadActionList::Action action;
  zx_koid_t pid, tid;
};

struct ActionTest {
  bool ok;
  const char* str;
  ThreadActionList::Action default_action;
  size_t nr_actions;
  Action actions[kMaxActions];
};

#define CONTINUE ThreadActionList::Action::kContinue
#define NONE ThreadActionList::Action::kNone

const ActionTest basic_tests[] = {
    {true, "c", CONTINUE, 0, {}},
    {true, "c;", CONTINUE, 0, {}},
    {true, "c:p1.1", NONE, 1, {{CONTINUE, 1, 1}}},
    {true, "c:3", NONE, 1, {{CONTINUE, kCurProc, 3}}},
    {true, "c:p-1.-1", NONE, 1, {{CONTINUE, kMinusOne, kMinusOne}}},
    {true,
     "c;c:p1.-1;c:p2.3",
     CONTINUE,
     2,
     {{CONTINUE, 1, kMinusOne}, {CONTINUE, 2, 3}}},
    {true, "c:p0.0", NONE, 1, {{CONTINUE, kCurProc, 0}}},

    {false, "", NONE, 0, {}},
    {false, "?", NONE, 0, {}},
    {false, "c?", NONE, 0, {}},
    {false, "c:?", NONE, 0, {}},
    {false, "c;;", NONE, 0, {}},
    {false, "c:p.3", NONE, 0, {}},
    // Multiple default actions is an error.
    {false, "c;c", NONE, 0, {}},
    // Specifying all processes and a specific thread is an error.
    {false, "c:p-1.1", NONE, 0, {}},
};

TEST(ThreadActionListTest, Basic) {
  for (size_t i = 0; i < arraysize(basic_tests); ++i) {
    const ActionTest* t = &basic_tests[i];
    FXL_LOG(INFO) << "Testing \"" << t->str << "\"";
    ThreadActionList actions(fxl::StringView(t->str), kCurProc);
    EXPECT_EQ(t->ok, actions.valid());
    if (t->ok) {
      EXPECT_EQ(t->default_action, actions.default_action());
      auto v = actions.actions();
      EXPECT_EQ(t->nr_actions, v.size());
      if (t->nr_actions == v.size()) {
        for (size_t j = 0; j < t->nr_actions; ++j) {
          EXPECT_EQ(t->actions[j].action, v[j].action());
          EXPECT_EQ(t->actions[j].pid, v[j].pid());
          EXPECT_EQ(t->actions[j].tid, v[j].tid());
        }
      }
    }
  }
}

}  // anonymous namespace
}  // namespace debugserver
