blob: e69ae2ac445514ace756f4058abfe4ed856db8a4 [file] [log] [blame]
// Copyright 2020 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 "args.h"
#include <stdio.h>
#include <zircon/status.h>
#include <zircon/syscalls.h>
#include <string>
#include <variant>
#include <fbl/span.h>
#include <gtest/gtest.h>
namespace hwstress {
namespace {
TEST(Args, ParseHelp) {
EXPECT_TRUE(ParseArgs({{"hwstress", "--help"}})->help);
EXPECT_TRUE(ParseArgs({{"hwstress", "-h"}})->help);
}
TEST(Args, ParseSubcommand) {
// Subcommand given.
EXPECT_EQ(ParseArgs({{"hwstress", "cpu"}})->subcommand, StressTest::kCpu);
EXPECT_EQ(ParseArgs({{"hwstress", "memory"}})->subcommand, StressTest::kMemory);
// No subcommand given.
EXPECT_TRUE(ParseArgs({{"hwstress"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "bad_subcommand"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "-d", "3"}}).is_error());
}
TEST(Args, ParseDuration) {
// Good duration specified.
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "-d", "5"}})->test_duration_seconds, 5.0);
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "-d", "0.1"}})->test_duration_seconds, 0.1);
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "--duration", "3"}})->test_duration_seconds, 3.0);
// Bad durations.
EXPECT_TRUE(ParseArgs({{"hwstress", "cpu", "-d", "x"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "cpu", "-d", "-3"}}).is_error());
}
TEST(Args, ParseFlash) {
// Flash subcommand given with FVM path provided
EXPECT_EQ(ParseArgs({{"hwstress", "flash", "-f", "/path"}})->subcommand, StressTest::kFlash);
EXPECT_EQ(ParseArgs({{"hwstress", "flash", "--fvm-path", "/path"}})->subcommand,
StressTest::kFlash);
EXPECT_EQ(ParseArgs({{"hwstress", "flash", "-f", "/path/to/fvm"}})->fvm_path, "/path/to/fvm");
EXPECT_EQ(ParseArgs({{"hwstress", "flash", "--fvm-path", "/fvm/path"}})->fvm_path, "/fvm/path");
// Flash subcommand given without FVM path
EXPECT_TRUE(ParseArgs({{"hwstress", "flash"}}).is_error());
}
TEST(Args, ParseMemory) {
// No optional arguments.
CommandLineArgs args = ParseArgs({{"hwstress", "memory"}}).value();
EXPECT_FALSE(args.ram_to_test_percent.has_value());
EXPECT_FALSE(args.mem_to_test_megabytes.has_value());
// Arguments given.
EXPECT_EQ(ParseArgs({{"hwstress", "memory", "--memory", "123"}})->mem_to_test_megabytes,
cmdline::Optional<int64_t>(123));
EXPECT_EQ(ParseArgs({{"hwstress", "memory", "--percent-memory", "12"}})->ram_to_test_percent,
cmdline::Optional<int64_t>(12));
// Errors
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--memory", "0"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--memory", "-5"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--memory", "18446744073709551617"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--memory", "0.5"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--memory", "lots"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--memory", ""}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--percent-memory", "0"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--percent-memory", "-5"}}).is_error());
EXPECT_TRUE(
ParseArgs({{"hwstress", "memory", "--percent-memory", "18446744073709551617"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--percent-memory", "100"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--percent-memory", "0.5"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--percent-memory", "3%"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "memory", "--percent-memory", ""}}).is_error());
}
TEST(Args, ParseCpu) {
// Utilization values.
EXPECT_EQ(ParseArgs({{"hwstress", "cpu"}})->utilization_percent, 100.0); // default
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "-u", "100"}})->utilization_percent, 100.0);
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "-u", "50"}})->utilization_percent, 50.0);
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "-u", "25.5"}})->utilization_percent, 25.5);
EXPECT_TRUE(ParseArgs({{"hwstress", "cpu", "-u", "-3"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "cpu", "-u"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "cpu", "-u", "0"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "cpu", "-u", "101"}}).is_error());
// Workload values
EXPECT_EQ(ParseArgs({{"hwstress", "cpu"}})->cpu_workload, "");
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "-w", "xyz"}})->cpu_workload, "xyz");
}
TEST(Args, ParseLogLevel) {
EXPECT_EQ(ParseArgs({{"hwstress", "cpu"}})->log_level, "normal");
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "--logging-level", "Terse"}})->log_level, "Terse");
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "-l", "Verbose"}})->log_level, "Verbose");
EXPECT_TRUE(ParseArgs({{"hwstress", "cpu", "-l", "Bad"}}).is_error());
}
TEST(Args, ParseLight) {
EXPECT_TRUE(ParseArgs({{"hwstress", "light"}}).is_ok());
EXPECT_EQ(ParseArgs({{"hwstress", "light", "--light-on-time=0.25"}})->light_on_time_seconds,
0.25);
EXPECT_EQ(ParseArgs({{"hwstress", "light", "--light-off-time=0.25"}})->light_off_time_seconds,
0.25);
EXPECT_TRUE(ParseArgs({{"hwstress", "light", "--light-on-time=-3"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "light", "--light-off-time=-3"}}).is_error());
}
TEST(Args, ParseIterations) {
EXPECT_EQ(ParseArgs({{"hwstress", "flash", "--fvm-path=abc"}})->iterations,
static_cast<uint64_t>(0));
EXPECT_EQ(ParseArgs({{"hwstress", "flash", "--fvm-path=abc", "--iterations=7"}})->iterations,
static_cast<uint64_t>(7));
EXPECT_EQ(ParseArgs({{"hwstress", "flash", "--fvm-path=abc", "-i", "11"}})->iterations,
static_cast<uint64_t>(11));
EXPECT_TRUE(ParseArgs({{"hwstress", "flash", "--fvm-path=abc", "--iterations=1", "--duration=2"}})
.is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "flash", "--fvm-path=abc", "--iterations=1.5"}}).is_error());
}
TEST(Args, ParseCores) {
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "--cpu-cores=0"}})->cores_to_test.cores,
std::vector<uint32_t>({0}));
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "--cpu-cores=2,1"}})->cores_to_test.cores,
std::vector<uint32_t>({2, 1}));
EXPECT_EQ(ParseArgs({{"hwstress", "cpu", "-p", "0,3"}})->cores_to_test.cores,
std::vector<uint32_t>({0, 3}));
EXPECT_FALSE(ParseArgs({{"hwstress", "cpu"}})->cores_to_test.cores.empty());
EXPECT_TRUE(ParseArgs({{"hwstress", "cpu", "--cpu-cores=a"}}).is_error());
EXPECT_TRUE(ParseArgs({{"hwstress", "cpu", "--cpu-cores=1.0"}}).is_error());
}
} // namespace
} // namespace hwstress