/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <gtest/gtest.h>

#include <workload.h>

#include <chrono>

using namespace std::chrono;

TEST(workload, smoke) {
  auto workload = Workload::CreateWorkload({"sleep", "1"});
  ASSERT_TRUE(workload != nullptr);
  ASSERT_FALSE(workload->IsFinished());
  ASSERT_TRUE(workload->GetPid() != 0);
  auto start_time = steady_clock::now();
  ASSERT_TRUE(workload->Start());
  ASSERT_FALSE(workload->IsFinished());
  workload->WaitFinish();
  ASSERT_TRUE(workload->IsFinished());
  auto end_time = steady_clock::now();
  ASSERT_TRUE(end_time >= start_time + seconds(1));
}

TEST(workload, execvp_failure) {
  auto workload = Workload::CreateWorkload({"/dev/null"});
  ASSERT_TRUE(workload != nullptr);
  ASSERT_FALSE(workload->Start());
}
