TestForkerEventListener.cpp revision eab33fc589a8e1ca04f5703b5f1ace69f8ff9aea
1eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin/* 2eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * Copyright (C) 2012 The Android Open Source Project 3eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * 4eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * you may not use this file except in compliance with the License. 6eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * You may obtain a copy of the License at 7eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * 8eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * 10eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * Unless required by applicable law or agreed to in writing, software 11eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * See the License for the specific language governing permissions and 14eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * limitations under the License. 15eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin */ 16eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 17eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#include <unistd.h> 18eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#include <sys/types.h> 19eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#include <sys/wait.h> 20eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#include <string.h> 21eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 22eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#include <gtest/gtest.h> 23eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 24eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#include "TestForkerEventListener.h" 25eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#include "TestExtensions.h" 26eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 27eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#define DEBUG_TEST_FORKER_EVENT_LISTENER 0 28eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 29eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#define RETURN_CODE_PASSED 0 30eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#define RETURN_CODE_FAILED 1 31eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 32eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinnamespace android { 33eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinnamespace camera2 { 34eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinnamespace tests { 35eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 36eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinbool TestForkerEventListener::mUsingForking = true; 37eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinbool TestForkerEventListener::mIsForked = false; 38eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 39eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTestForkerEventListener::TestForkerEventListener() { 40eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin mIsForked = false; 41eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin mHasSucceeded = true; 42eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin mTermSignal = 0; 43eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin} 44eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 45eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinvoid TestForkerEventListener::SetForking(bool enabled) { 46eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin mUsingForking = enabled; 47eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin} 48eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 49eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin// Called before a test starts. 50eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinvoid TestForkerEventListener::OnTestStart(const ::testing::TestInfo&) { 51eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 52eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin if (!TEST_EXTENSION_FORKING_ENABLED) { 53eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin return; 54eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } 55eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 56eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin pid_t childPid = fork(); 57eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin if (childPid != 0) { 58eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin int status; 59eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin waitpid(childPid, &status, /*options*/0); 60eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 61eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin // terminated normally? 62eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin mHasSucceeded = WIFEXITED(status); 63eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin // terminate with return code 0 = test passed, 1 = test failed 64eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin if (mHasSucceeded) { 65eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin mHasSucceeded = WEXITSTATUS(status) == RETURN_CODE_PASSED; 66eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } else if (WIFSIGNALED(status)) { 67eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin mTermSignal = WTERMSIG(status); 68eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } 69eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 70eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin /* the test is then skipped by inserting the various 71eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin TEST_EXTENSION_ macros in TestExtensions.h */ 72eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 73eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } else { 74eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin mIsForked = true; 75eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } 76eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin} 77eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 78eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin// Called after a failed assertion or a SUCCEED() invocation. 79eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinvoid TestForkerEventListener::OnTestPartResult( 80eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin const ::testing::TestPartResult& test_part_result) { 81eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 82eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin if (DEBUG_TEST_FORKER_EVENT_LISTENER) { 83eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin printf("%s in %s:%d\n%s\n", 84eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin test_part_result.failed() ? "*** Failure" : "Success", 85eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin test_part_result.file_name(), 86eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin test_part_result.line_number(), 87eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin test_part_result.summary()); 88eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } 89eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin} 90eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 91eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin// Called after a test ends. 92eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinvoid TestForkerEventListener::OnTestEnd(const ::testing::TestInfo& test_info) { 93eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 94eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin if (!TEST_EXTENSION_FORKING_ENABLED) { 95eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin return; 96eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } 97eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 98eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin if (mIsForked) { 99eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin exit(test_info.result()->Passed() 100eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin ? RETURN_CODE_PASSED : RETURN_CODE_FAILED); 101eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } else if (!mHasSucceeded && mTermSignal != 0) { 102eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 103eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin printf("*** Test %s.%s crashed with signal = %s\n", 104eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin test_info.test_case_name(), test_info.name(), 105eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin strsignal(mTermSignal)); 106eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } 107eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 108eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin //TODO: overload the default event listener to suppress this message 109eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin // dynamically (e.g. by skipping OnTestPartResult after OnTestEnd ) 110eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 111eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin // trigger a test failure if the child has failed 112eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin if (!mHasSucceeded) { 113eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin ADD_FAILURE(); 114eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin } 115eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin mTermSignal = 0; 116eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin} 117eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 118eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 119eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin} 120eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin} 121eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin} 122eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin 123