1b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer/* 2b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * Copyright (C) 2018 The Android Open Source Project 3b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * 4b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * Licensed under the Apache License, Version 2.0 (the "License"); 5b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * you may not use this file except in compliance with the License. 6b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * You may obtain a copy of the License at 7b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * 8b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * http://www.apache.org/licenses/LICENSE-2.0 9b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * 10b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * Unless required by applicable law or agreed to in writing, software 11b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * distributed under the License is distributed on an "AS IS" BASIS, 12b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * See the License for the specific language governing permissions and 14b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer * limitations under the License. 15b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer */ 16b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer 17b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer#include "perfetto/base/watchdog.h" 18b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer 19b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer#include "gtest/gtest.h" 2044ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti#include "perfetto/base/logging.h" 2144ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti#include "perfetto/base/page_allocator.h" 22b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer 23b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer#include <time.h> 2444ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti#include <map> 25b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer 26b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayernamespace perfetto { 27b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayernamespace base { 28b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayernamespace { 29b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer 3044ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganticlass TestWatchdog : public Watchdog { 3144ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti public: 3222e4b396fcfd44ef7f70c5f2ecb8f665eee97742Florian Mayer explicit TestWatchdog(uint32_t polling_interval_ms) 3322e4b396fcfd44ef7f70c5f2ecb8f665eee97742Florian Mayer : Watchdog(polling_interval_ms) {} 3444ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti ~TestWatchdog() override {} 3544ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti TestWatchdog(TestWatchdog&& other) noexcept = default; 3644ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti}; 3744ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti 3844ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit MagantiTEST(WatchdogTest, TimerCrash) { 3944ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti // Create a timer for 20 ms and don't release wihin the time. 4044ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti EXPECT_DEATH( 4144ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti { 4244ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti TestWatchdog watchdog(100); 4344ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti auto handle = watchdog.CreateFatalTimer(20); 4444ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti usleep(200 * 1000); 4544ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti }, 4644ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti ""); 4744ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti} 4844ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti 4944ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit MagantiTEST(WatchdogTest, CrashEvenWhenMove) { 5044ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti std::map<int, Watchdog::Timer> timers; 51b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer EXPECT_DEATH( 52b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer { 5344ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti TestWatchdog watchdog(100); 5444ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti timers.emplace(0, watchdog.CreateFatalTimer(20)); 5544ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti usleep(200 * 1000); 5644ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti }, 5744ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti ""); 5844ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti} 5944ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti 6044ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit MagantiTEST(WatchdogTest, CrashMemory) { 6144ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti EXPECT_DEATH( 6244ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti { 6344ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti // Allocate 8MB of data and use it to increase RSS. 6444ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti const size_t kSize = 8 * 1024 * 1024; 6544ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti auto void_ptr = PageAllocator::Allocate(kSize); 6644ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti volatile uint8_t* ptr = static_cast<volatile uint8_t*>(void_ptr.get()); 6744ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti for (size_t i = 0; i < kSize; i += sizeof(size_t)) { 6844ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti *reinterpret_cast<volatile size_t*>(&ptr[i]) = i; 69b204a778f588ed1b0bf1e22c38c9b873401460c4Florian Mayer } 7044ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti 7144ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti TestWatchdog watchdog(5); 7244ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti watchdog.SetMemoryLimit(8 * 1024 * 1024, 25); 73e419ccbce05084404b0ae79a294696e65aa5b17cLalit Maganti watchdog.Start(); 7444ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti 7544ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti // Sleep so that the watchdog has some time to pick it up. 7644ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti usleep(1000 * 1000); 77b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer }, 78b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer ""); 79b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer} 80b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer 8144ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit MagantiTEST(WatchdogTest, CrashCpu) { 8244ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti EXPECT_DEATH( 8344ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti { 8444ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti TestWatchdog watchdog(1); 8544ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti watchdog.SetCpuLimit(10, 25); 86e419ccbce05084404b0ae79a294696e65aa5b17cLalit Maganti watchdog.Start(); 8744ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti volatile int x = 0; 8844ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti while (true) { 8944ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti x++; 9044ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti } 9144ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti }, 9244ff2a7b4dd36edfda57c0cc092c3ce05442a07aLalit Maganti ""); 93b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer} 94b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer 95b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer} // namespace 96b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer} // namespace base 97b43340086de2bfe2d411d471b065ea44fdb6e0b7Florian Mayer} // namespace perfetto 98