/* * Copyright (C) 2017 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 <stdio.h> #include <sys/types.h> #include <unistd.h> #include <string> #include <android-base/file.h> #include <android-base/stringprintf.h> #include <gtest/gtest.h> // Test the APIs in this standalone include file #include <log/log_radio.h> TEST(liblog, RLOG) { static const char content[] = "log_radio.h"; static const char content_false[] = "log_radio.h false"; // ratelimit content to 10/s to keep away from spam filters // do not send identical content together to keep away from spam filters #undef LOG_TAG #define LOG_TAG "TEST__RLOGV" RLOGV(content); usleep(100000); #undef LOG_TAG #define LOG_TAG "TEST__RLOGD" RLOGD(content); usleep(100000); #undef LOG_TAG #define LOG_TAG "TEST__RLOGI" RLOGI(content); usleep(100000); #undef LOG_TAG #define LOG_TAG "TEST__RLOGW" RLOGW(content); usleep(100000); #undef LOG_TAG #define LOG_TAG "TEST__RLOGE" RLOGE(content); usleep(100000); #undef LOG_TAG #define LOG_TAG "TEST__RLOGV" RLOGV_IF(true, content); usleep(100000); RLOGV_IF(false, content_false); usleep(100000); #undef LOG_TAG #define LOG_TAG "TEST__RLOGD" RLOGD_IF(true, content); usleep(100000); RLOGD_IF(false, content_false); usleep(100000); #undef LOG_TAG #define LOG_TAG "TEST__RLOGI" RLOGI_IF(true, content); usleep(100000); RLOGI_IF(false, content_false); usleep(100000); #undef LOG_TAG #define LOG_TAG "TEST__RLOGW" RLOGW_IF(true, content); usleep(100000); RLOGW_IF(false, content_false); usleep(100000); #undef LOG_TAG #define LOG_TAG "TEST__RLOGE" RLOGE_IF(true, content); usleep(100000); RLOGE_IF(false, content_false); #ifdef __ANDROID__ // give time for content to long-path through logger sleep(1); std::string buf = android::base::StringPrintf( "logcat -b radio --pid=%u -d -s" " TEST__RLOGV TEST__RLOGD TEST__RLOGI TEST__RLOGW TEST__RLOGE", (unsigned)getpid()); FILE* fp = popen(buf.c_str(), "r"); int count = 0; int count_false = 0; if (fp) { if (!android::base::ReadFdToString(fileno(fp), &buf)) buf = ""; pclose(fp); for (size_t pos = 0; (pos = buf.find(content, pos)) != std::string::npos; ++pos) { ++count; } for (size_t pos = 0; (pos = buf.find(content_false, pos)) != std::string::npos; ++pos) { ++count_false; } } EXPECT_EQ(0, count_false); #if LOG_NDEBUG ASSERT_EQ(8, count); #else ASSERT_EQ(10, count); #endif #else GTEST_LOG_(INFO) << "This test does not test end-to-end.\n"; #endif }