aosp12/system/testing/gtest_extras/Test.cpp

136 lines
3.2 KiB
C++

/*
* Copyright (C) 2014 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 <inttypes.h>
#include <stdio.h>
#include <unistd.h>
#include <regex>
#include <string>
#include <tuple>
#include <vector>
#include <android/log.h>
#include <gtest/gtest.h>
#include "Color.h"
#include "Log.h"
#include "NanoTime.h"
#include "Test.h"
namespace android {
namespace gtest_extras {
std::regex Test::skipped_regex_("(^|\\n)[^\\n]+:\\(\\d+\\) Skipped\\n");
Test::Test(std::tuple<std::string, std::string>& test, size_t index, size_t run_index, int fd)
: suite_name_(std::get<0>(test)),
test_name_(std::get<1>(test)),
name_(suite_name_ + test_name_),
test_index_(index),
run_index_(run_index),
fd_(fd),
start_ns_(NanoTime()) {}
void Test::Stop() {
end_ns_ = NanoTime();
}
void Test::CloseFd() {
if (fd_ != -1) {
close(fd_);
fd_ = -1;
}
}
void Test::Print() {
ColoredPrintf(COLOR_GREEN, "[ RUN ]");
printf(" %s\n", name_.c_str());
printf("%s", output_.c_str());
switch (result_) {
case TEST_PASS:
case TEST_XFAIL:
ColoredPrintf(COLOR_GREEN, "[ OK ]");
break;
case TEST_SKIPPED:
ColoredPrintf(COLOR_GREEN, "[ SKIPPED ]");
break;
default:
ColoredPrintf(COLOR_RED, "[ FAILED ]");
break;
}
printf(" %s", name_.c_str());
if (::testing::GTEST_FLAG(print_time)) {
printf(" (%" PRId64 " ms)", RunTimeNs() / kNsPerMs);
}
printf("\n");
fflush(stdout);
}
bool Test::Read() {
char buffer[2048];
ssize_t bytes = TEMP_FAILURE_RETRY(read(fd_, buffer, sizeof(buffer) - 1));
if (bytes < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
// Reading would block. Since this is not an error keep going.
return true;
}
FATAL_PLOG("Unexpected failure from read");
return false;
}
if (bytes == 0) {
return false;
}
buffer[bytes] = '\0';
output_ += buffer;
return true;
}
void Test::ReadUntilClosed() {
uint64_t start_ns = NanoTime();
while (fd_ != -1) {
if (!Read()) {
CloseFd();
break;
}
if (NanoTime() - start_ns > 2 * kNsPerS) {
printf("Reading of done process did not finish after 2 seconds.\n");
CloseFd();
break;
}
}
}
void Test::SetResultFromOutput() {
result_ = TEST_PASS;
// Need to parse the output to determine if this test was skipped.
// Format of a skipped test:
// <filename>:(<line_number>) Skipped
// <Skip Message>
// If there are multiple skip messages, it doesn't matter, seeing
// even one indicates this is a skipped test.
if (std::regex_search(output_, skipped_regex_)) {
result_ = TEST_SKIPPED;
}
}
} // namespace gtest_extras
} // namespace android