// Copyright (c) 2012 The Chromium OS 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 "cros-disks/process.h"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace cros_disks {

// A mock process class for testing the process base class.
class ProcessUnderTest : public Process {
 public:
  ProcessUnderTest() {}

  MOCK_METHOD0(Start, bool());
};

class ProcessTest : public ::testing::Test {
 protected:
  ProcessUnderTest process_;
};

TEST_F(ProcessTest, GetArguments) {
  static const char* const kTestArguments[] = {
    "/bin/ls", "-l", "", "."
  };
  static const size_t kNumTestArguments = arraysize(kTestArguments);
  for (size_t i = 0; i < kNumTestArguments; ++i) {
    process_.AddArgument(kTestArguments[i]);
  }

  char** arguments = process_.GetArguments();
  EXPECT_NE(nullptr, arguments);
  for (size_t i = 0; i < kNumTestArguments; ++i) {
    EXPECT_STREQ(kTestArguments[i], arguments[i]);
  }
  EXPECT_EQ(nullptr, arguments[kNumTestArguments]);
}

TEST_F(ProcessTest, GetArgumentsWithNoArgumentsAdded) {
  EXPECT_EQ(nullptr, process_.GetArguments());
}

}  // namespace cros_disks
