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