1dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn/* 2dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * Copyright (C) 2017 The Android Open Source Project 3dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * 4dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 5dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * you may not use this file except in compliance with the License. 6dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * You may obtain a copy of the License at 7dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * 8dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 9dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * 10dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 11dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 12dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * See the License for the specific language governing permissions and 14dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn * limitations under the License. 15dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn */ 16dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn 17dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#include <stdio.h> 18dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#include <sys/types.h> 19dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#include <unistd.h> 20dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn 21dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#include <string> 22dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn 23dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#include <android-base/file.h> 24dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#include <android-base/stringprintf.h> 25dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#include <gtest/gtest.h> 26dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn// Test the APIs in this standalone include file 27dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#include <log/log_system.h> 28dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn 29dd61659e73e71d025979ba0001be0a81ea0e9711Mark SalyzynTEST(liblog, SLOG) { 302ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn static const char content[] = "log_system.h"; 312ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn static const char content_false[] = "log_system.h false"; 32dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn 332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn// ratelimit content to 10/s to keep away from spam filters 342ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn// do not send identical content together to keep away from spam filters 35dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn 36dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 37dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGV" 382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGV(content); 392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 40dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 41dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGD" 422ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGD(content); 432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 44dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 45dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGI" 462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGI(content); 472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 48dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 49dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGW" 502ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGW(content); 512ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 52dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 53dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGE" 542ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGE(content); 552ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 56dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 57dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGV" 582ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGV_IF(true, content); 592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGV_IF(false, content_false); 612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 62dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 63dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGD" 642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGD_IF(true, content); 652ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 662ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGD_IF(false, content_false); 672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 68dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 69dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGI" 702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGI_IF(true, content); 712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGI_IF(false, content_false); 732ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 74dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 75dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGW" 762ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGW_IF(true, content); 772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGW_IF(false, content_false); 792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 80dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#undef LOG_TAG 81dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#define LOG_TAG "TEST__SLOGE" 822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGE_IF(true, content); 832ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn usleep(100000); 842ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn SLOGE_IF(false, content_false); 85dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn 8662d0d2d683f5d19cf9d451548bd03c4b4f53c42eMark Salyzyn#ifdef __ANDROID__ 872ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn // give time for content to long-path through logger 882ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn sleep(1); 89dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn 902ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn std::string buf = android::base::StringPrintf( 912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn "logcat -b system --pid=%u -d -s" 922ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn " TEST__SLOGV TEST__SLOGD TEST__SLOGI TEST__SLOGW TEST__SLOGE", 932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (unsigned)getpid()); 942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn FILE* fp = popen(buf.c_str(), "r"); 952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int count = 0; 962ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn int count_false = 0; 972ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn if (fp) { 982ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn if (!android::base::ReadFdToString(fileno(fp), &buf)) buf = ""; 992ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn pclose(fp); 1002ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn for (size_t pos = 0; (pos = buf.find(content, pos)) != std::string::npos; 1012ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ++pos) { 1022ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ++count; 103dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn } 1042ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn for (size_t pos = 0; 1052ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (pos = buf.find(content_false, pos)) != std::string::npos; ++pos) { 1062ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ++count_false; 1072ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1082ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1092ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn EXPECT_EQ(0, count_false); 110dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#if LOG_NDEBUG 1112ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ASSERT_EQ(8, count); 112dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#else 1132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ASSERT_EQ(10, count); 114dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#endif 115dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn 116dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#else 1172ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn GTEST_LOG_(INFO) << "This test does not test end-to-end.\n"; 118dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn#endif 119dd61659e73e71d025979ba0001be0a81ea0e9711Mark Salyzyn} 120