Remove unused android files Change-Id: I64d12853c00480a0525eb3831018bc4e143932ab Reviewed-on: https://gn-review.googlesource.com/1406 Reviewed-by: Brett Wilson <brettw@chromium.org> Commit-Queue: Scott Graham <scottmg@chromium.org>
diff --git a/base/base_paths_android.cc b/base/base_paths_android.cc deleted file mode 100644 index 078f565..0000000 --- a/base/base_paths_android.cc +++ /dev/null
@@ -1,66 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Defines base::PathProviderAndroid which replaces base::PathProviderPosix for -// Android in base/path_service.cc. - -#include <limits.h> -#include <unistd.h> - -#include "base/android/jni_android.h" -#include "base/android/path_utils.h" -#include "base/base_paths.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/process/process_metrics.h" - -namespace base { - -bool PathProviderAndroid(int key, FilePath* result) { - switch (key) { - case base::FILE_EXE: { - FilePath bin_dir; - if (!ReadSymbolicLink(FilePath(kProcSelfExe), &bin_dir)) { - NOTREACHED() << "Unable to resolve " << kProcSelfExe << "."; - return false; - } - *result = bin_dir; - return true; - } - case base::FILE_MODULE: - // dladdr didn't work in Android as only the file name was returned. - NOTIMPLEMENTED(); - return false; - case base::DIR_MODULE: - return base::android::GetNativeLibraryDirectory(result); - case base::DIR_SOURCE_ROOT: - // Used only by tests. - // In that context, hooked up via base/test/test_support_android.cc. - NOTIMPLEMENTED(); - return false; - case base::DIR_USER_DESKTOP: - // Android doesn't support GetUserDesktop. - NOTIMPLEMENTED(); - return false; - case base::DIR_CACHE: - return base::android::GetCacheDirectory(result); - case base::DIR_ASSETS: - // On Android assets are normally loaded from the APK using - // base::android::OpenApkAsset(). In tests, since the assets are no - // packaged, DIR_ASSETS is overridden to point to the build directory. - return false; - case base::DIR_ANDROID_APP_DATA: - return base::android::GetDataDirectory(result); - case base::DIR_ANDROID_EXTERNAL_STORAGE: - return base::android::GetExternalStorageDirectory(result); - default: - // Note: the path system expects this function to override the default - // behavior. So no need to log an error if we don't support a given - // path. The system will just use the default. - return false; - } -} - -} // namespace base
diff --git a/base/base_paths_android.h b/base/base_paths_android.h deleted file mode 100644 index 7a9ac4a..0000000 --- a/base/base_paths_android.h +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_BASE_PATHS_ANDROID_H_ -#define BASE_BASE_PATHS_ANDROID_H_ - -// This file declares Android-specific path keys for the base module. -// These can be used with the PathService to access various special -// directories and files. - -namespace base { - -enum { - PATH_ANDROID_START = 300, - - DIR_ANDROID_APP_DATA, // Directory where to put Android app's data. - DIR_ANDROID_EXTERNAL_STORAGE, // Android external storage directory. - - PATH_ANDROID_END -}; - -} // namespace base - -#endif // BASE_BASE_PATHS_ANDROID_H_
diff --git a/base/debug/stack_trace_android.cc b/base/debug/stack_trace_android.cc deleted file mode 100644 index 329204c..0000000 --- a/base/debug/stack_trace_android.cc +++ /dev/null
@@ -1,134 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/debug/stack_trace.h" - -#include <android/log.h> -#include <stddef.h> -#include <unwind.h> - -#include <algorithm> -#include <ostream> - -#include "base/debug/proc_maps_linux.h" -#include "base/strings/stringprintf.h" -#include "base/threading/thread_restrictions.h" - -#ifdef __LP64__ -#define FMT_ADDR "0x%016lx" -#else -#define FMT_ADDR "0x%08x" -#endif - -namespace { - -struct StackCrawlState { - StackCrawlState(uintptr_t* frames, size_t max_depth) - : frames(frames), - frame_count(0), - max_depth(max_depth), - have_skipped_self(false) {} - - uintptr_t* frames; - size_t frame_count; - size_t max_depth; - bool have_skipped_self; -}; - -_Unwind_Reason_Code TraceStackFrame(_Unwind_Context* context, void* arg) { - StackCrawlState* state = static_cast<StackCrawlState*>(arg); - uintptr_t ip = _Unwind_GetIP(context); - - // The first stack frame is this function itself. Skip it. - if (ip != 0 && !state->have_skipped_self) { - state->have_skipped_self = true; - return _URC_NO_REASON; - } - - state->frames[state->frame_count++] = ip; - if (state->frame_count >= state->max_depth) - return _URC_END_OF_STACK; - return _URC_NO_REASON; -} - -} // namespace - -namespace base { -namespace debug { - -bool EnableInProcessStackDumping() { - // When running in an application, our code typically expects SIGPIPE - // to be ignored. Therefore, when testing that same code, it should run - // with SIGPIPE ignored as well. - // TODO(phajdan.jr): De-duplicate this SIGPIPE code. - struct sigaction action; - memset(&action, 0, sizeof(action)); - action.sa_handler = SIG_IGN; - sigemptyset(&action.sa_mask); - return (sigaction(SIGPIPE, &action, NULL) == 0); -} - -StackTrace::StackTrace(size_t count) { - count = std::min(arraysize(trace_), count); - - StackCrawlState state(reinterpret_cast<uintptr_t*>(trace_), count); - _Unwind_Backtrace(&TraceStackFrame, &state); - count_ = state.frame_count; -} - -void StackTrace::Print() const { - std::string backtrace = ToString(); - __android_log_write(ANDROID_LOG_ERROR, "chromium", backtrace.c_str()); -} - -// NOTE: Native libraries in APKs are stripped before installing. Print out the -// relocatable address and library names so host computers can use tools to -// symbolize and demangle (e.g., addr2line, c++filt). -void StackTrace::OutputToStream(std::ostream* os) const { - std::string proc_maps; - std::vector<MappedMemoryRegion> regions; - // Allow IO to read /proc/self/maps. Reading this file doesn't hit the disk - // since it lives in procfs, and this is currently used to print a stack trace - // on fatal log messages in debug builds only. If the restriction is enabled - // then it will recursively trigger fatal failures when this enters on the - // UI thread. - base::ThreadRestrictions::ScopedAllowIO allow_io; - if (!ReadProcMaps(&proc_maps)) { - __android_log_write( - ANDROID_LOG_ERROR, "chromium", "Failed to read /proc/self/maps"); - } else if (!ParseProcMaps(proc_maps, ®ions)) { - __android_log_write( - ANDROID_LOG_ERROR, "chromium", "Failed to parse /proc/self/maps"); - } - - for (size_t i = 0; i < count_; ++i) { - // Subtract one as return address of function may be in the next - // function when a function is annotated as noreturn. - uintptr_t address = reinterpret_cast<uintptr_t>(trace_[i]) - 1; - - std::vector<MappedMemoryRegion>::iterator iter = regions.begin(); - while (iter != regions.end()) { - if (address >= iter->start && address < iter->end && - !iter->path.empty()) { - break; - } - ++iter; - } - - *os << base::StringPrintf("#%02zd " FMT_ADDR " ", i, address); - - if (iter != regions.end()) { - uintptr_t rel_pc = address - iter->start + iter->offset; - const char* path = iter->path.c_str(); - *os << base::StringPrintf("%s+" FMT_ADDR, path, rel_pc); - } else { - *os << "<unknown>"; - } - - *os << "\n"; - } -} - -} // namespace debug -} // namespace base
diff --git a/base/files/file_util_android.cc b/base/files/file_util_android.cc deleted file mode 100644 index b8b3b37..0000000 --- a/base/files/file_util_android.cc +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/files/file_util.h" - -#include "base/files/file_path.h" -#include "base/path_service.h" - -namespace base { - -bool GetShmemTempDir(bool executable, base::FilePath* path) { - return PathService::Get(base::DIR_CACHE, path); -} - -} // namespace base
diff --git a/base/memory/platform_shared_memory_region_android.cc b/base/memory/platform_shared_memory_region_android.cc deleted file mode 100644 index 664d3d4..0000000 --- a/base/memory/platform_shared_memory_region_android.cc +++ /dev/null
@@ -1,190 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/memory/platform_shared_memory_region.h" - -#include <sys/mman.h> - -#include "base/memory/shared_memory_tracker.h" -#include "base/posix/eintr_wrapper.h" -#include "third_party/ashmem/ashmem.h" - -namespace base { -namespace subtle { - -// For Android, we use ashmem to implement SharedMemory. ashmem_create_region -// will automatically pin the region. We never explicitly call pin/unpin. When -// all the file descriptors from different processes associated with the region -// are closed, the memory buffer will go away. - -namespace { - -static int GetAshmemRegionProtectionMask(int fd) { - int prot = ashmem_get_prot_region(fd); - if (prot < 0) { - DPLOG(ERROR) << "ashmem_get_prot_region failed"; - return -1; - } - return prot; -} - -} // namespace - -// static -PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Take( - ScopedFD fd, - Mode mode, - size_t size, - const UnguessableToken& guid) { - if (!fd.is_valid()) - return {}; - - if (size == 0) - return {}; - - if (size > static_cast<size_t>(std::numeric_limits<int>::max())) - return {}; - - CHECK(CheckPlatformHandlePermissionsCorrespondToMode(fd.get(), mode, size)); - - return PlatformSharedMemoryRegion(std::move(fd), mode, size, guid); -} - -int PlatformSharedMemoryRegion::GetPlatformHandle() const { - return handle_.get(); -} - -bool PlatformSharedMemoryRegion::IsValid() const { - return handle_.is_valid(); -} - -PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Duplicate() const { - if (!IsValid()) - return {}; - - CHECK_NE(mode_, Mode::kWritable) - << "Duplicating a writable shared memory region is prohibited"; - - ScopedFD duped_fd(HANDLE_EINTR(dup(handle_.get()))); - if (!duped_fd.is_valid()) { - DPLOG(ERROR) << "dup(" << handle_.get() << ") failed"; - return {}; - } - - return PlatformSharedMemoryRegion(std::move(duped_fd), mode_, size_, guid_); -} - -bool PlatformSharedMemoryRegion::ConvertToReadOnly() { - if (!IsValid()) - return false; - - CHECK_EQ(mode_, Mode::kWritable) - << "Only writable shared memory region can be converted to read-only"; - - ScopedFD handle_copy(handle_.release()); - - int prot = GetAshmemRegionProtectionMask(handle_copy.get()); - if (prot < 0) - return false; - - prot &= ~PROT_WRITE; - int ret = ashmem_set_prot_region(handle_copy.get(), prot); - if (ret != 0) { - DPLOG(ERROR) << "ashmem_set_prot_region failed"; - return false; - } - - handle_ = std::move(handle_copy); - mode_ = Mode::kReadOnly; - return true; -} - -bool PlatformSharedMemoryRegion::MapAt(off_t offset, - size_t size, - void** memory, - size_t* mapped_size) const { - if (!IsValid()) - return false; - - size_t end_byte; - if (!CheckAdd(offset, size).AssignIfValid(&end_byte) || end_byte > size_) { - return false; - } - - bool write_allowed = mode_ != Mode::kReadOnly; - *memory = mmap(nullptr, size, PROT_READ | (write_allowed ? PROT_WRITE : 0), - MAP_SHARED, handle_.get(), offset); - - bool mmap_succeeded = *memory && *memory != reinterpret_cast<void*>(-1); - if (!mmap_succeeded) { - DPLOG(ERROR) << "mmap " << handle_.get() << " failed"; - return false; - } - - *mapped_size = size; - DCHECK_EQ(0U, - reinterpret_cast<uintptr_t>(*memory) & (kMapMinimumAlignment - 1)); - return true; -} - -// static -PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Create(Mode mode, - size_t size) { - if (size == 0) - return {}; - - if (size > static_cast<size_t>(std::numeric_limits<int>::max())) - return {}; - - CHECK_NE(mode, Mode::kReadOnly) << "Creating a region in read-only mode will " - "lead to this region being non-modifiable"; - - UnguessableToken guid = UnguessableToken::Create(); - - ScopedFD fd(ashmem_create_region( - SharedMemoryTracker::GetDumpNameForTracing(guid).c_str(), size)); - if (!fd.is_valid()) { - DPLOG(ERROR) << "ashmem_create_region failed"; - return {}; - } - - int err = ashmem_set_prot_region(fd.get(), PROT_READ | PROT_WRITE); - if (err < 0) { - DPLOG(ERROR) << "ashmem_set_prot_region failed"; - return {}; - } - - return PlatformSharedMemoryRegion(std::move(fd), mode, size, guid); -} - -bool PlatformSharedMemoryRegion::CheckPlatformHandlePermissionsCorrespondToMode( - PlatformHandle handle, - Mode mode, - size_t size) { - int prot = GetAshmemRegionProtectionMask(handle); - if (prot < 0) - return false; - - bool is_read_only = (prot & PROT_WRITE) == 0; - bool expected_read_only = mode == Mode::kReadOnly; - - if (is_read_only != expected_read_only) { - DLOG(ERROR) << "Ashmem region has a wrong protection mask: it is" - << (is_read_only ? " " : " not ") << "read-only but it should" - << (expected_read_only ? " " : " not ") << "be"; - return false; - } - - return true; -} - -PlatformSharedMemoryRegion::PlatformSharedMemoryRegion( - ScopedFD fd, - Mode mode, - size_t size, - const UnguessableToken& guid) - : handle_(std::move(fd)), mode_(mode), size_(size), guid_(guid) {} - -} // namespace subtle -} // namespace base
diff --git a/base/memory/shared_memory_android.cc b/base/memory/shared_memory_android.cc deleted file mode 100644 index c126767..0000000 --- a/base/memory/shared_memory_android.cc +++ /dev/null
@@ -1,75 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/memory/shared_memory.h" - -#include <stddef.h> -#include <sys/mman.h> - -#include "base/logging.h" -#include "third_party/ashmem/ashmem.h" - -namespace base { - -// For Android, we use ashmem to implement SharedMemory. ashmem_create_region -// will automatically pin the region. We never explicitly call pin/unpin. When -// all the file descriptors from different processes associated with the region -// are closed, the memory buffer will go away. - -bool SharedMemory::Create(const SharedMemoryCreateOptions& options) { - DCHECK(!shm_.IsValid()); - - if (options.size > static_cast<size_t>(std::numeric_limits<int>::max())) - return false; - - // "name" is just a label in ashmem. It is visible in /proc/pid/maps. - int fd = ashmem_create_region( - options.name_deprecated ? options.name_deprecated->c_str() : "", - options.size); - shm_ = SharedMemoryHandle::ImportHandle(fd, options.size); - if (!shm_.IsValid()) { - DLOG(ERROR) << "Shared memory creation failed"; - return false; - } - - int flags = PROT_READ | PROT_WRITE | (options.executable ? PROT_EXEC : 0); - int err = ashmem_set_prot_region(shm_.GetHandle(), flags); - if (err < 0) { - DLOG(ERROR) << "Error " << err << " when setting protection of ashmem"; - return false; - } - - requested_size_ = options.size; - - return true; -} - -bool SharedMemory::Delete(const std::string& name) { - // Like on Windows, this is intentionally returning true as ashmem will - // automatically releases the resource when all FDs on it are closed. - return true; -} - -bool SharedMemory::Open(const std::string& name, bool read_only) { - // ashmem doesn't support name mapping - NOTIMPLEMENTED(); - return false; -} - -void SharedMemory::Close() { - if (shm_.IsValid()) { - shm_.Close(); - shm_ = SharedMemoryHandle(); - } -} - -SharedMemoryHandle SharedMemory::GetReadOnlyHandle() const { - // There are no read-only Ashmem descriptors on Android. - // Instead, the protection mask is a property of the region itself. - SharedMemoryHandle handle = shm_.Duplicate(); - handle.SetReadOnly(); - return handle; -} - -} // namespace base
diff --git a/base/memory/shared_memory_handle_android.cc b/base/memory/shared_memory_handle_android.cc deleted file mode 100644 index 1b61535..0000000 --- a/base/memory/shared_memory_handle_android.cc +++ /dev/null
@@ -1,115 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/memory/shared_memory_handle.h" - -#include <sys/mman.h> -#include <unistd.h> - -#include "base/logging.h" -#include "base/posix/eintr_wrapper.h" -#include "base/posix/unix_domain_socket.h" -#include "base/unguessable_token.h" -#include "third_party/ashmem/ashmem.h" - -namespace base { - -static int GetAshmemRegionProtectionMask(int fd) { - int prot = ashmem_get_prot_region(fd); - if (prot < 0) { - DPLOG(ERROR) << "ashmem_get_prot_region"; - return -1; - } - return prot; -} - -SharedMemoryHandle::SharedMemoryHandle() = default; - -SharedMemoryHandle::SharedMemoryHandle( - const base::FileDescriptor& file_descriptor, - size_t size, - const base::UnguessableToken& guid) - : guid_(guid), size_(size) { - DCHECK_GE(file_descriptor.fd, 0); - file_descriptor_ = file_descriptor; -} - -// static -SharedMemoryHandle SharedMemoryHandle::ImportHandle(int fd, size_t size) { - SharedMemoryHandle handle; - handle.file_descriptor_.fd = fd; - handle.file_descriptor_.auto_close = false; - handle.guid_ = UnguessableToken::Create(); - handle.size_ = size; - return handle; -} - -int SharedMemoryHandle::GetHandle() const { - DCHECK(IsValid()); - return file_descriptor_.fd; -} - -bool SharedMemoryHandle::IsValid() const { - return file_descriptor_.fd >= 0; -} - -void SharedMemoryHandle::Close() const { - DCHECK(IsValid()); - if (IGNORE_EINTR(close(file_descriptor_.fd)) < 0) - PLOG(ERROR) << "close"; -} - -int SharedMemoryHandle::Release() { - int old_fd = file_descriptor_.fd; - file_descriptor_.fd = -1; - return old_fd; -} - -SharedMemoryHandle SharedMemoryHandle::Duplicate() const { - DCHECK(IsValid()); - SharedMemoryHandle result; - int duped_handle = HANDLE_EINTR(dup(file_descriptor_.fd)); - if (duped_handle >= 0) { - result = SharedMemoryHandle(FileDescriptor(duped_handle, true), GetSize(), - GetGUID()); - if (IsReadOnly()) - result.SetReadOnly(); - } - return result; -} - -void SharedMemoryHandle::SetOwnershipPassesToIPC(bool ownership_passes) { - file_descriptor_.auto_close = ownership_passes; -} - -bool SharedMemoryHandle::OwnershipPassesToIPC() const { - return file_descriptor_.auto_close; -} - -bool SharedMemoryHandle::IsRegionReadOnly() const { - int prot = GetAshmemRegionProtectionMask(file_descriptor_.fd); - return (prot >= 0 && (prot & PROT_WRITE) == 0); -} - -bool SharedMemoryHandle::SetRegionReadOnly() const { - int fd = file_descriptor_.fd; - int prot = GetAshmemRegionProtectionMask(fd); - if (prot < 0) - return false; - - if ((prot & PROT_WRITE) == 0) { - // Region is already read-only. - return true; - } - - prot &= ~PROT_WRITE; - int ret = ashmem_set_prot_region(fd, prot); - if (ret != 0) { - DPLOG(ERROR) << "ashmem_set_prot_region"; - return false; - } - return true; -} - -} // namespace base
diff --git a/base/message_loop/message_pump_android.cc b/base/message_loop/message_pump_android.cc deleted file mode 100644 index 8c5bb57..0000000 --- a/base/message_loop/message_pump_android.cc +++ /dev/null
@@ -1,165 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/message_loop/message_pump_android.h" - -#include <jni.h> - -#include "base/android/jni_android.h" -#include "base/android/scoped_java_ref.h" -#include "base/lazy_instance.h" -#include "base/logging.h" -#include "base/run_loop.h" -#include "jni/SystemMessageHandler_jni.h" - -using base::android::JavaParamRef; -using base::android::ScopedJavaLocalRef; - -namespace base { - -MessagePumpForUI::MessagePumpForUI() = default; -MessagePumpForUI::~MessagePumpForUI() = default; - -// This is called by the java SystemMessageHandler whenever the message queue -// detects an idle state (as in, control returns to the looper and there are no -// tasks available to be run immediately). -// See the comments in DoRunLoopOnce for how this differs from the -// implementation on other platforms. -void MessagePumpForUI::DoIdleWork(JNIEnv* env, - const JavaParamRef<jobject>& obj) { - delegate_->DoIdleWork(); -} - -void MessagePumpForUI::DoRunLoopOnce(JNIEnv* env, - const JavaParamRef<jobject>& obj, - jboolean delayed) { - if (delayed) - delayed_scheduled_time_ = base::TimeTicks(); - - // If the pump has been aborted, tasks may continue to be queued up, but - // shouldn't run. - if (ShouldAbort()) - return; - - // This is based on MessagePumpForUI::DoRunLoop() from desktop. - // Note however that our system queue is handled in the java side. - // In desktop we inspect and process a single system message and then - // we call DoWork() / DoDelayedWork(). This is then wrapped in a for loop and - // repeated until no work is left to do, at which point DoIdleWork is called. - // On Android, the java message queue may contain messages for other handlers - // that will be processed before calling here again. - // This means that unlike Desktop, we can't wrap a for loop around this - // function and keep processing tasks until we have no work left to do - we - // have to return control back to the Android Looper after each message. This - // also means we have to perform idle detection differently, which is why we - // add an IdleHandler to the message queue in SystemMessageHandler.java, which - // calls DoIdleWork whenever control returns back to the looper and there are - // no tasks queued up to run immediately. - delegate_->DoWork(); - if (ShouldAbort()) { - // There is a pending JNI exception, return to Java so that the exception is - // thrown correctly. - return; - } - - base::TimeTicks next_delayed_work_time; - delegate_->DoDelayedWork(&next_delayed_work_time); - if (ShouldAbort()) { - // There is a pending JNI exception, return to Java so that the exception is - // thrown correctly - return; - } - - if (!next_delayed_work_time.is_null()) - ScheduleDelayedWork(next_delayed_work_time); -} - -void MessagePumpForUI::Run(Delegate* delegate) { - NOTREACHED() << "UnitTests should rely on MessagePumpForUIStub in" - " test_stub_android.h"; -} - -void MessagePumpForUI::Start(Delegate* delegate) { - DCHECK(!quit_); - delegate_ = delegate; - run_loop_ = std::make_unique<RunLoop>(); - // Since the RunLoop was just created above, BeforeRun should be guaranteed to - // return true (it only returns false if the RunLoop has been Quit already). - if (!run_loop_->BeforeRun()) - NOTREACHED(); - - DCHECK(system_message_handler_obj_.is_null()); - - JNIEnv* env = base::android::AttachCurrentThread(); - DCHECK(env); - system_message_handler_obj_.Reset( - Java_SystemMessageHandler_create(env, reinterpret_cast<jlong>(this))); -} - -void MessagePumpForUI::Quit() { - quit_ = true; - - if (!system_message_handler_obj_.is_null()) { - JNIEnv* env = base::android::AttachCurrentThread(); - DCHECK(env); - - Java_SystemMessageHandler_shutdown(env, system_message_handler_obj_); - system_message_handler_obj_.Reset(); - } - - if (run_loop_) { - run_loop_->AfterRun(); - run_loop_ = nullptr; - } -} - -void MessagePumpForUI::ScheduleWork() { - if (quit_) - return; - DCHECK(!system_message_handler_obj_.is_null()); - - JNIEnv* env = base::android::AttachCurrentThread(); - DCHECK(env); - - Java_SystemMessageHandler_scheduleWork(env, system_message_handler_obj_); -} - -void MessagePumpForUI::ScheduleDelayedWork(const TimeTicks& delayed_work_time) { - if (quit_) - return; - // In the java side, |SystemMessageHandler| keeps a single "delayed" message. - // It's an expensive operation to |removeMessage| there, so this is optimized - // to avoid those calls. - // - // At this stage, |delayed_work_time| can be: - // 1) The same as previously scheduled: nothing to be done, move along. This - // is the typical case, since this method is called for every single message. - // - // 2) Not previously scheduled: just post a new message in java. - // - // 3) Shorter than previously scheduled: far less common. In this case, - // |removeMessage| and post a new one. - // - // 4) Longer than previously scheduled (or null): nothing to be done, move - // along. - if (!delayed_scheduled_time_.is_null() && - delayed_work_time >= delayed_scheduled_time_) { - return; - } - DCHECK(!delayed_work_time.is_null()); - DCHECK(!system_message_handler_obj_.is_null()); - - JNIEnv* env = base::android::AttachCurrentThread(); - DCHECK(env); - - jlong millis = - (delayed_work_time - TimeTicks::Now()).InMillisecondsRoundedUp(); - delayed_scheduled_time_ = delayed_work_time; - // Note that we're truncating to milliseconds as required by the java side, - // even though delayed_work_time is microseconds resolution. - Java_SystemMessageHandler_scheduleDelayedWork( - env, system_message_handler_obj_, millis); -} - -} // namespace base
diff --git a/base/message_loop/message_pump_android.h b/base/message_loop/message_pump_android.h deleted file mode 100644 index d09fdde..0000000 --- a/base/message_loop/message_pump_android.h +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_MESSAGE_LOOP_MESSAGE_PUMP_ANDROID_H_ -#define BASE_MESSAGE_LOOP_MESSAGE_PUMP_ANDROID_H_ - -#include <jni.h> -#include <memory> - -#include "base/android/scoped_java_ref.h" -#include "base/base_export.h" -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "base/message_loop/message_pump.h" -#include "base/time/time.h" - -namespace base { - -class RunLoop; - -// This class implements a MessagePump needed for TYPE_UI MessageLoops on -// OS_ANDROID platform. -class BASE_EXPORT MessagePumpForUI : public MessagePump { - public: - MessagePumpForUI(); - ~MessagePumpForUI() override; - - void DoIdleWork(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); - void DoRunLoopOnce(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - jboolean delayed); - - void Run(Delegate* delegate) override; - void Quit() override; - void ScheduleWork() override; - void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override; - - virtual void Start(Delegate* delegate); - - // We call Abort when there is a pending JNI exception, meaning that the - // current thread will crash when we return to Java. - // We can't call any JNI-methods before returning to Java as we would then - // cause a native crash (instead of the original Java crash). - void Abort() { should_abort_ = true; } - bool ShouldAbort() const { return should_abort_; } - - private: - std::unique_ptr<RunLoop> run_loop_; - base::android::ScopedJavaGlobalRef<jobject> system_message_handler_obj_; - bool should_abort_ = false; - bool quit_ = false; - Delegate* delegate_ = nullptr; - base::TimeTicks delayed_scheduled_time_; - - DISALLOW_COPY_AND_ASSIGN(MessagePumpForUI); -}; - -} // namespace base - -#endif // BASE_MESSAGE_LOOP_MESSAGE_PUMP_ANDROID_H_
diff --git a/base/os_compat_android.cc b/base/os_compat_android.cc deleted file mode 100644 index c1a2ac8..0000000 --- a/base/os_compat_android.cc +++ /dev/null
@@ -1,178 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/os_compat_android.h" - -#include <asm/unistd.h> -#include <errno.h> -#include <limits.h> -#include <math.h> -#include <sys/stat.h> -#include <sys/syscall.h> -#include <unistd.h> - -#if !defined(__LP64__) -#include <time64.h> -#endif - -#include "base/rand_util.h" -#include "base/strings/string_piece.h" -#include "base/strings/stringprintf.h" - -extern "C" { -// There is no futimes() avaiable in Bionic, so we provide our own -// implementation until it is there. -int futimes(int fd, const struct timeval tv[2]) { - if (tv == NULL) - return syscall(__NR_utimensat, fd, NULL, NULL, 0); - - if (tv[0].tv_usec < 0 || tv[0].tv_usec >= 1000000 || - tv[1].tv_usec < 0 || tv[1].tv_usec >= 1000000) { - errno = EINVAL; - return -1; - } - - // Convert timeval to timespec. - struct timespec ts[2]; - ts[0].tv_sec = tv[0].tv_sec; - ts[0].tv_nsec = tv[0].tv_usec * 1000; - ts[1].tv_sec = tv[1].tv_sec; - ts[1].tv_nsec = tv[1].tv_usec * 1000; - return syscall(__NR_utimensat, fd, NULL, ts, 0); -} - -#if !defined(__LP64__) -// 32-bit Android has only timegm64() and not timegm(). -// We replicate the behaviour of timegm() when the result overflows time_t. -time_t timegm(struct tm* const t) { - // time_t is signed on Android. - static const time_t kTimeMax = ~(1L << (sizeof(time_t) * CHAR_BIT - 1)); - static const time_t kTimeMin = (1L << (sizeof(time_t) * CHAR_BIT - 1)); - time64_t result = timegm64(t); - if (result < kTimeMin || result > kTimeMax) - return -1; - return result; -} -#endif - -// The following is only needed when building with GCC 4.6 or higher -// (i.e. not with Android GCC 4.4.3, nor with Clang). -// -// GCC is now capable of optimizing successive calls to sin() and cos() into -// a single call to sincos(). This means that source code that looks like: -// -// double c, s; -// c = cos(angle); -// s = sin(angle); -// -// Will generate machine code that looks like: -// -// double c, s; -// sincos(angle, &s, &c); -// -// Unfortunately, sincos() and friends are not part of the Android libm.so -// library provided by the NDK for API level 9. When the optimization kicks -// in, it makes the final build fail with a puzzling message (puzzling -// because 'sincos' doesn't appear anywhere in the sources!). -// -// To solve this, we provide our own implementation of the sincos() function -// and related friends. Note that we must also explicitely tell GCC to disable -// optimizations when generating these. Otherwise, the generated machine code -// for each function would simply end up calling itself, resulting in a -// runtime crash due to stack overflow. -// -#if defined(__GNUC__) && !defined(__clang__) && \ - !defined(ANDROID_SINCOS_PROVIDED) - -// For the record, Clang does not support the 'optimize' attribute. -// In the unlikely event that it begins performing this optimization too, -// we'll have to find a different way to achieve this. NOTE: Tested with O1 -// which still performs the optimization. -// -#define GCC_NO_OPTIMIZE __attribute__((optimize("O0"))) - -GCC_NO_OPTIMIZE -void sincos(double angle, double* s, double *c) { - *c = cos(angle); - *s = sin(angle); -} - -GCC_NO_OPTIMIZE -void sincosf(float angle, float* s, float* c) { - *c = cosf(angle); - *s = sinf(angle); -} - -#endif // __GNUC__ && !__clang__ - -// An implementation of mkdtemp, since it is not exposed by the NDK -// for native API level 9 that we target. -// -// For any changes in the mkdtemp function, you should manually run the unittest -// OsCompatAndroidTest.DISABLED_TestMkdTemp in your local machine to check if it -// passes. Please don't enable it, since it creates a directory and may be -// source of flakyness. -char* mkdtemp(char* path) { - if (path == NULL) { - errno = EINVAL; - return NULL; - } - - const int path_len = strlen(path); - - // The last six characters of 'path' must be XXXXXX. - const base::StringPiece kSuffix("XXXXXX"); - const int kSuffixLen = kSuffix.length(); - if (!base::StringPiece(path, path_len).ends_with(kSuffix)) { - errno = EINVAL; - return NULL; - } - - // If the path contains a directory, as in /tmp/foo/XXXXXXXX, make sure - // that /tmp/foo exists, otherwise we're going to loop a really long - // time for nothing below - char* dirsep = strrchr(path, '/'); - if (dirsep != NULL) { - struct stat st; - int ret; - - *dirsep = '\0'; // Terminating directory path temporarily - - ret = stat(path, &st); - - *dirsep = '/'; // Restoring directory separator - if (ret < 0) // Directory probably does not exist - return NULL; - if (!S_ISDIR(st.st_mode)) { // Not a directory - errno = ENOTDIR; - return NULL; - } - } - - // Max number of tries using different random suffixes. - const int kMaxTries = 100; - - // Now loop until we CAN create a directory by that name or we reach the max - // number of tries. - for (int i = 0; i < kMaxTries; ++i) { - // Fill the suffix XXXXXX with a random string composed of a-z chars. - for (int pos = 0; pos < kSuffixLen; ++pos) { - char rand_char = static_cast<char>(base::RandInt('a', 'z')); - path[path_len - kSuffixLen + pos] = rand_char; - } - if (mkdir(path, 0700) == 0) { - // We just created the directory succesfully. - return path; - } - if (errno != EEXIST) { - // The directory doesn't exist, but an error occured - return NULL; - } - } - - // We reached the max number of tries. - return NULL; -} - -} // extern "C"
diff --git a/base/os_compat_android.h b/base/os_compat_android.h deleted file mode 100644 index e33b1f7..0000000 --- a/base/os_compat_android.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_OS_COMPAT_ANDROID_H_ -#define BASE_OS_COMPAT_ANDROID_H_ - -#include <fcntl.h> -#include <sys/types.h> -#include <utime.h> - -// Not implemented in Bionic. -extern "C" int futimes(int fd, const struct timeval tv[2]); - -// Not exposed or implemented in Bionic. -extern "C" char* mkdtemp(char* path); - -// Android has no timegm(). -extern "C" time_t timegm(struct tm* const t); - -#endif // BASE_OS_COMPAT_ANDROID_H_
diff --git a/base/power_monitor/power_monitor_device_source_android.cc b/base/power_monitor/power_monitor_device_source_android.cc deleted file mode 100644 index 7688513..0000000 --- a/base/power_monitor/power_monitor_device_source_android.cc +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/power_monitor/power_monitor.h" -#include "base/power_monitor/power_monitor_device_source.h" -#include "base/power_monitor/power_monitor_source.h" -#include "jni/PowerMonitor_jni.h" - -namespace base { - -// A helper function which is a friend of PowerMonitorSource. -void ProcessPowerEventHelper(PowerMonitorSource::PowerEvent event) { - PowerMonitorSource::ProcessPowerEvent(event); -} - -namespace android { - -// Native implementation of PowerMonitor.java. Note: This will be invoked by -// PowerMonitor.java shortly after startup to set the correct initial value for -// "is on battery power." -void JNI_PowerMonitor_OnBatteryChargingChanged( - JNIEnv* env, - const JavaParamRef<jclass>& clazz) { - ProcessPowerEventHelper(PowerMonitorSource::POWER_STATE_EVENT); -} - -// Note: Android does not have the concept of suspend / resume as it's known by -// other platforms. Thus we do not send Suspend/Resume notifications. See -// http://crbug.com/644515 - -} // namespace android - -bool PowerMonitorDeviceSource::IsOnBatteryPowerImpl() { - JNIEnv* env = base::android::AttachCurrentThread(); - return base::android::Java_PowerMonitor_isBatteryPower(env); -} - -} // namespace base
diff --git a/base/sys_info_android.cc b/base/sys_info_android.cc deleted file mode 100644 index 7704796..0000000 --- a/base/sys_info_android.cc +++ /dev/null
@@ -1,241 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/sys_info.h" - -#include <dlfcn.h> -#include <stddef.h> -#include <stdint.h> -#include <sys/system_properties.h> - -#include "base/android/jni_android.h" -#include "base/android/sys_utils.h" -#include "base/lazy_instance.h" -#include "base/logging.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_piece.h" -#include "base/strings/stringprintf.h" -#include "base/sys_info_internal.h" - -#if (__ANDROID_API__ >= 21 /* 5.0 - Lollipop */) - -namespace { - -typedef int (SystemPropertyGetFunction)(const char*, char*); - -SystemPropertyGetFunction* DynamicallyLoadRealSystemPropertyGet() { - // libc.so should already be open, get a handle to it. - void* handle = dlopen("libc.so", RTLD_NOLOAD); - if (!handle) { - LOG(FATAL) << "Cannot dlopen libc.so: " << dlerror(); - } - SystemPropertyGetFunction* real_system_property_get = - reinterpret_cast<SystemPropertyGetFunction*>( - dlsym(handle, "__system_property_get")); - if (!real_system_property_get) { - LOG(FATAL) << "Cannot resolve __system_property_get(): " << dlerror(); - } - return real_system_property_get; -} - -static base::LazyInstance<base::internal::LazySysInfoValue< - SystemPropertyGetFunction*, DynamicallyLoadRealSystemPropertyGet> >::Leaky - g_lazy_real_system_property_get = LAZY_INSTANCE_INITIALIZER; - -} // namespace - -// Android 'L' removes __system_property_get from the NDK, however it is still -// a hidden symbol in libc. Until we remove all calls of __system_property_get -// from Chrome we work around this by defining a weak stub here, which uses -// dlsym to but ensures that Chrome uses the real system -// implementatation when loaded. http://crbug.com/392191. -BASE_EXPORT int __system_property_get(const char* name, char* value) { - return g_lazy_real_system_property_get.Get().value()(name, value); -} - -#endif - -namespace { - -// Default version of Android to fall back to when actual version numbers -// cannot be acquired. Use the latest Android release with a higher bug fix -// version to avoid unnecessarily comparison errors with the latest release. -// This should be manually kept up to date on each Android release. -const int kDefaultAndroidMajorVersion = 8; -const int kDefaultAndroidMinorVersion = 1; -const int kDefaultAndroidBugfixVersion = 99; - -// Get and parse out the OS version numbers from the system properties. -// Note if parse fails, the "default" version is returned as fallback. -void GetOsVersionStringAndNumbers(std::string* version_string, - int32_t* major_version, - int32_t* minor_version, - int32_t* bugfix_version) { - // Read the version number string out from the properties. - char os_version_str[PROP_VALUE_MAX]; - __system_property_get("ro.build.version.release", os_version_str); - - if (os_version_str[0]) { - // Try to parse out the version numbers from the string. - int num_read = sscanf(os_version_str, "%d.%d.%d", major_version, - minor_version, bugfix_version); - - if (num_read > 0) { - // If we don't have a full set of version numbers, make the extras 0. - if (num_read < 2) - *minor_version = 0; - if (num_read < 3) - *bugfix_version = 0; - *version_string = std::string(os_version_str); - return; - } - } - - // For some reason, we couldn't parse the version number string. - *major_version = kDefaultAndroidMajorVersion; - *minor_version = kDefaultAndroidMinorVersion; - *bugfix_version = kDefaultAndroidBugfixVersion; - *version_string = ::base::StringPrintf("%d.%d.%d", *major_version, - *minor_version, *bugfix_version); -} - -// Parses a system property (specified with unit 'k','m' or 'g'). -// Returns a value in bytes. -// Returns -1 if the string could not be parsed. -int64_t ParseSystemPropertyBytes(const base::StringPiece& str) { - const int64_t KB = 1024; - const int64_t MB = 1024 * KB; - const int64_t GB = 1024 * MB; - if (str.size() == 0u) - return -1; - int64_t unit_multiplier = 1; - size_t length = str.size(); - if (str[length - 1] == 'k') { - unit_multiplier = KB; - length--; - } else if (str[length - 1] == 'm') { - unit_multiplier = MB; - length--; - } else if (str[length - 1] == 'g') { - unit_multiplier = GB; - length--; - } - int64_t result = 0; - bool parsed = base::StringToInt64(str.substr(0, length), &result); - bool negative = result <= 0; - bool overflow = - result >= std::numeric_limits<int64_t>::max() / unit_multiplier; - if (!parsed || negative || overflow) - return -1; - return result * unit_multiplier; -} - -int GetDalvikHeapSizeMB() { - char heap_size_str[PROP_VALUE_MAX]; - __system_property_get("dalvik.vm.heapsize", heap_size_str); - // dalvik.vm.heapsize property is writable by a root user. - // Clamp it to reasonable range as a sanity check, - // a typical android device will never have less than 48MB. - const int64_t MB = 1024 * 1024; - int64_t result = ParseSystemPropertyBytes(heap_size_str); - if (result == -1) { - // We should consider not exposing these values if they are not reliable. - LOG(ERROR) << "Can't parse dalvik.vm.heapsize: " << heap_size_str; - result = base::SysInfo::AmountOfPhysicalMemoryMB() / 3; - } - result = - std::min<int64_t>(std::max<int64_t>(32 * MB, result), 1024 * MB) / MB; - return static_cast<int>(result); -} - -int GetDalvikHeapGrowthLimitMB() { - char heap_size_str[PROP_VALUE_MAX]; - __system_property_get("dalvik.vm.heapgrowthlimit", heap_size_str); - // dalvik.vm.heapgrowthlimit property is writable by a root user. - // Clamp it to reasonable range as a sanity check, - // a typical android device will never have less than 24MB. - const int64_t MB = 1024 * 1024; - int64_t result = ParseSystemPropertyBytes(heap_size_str); - if (result == -1) { - // We should consider not exposing these values if they are not reliable. - LOG(ERROR) << "Can't parse dalvik.vm.heapgrowthlimit: " << heap_size_str; - result = base::SysInfo::AmountOfPhysicalMemoryMB() / 6; - } - result = std::min<int64_t>(std::max<int64_t>(16 * MB, result), 512 * MB) / MB; - return static_cast<int>(result); -} - -} // anonymous namespace - -namespace base { - -std::string SysInfo::HardwareModelName() { - char device_model_str[PROP_VALUE_MAX]; - __system_property_get("ro.product.model", device_model_str); - return std::string(device_model_str); -} - -std::string SysInfo::OperatingSystemName() { - return "Android"; -} - -std::string SysInfo::OperatingSystemVersion() { - std::string version_string; - int32_t major, minor, bugfix; - GetOsVersionStringAndNumbers(&version_string, &major, &minor, &bugfix); - return version_string; -} - -void SysInfo::OperatingSystemVersionNumbers(int32_t* major_version, - int32_t* minor_version, - int32_t* bugfix_version) { - std::string version_string; - GetOsVersionStringAndNumbers(&version_string, major_version, minor_version, - bugfix_version); -} - -std::string SysInfo::GetAndroidBuildCodename() { - char os_version_codename_str[PROP_VALUE_MAX]; - __system_property_get("ro.build.version.codename", os_version_codename_str); - return std::string(os_version_codename_str); -} - -std::string SysInfo::GetAndroidBuildID() { - char os_build_id_str[PROP_VALUE_MAX]; - __system_property_get("ro.build.id", os_build_id_str); - return std::string(os_build_id_str); -} - -int SysInfo::DalvikHeapSizeMB() { - static int heap_size = GetDalvikHeapSizeMB(); - return heap_size; -} - -int SysInfo::DalvikHeapGrowthLimitMB() { - static int heap_growth_limit = GetDalvikHeapGrowthLimitMB(); - return heap_growth_limit; -} - -static base::LazyInstance< - base::internal::LazySysInfoValue<bool, - android::SysUtils::IsLowEndDeviceFromJni> >::Leaky - g_lazy_low_end_device = LAZY_INSTANCE_INITIALIZER; - -bool SysInfo::IsLowEndDeviceImpl() { - // This code might be used in some environments - // which might not have a Java environment. - // Note that we need to call the Java version here. - // There exists a complete native implementation in - // sys_info.cc but calling that here would mean that - // the Java code and the native code would call different - // implementations which could give different results. - // Also the Java code cannot depend on the native code - // since it might not be loaded yet. - if (!base::android::IsVMInitialized()) - return false; - return g_lazy_low_end_device.Get().value(); -} - - -} // namespace base
diff --git a/base/test/android/OWNERS b/base/test/android/OWNERS deleted file mode 100644 index 2b0078b..0000000 --- a/base/test/android/OWNERS +++ /dev/null
@@ -1,4 +0,0 @@ -jbudorick@chromium.org -file://base/android/OWNERS - -# COMPONENT: Test>Android
diff --git a/base/test/android/java/src/org/chromium/base/ContentUriTestUtils.java b/base/test/android/java/src/org/chromium/base/ContentUriTestUtils.java deleted file mode 100644 index fe9d540..0000000 --- a/base/test/android/java/src/org/chromium/base/ContentUriTestUtils.java +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -import android.content.ContentValues; -import android.database.Cursor; -import android.net.Uri; -import android.provider.MediaStore; - -import org.chromium.base.annotations.CalledByNative; - -/** - * Utilities for testing operations on content URI. - */ -public class ContentUriTestUtils { - /** - * Insert an image into the MediaStore, and return the content URI. If the - * image already exists in the MediaStore, just retrieve the URI. - * - * @param path Path to the image file. - * @return Content URI of the image. - */ - @CalledByNative - private static String insertImageIntoMediaStore(String path) { - // Check whether the content URI exists. - Cursor c = ContextUtils.getApplicationContext().getContentResolver().query( - MediaStore.Images.Media.EXTERNAL_CONTENT_URI, - new String[] {MediaStore.Video.VideoColumns._ID}, - MediaStore.Images.Media.DATA + " LIKE ?", new String[] {path}, null); - if (c != null && c.getCount() > 0) { - c.moveToFirst(); - int id = c.getInt(0); - return Uri.withAppendedPath( - MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id).toString(); - } - - // Insert the content URI into MediaStore. - ContentValues values = new ContentValues(); - values.put(MediaStore.MediaColumns.DATA, path); - Uri uri = ContextUtils.getApplicationContext().getContentResolver().insert( - MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); - return uri.toString(); - } -}
diff --git a/base/test/android/java/src/org/chromium/base/ITestCallback.aidl b/base/test/android/java/src/org/chromium/base/ITestCallback.aidl deleted file mode 100644 index dd208d5..0000000 --- a/base/test/android/java/src/org/chromium/base/ITestCallback.aidl +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -import org.chromium.base.ITestController; -import org.chromium.base.process_launcher.FileDescriptorInfo; - -/** - * This interface is called by the child process to pass its controller to its parent. - */ -interface ITestCallback { - oneway void childConnected(ITestController controller); - - /** - * Invoked by the service to notify that the main method returned. - * IMPORTANT! Should not be marked oneway as the caller will terminate the running process after - * this call. Marking it oneway would make the call asynchronous and the process could terminate - * before the call was actually sent. - */ - void mainReturned(int returnCode); -}
diff --git a/base/test/android/java/src/org/chromium/base/ITestController.aidl b/base/test/android/java/src/org/chromium/base/ITestController.aidl deleted file mode 100644 index d927ee5..0000000 --- a/base/test/android/java/src/org/chromium/base/ITestController.aidl +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -import org.chromium.base.process_launcher.FileDescriptorInfo; - -/** - * This interface is used to control child processes. - */ -interface ITestController { - /** - * Forces the service process to terminate and block until the process stops. - * @param exitCode the exit code the process should terminate with. - * @return always true, a return value is only returned to force the call to be synchronous. - */ - boolean forceStopSynchronous(int exitCode); - - /** - * Forces the service process to terminate. - * @param exitCode the exit code the process should terminate with. - */ - oneway void forceStop(int exitCode); -}
diff --git a/base/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java b/base/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java deleted file mode 100644 index 3da7ba8..0000000 --- a/base/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java +++ /dev/null
@@ -1,63 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -import android.os.Handler; - -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.CalledByNativeUnchecked; -import org.chromium.base.annotations.JNINamespace; - -import java.util.concurrent.atomic.AtomicBoolean; - -@JNINamespace("base::android") -class JavaHandlerThreadHelpers { - private static class TestException extends Exception {} - - // This is executed as part of base_unittests. This tests that JavaHandlerThread can be used - // by itself without attaching to its native peer. - @CalledByNative - private static JavaHandlerThread testAndGetJavaHandlerThread() { - final AtomicBoolean taskExecuted = new AtomicBoolean(); - final Object lock = new Object(); - Runnable runnable = new Runnable() { - @Override - public void run() { - synchronized (lock) { - taskExecuted.set(true); - lock.notifyAll(); - } - } - }; - - JavaHandlerThread thread = new JavaHandlerThread("base_unittests_java"); - thread.maybeStart(); - - Handler handler = new Handler(thread.getLooper()); - handler.post(runnable); - synchronized (lock) { - while (!taskExecuted.get()) { - try { - lock.wait(); - } catch (InterruptedException e) { - // ignore interrupts - } - } - } - - return thread; - } - - @CalledByNativeUnchecked - private static void throwException() throws TestException { - throw new TestException(); - } - - @CalledByNative - private static boolean isExceptionTestException(Throwable exception) { - if (exception == null) return false; - return exception instanceof TestException; - } -}
diff --git a/base/test/android/java/src/org/chromium/base/MainReturnCodeResult.java b/base/test/android/java/src/org/chromium/base/MainReturnCodeResult.java deleted file mode 100644 index 9756c97..0000000 --- a/base/test/android/java/src/org/chromium/base/MainReturnCodeResult.java +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.JNINamespace; - -/** - * Contains the result of a native main method that ran in a child process. - */ -@JNINamespace("base::android") -public final class MainReturnCodeResult { - private final int mMainReturnCode; - private final boolean mTimedOut; - - public static MainReturnCodeResult createMainResult(int returnCode) { - return new MainReturnCodeResult(returnCode, false /* timedOut */); - } - - public static MainReturnCodeResult createTimeoutMainResult() { - return new MainReturnCodeResult(0, true /* timedOut */); - } - - private MainReturnCodeResult(int mainReturnCode, boolean timedOut) { - mMainReturnCode = mainReturnCode; - mTimedOut = timedOut; - } - - @CalledByNative - public int getReturnCode() { - return mMainReturnCode; - } - - @CalledByNative - public boolean hasTimedOut() { - return mTimedOut; - } -}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java deleted file mode 100644 index d0b1850..0000000 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java +++ /dev/null
@@ -1,383 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Looper; -import android.os.ParcelFileDescriptor; -import android.os.RemoteException; -import android.util.SparseArray; - -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.JNINamespace; -import org.chromium.base.process_launcher.ChildConnectionAllocator; -import org.chromium.base.process_launcher.ChildProcessConnection; -import org.chromium.base.process_launcher.ChildProcessLauncher; -import org.chromium.base.process_launcher.FileDescriptorInfo; -import org.chromium.base.process_launcher.IChildProcessService; - -import java.io.IOException; -import java.util.Arrays; -import java.util.concurrent.Callable; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.FutureTask; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - -import javax.annotation.concurrent.GuardedBy; - -/** - * Helper class for launching test client processes for multiprocess unit tests. - */ -@JNINamespace("base::android") -public final class MultiprocessTestClientLauncher { - private static final String TAG = "cr_MProcTCLauncher"; - - private static final int CONNECTION_TIMEOUT_MS = 10 * 1000; - - private static final SparseArray<MultiprocessTestClientLauncher> sPidToLauncher = - new SparseArray<>(); - - private static final SparseArray<Integer> sPidToMainResult = new SparseArray<>(); - - private static final Object sLauncherHandlerInitLock = new Object(); - private static Handler sLauncherHandler; - - private static ChildConnectionAllocator sConnectionAllocator; - - private final ITestCallback.Stub mCallback = new ITestCallback.Stub() { - @Override - public void childConnected(ITestController controller) { - mTestController = controller; - // This method can be called before onServiceConnected below has set the PID. - // Wait for mPid to be set before notifying. - try { - mPidReceived.await(); - } catch (InterruptedException ie) { - Log.e(TAG, "Interrupted while waiting for connection PID."); - return; - } - // Now we are fully initialized, notify clients. - mConnectedLock.lock(); - try { - mConnected = true; - mConnectedCondition.signal(); - } finally { - mConnectedLock.unlock(); - } - } - - @Override - public void mainReturned(int returnCode) { - mMainReturnCodeLock.lock(); - try { - mMainReturnCode = returnCode; - mMainReturnCodeCondition.signal(); - } finally { - mMainReturnCodeLock.unlock(); - } - - // Also store the return code in a map as the connection might get disconnected - // before waitForMainToReturn is called and then we would not have a way to retrieve - // the connection. - sPidToMainResult.put(mPid, returnCode); - } - }; - - private final ChildProcessLauncher.Delegate mLauncherDelegate = - new ChildProcessLauncher.Delegate() { - @Override - public void onConnectionEstablished(ChildProcessConnection connection) { - assert isRunningOnLauncherThread(); - int pid = connection.getPid(); - sPidToLauncher.put(pid, MultiprocessTestClientLauncher.this); - mPid = pid; - mPidReceived.countDown(); - } - - @Override - public void onConnectionLost(ChildProcessConnection connection) { - assert isRunningOnLauncherThread(); - assert sPidToLauncher.get(connection.getPid()) - == MultiprocessTestClientLauncher.this; - sPidToLauncher.remove(connection.getPid()); - } - }; - - private final CountDownLatch mPidReceived = new CountDownLatch(1); - - private final ChildProcessLauncher mLauncher; - - private final ReentrantLock mConnectedLock = new ReentrantLock(); - private final Condition mConnectedCondition = mConnectedLock.newCondition(); - @GuardedBy("mConnectedLock") - private boolean mConnected; - - private IChildProcessService mService = null; - private int mPid; - private ITestController mTestController; - - private final ReentrantLock mMainReturnCodeLock = new ReentrantLock(); - private final Condition mMainReturnCodeCondition = mMainReturnCodeLock.newCondition(); - // The return code returned by the service's main method. - // null if the service has not sent it yet. - @GuardedBy("mMainReturnCodeLock") - private Integer mMainReturnCode; - - private MultiprocessTestClientLauncher(String[] commandLine, FileDescriptorInfo[] filesToMap) { - assert isRunningOnLauncherThread(); - - if (sConnectionAllocator == null) { - sConnectionAllocator = ChildConnectionAllocator.create( - ContextUtils.getApplicationContext(), sLauncherHandler, null, - "org.chromium.native_test", "org.chromium.base.MultiprocessTestClientService", - "org.chromium.native_test.NUM_TEST_CLIENT_SERVICES", false /* bindToCaller */, - false /* bindAsExternalService */, false /* useStrongBinding */); - } - mLauncher = new ChildProcessLauncher(sLauncherHandler, mLauncherDelegate, commandLine, - filesToMap, sConnectionAllocator, Arrays.asList(mCallback)); - } - - private boolean waitForConnection(long timeoutMs) { - assert !isRunningOnLauncherThread(); - - long timeoutNs = TimeUnit.MILLISECONDS.toNanos(timeoutMs); - mConnectedLock.lock(); - try { - while (!mConnected) { - if (timeoutNs <= 0L) { - return false; - } - try { - mConnectedCondition.awaitNanos(timeoutNs); - } catch (InterruptedException ie) { - Log.e(TAG, "Interrupted while waiting for connection."); - } - } - } finally { - mConnectedLock.unlock(); - } - return true; - } - - private Integer getMainReturnCode(long timeoutMs) { - assert isRunningOnLauncherThread(); - - long timeoutNs = TimeUnit.MILLISECONDS.toNanos(timeoutMs); - mMainReturnCodeLock.lock(); - try { - while (mMainReturnCode == null) { - if (timeoutNs <= 0L) { - return null; - } - try { - timeoutNs = mMainReturnCodeCondition.awaitNanos(timeoutNs); - } catch (InterruptedException ie) { - Log.e(TAG, "Interrupted while waiting for main return code."); - } - } - return mMainReturnCode; - } finally { - mMainReturnCodeLock.unlock(); - } - } - - /** - * Spawns and connects to a child process. - * May not be called from the main thread. - * - * @param commandLine the child process command line argv. - * @return the PID of the started process or 0 if the process could not be started. - */ - @CalledByNative - private static int launchClient( - final String[] commandLine, final FileDescriptorInfo[] filesToMap) { - initLauncherThread(); - - final MultiprocessTestClientLauncher launcher = - runOnLauncherAndGetResult(new Callable<MultiprocessTestClientLauncher>() { - @Override - public MultiprocessTestClientLauncher call() { - return createAndStartLauncherOnLauncherThread(commandLine, filesToMap); - } - }); - if (launcher == null) { - return 0; - } - - if (!launcher.waitForConnection(CONNECTION_TIMEOUT_MS)) { - return 0; // Timed-out. - } - - return runOnLauncherAndGetResult(new Callable<Integer>() { - @Override - public Integer call() { - int pid = launcher.mLauncher.getPid(); - assert pid > 0; - sPidToLauncher.put(pid, launcher); - return pid; - } - }); - } - - private static MultiprocessTestClientLauncher createAndStartLauncherOnLauncherThread( - String[] commandLine, FileDescriptorInfo[] filesToMap) { - assert isRunningOnLauncherThread(); - - MultiprocessTestClientLauncher launcher = - new MultiprocessTestClientLauncher(commandLine, filesToMap); - if (!launcher.mLauncher.start( - true /* setupConnection */, true /* queueIfNoFreeConnection */)) { - return null; - } - - return launcher; - } - - /** - * Blocks until the main method invoked by a previous call to launchClient terminates or until - * the specified time-out expires. - * Returns immediately if main has already returned. - * @param pid the process ID that was returned by the call to launchClient - * @param timeoutMs the timeout in milliseconds after which the method returns even if main has - * not returned. - * @return the return code returned by the main method or whether it timed-out. - */ - @CalledByNative - private static MainReturnCodeResult waitForMainToReturn(final int pid, final int timeoutMs) { - return runOnLauncherAndGetResult(new Callable<MainReturnCodeResult>() { - @Override - public MainReturnCodeResult call() { - return waitForMainToReturnOnLauncherThread(pid, timeoutMs); - } - }); - } - - private static MainReturnCodeResult waitForMainToReturnOnLauncherThread( - int pid, int timeoutMs) { - assert isRunningOnLauncherThread(); - - MultiprocessTestClientLauncher launcher = sPidToLauncher.get(pid); - // The launcher can be null if it got cleaned-up (because the connection was lost) before - // this gets called. - if (launcher != null) { - Integer mainResult = launcher.getMainReturnCode(timeoutMs); - return mainResult == null ? MainReturnCodeResult.createTimeoutMainResult() - : MainReturnCodeResult.createMainResult(mainResult); - } - - Integer mainResult = sPidToMainResult.get(pid); - if (mainResult == null) { - Log.e(TAG, "waitForMainToReturn called on unknown connection for pid " + pid); - return null; - } - sPidToMainResult.remove(pid); - return MainReturnCodeResult.createMainResult(mainResult); - } - - @CalledByNative - private static boolean terminate(final int pid, final int exitCode, final boolean wait) { - return runOnLauncherAndGetResult(new Callable<Boolean>() { - @Override - public Boolean call() { - return terminateOnLauncherThread(pid, exitCode, wait); - } - }); - } - - private static boolean terminateOnLauncherThread(int pid, int exitCode, boolean wait) { - assert isRunningOnLauncherThread(); - - MultiprocessTestClientLauncher launcher = sPidToLauncher.get(pid); - if (launcher == null) { - Log.e(TAG, "terminate called on unknown launcher for pid " + pid); - return false; - } - try { - if (wait) { - launcher.mTestController.forceStopSynchronous(exitCode); - } else { - launcher.mTestController.forceStop(exitCode); - } - } catch (RemoteException e) { - // We expect this failure, since the forceStop's service implementation calls - // System.exit(). - } - return true; - } - - private static void initLauncherThread() { - synchronized (sLauncherHandlerInitLock) { - if (sLauncherHandler != null) return; - - HandlerThread launcherThread = new HandlerThread("LauncherThread"); - launcherThread.start(); - sLauncherHandler = new Handler(launcherThread.getLooper()); - } - } - - /** Does not take ownership of of fds. */ - @CalledByNative - private static FileDescriptorInfo[] makeFdInfoArray(int[] keys, int[] fds) { - FileDescriptorInfo[] fdInfos = new FileDescriptorInfo[keys.length]; - for (int i = 0; i < keys.length; i++) { - FileDescriptorInfo fdInfo = makeFdInfo(keys[i], fds[i]); - if (fdInfo == null) { - Log.e(TAG, "Failed to make file descriptor (" + keys[i] + ", " + fds[i] + ")."); - return null; - } - fdInfos[i] = fdInfo; - } - return fdInfos; - } - - private static FileDescriptorInfo makeFdInfo(int id, int fd) { - ParcelFileDescriptor parcelableFd = null; - try { - parcelableFd = ParcelFileDescriptor.fromFd(fd); - } catch (IOException e) { - Log.e(TAG, "Invalid FD provided for process connection, aborting connection.", e); - return null; - } - return new FileDescriptorInfo(id, parcelableFd, 0 /* offset */, 0 /* size */); - } - - private static boolean isRunningOnLauncherThread() { - return sLauncherHandler.getLooper() == Looper.myLooper(); - } - - private static void runOnLauncherThreadBlocking(final Runnable runnable) { - assert !isRunningOnLauncherThread(); - final Semaphore done = new Semaphore(0); - sLauncherHandler.post(new Runnable() { - @Override - public void run() { - runnable.run(); - done.release(); - } - }); - done.acquireUninterruptibly(); - } - - private static <R> R runOnLauncherAndGetResult(Callable<R> callable) { - if (isRunningOnLauncherThread()) { - try { - return callable.call(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - try { - FutureTask<R> task = new FutureTask<R>(callable); - sLauncherHandler.post(task); - return task.get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService.java deleted file mode 100644 index 9b50001..0000000 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService.java +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -import org.chromium.base.process_launcher.ChildProcessService; - -/** The service implementation used to host all multiprocess test client code. */ -public class MultiprocessTestClientService extends ChildProcessService { - public MultiprocessTestClientService() { - super(new MultiprocessTestClientServiceDelegate()); - } -}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService0.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService0.java deleted file mode 100644 index 6bdd867..0000000 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService0.java +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -/** - * A subclass used only to differentiate different test client service process instances. - */ -public class MultiprocessTestClientService0 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService1.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService1.java deleted file mode 100644 index 69827f0..0000000 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService1.java +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -/** - * A subclass used only to differentiate different test client service process instances. - */ -public class MultiprocessTestClientService1 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService2.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService2.java deleted file mode 100644 index aad11f1..0000000 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService2.java +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -/** - * A subclass used only to differentiate different test client service process instances. - */ -public class MultiprocessTestClientService2 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService3.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService3.java deleted file mode 100644 index 20d2561..0000000 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService3.java +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -/** - * A subclass used only to differentiate different test client service process instances. - */ -public class MultiprocessTestClientService3 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService4.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService4.java deleted file mode 100644 index 4b14551..0000000 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService4.java +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -/** - * A subclass used only to differentiate different test client service process instances. - */ -public class MultiprocessTestClientService4 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientServiceDelegate.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientServiceDelegate.java deleted file mode 100644 index 83ccaca..0000000 --- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientServiceDelegate.java +++ /dev/null
@@ -1,99 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -package org.chromium.base; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.IBinder; -import android.os.RemoteException; -import android.util.SparseArray; - -import org.chromium.base.library_loader.LibraryLoader; -import org.chromium.base.library_loader.LibraryProcessType; -import org.chromium.base.library_loader.ProcessInitException; -import org.chromium.base.process_launcher.ChildProcessServiceDelegate; -import org.chromium.native_test.MainRunner; - -import java.util.List; - -/** Implementation of the ChildProcessServiceDelegate used for the Multiprocess tests. */ -public class MultiprocessTestClientServiceDelegate implements ChildProcessServiceDelegate { - private static final String TAG = "MPTestCSDelegate"; - - private ITestCallback mTestCallback; - - private final ITestController.Stub mTestController = new ITestController.Stub() { - @Override - public boolean forceStopSynchronous(int exitCode) { - System.exit(exitCode); - return true; - } - - @Override - public void forceStop(int exitCode) { - System.exit(exitCode); - } - }; - - @Override - public void onServiceCreated() { - PathUtils.setPrivateDataDirectorySuffix("chrome_multiprocess_test_client_service"); - } - - @Override - public void onServiceBound(Intent intent) {} - - @Override - public void onConnectionSetup(Bundle connectionBundle, List<IBinder> callbacks) { - mTestCallback = ITestCallback.Stub.asInterface(callbacks.get(0)); - } - - @Override - public void onDestroy() {} - - @Override - public void preloadNativeLibrary(Context hostContext) { - try { - LibraryLoader.get(LibraryProcessType.PROCESS_CHILD).preloadNow(); - } catch (ProcessInitException pie) { - Log.w(TAG, "Unable to preload native libraries.", pie); - } - } - - @Override - public boolean loadNativeLibrary(Context hostContext) { - try { - LibraryLoader.get(LibraryProcessType.PROCESS_CHILD).loadNow(); - return true; - } catch (ProcessInitException pie) { - Log.e(TAG, "Unable to load native libraries.", pie); - return false; - } - } - - @Override - public SparseArray<String> getFileDescriptorsIdsToKeys() { - return null; - } - - @Override - public void onBeforeMain() { - try { - mTestCallback.childConnected(mTestController); - } catch (RemoteException re) { - Log.e(TAG, "Failed to notify parent process of connection."); - } - } - - @Override - public void runMain() { - int result = MainRunner.runMain(CommandLine.getJavaSwitchesOrNull()); - try { - mTestCallback.mainReturned(result); - } catch (RemoteException re) { - Log.e(TAG, "Failed to notify parent process of main returning."); - } - } -}
diff --git a/base/test/android/java/src/org/chromium/base/OWNERS b/base/test/android/java/src/org/chromium/base/OWNERS deleted file mode 100644 index 89442ab..0000000 --- a/base/test/android/java/src/org/chromium/base/OWNERS +++ /dev/null
@@ -1,2 +0,0 @@ -per-file *.aidl=set noparent -per-file *.aidl=file://ipc/SECURITY_OWNERS \ No newline at end of file
diff --git a/base/test/android/java/src/org/chromium/base/TestUiThread.java b/base/test/android/java/src/org/chromium/base/TestUiThread.java deleted file mode 100644 index 237c0ec..0000000 --- a/base/test/android/java/src/org/chromium/base/TestUiThread.java +++ /dev/null
@@ -1,51 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -import android.os.Looper; - -import org.chromium.base.annotations.CalledByNative; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.annotation.concurrent.ThreadSafe; - -/** - * Set up a thread as the Chromium UI Thread, and run its looper. This is is intended for C++ unit - * tests (e.g. the net unit tests) that don't run with the UI thread as their main looper, but test - * code that, on Android, uses UI thread events, so need a running UI thread. - */ -@ThreadSafe -public class TestUiThread { - private static final AtomicBoolean sStarted = new AtomicBoolean(false); - private static final String TAG = "cr.TestUiThread"; - - @CalledByNative - private static void loop() { - // @{link ThreadUtils#setUiThread(Looper)} can only be called once in a test run, so do this - // once, and leave it running. - if (sStarted.getAndSet(true)) return; - - final CountDownLatch startLatch = new CountDownLatch(1); - new Thread(new Runnable() { - - @Override - public void run() { - Looper.prepare(); - ThreadUtils.setUiThread(Looper.myLooper()); - startLatch.countDown(); - Looper.loop(); - } - - }).start(); - - try { - startLatch.await(); - } catch (InterruptedException e) { - Log.e(TAG, "Failed to set UI Thread"); - } - } -}
diff --git a/base/test/android/java_handler_thread_helpers.cc b/base/test/android/java_handler_thread_helpers.cc deleted file mode 100644 index 925dc9d..0000000 --- a/base/test/android/java_handler_thread_helpers.cc +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/test/android/java_handler_thread_helpers.h" - -#include "base/android/java_handler_thread.h" -#include "base/message_loop/message_loop_current.h" -#include "base/synchronization/waitable_event.h" -#include "jni/JavaHandlerThreadHelpers_jni.h" - -namespace base { -namespace android { - -// static -std::unique_ptr<JavaHandlerThread> JavaHandlerThreadHelpers::CreateJavaFirst() { - return std::make_unique<JavaHandlerThread>( - Java_JavaHandlerThreadHelpers_testAndGetJavaHandlerThread( - base::android::AttachCurrentThread())); -} - -// static -void JavaHandlerThreadHelpers::ThrowExceptionAndAbort(WaitableEvent* event) { - JNIEnv* env = AttachCurrentThread(); - Java_JavaHandlerThreadHelpers_throwException(env); - DCHECK(HasException(env)); - base::MessageLoopCurrentForUI::Get()->Abort(); - event->Signal(); -} - -// static -bool JavaHandlerThreadHelpers::IsExceptionTestException( - ScopedJavaLocalRef<jthrowable> exception) { - JNIEnv* env = AttachCurrentThread(); - return Java_JavaHandlerThreadHelpers_isExceptionTestException(env, exception); -} - -} // namespace android -} // namespace base
diff --git a/base/test/android/java_handler_thread_helpers.h b/base/test/android/java_handler_thread_helpers.h deleted file mode 100644 index 5f05cbc..0000000 --- a/base/test/android/java_handler_thread_helpers.h +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_ANDROID_JAVA_HANDLER_THREAD_FOR_TESTING_H_ -#define BASE_ANDROID_JAVA_HANDLER_THREAD_FOR_TESTING_H_ - -#include <jni.h> - -#include <memory> - -#include "base/android/scoped_java_ref.h" - -namespace base { - -class WaitableEvent; - -namespace android { - -class JavaHandlerThread; - -// Test-only helpers for working with JavaHandlerThread. -class JavaHandlerThreadHelpers { - public: - // Create the Java peer first and test that it works before connecting to the - // native object. - static std::unique_ptr<JavaHandlerThread> CreateJavaFirst(); - - static void ThrowExceptionAndAbort(WaitableEvent* event); - - static bool IsExceptionTestException( - ScopedJavaLocalRef<jthrowable> exception); - - private: - JavaHandlerThreadHelpers() = default; - ~JavaHandlerThreadHelpers() = default; -}; - -} // namespace android -} // namespace base - -#endif // BASE_ANDROID_JAVA_HANDLER_THREAD_FOR_TESTING_H_
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java deleted file mode 100644 index 59ab519..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java +++ /dev/null
@@ -1,282 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import android.app.Activity; -import android.app.Application; -import android.app.Instrumentation; -import android.content.Context; -import android.content.pm.InstrumentationInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.os.Bundle; -import android.support.test.InstrumentationRegistry; -import android.support.test.internal.runner.RunnerArgs; -import android.support.test.internal.runner.TestExecutor; -import android.support.test.internal.runner.TestLoader; -import android.support.test.internal.runner.TestRequest; -import android.support.test.internal.runner.TestRequestBuilder; -import android.support.test.runner.AndroidJUnitRunner; - -import dalvik.system.DexFile; - -import org.chromium.base.BuildConfig; -import org.chromium.base.Log; -import org.chromium.base.annotations.MainDex; -import org.chromium.base.multidex.ChromiumMultiDexInstaller; - -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.Enumeration; - -/** - * A custom AndroidJUnitRunner that supports multidex installer and list out test information. - * - * This class is the equivalent of BaseChromiumInstrumentationTestRunner in JUnit3. Please - * beware that is this not a class runner. It is declared in test apk AndroidManifest.xml - * <instrumentation> - * - * TODO(yolandyan): remove this class after all tests are converted to JUnit4. Use class runner - * for test listing. - */ -@MainDex -public class BaseChromiumAndroidJUnitRunner extends AndroidJUnitRunner { - private static final String LIST_ALL_TESTS_FLAG = - "org.chromium.base.test.BaseChromiumAndroidJUnitRunner.TestList"; - private static final String LIST_TESTS_PACKAGE_FLAG = - "org.chromium.base.test.BaseChromiumAndroidJUnitRunner.TestListPackage"; - /** - * This flag is supported by AndroidJUnitRunner. - * - * See the following page for detail - * https://developer.android.com/reference/android/support/test/runner/AndroidJUnitRunner.html - */ - private static final String ARGUMENT_TEST_PACKAGE = "package"; - - /** - * The following arguments are corresponding to AndroidJUnitRunner command line arguments. - * `annotation`: run with only the argument annotation - * `notAnnotation`: run all tests except the ones with argument annotation - * `log`: run in log only mode, do not execute tests - * - * For more detail, please check - * https://developer.android.com/reference/android/support/test/runner/AndroidJUnitRunner.html - */ - private static final String ARGUMENT_ANNOTATION = "annotation"; - private static final String ARGUMENT_NOT_ANNOTATION = "notAnnotation"; - private static final String ARGUMENT_LOG_ONLY = "log"; - - private static final String TAG = "BaseJUnitRunner"; - - @Override - public Application newApplication(ClassLoader cl, String className, Context context) - throws ClassNotFoundException, IllegalAccessException, InstantiationException { - // The multidex support library doesn't currently support having the test apk be multidex - // as well as the under-test apk being multidex. If MultiDex.install() is called for both, - // then re-extraction is triggered every time due to the support library caching only a - // single timestamp & crc. - // - // Attempt to install test apk multidex only if the apk-under-test is not multidex. - // It will likely continue to be true that the two are mutually exclusive because: - // * ProGuard enabled => - // Under-test apk is single dex. - // Test apk duplicates under-test classes, so may need multidex. - // * ProGuard disabled => - // Under-test apk might be multidex - // Test apk does not duplicate classes, so does not need multidex. - // https://crbug.com/824523 - if (!BuildConfig.IS_MULTIDEX_ENABLED) { - ChromiumMultiDexInstaller.install(new BaseChromiumRunnerCommon.MultiDexContextWrapper( - getContext(), getTargetContext())); - BaseChromiumRunnerCommon.reorderDexPathElements(cl, getContext(), getTargetContext()); - } - return super.newApplication(cl, className, context); - } - - /** - * Add TestListInstrumentationRunListener when argument ask the runner to list tests info. - * - * The running mechanism when argument has "listAllTests" is equivalent to that of - * {@link android.support.test.runner.AndroidJUnitRunner#onStart()} except it adds - * only TestListInstrumentationRunListener to monitor the tests. - */ - @Override - public void onStart() { - Bundle arguments = InstrumentationRegistry.getArguments(); - if (arguments != null && arguments.getString(LIST_ALL_TESTS_FLAG) != null) { - Log.w(TAG, - String.format("Runner will list out tests info in JSON without running tests. " - + "Arguments: %s", - arguments.toString())); - listTests(); // Intentionally not calling super.onStart() to avoid additional work. - } else { - if (arguments != null && arguments.getString(ARGUMENT_LOG_ONLY) != null) { - Log.e(TAG, - String.format("Runner will log the tests without running tests." - + " If this cause a test run to fail, please report to" - + " crbug.com/754015. Arguments: %s", - arguments.toString())); - } - super.onStart(); - } - } - - // TODO(yolandyan): Move this to test harness side once this class gets removed - private void addTestListPackage(Bundle bundle) { - PackageManager pm = getContext().getPackageManager(); - InstrumentationInfo info; - try { - info = pm.getInstrumentationInfo(getComponentName(), PackageManager.GET_META_DATA); - } catch (NameNotFoundException e) { - Log.e(TAG, String.format("Could not find component %s", getComponentName())); - throw new RuntimeException(e); - } - Bundle metaDataBundle = info.metaData; - if (metaDataBundle != null && metaDataBundle.getString(LIST_TESTS_PACKAGE_FLAG) != null) { - bundle.putString( - ARGUMENT_TEST_PACKAGE, metaDataBundle.getString(LIST_TESTS_PACKAGE_FLAG)); - } - } - - private void listTests() { - Bundle results = new Bundle(); - TestListInstrumentationRunListener listener = new TestListInstrumentationRunListener(); - try { - TestExecutor.Builder executorBuilder = new TestExecutor.Builder(this); - executorBuilder.addRunListener(listener); - Bundle junit3Arguments = new Bundle(InstrumentationRegistry.getArguments()); - junit3Arguments.putString(ARGUMENT_NOT_ANNOTATION, "org.junit.runner.RunWith"); - addTestListPackage(junit3Arguments); - TestRequest listJUnit3TestRequest = createListTestRequest(junit3Arguments); - results = executorBuilder.build().execute(listJUnit3TestRequest); - - Bundle junit4Arguments = new Bundle(InstrumentationRegistry.getArguments()); - junit4Arguments.putString(ARGUMENT_ANNOTATION, "org.junit.runner.RunWith"); - addTestListPackage(junit4Arguments); - - // Do not use Log runner from android test support. - // - // Test logging and execution skipping is handled by BaseJUnit4ClassRunner, - // having ARGUMENT_LOG_ONLY in argument bundle here causes AndroidJUnitRunner - // to use its own log-only class runner instead of BaseJUnit4ClassRunner. - junit4Arguments.remove(ARGUMENT_LOG_ONLY); - - TestRequest listJUnit4TestRequest = createListTestRequest(junit4Arguments); - results.putAll(executorBuilder.build().execute(listJUnit4TestRequest)); - listener.saveTestsToJson( - InstrumentationRegistry.getArguments().getString(LIST_ALL_TESTS_FLAG)); - } catch (IOException | RuntimeException e) { - String msg = "Fatal exception when running tests"; - Log.e(TAG, msg, e); - // report the exception to instrumentation out - results.putString(Instrumentation.REPORT_KEY_STREAMRESULT, - msg + "\n" + Log.getStackTraceString(e)); - } - finish(Activity.RESULT_OK, results); - } - - private TestRequest createListTestRequest(Bundle arguments) { - RunnerArgs runnerArgs = - new RunnerArgs.Builder().fromManifest(this).fromBundle(arguments).build(); - TestRequestBuilder builder = new IncrementalInstallTestRequestBuilder(this, arguments); - builder.addFromRunnerArgs(runnerArgs); - builder.addApkToScan(getContext().getPackageCodePath()); - return builder.build(); - } - - static boolean shouldListTests(Bundle arguments) { - return arguments != null && arguments.getString(LIST_ALL_TESTS_FLAG) != null; - } - - /** - * Wraps TestRequestBuilder to make it work with incremental install. - */ - private static class IncrementalInstallTestRequestBuilder extends TestRequestBuilder { - boolean mHasClassList; - - public IncrementalInstallTestRequestBuilder(Instrumentation instr, Bundle bundle) { - super(instr, bundle); - } - - @Override - public TestRequestBuilder addTestClass(String className) { - mHasClassList = true; - return super.addTestClass(className); - } - - @Override - public TestRequestBuilder addTestMethod(String testClassName, String testMethodName) { - mHasClassList = true; - return super.addTestMethod(testClassName, testMethodName); - } - - @Override - public TestRequest build() { - // See crbug://841695. TestLoader.isTestClass is incorrectly deciding that - // InstrumentationTestSuite is a test class. - removeTestClass("android.test.InstrumentationTestSuite"); - // If a test class was requested, then no need to iterate class loader. - if (mHasClassList) { - return super.build(); - } - maybeScanIncrementalClasspath(); - return super.build(); - } - - private void maybeScanIncrementalClasspath() { - DexFile[] incrementalJars = null; - try { - Class<?> bootstrapClass = - Class.forName("org.chromium.incrementalinstall.BootstrapApplication"); - incrementalJars = - (DexFile[]) bootstrapClass.getDeclaredField("sIncrementalDexFiles") - .get(null); - } catch (Exception e) { - // Not an incremental apk. - } - if (incrementalJars != null) { - // builder.addApkToScan uses new DexFile(path) under the hood, which on Dalvik OS's - // assumes that the optimized dex is in the default location (crashes). - // Perform our own dex file scanning instead as a workaround. - addTestClasses(incrementalJars, this); - } - } - - private boolean startsWithAny(String str, String[] prefixes) { - for (String prefix : prefixes) { - if (str.startsWith(prefix)) { - return true; - } - } - return false; - } - - private void addTestClasses(DexFile[] dexFiles, TestRequestBuilder builder) { - Log.i(TAG, "Scanning incremental classpath."); - String[] excludedPrefixes; - try { - Field excludedPackagesField = - TestRequestBuilder.class.getDeclaredField("DEFAULT_EXCLUDED_PACKAGES"); - excludedPackagesField.setAccessible(true); - excludedPrefixes = (String[]) excludedPackagesField.get(null); - } catch (Exception e) { - throw new RuntimeException(e); - } - - // Mirror TestRequestBuilder.getClassNamesFromClassPath(). - TestLoader loader = new TestLoader(); - for (DexFile dexFile : dexFiles) { - Enumeration<String> classNames = dexFile.entries(); - while (classNames.hasMoreElements()) { - String className = classNames.nextElement(); - if (!className.contains("$") && !startsWithAny(className, excludedPrefixes) - && loader.loadIfTest(className) != null) { - addTestClass(className); - } - } - } - } - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java deleted file mode 100644 index e5eb273..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java +++ /dev/null
@@ -1,162 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import android.content.Context; -import android.content.ContextWrapper; -import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.support.v4.content.ContextCompat; - -import org.chromium.android.support.PackageManagerWrapper; -import org.chromium.base.Log; -import org.chromium.base.annotations.MainDex; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Comparator; - -/** - * Functionality common to the JUnit3 and JUnit4 runners. - */ -@MainDex -class BaseChromiumRunnerCommon { - private static final String TAG = "base_test"; - - /** - * A ContextWrapper that allows multidex test APKs to extract secondary dexes into - * the APK under test's data directory. - */ - @MainDex - static class MultiDexContextWrapper extends ContextWrapper { - private Context mAppContext; - - MultiDexContextWrapper(Context instrContext, Context appContext) { - super(instrContext); - mAppContext = appContext; - } - - @Override - public File getFilesDir() { - return mAppContext.getFilesDir(); - } - - @Override - public SharedPreferences getSharedPreferences(String name, int mode) { - return mAppContext.getSharedPreferences(name, mode); - } - - @Override - public PackageManager getPackageManager() { - return new PackageManagerWrapper(super.getPackageManager()) { - @Override - public ApplicationInfo getApplicationInfo(String packageName, int flags) { - try { - ApplicationInfo ai = super.getApplicationInfo(packageName, flags); - if (packageName.equals(getPackageName())) { - File dataDir = new File( - ContextCompat.getCodeCacheDir(mAppContext), "test-multidex"); - if (!dataDir.exists() && !dataDir.mkdirs()) { - throw new IOException(String.format( - "Unable to create test multidex directory \"%s\"", - dataDir.getPath())); - } - ai.dataDir = dataDir.getPath(); - } - return ai; - } catch (Exception e) { - Log.e(TAG, "Failed to get application info for %s", packageName, e); - } - return null; - } - }; - } - } - - /** - * Ensure all test dex entries precede app dex entries. - * - * @param cl ClassLoader to modify. Assumed to be a derivative of - * {@link dalvik.system.BaseDexClassLoader}. If this isn't - * the case, reordering will fail. - */ - static void reorderDexPathElements(ClassLoader cl, Context context, Context targetContext) { - try { - Log.i(TAG, - "Reordering dex files. If you're building a multidex test APK and see a " - + "class resolving to an unexpected implementation, this may be why."); - Field pathListField = findField(cl, "pathList"); - Object dexPathList = pathListField.get(cl); - Field dexElementsField = findField(dexPathList, "dexElements"); - Object[] dexElementsList = (Object[]) dexElementsField.get(dexPathList); - Arrays.sort(dexElementsList, - new DexListReorderingComparator( - context.getPackageName(), targetContext.getPackageName())); - dexElementsField.set(dexPathList, dexElementsList); - } catch (Exception e) { - Log.e(TAG, "Failed to reorder dex elements for testing.", e); - } - } - - /** - * Comparator for sorting dex list entries. - * - * Using this to sort a list of dex list entries will result in the following order: - * - Strings that contain neither the test package nor the app package in lexicographical - * order. - * - Strings that contain the test package in lexicographical order. - * - Strings that contain the app package but not the test package in lexicographical order. - */ - private static class DexListReorderingComparator implements Comparator<Object>, Serializable { - private String mTestPackage; - private String mAppPackage; - - public DexListReorderingComparator(String testPackage, String appPackage) { - mTestPackage = testPackage; - mAppPackage = appPackage; - } - - @Override - public int compare(Object o1, Object o2) { - String s1 = o1.toString(); - String s2 = o2.toString(); - if (s1.contains(mTestPackage)) { - if (!s2.contains(mTestPackage)) { - if (s2.contains(mAppPackage)) { - return -1; - } else { - return 1; - } - } - } else if (s1.contains(mAppPackage)) { - if (s2.contains(mTestPackage)) { - return 1; - } else if (!s2.contains(mAppPackage)) { - return 1; - } - } else if (s2.contains(mTestPackage) || s2.contains(mAppPackage)) { - return -1; - } - return s1.compareTo(s2); - } - } - - private static Field findField(Object instance, String name) throws NoSuchFieldException { - for (Class<?> clazz = instance.getClass(); clazz != null; clazz = clazz.getSuperclass()) { - try { - Field f = clazz.getDeclaredField(name); - f.setAccessible(true); - return f; - } catch (NoSuchFieldException e) { - } - } - throw new NoSuchFieldException( - "Unable to find field " + name + " in " + instance.getClass()); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java deleted file mode 100644 index 102e082..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java +++ /dev/null
@@ -1,242 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import static org.chromium.base.test.BaseChromiumAndroidJUnitRunner.shouldListTests; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner; -import android.support.test.internal.util.AndroidRunnerParams; - -import org.junit.runner.Description; -import org.junit.runner.notification.RunNotifier; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.InitializationError; -import org.junit.runners.model.Statement; - -import org.chromium.base.CollectionUtil; -import org.chromium.base.CommandLine; -import org.chromium.base.ContextUtils; -import org.chromium.base.Log; -import org.chromium.base.test.BaseTestResult.PreTestHook; -import org.chromium.base.test.util.DisableIfSkipCheck; -import org.chromium.base.test.util.ManualSkipCheck; -import org.chromium.base.test.util.MinAndroidSdkLevelSkipCheck; -import org.chromium.base.test.util.RestrictionSkipCheck; -import org.chromium.base.test.util.SkipCheck; - -import java.io.File; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - -/** - * A custom runner for JUnit4 tests that checks requirements to conditionally ignore tests. - * - * This ClassRunner imports from AndroidJUnit4ClassRunner which is a hidden but accessible - * class. The reason is that default JUnit4 runner for Android is a final class, - * AndroidJUnit4. We need to extends an inheritable class to change {@link #runChild} - * and {@link #isIgnored} to add SkipChecks and PreTesthook. - */ -public class BaseJUnit4ClassRunner extends AndroidJUnit4ClassRunner { - private static final String TAG = "BaseJUnit4ClassRunnr"; - private final List<SkipCheck> mSkipChecks; - private final List<PreTestHook> mPreTestHooks; - - private static final String EXTRA_TRACE_FILE = - "org.chromium.base.test.BaseJUnit4ClassRunner.TraceFile"; - - /** - * Create a BaseJUnit4ClassRunner to run {@code klass} and initialize values - * - * @throws InitializationError if the test class malformed - */ - public BaseJUnit4ClassRunner(final Class<?> klass) throws InitializationError { - this(klass, null, null); - } - - /** - * Create a BaseJUnit4ClassRunner to run {@code klass} and initialize values. - * - * To add more SkipCheck or PreTestHook in subclass, create Lists of checks and hooks, - * pass them into the super constructors. If you want make a subclass extendable by other - * class runners, you also have to create a constructor similar to the following one that - * merges default checks or hooks with this checks and hooks passed in by constructor. - * - * <pre> - * <code> - * e.g. - * public ChildRunner extends BaseJUnit4ClassRunner { - * public ChildRunner(final Class<?> klass) { - * throws InitializationError { - * this(klass, null, null); - * } - * - * public ChildRunner( - * final Class<?> klass, List<SkipCheck> checks, List<PreTestHook> hook) { - * throws InitializationError { - * super(klass, mergeList( - * checks, defaultSkipChecks()), mergeList(hooks, DEFAULT_HOOKS)); - * } - * - * public List<SkipCheck> defaultSkipChecks() {...} - * - * public List<PreTestHook> defaultPreTestHooks() {...} - * </code> - * </pre> - * - * @throws InitializationError if the test class malformed - */ - public BaseJUnit4ClassRunner( - final Class<?> klass, List<SkipCheck> checks, List<PreTestHook> hooks) - throws InitializationError { - super(klass, - new AndroidRunnerParams(InstrumentationRegistry.getInstrumentation(), - InstrumentationRegistry.getArguments(), false, 0L, false)); - - String traceOutput = InstrumentationRegistry.getArguments().getString(EXTRA_TRACE_FILE); - - if (traceOutput != null) { - File traceOutputFile = new File(traceOutput); - File traceOutputDir = traceOutputFile.getParentFile(); - - if (traceOutputDir != null) { - if (traceOutputDir.exists() || traceOutputDir.mkdirs()) { - TestTraceEvent.enable(traceOutputFile); - } - } - } - - mSkipChecks = mergeList(checks, defaultSkipChecks()); - mPreTestHooks = mergeList(hooks, defaultPreTestHooks()); - } - - /** - * Merge two List into a new ArrayList. - * - * Used to merge the default SkipChecks/PreTestHooks with the subclasses's - * SkipChecks/PreTestHooks. - */ - protected static final <T> List<T> mergeList(List<T> listA, List<T> listB) { - List<T> l = new ArrayList<>(); - if (listA != null) { - l.addAll(listA); - } - if (listB != null) { - l.addAll(listB); - } - return l; - } - - @Override - protected void collectInitializationErrors(List<Throwable> errors) { - super.collectInitializationErrors(errors); - // Log any initialization errors to help debugging, as the host-side test runner can get - // confused by the thrown exception. - if (!errors.isEmpty()) { - Log.e(TAG, "Initialization errors in %s: %s", getTestClass().getName(), errors); - } - } - - /** - * Change this static function to add or take out default {@code SkipCheck}s. - */ - private static List<SkipCheck> defaultSkipChecks() { - return CollectionUtil.newArrayList( - new RestrictionSkipCheck(InstrumentationRegistry.getTargetContext()), - new MinAndroidSdkLevelSkipCheck(), new DisableIfSkipCheck(), new ManualSkipCheck()); - } - - /** - * Change this static function to add or take out default {@code PreTestHook}s. - */ - private static List<PreTestHook> defaultPreTestHooks() { - return null; - } - - /** - * Evaluate whether a FrameworkMethod is ignored based on {@code SkipCheck}s. - */ - @Override - protected boolean isIgnored(FrameworkMethod method) { - return super.isIgnored(method) || shouldSkip(method); - } - - /** - * Run test with or without execution based on bundle arguments. - */ - @Override - public void run(RunNotifier notifier) { - ContextUtils.initApplicationContext( - InstrumentationRegistry.getTargetContext().getApplicationContext()); - if (shouldListTests(InstrumentationRegistry.getArguments())) { - for (Description child : getDescription().getChildren()) { - notifier.fireTestStarted(child); - notifier.fireTestFinished(child); - } - } else { - if (!CommandLine.isInitialized()) { - initCommandLineForTest(); - } - super.run(notifier); - } - } - - /** - * Override this method to change how test class runner initiate commandline flags - */ - protected void initCommandLineForTest() { - CommandLine.init(null); - } - - @Override - protected void runChild(FrameworkMethod method, RunNotifier notifier) { - String testName = method.getName(); - TestTraceEvent.begin(testName); - - runPreTestHooks(method); - - super.runChild(method, notifier); - - TestTraceEvent.end(testName); - - // A new instance of BaseJUnit4ClassRunner is created on the device - // for each new method, so runChild will only be called once. Thus, we - // can disable tracing, and dump the output, once we get here. - TestTraceEvent.disable(); - } - - /** - * Loop through all the {@code PreTestHook}s to run them - */ - private void runPreTestHooks(FrameworkMethod frameworkMethod) { - Method testMethod = frameworkMethod.getMethod(); - Context targetContext = InstrumentationRegistry.getTargetContext(); - for (PreTestHook hook : mPreTestHooks) { - hook.run(targetContext, testMethod); - } - } - - /** - * Loop through all the {@code SkipCheck}s to confirm whether a test should be ignored - */ - private boolean shouldSkip(FrameworkMethod method) { - for (SkipCheck s : mSkipChecks) { - if (s.shouldSkip(method)) { - return true; - } - } - return false; - } - - /* - * Overriding this method to take screenshot of failure before tear down functions are run. - */ - @Override - protected Statement withAfters(FrameworkMethod method, Object test, Statement base) { - return super.withAfters(method, test, new ScreenshotOnFailureStatement(base)); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseTestResult.java b/base/test/android/javatests/src/org/chromium/base/test/BaseTestResult.java deleted file mode 100644 index a80e0cc..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseTestResult.java +++ /dev/null
@@ -1,137 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import android.app.Instrumentation; -import android.content.Context; -import android.os.Bundle; -import android.os.SystemClock; - -import junit.framework.TestCase; -import junit.framework.TestResult; - -import org.chromium.base.Log; -import org.chromium.base.test.util.SkipCheck; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - -/** - * A test result that can skip tests. - */ -public class BaseTestResult extends TestResult { - private static final String TAG = "base_test"; - - private static final int SLEEP_INTERVAL_MS = 50; - private static final int WAIT_DURATION_MS = 5000; - - private final Instrumentation mInstrumentation; - private final List<SkipCheck> mSkipChecks; - private final List<PreTestHook> mPreTestHooks; - - /** - * Creates an instance of BaseTestResult. - */ - public BaseTestResult(Instrumentation instrumentation) { - mSkipChecks = new ArrayList<>(); - mPreTestHooks = new ArrayList<>(); - mInstrumentation = instrumentation; - } - - /** - * An interface for classes that have some code to run before a test. They run after - * {@link SkipCheck}s. Provides access to the test method (and the annotations defined for it) - * and the instrumentation context. - */ - public interface PreTestHook { - /** - * @param targetContext the instrumentation context that will be used during the test. - * @param testMethod the test method to be run. - */ - public void run(Context targetContext, Method testMethod); - } - - /** - * Adds a check for whether a test should run. - * - * @param skipCheck The check to add. - */ - public void addSkipCheck(SkipCheck skipCheck) { - mSkipChecks.add(skipCheck); - } - - /** - * Adds hooks that will be executed before each test that runs. - * - * @param preTestHook The hook to add. - */ - public void addPreTestHook(PreTestHook preTestHook) { - mPreTestHooks.add(preTestHook); - } - - protected boolean shouldSkip(TestCase test) { - for (SkipCheck s : mSkipChecks) { - if (s.shouldSkip(test)) return true; - } - return false; - } - - private void runPreTestHooks(TestCase test) { - try { - Method testMethod = test.getClass().getMethod(test.getName()); - Context targetContext = getTargetContext(); - - for (PreTestHook hook : mPreTestHooks) { - hook.run(targetContext, testMethod); - } - } catch (NoSuchMethodException e) { - Log.e(TAG, "Unable to run pre test hooks.", e); - } - } - - @Override - protected void run(TestCase test) { - runPreTestHooks(test); - - if (shouldSkip(test)) { - startTest(test); - - Bundle skipResult = new Bundle(); - skipResult.putString("class", test.getClass().getName()); - skipResult.putString("test", test.getName()); - skipResult.putBoolean("test_skipped", true); - mInstrumentation.sendStatus(0, skipResult); - - endTest(test); - } else { - super.run(test); - } - } - - /** - * Gets the target context. - * - * On older versions of Android, getTargetContext() may initially return null, so we have to - * wait for it to become available. - * - * @return The target {@link Context} if available; null otherwise. - */ - public Context getTargetContext() { - Context targetContext = mInstrumentation.getTargetContext(); - try { - long startTime = SystemClock.uptimeMillis(); - // TODO(jbudorick): Convert this to CriteriaHelper once that moves to base/. - while (targetContext == null - && SystemClock.uptimeMillis() - startTime < WAIT_DURATION_MS) { - Thread.sleep(SLEEP_INTERVAL_MS); - targetContext = mInstrumentation.getTargetContext(); - } - } catch (InterruptedException e) { - Log.e(TAG, "Interrupted while attempting to initialize the command line."); - } - return targetContext; - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java b/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java deleted file mode 100644 index 397e8ab..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java +++ /dev/null
@@ -1,83 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import android.support.test.InstrumentationRegistry; -import android.support.test.uiautomator.UiDevice; - -import org.junit.runners.model.Statement; - -import org.chromium.base.Log; - -import java.io.File; - -/** - * Statement that captures screenshots if |base| statement fails. - * - * If --screenshot-path commandline flag is given, this |Statement| - * will save a screenshot to the specified path in the case of a test failure. - */ -public class ScreenshotOnFailureStatement extends Statement { - private static final String TAG = "ScreenshotOnFail"; - - private static final String EXTRA_SCREENSHOT_FILE = - "org.chromium.base.test.ScreenshotOnFailureStatement.ScreenshotFile"; - - private final Statement mBase; - - public ScreenshotOnFailureStatement(final Statement base) { - mBase = base; - } - - @Override - public void evaluate() throws Throwable { - try { - mBase.evaluate(); - } catch (Throwable e) { - takeScreenshot(); - throw e; - } - } - - private void takeScreenshot() { - String screenshotFilePath = - InstrumentationRegistry.getArguments().getString(EXTRA_SCREENSHOT_FILE); - if (screenshotFilePath == null) { - Log.d(TAG, - String.format("Did not save screenshot of failure. Must specify %s " - + "instrumentation argument to enable this feature.", - EXTRA_SCREENSHOT_FILE)); - return; - } - - UiDevice uiDevice = null; - try { - uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); - } catch (RuntimeException ex) { - Log.d(TAG, "Failed to initialize UiDevice", ex); - return; - } - - File screenshotFile = new File(screenshotFilePath); - File screenshotDir = screenshotFile.getParentFile(); - if (screenshotDir == null) { - Log.d(TAG, - String.format( - "Failed to create parent directory for %s. Can't save screenshot.", - screenshotFile)); - return; - } - if (!screenshotDir.exists()) { - if (!screenshotDir.mkdirs()) { - Log.d(TAG, - String.format( - "Failed to create %s. Can't save screenshot.", screenshotDir)); - return; - } - } - Log.d(TAG, String.format("Saving screenshot of test failure, %s", screenshotFile)); - uiDevice.takeScreenshot(screenshotFile); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/SetUpStatement.java b/base/test/android/javatests/src/org/chromium/base/test/SetUpStatement.java deleted file mode 100644 index 30ac2b6..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/SetUpStatement.java +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import org.junit.rules.TestRule; -import org.junit.runners.model.Statement; - -/** - * Custom Statement for SetUpTestRules. - * - * Calls {@link SetUpTestRule#setUp} before evaluating {@link SetUpTestRule#base} if - * {@link SetUpTestRule#shouldSetUp} is true - */ -public class SetUpStatement extends Statement { - private final Statement mBase; - private final SetUpTestRule<? extends TestRule> mSetUpTestRule; - private final boolean mShouldSetUp; - - public SetUpStatement( - final Statement base, SetUpTestRule<? extends TestRule> callback, boolean shouldSetUp) { - mBase = base; - mSetUpTestRule = callback; - mShouldSetUp = shouldSetUp; - } - - @Override - public void evaluate() throws Throwable { - if (mShouldSetUp) { - mSetUpTestRule.setUp(); - } - mBase.evaluate(); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/SetUpTestRule.java b/base/test/android/javatests/src/org/chromium/base/test/SetUpTestRule.java deleted file mode 100644 index 57dd8db..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/SetUpTestRule.java +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import org.junit.rules.TestRule; - -/** - * An interface for TestRules that can be configured to automatically run set-up logic prior - * to @Before. - * - * TestRules that implement this interface should return a {@link SetUpStatement} from their {@link - * TestRule#apply} method - * - * @param <T> TestRule type that implements this SetUpTestRule - */ -public interface SetUpTestRule<T extends TestRule> { - /** - * Set whether the TestRule should run setUp automatically. - * - * So TestRule can be declared in test like this: - * <code> - * @Rule TestRule mRule = new MySetUpTestRule().shouldSetUp(true); - * </code> - * - * @return itself to chain up the calls for convenience - */ - T shouldSetUp(boolean runSetUp); - - /** - * Specify setUp action in this method - */ - void setUp(); -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/TestChildProcessConnection.java b/base/test/android/javatests/src/org/chromium/base/test/TestChildProcessConnection.java deleted file mode 100644 index ae91b44..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/TestChildProcessConnection.java +++ /dev/null
@@ -1,87 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import android.content.ComponentName; -import android.content.Intent; -import android.os.Bundle; - -import org.chromium.base.process_launcher.ChildProcessConnection; - -/** An implementation of ChildProcessConnection that does not connect to a real service. */ -public class TestChildProcessConnection extends ChildProcessConnection { - private static class MockChildServiceConnection - implements ChildProcessConnection.ChildServiceConnection { - private boolean mBound; - - @Override - public boolean bind() { - mBound = true; - return true; - } - - @Override - public void unbind() { - mBound = false; - } - - @Override - public boolean isBound() { - return mBound; - } - } - - private int mPid; - private boolean mConnected; - private ServiceCallback mServiceCallback; - - /** - * Creates a mock binding corresponding to real ManagedChildProcessConnection after the - * connection is established: with initial binding bound and no strong binding. - */ - public TestChildProcessConnection(ComponentName serviceName, boolean bindToCaller, - boolean bindAsExternalService, Bundle serviceBundle) { - super(null /* context */, serviceName, bindToCaller, bindAsExternalService, serviceBundle, - new ChildServiceConnectionFactory() { - @Override - public ChildServiceConnection createConnection(Intent bindIntent, int bindFlags, - ChildServiceConnectionDelegate delegate) { - return new MockChildServiceConnection(); - } - }); - } - - public void setPid(int pid) { - mPid = pid; - } - - @Override - public int getPid() { - return mPid; - } - - // We don't have a real service so we have to mock the connection status. - @Override - public void start(boolean useStrongBinding, ServiceCallback serviceCallback) { - super.start(useStrongBinding, serviceCallback); - mConnected = true; - mServiceCallback = serviceCallback; - } - - @Override - public void stop() { - super.stop(); - mConnected = false; - } - - @Override - public boolean isConnected() { - return mConnected; - } - - public ServiceCallback getServiceCallback() { - return mServiceCallback; - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/TestListInstrumentationRunListener.java b/base/test/android/javatests/src/org/chromium/base/test/TestListInstrumentationRunListener.java deleted file mode 100644 index 8cde570..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/TestListInstrumentationRunListener.java +++ /dev/null
@@ -1,142 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import android.support.test.internal.runner.listener.InstrumentationRunListener; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.junit.runner.Description; - -import org.chromium.base.Log; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -/** - * A RunListener that list out all the test information into a json file. - */ -public class TestListInstrumentationRunListener extends InstrumentationRunListener { - private static final String TAG = "TestListRunListener"; - private static final Set<String> SKIP_METHODS = new HashSet<>( - Arrays.asList(new String[] {"toString", "hashCode", "annotationType", "equals"})); - - private final Map<Class<?>, JSONObject> mTestClassJsonMap = new HashMap<>(); - - /** - * Store the test method description to a Map at the beginning of a test run. - */ - @Override - public void testStarted(Description desc) throws Exception { - if (mTestClassJsonMap.containsKey(desc.getTestClass())) { - ((JSONArray) mTestClassJsonMap.get(desc.getTestClass()).get("methods")) - .put(getTestMethodJSON(desc)); - } else { - Class<?> testClass = desc.getTestClass(); - mTestClassJsonMap.put(desc.getTestClass(), new JSONObject() - .put("class", testClass.getName()) - .put("superclass", testClass.getSuperclass().getName()) - .put("annotations", - getAnnotationJSON(Arrays.asList(testClass.getAnnotations()))) - .put("methods", new JSONArray().put(getTestMethodJSON(desc)))); - } - } - - /** - * Create a JSONArray with all the test class JSONObjects and save it to listed output path. - */ - public void saveTestsToJson(String outputPath) throws IOException { - Writer writer = null; - File file = new File(outputPath); - try { - writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); - JSONArray allTestClassesJSON = new JSONArray(mTestClassJsonMap.values()); - writer.write(allTestClassesJSON.toString()); - } catch (IOException e) { - Log.e(TAG, "failed to write json to file", e); - throw e; - } finally { - if (writer != null) { - try { - writer.close(); - } catch (IOException e) { - // Intentionally ignore IOException when closing writer - } - } - } - } - - /** - * Return a JSONOject that represent a Description of a method". - */ - static JSONObject getTestMethodJSON(Description desc) throws Exception { - return new JSONObject() - .put("method", desc.getMethodName()) - .put("annotations", getAnnotationJSON(desc.getAnnotations())); - } - - /** - * Create a JSONObject that represent a collection of anntations. - * - * For example, for the following group of annotations for ExampleClass - * <code> - * @A - * @B(message = "hello", level = 3) - * public class ExampleClass() {} - * </code> - * - * This method would return a JSONObject as such: - * <code> - * { - * "A": {}, - * "B": { - * "message": "hello", - * "level": "3" - * } - * } - * </code> - * - * The method accomplish this by though through each annotation and reflectively call the - * annotation's method to get the element value, with exceptions to methods like "equals()" - * or "hashCode". - */ - static JSONObject getAnnotationJSON(Collection<Annotation> annotations) - throws Exception { - JSONObject annotationsJsons = new JSONObject(); - for (Annotation a : annotations) { - JSONObject elementJsonObject = new JSONObject(); - for (Method method : a.annotationType().getMethods()) { - if (SKIP_METHODS.contains(method.getName())) { - continue; - } - try { - Object value = method.invoke(a); - if (value == null) { - elementJsonObject.put(method.getName(), null); - } else { - elementJsonObject.put(method.getName(), - value.getClass().isArray() - ? new JSONArray(Arrays.asList((Object[]) value)) - : value.toString()); - } - } catch (IllegalArgumentException e) { - } - } - annotationsJsons.put(a.annotationType().getSimpleName(), elementJsonObject); - } - return annotationsJsons; - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/TestTraceEvent.java b/base/test/android/javatests/src/org/chromium/base/test/TestTraceEvent.java deleted file mode 100644 index 5e0f6b3..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/TestTraceEvent.java +++ /dev/null
@@ -1,168 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import org.chromium.base.Log; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.PrintStream; - -/** - * TestTraceEvent is a modified version of TraceEvent, intended for tracing test runs. - */ -public class TestTraceEvent { - private static final String TAG = "TestTraceEvent"; - - /** The event types understood by the trace scripts. */ - private enum EventType { - BEGIN("B"), - END("E"), - INSTANT("I"); - - private final String mTypeStr; - - EventType(String typeStr) { - mTypeStr = typeStr; - } - - @Override - public String toString() { - return mTypeStr; - } - } - - // Locks internal fields. - private static final Object sLock = new Object(); - - private static File sOutputFile; - - private static boolean sEnabled; - - // A list of trace event strings. - private static JSONArray sTraceStrings; - - /** - * Enable tracing, and set a specific output file. If tracing was previously enabled and - * disabled, that data is cleared. - * - * @param file Which file to append the trace data to. - */ - public static void enable(File outputFile) { - synchronized (sLock) { - if (sEnabled) return; - - sEnabled = true; - sOutputFile = outputFile; - sTraceStrings = new JSONArray(); - } - } - - /** - * Disabling of tracing will dump trace data to the system log. - */ - public static void disable() { - synchronized (sLock) { - if (!sEnabled) return; - - sEnabled = false; - dumpTraceOutput(); - sTraceStrings = null; - } - } - - /** - * @return True if tracing is enabled, false otherwise. - */ - public static boolean isEnabled() { - synchronized (sLock) { - return sEnabled; - } - } - - /** - * Record an "instant" trace event. E.g. "screen update happened". - */ - public static void instant(String name) { - synchronized (sLock) { - if (!sEnabled) return; - - saveTraceString(name, name.hashCode(), EventType.INSTANT); - } - } - - /** - * Record an "begin" trace event. Begin trace events should have a matching end event (recorded - * by calling {@link #end(String)}). - */ - public static void begin(String name) { - synchronized (sLock) { - if (!sEnabled) return; - - saveTraceString(name, name.hashCode(), EventType.BEGIN); - } - } - - /** - * Record an "end" trace event, to match a begin event (recorded by calling {@link - * #begin(String)}). The time delta between begin and end is usually interesting to graph code. - */ - public static void end(String name) { - synchronized (sLock) { - if (!sEnabled) return; - - saveTraceString(name, name.hashCode(), EventType.END); - } - } - - /** - * Save a trace event as a JSON dict. - * - * @param name The trace data. - * @param id An identifier for the event, to be saved as the thread ID. - * @param type the type of trace event (B, E, I). - */ - private static void saveTraceString(String name, long id, EventType type) { - // We use System.currentTimeMillis() because it agrees with the value of - // the $EPOCHREALTIME environment variable. The Python test runner code - // uses that variable to synchronize timing. - long timeMicroseconds = System.currentTimeMillis() * 1000; - - try { - JSONObject traceObj = new JSONObject(); - traceObj.put("cat", "Java"); - traceObj.put("ts", timeMicroseconds); - traceObj.put("ph", type); - traceObj.put("name", name); - traceObj.put("tid", id); - - sTraceStrings.put(traceObj); - } catch (JSONException e) { - throw new RuntimeException(e); - } - } - - /** - * Dump all tracing data we have saved up to the log. - * Output as JSON for parsing convenience. - */ - private static void dumpTraceOutput() { - try { - PrintStream stream = new PrintStream(new FileOutputStream(sOutputFile, true)); - try { - stream.print(sTraceStrings); - } finally { - if (stream != null) stream.close(); - } - } catch (FileNotFoundException ex) { - Log.e(TAG, "Unable to dump trace data to output file."); - } - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java b/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java deleted file mode 100644 index c0dcd46..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.InitializationError; - -import org.chromium.base.test.BaseJUnit4ClassRunner; -import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException; - -import java.util.List; - -/** - * Class runner delegate that extends BaseJUnit4ClassRunner - */ -public final class BaseJUnit4RunnerDelegate - extends BaseJUnit4ClassRunner implements ParameterizedRunnerDelegate { - private ParameterizedRunnerDelegateCommon mDelegateCommon; - - public BaseJUnit4RunnerDelegate(Class<?> klass, - ParameterizedRunnerDelegateCommon delegateCommon) throws InitializationError { - super(klass); - mDelegateCommon = delegateCommon; - } - - @Override - public void collectInitializationErrors(List<Throwable> errors) { - ParameterizedRunnerDelegateCommon.collectInitializationErrors(errors); - } - - @Override - public List<FrameworkMethod> computeTestMethods() { - return mDelegateCommon.computeTestMethods(); - } - - @Override - public Object createTest() throws ParameterizedTestInstantiationException { - return mDelegateCommon.createTest(); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java b/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java deleted file mode 100644 index 7c948bb..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.InitializationError; - -import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException; - -import java.util.List; - -/** - * Parameterized class runner delegate that extends BlockJUnit4ClassRunner - */ -public final class BlockJUnit4RunnerDelegate - extends BlockJUnit4ClassRunner implements ParameterizedRunnerDelegate { - private ParameterizedRunnerDelegateCommon mDelegateCommon; - - public BlockJUnit4RunnerDelegate(Class<?> klass, - ParameterizedRunnerDelegateCommon delegateCommon) throws InitializationError { - super(klass); - mDelegateCommon = delegateCommon; - } - - @Override - public void collectInitializationErrors(List<Throwable> errors) { - ParameterizedRunnerDelegateCommon.collectInitializationErrors(errors); - } - - @Override - public List<FrameworkMethod> computeTestMethods() { - return mDelegateCommon.computeTestMethods(); - } - - @Override - public Object createTest() throws ParameterizedTestInstantiationException { - return mDelegateCommon.createTest(); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamAnnotationRule.java b/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamAnnotationRule.java deleted file mode 100644 index 2986b96..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamAnnotationRule.java +++ /dev/null
@@ -1,62 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.runners.model.Statement; - -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameterAfter; -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameterBefore; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.List; - -/** - * Processes {@link UseMethodParameterBefore} and {@link UseMethodParameterAfter} annotations to run - * the corresponding methods. To use, add an instance to the test class and annotate it with - * {@code @}{@link org.junit.Rule Rule}. - */ -public class MethodParamAnnotationRule extends MethodParamRule { - @Override - protected Statement applyParameterAndValues(final Statement base, Object target, - Class<? extends ParameterProvider> parameterProvider, List<Object> values) { - final List<Method> beforeMethods = new ArrayList<>(); - final List<Method> afterMethods = new ArrayList<>(); - for (Method m : target.getClass().getDeclaredMethods()) { - if (!m.getReturnType().equals(Void.TYPE)) continue; - if (!Modifier.isPublic(m.getModifiers())) continue; - - UseMethodParameterBefore beforeAnnotation = - m.getAnnotation(UseMethodParameterBefore.class); - if (beforeAnnotation != null && beforeAnnotation.value().equals(parameterProvider)) { - beforeMethods.add(m); - } - - UseMethodParameterAfter afterAnnotation = - m.getAnnotation(UseMethodParameterAfter.class); - if (afterAnnotation != null && afterAnnotation.value().equals(parameterProvider)) { - afterMethods.add(m); - } - } - - if (beforeMethods.isEmpty() && afterMethods.isEmpty()) return base; - - return new Statement() { - @Override - public void evaluate() throws Throwable { - for (Method m : beforeMethods) { - m.invoke(target, values.toArray()); - } - - base.evaluate(); - - for (Method m : afterMethods) { - m.invoke(target, values.toArray()); - } - } - }; - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamRule.java b/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamRule.java deleted file mode 100644 index 440831a..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamRule.java +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.rules.MethodRule; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.Statement; - -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter; - -import java.util.List; - -/** - * Abstract base class for rules that are applied to test methods using - * {@link org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter method parameters}. - */ -public abstract class MethodParamRule implements MethodRule { - @Override - public Statement apply(final Statement base, FrameworkMethod method, Object target) { - UseMethodParameter useParameterProvider = method.getAnnotation(UseMethodParameter.class); - if (useParameterProvider == null) return base; - Class<? extends ParameterProvider> parameterProvider = useParameterProvider.value(); - - if (!(method instanceof ParameterizedFrameworkMethod)) return base; - ParameterSet parameters = ((ParameterizedFrameworkMethod) method).getParameterSet(); - List<Object> values = parameters.getValues(); - - return applyParameterAndValues(base, target, parameterProvider, values); - } - - protected abstract Statement applyParameterAndValues(final Statement base, Object target, - Class<? extends ParameterProvider> parameterProvider, List<Object> values); -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterAnnotations.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterAnnotations.java deleted file mode 100644 index 7918369..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterAnnotations.java +++ /dev/null
@@ -1,78 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotations for Parameterized Tests - */ -public class ParameterAnnotations { - /** - * Annotation for test methods to indicate associated {@link ParameterProvider}. - * Note: the class referred to must be public and have a public default constructor. - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.METHOD) - public @interface UseMethodParameter { - Class<? extends ParameterProvider> value(); - } - - /** - * Annotation for methods that should be called before running a test with method parameters. - * - * In order to use this, add a {@link MethodParamAnnotationRule} annotated with - * {@code @}{@link org.junit.Rule Rule} to your test class. - * @see ParameterProvider - * @see UseMethodParameterAfter - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.METHOD) - public @interface UseMethodParameterBefore { - Class<? extends ParameterProvider> value(); - } - - /** - * Annotation for methods that should be called after running a test with method parameters. - * - * In order to use this, add a {@link MethodParamAnnotationRule} annotated with - * {@code @}{@link org.junit.Rule Rule} to your test class. - * @see ParameterProvider - * @see UseMethodParameterBefore - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.METHOD) - public @interface UseMethodParameterAfter { - Class<? extends ParameterProvider> value(); - } - - /** - * Annotation for static field of a `List<ParameterSet>` for entire test class - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - public @interface ClassParameter {} - - /** - * Annotation for static field of a `List<ParameterSet>` of TestRule - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - public @interface RuleParameter {} - - /** - * Annotation for test class, it specifies which ParameterizeRunnerDelegate to use. - * - * The default ParameterizedRunnerDelegate is BaseJUnit4RunnerDelegate.class - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.TYPE) - public @interface UseRunnerDelegate { - Class<? extends ParameterizedRunnerDelegate> value(); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterProvider.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterProvider.java deleted file mode 100644 index 9bf27bd..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterProvider.java +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -/** - * Generator to use generate arguments for parameterized test methods. - * @see ParameterAnnotations.UseMethodParameter - */ -public interface ParameterProvider { Iterable<ParameterSet> getParameters(); }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java deleted file mode 100644 index 1cdb576..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java +++ /dev/null
@@ -1,129 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.Assert; - -import java.io.File; -import java.net.URI; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Callable; - -/** - * A set of parameters for one *SINGLE* test method or test class constructor. - * - * For example, <code>new ParameterSet().value("a", "b")</code> is intended for - * a test method/constructor that takes in two string as arguments. - * <code>public void testSimple(String a, String b) {...}</code> - * or - * <code>public MyTestClass(String a, String b) {...}</code> - * - * To parameterize testSimple or MyTestClass's tests, create multiple ParameterSets - * <code> - * static List<ParameterSet> sAllParameterSets = new ArrayList<>(); - * static { - * sAllParameterSets.add(new ParameterSet().value("a", "b"); - * sAllParameterSets.add(new ParameterSet().value("c", "d"); - * } - */ -public class ParameterSet { - private List<Object> mValues; - private String mName; - - public ParameterSet() {} - - public ParameterSet value(Object firstArg, Object... objects) { - List<Object> parameterList = new ArrayList<Object>(); - parameterList.add(firstArg); - parameterList.addAll(Arrays.asList(objects)); - Assert.assertTrue( - "Can not create ParameterSet with no parameters", parameterList.size() != 0); - mValues = validateAndCopy(parameterList); - return this; - } - - public ParameterSet name(String name) { - mName = name; - return this; - } - - @Override - public String toString() { - if (mValues == null) { - return "null"; - } - return Arrays.toString(mValues.toArray()); - } - - private List<Object> validateAndCopy(List<Object> values) { - List<Object> tempValues = new ArrayList<>(); - for (Object o : values) { - if (o == null) { - tempValues.add(null); - } else { - if (o.getClass().isPrimitive() || ACCEPTABLE_TYPES.contains(o.getClass()) - || o instanceof Callable) { - tempValues.add(o); - } else { - // TODO(yolandyan): maybe come up with way to support - // complex object while handling immutability at the - // same time - throw new IllegalArgumentException("Type \"%s\" is not supported in" - + " parameterized testing at this time. Accepted types include" - + " all primitive types along with " - + Arrays.toString(ACCEPTABLE_TYPES.toArray( - new String[ACCEPTABLE_TYPES.size()]))); - } - } - } - return Collections.unmodifiableList(tempValues); - } - - String getName() { - if (mName == null) { - return ""; - } - return mName; - } - - List<Object> getValues() { - return mValues; - } - - int size() { - if (mValues == null) return 0; - return mValues.size(); - } - - private static final Set<Class<?>> ACCEPTABLE_TYPES = getAcceptableTypes(); - - /** - * Any immutable class is acceptable. - */ - private static Set<Class<?>> getAcceptableTypes() { - Set<Class<?>> ret = new HashSet<Class<?>>(); - ret.add(Boolean.class); - ret.add(Byte.class); - ret.add(Character.class); - ret.add(Class.class); - ret.add(Double.class); - ret.add(File.class); - ret.add(Float.class); - ret.add(Integer.class); - ret.add(Long.class); - ret.add(Short.class); - ret.add(String.class); - ret.add(URI.class); - ret.add(URL.class); - ret.add(Void.class); - return ret; - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java deleted file mode 100644 index f3333b5..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java +++ /dev/null
@@ -1,94 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.runners.model.FrameworkMethod; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -/** - * Custom FrameworkMethod that includes a {@code ParameterSet} that - * represents the parameters for this test method - */ -public class ParameterizedFrameworkMethod extends FrameworkMethod { - private ParameterSet mParameterSet; - private String mName; - - public ParameterizedFrameworkMethod( - Method method, ParameterSet parameterSet, String classParameterSetName) { - super(method); - mParameterSet = parameterSet; - String postFix = ""; - if (classParameterSetName != null && !classParameterSetName.isEmpty()) { - postFix += "_" + classParameterSetName; - } - if (parameterSet != null && !parameterSet.getName().isEmpty()) { - postFix += "_" + parameterSet.getName(); - } - mName = postFix.isEmpty() ? method.getName() : method.getName() + "_" + postFix; - } - - @Override - public String getName() { - return mName; - } - - @Override - public Object invokeExplosively(Object target, Object... params) throws Throwable { - if (mParameterSet != null) { - return super.invokeExplosively(target, mParameterSet.getValues().toArray()); - } - return super.invokeExplosively(target, params); - } - - static List<FrameworkMethod> wrapAllFrameworkMethods( - Collection<FrameworkMethod> frameworkMethods, String classParameterSetName) { - List<FrameworkMethod> results = new ArrayList<>(); - for (FrameworkMethod frameworkMethod : frameworkMethods) { - results.add(new ParameterizedFrameworkMethod( - frameworkMethod.getMethod(), null, classParameterSetName)); - } - return results; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof ParameterizedFrameworkMethod) { - ParameterizedFrameworkMethod method = (ParameterizedFrameworkMethod) obj; - return super.equals(obj) && method.getParameterSet().equals(getParameterSet()) - && method.getName().equals(getName()); - } - return false; - } - - /** - * Override hashCode method to distinguish two ParameterizedFrameworkmethod with same - * Method object. - */ - @Override - public int hashCode() { - int result = 17; - result = 31 * result + super.hashCode(); - result = 31 * result + getName().hashCode(); - if (getParameterSet() != null) { - result = 31 * result + getParameterSet().hashCode(); - } - return result; - } - - Annotation[] getTestAnnotations() { - // TODO(yolandyan): add annotation from the ParameterSet, enable - // test writing to add SkipCheck for an individual parameter - return getMethod().getAnnotations(); - } - - public ParameterSet getParameterSet() { - return mParameterSet; - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunner.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunner.java deleted file mode 100644 index 113f176..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunner.java +++ /dev/null
@@ -1,220 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.Test; -import org.junit.runner.Runner; -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.Suite; -import org.junit.runners.model.FrameworkField; -import org.junit.runners.model.TestClass; - -import org.chromium.base.test.params.ParameterAnnotations.ClassParameter; -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter; -import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate; -import org.chromium.base.test.params.ParameterizedRunnerDelegateFactory.ParameterizedRunnerDelegateInstantiationException; - -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Locale; - -/** - * ParameterizedRunner generates a list of runners for each of class parameter set in a test class. - * - * ParameterizedRunner looks for {@code @ClassParameter} annotation in test class and - * generates a list of ParameterizedRunnerDelegate runners for each ParameterSet. - */ -public final class ParameterizedRunner extends Suite { - private final List<Runner> mRunners; - - /** - * Create a ParameterizedRunner to run test class - * - * @param klass the Class of the test class, test class should be atomic - * (extends only Object) - */ - public ParameterizedRunner(Class<?> klass) throws Throwable { - super(klass, Collections.emptyList()); // pass in empty list of runners - validate(); - mRunners = createRunners(getTestClass()); - } - - @Override - protected List<Runner> getChildren() { - return mRunners; - } - - /** - * ParentRunner calls collectInitializationErrors() to check for errors in Test class. - * Parameterized tests are written in unconventional ways, therefore, this method is - * overridden and validation is done seperately. - */ - @Override - protected void collectInitializationErrors(List<Throwable> errors) { - // Do not call super collectInitializationErrors - } - - private void validate() throws Throwable { - validateNoNonStaticInnerClass(); - validateOnlyOneConstructor(); - validateInstanceMethods(); - validateOnlyOneClassParameterField(); - validateAtLeastOneParameterSetField(); - } - - private void validateNoNonStaticInnerClass() throws Exception { - if (getTestClass().isANonStaticInnerClass()) { - throw new Exception("The inner class " + getTestClass().getName() + " is not static."); - } - } - - private void validateOnlyOneConstructor() throws Exception { - if (!hasOneConstructor()) { - throw new Exception("Test class should have exactly one public constructor"); - } - } - - private boolean hasOneConstructor() { - return getTestClass().getJavaClass().getConstructors().length == 1; - } - - private void validateOnlyOneClassParameterField() { - if (getTestClass().getAnnotatedFields(ClassParameter.class).size() > 1) { - throw new IllegalParameterArgumentException( - "%s class has more than one @ClassParameter, only one is allowed"); - } - } - - private void validateAtLeastOneParameterSetField() { - if (getTestClass().getAnnotatedFields(ClassParameter.class).isEmpty() - && getTestClass().getAnnotatedMethods(UseMethodParameter.class).isEmpty()) { - throw new IllegalArgumentException(String.format(Locale.getDefault(), - "%s has no field annotated with @ClassParameter or method annotated with" - + "@UseMethodParameter; it should not use ParameterizedRunner", - getTestClass().getName())); - } - } - - private void validateInstanceMethods() throws Exception { - if (getTestClass().getAnnotatedMethods(Test.class).size() == 0) { - throw new Exception("No runnable methods"); - } - } - - /** - * Return a list of runner delegates through ParameterizedRunnerDelegateFactory. - * - * For class parameter set: each class can only have one list of class parameter sets. - * Each parameter set will be used to create one runner. - * - * For method parameter set: a single list method parameter sets is associated with - * a string tag, an immutable map of string to parameter set list will be created and - * passed into factory for each runner delegate to create multiple tests. Only one - * Runner will be created for a method that uses @UseMethodParameter, regardless of the - * number of ParameterSets in the associated list. - * - * @return a list of runners - * @throws ParameterizedRunnerDelegateInstantiationException if runner delegate can not - * be instantiated with constructor reflectively - * @throws IllegalAccessError if the field in tests are not accessible - */ - static List<Runner> createRunners(TestClass testClass) - throws IllegalAccessException, ParameterizedRunnerDelegateInstantiationException { - List<ParameterSet> classParameterSetList; - if (testClass.getAnnotatedFields(ClassParameter.class).isEmpty()) { - classParameterSetList = new ArrayList<>(); - classParameterSetList.add(null); - } else { - classParameterSetList = getParameterSetList( - testClass.getAnnotatedFields(ClassParameter.class).get(0), testClass); - validateWidth(classParameterSetList); - } - - Class<? extends ParameterizedRunnerDelegate> runnerDelegateClass = - getRunnerDelegateClass(testClass); - ParameterizedRunnerDelegateFactory factory = new ParameterizedRunnerDelegateFactory(); - List<Runner> runnersForTestClass = new ArrayList<>(); - for (ParameterSet classParameterSet : classParameterSetList) { - BlockJUnit4ClassRunner runner = (BlockJUnit4ClassRunner) factory.createRunner( - testClass, classParameterSet, runnerDelegateClass); - runnersForTestClass.add(runner); - } - return runnersForTestClass; - } - - /** - * Return an unmodifiable list of ParameterSet through a FrameworkField - */ - private static List<ParameterSet> getParameterSetList(FrameworkField field, TestClass testClass) - throws IllegalAccessException { - field.getField().setAccessible(true); - if (!Modifier.isStatic(field.getField().getModifiers())) { - throw new IllegalParameterArgumentException(String.format(Locale.getDefault(), - "ParameterSetList fields must be static, this field %s in %s is not", - field.getName(), testClass.getName())); - } - if (!(field.get(testClass.getJavaClass()) instanceof List)) { - throw new IllegalArgumentException(String.format(Locale.getDefault(), - "Fields with @ClassParameter annotations must be an instance of List, " - + "this field %s in %s is not list", - field.getName(), testClass.getName())); - } - @SuppressWarnings("unchecked") // checked above - List<ParameterSet> result = (List<ParameterSet>) field.get(testClass.getJavaClass()); - return Collections.unmodifiableList(result); - } - - static void validateWidth(Iterable<ParameterSet> parameterSetList) { - int lastSize = -1; - for (ParameterSet set : parameterSetList) { - if (set.size() == 0) { - throw new IllegalParameterArgumentException( - "No parameter is added to method ParameterSet"); - } - if (lastSize == -1 || set.size() == lastSize) { - lastSize = set.size(); - } else { - throw new IllegalParameterArgumentException(String.format(Locale.getDefault(), - "All ParameterSets in a list of ParameterSet must have equal" - + " length. The current ParameterSet (%s) contains %d parameters," - + " while previous ParameterSet contains %d parameters", - Arrays.toString(set.getValues().toArray()), set.size(), lastSize)); - } - } - } - - /** - * Get the runner delegate class for the test class if {@code @UseRunnerDelegate} is used. - * The default runner delegate is BaseJUnit4RunnerDelegate.class - */ - private static Class<? extends ParameterizedRunnerDelegate> getRunnerDelegateClass( - TestClass testClass) { - if (testClass.getAnnotation(UseRunnerDelegate.class) != null) { - return testClass.getAnnotation(UseRunnerDelegate.class).value(); - } - return BaseJUnit4RunnerDelegate.class; - } - - static class IllegalParameterArgumentException extends IllegalArgumentException { - IllegalParameterArgumentException(String msg) { - super(msg); - } - } - - public static class ParameterizedTestInstantiationException extends Exception { - ParameterizedTestInstantiationException( - TestClass testClass, String parameterSetString, Exception e) { - super(String.format( - "Test class %s can not be initiated, the provided parameters are %s," - + " the required parameter types are %s", - testClass.getJavaClass().toString(), parameterSetString, - Arrays.toString(testClass.getOnlyConstructor().getParameterTypes())), - e); - } - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegate.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegate.java deleted file mode 100644 index d3698a9..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegate.java +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.runners.model.FrameworkMethod; - -import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException; - -import java.util.List; - -/** - * This interface defines the methods that needs to be overriden for a Runner to - * be used by ParameterizedRunner to generate individual runners for parameters. - * - * To create a ParameterizedRunnerDelegate, extends from any BlockJUnit4Runner - * children class. You can copy all the implementation from - * org.chromium.base.test.params.BaseJUnit4RunnerDelegate. - */ -public interface ParameterizedRunnerDelegate { - /** - * Override to use DelegateCommon's implementation - */ - void collectInitializationErrors(List<Throwable> errors); - - /** - * Override to use DelegateCommon's implementation - */ - List<FrameworkMethod> computeTestMethods(); - - /** - * Override to use DelegateCommon's implementation - */ - Object createTest() throws ParameterizedTestInstantiationException; -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommon.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommon.java deleted file mode 100644 index f25e2b2..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommon.java +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.TestClass; - -import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException; - -import java.lang.reflect.InvocationTargetException; -import java.util.List; - -/** - * Parameterized runner delegate common that implements method that needed to be - * delegated for parameterization purposes - */ -public final class ParameterizedRunnerDelegateCommon { - private final TestClass mTestClass; - private final ParameterSet mClassParameterSet; - private final List<FrameworkMethod> mParameterizedFrameworkMethodList; - - public ParameterizedRunnerDelegateCommon(TestClass testClass, ParameterSet classParameterSet, - List<FrameworkMethod> parameterizedFrameworkMethods) { - mTestClass = testClass; - mClassParameterSet = classParameterSet; - mParameterizedFrameworkMethodList = parameterizedFrameworkMethods; - } - - /** - * Do not do any validation here because running the default class runner's - * collectInitializationErrors fail due to the overridden computeTestMethod relying on a local - * member variable - * - * The validation needed for parameterized tests is already done by ParameterizedRunner. - */ - public static void collectInitializationErrors( - @SuppressWarnings("unused") List<Throwable> errors) {} - - public List<FrameworkMethod> computeTestMethods() { - return mParameterizedFrameworkMethodList; - } - - private void throwInstantiationException(Exception e) - throws ParameterizedTestInstantiationException { - String parameterSetString = - mClassParameterSet == null ? "null" : mClassParameterSet.toString(); - throw new ParameterizedTestInstantiationException(mTestClass, parameterSetString, e); - } - - public Object createTest() throws ParameterizedTestInstantiationException { - try { - if (mClassParameterSet == null) { - return mTestClass.getOnlyConstructor().newInstance(); - } - return mTestClass.getOnlyConstructor().newInstance( - mClassParameterSet.getValues().toArray()); - } catch (InstantiationException e) { - throwInstantiationException(e); - } catch (IllegalAccessException e) { - throwInstantiationException(e); - } catch (InvocationTargetException e) { - throwInstantiationException(e); - } - assert false; - return null; - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java deleted file mode 100644 index f829981..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java +++ /dev/null
@@ -1,115 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.Test; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.TestClass; - -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Factory to generate delegate class runners for ParameterizedRunner - */ -public class ParameterizedRunnerDelegateFactory { - /** - * Create a runner that implements ParameterizedRunner and extends BlockJUnit4ClassRunner - * - * @param testClass the TestClass object for current test class - * @param classParameterSet A parameter set for test constructor arguments - * @param parameterizedRunnerDelegateClass the parameterized runner delegate class specified - * through {@code @UseRunnerDelegate} - */ - <T extends ParameterizedRunnerDelegate> T createRunner(TestClass testClass, - ParameterSet classParameterSet, Class<T> parameterizedRunnerDelegateClass) - throws ParameterizedRunnerDelegateInstantiationException { - String testMethodPostfix = classParameterSet == null ? null : classParameterSet.getName(); - List<FrameworkMethod> unmodifiableFrameworkMethodList = - generateUnmodifiableFrameworkMethodList(testClass, testMethodPostfix); - ParameterizedRunnerDelegateCommon delegateCommon = new ParameterizedRunnerDelegateCommon( - testClass, classParameterSet, unmodifiableFrameworkMethodList); - try { - return parameterizedRunnerDelegateClass - .getDeclaredConstructor(Class.class, ParameterizedRunnerDelegateCommon.class) - .newInstance(testClass.getJavaClass(), delegateCommon); - } catch (Exception e) { - throw new ParameterizedRunnerDelegateInstantiationException( - parameterizedRunnerDelegateClass.toString(), e); - } - } - - /** - * Match test methods annotated by @UseMethodParameter(X) with - * ParameterSetList annotated by @MethodParameter(X) - * - * @param testClass a {@code TestClass} that wraps around the actual java - * test class - * @param postFix a name postfix for each test - * @return a list of ParameterizedFrameworkMethod - */ - static List<FrameworkMethod> generateUnmodifiableFrameworkMethodList( - TestClass testClass, String postFix) { - // Represent the list of all ParameterizedFrameworkMethod in this test class - List<FrameworkMethod> returnList = new ArrayList<>(); - - for (FrameworkMethod method : testClass.getAnnotatedMethods(Test.class)) { - if (method.getMethod().isAnnotationPresent(UseMethodParameter.class)) { - Iterable<ParameterSet> parameterSets = - getParameters(method.getAnnotation(UseMethodParameter.class).value()); - returnList.addAll(createParameterizedMethods(method, parameterSets, postFix)); - } else { - // If test method is not parameterized (does not have UseMethodParameter annotation) - returnList.add(new ParameterizedFrameworkMethod(method.getMethod(), null, postFix)); - } - } - - return Collections.unmodifiableList(returnList); - } - - /** - * Exception caused by instantiating the provided Runner delegate - * Potentially caused by not overriding collecInitializationErrors() method - * to be empty - */ - public static class ParameterizedRunnerDelegateInstantiationException extends Exception { - private ParameterizedRunnerDelegateInstantiationException( - String runnerDelegateClass, Exception e) { - super(String.format("Current class runner delegate %s can not be instantiated.", - runnerDelegateClass), - e); - } - } - - private static Iterable<ParameterSet> getParameters(Class<? extends ParameterProvider> clazz) { - ParameterProvider parameterProvider; - try { - parameterProvider = clazz.getDeclaredConstructor().newInstance(); - } catch (IllegalAccessException e) { - throw new IllegalStateException("Failed instantiating " + clazz.getCanonicalName(), e); - } catch (InstantiationException e) { - throw new IllegalStateException("Failed instantiating " + clazz.getCanonicalName(), e); - } catch (NoSuchMethodException e) { - throw new IllegalStateException("Failed instantiating " + clazz.getCanonicalName(), e); - } catch (InvocationTargetException e) { - throw new IllegalStateException("Failed instantiating " + clazz.getCanonicalName(), e); - } - return parameterProvider.getParameters(); - } - - private static List<FrameworkMethod> createParameterizedMethods( - FrameworkMethod baseMethod, Iterable<ParameterSet> parameterSetList, String suffix) { - ParameterizedRunner.validateWidth(parameterSetList); - List<FrameworkMethod> returnList = new ArrayList<>(); - for (ParameterSet set : parameterSetList) { - returnList.add(new ParameterizedFrameworkMethod(baseMethod.getMethod(), set, suffix)); - } - return returnList; - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/AdvancedMockContext.java b/base/test/android/javatests/src/org/chromium/base/test/util/AdvancedMockContext.java deleted file mode 100644 index c8117f7..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/AdvancedMockContext.java +++ /dev/null
@@ -1,118 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.content.ComponentCallbacks; -import android.content.ContentResolver; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.SharedPreferences; -import android.test.mock.MockContentResolver; -import android.test.mock.MockContext; - -import java.util.HashMap; -import java.util.Map; - -/** - * ContextWrapper that adds functionality for SharedPreferences and a way to set and retrieve flags. - */ -public class AdvancedMockContext extends ContextWrapper { - - private final MockContentResolver mMockContentResolver = new MockContentResolver(); - - private final Map<String, SharedPreferences> mSharedPreferences = - new HashMap<String, SharedPreferences>(); - - private final Map<String, Boolean> mFlags = new HashMap<String, Boolean>(); - - public AdvancedMockContext(Context base) { - super(base); - } - - public AdvancedMockContext() { - super(new MockContext()); - } - - @Override - public String getPackageName() { - return getBaseContext().getPackageName(); - } - - @Override - public Context getApplicationContext() { - return this; - } - - @Override - public ContentResolver getContentResolver() { - return mMockContentResolver; - } - - public MockContentResolver getMockContentResolver() { - return mMockContentResolver; - } - - @Override - public SharedPreferences getSharedPreferences(String name, int mode) { - synchronized (mSharedPreferences) { - if (!mSharedPreferences.containsKey(name)) { - // Auto-create shared preferences to mimic Android Context behavior - mSharedPreferences.put(name, new InMemorySharedPreferences()); - } - return mSharedPreferences.get(name); - } - } - - @Override - public void registerComponentCallbacks(ComponentCallbacks callback) { - getBaseContext().registerComponentCallbacks(callback); - } - - @Override - public void unregisterComponentCallbacks(ComponentCallbacks callback) { - getBaseContext().unregisterComponentCallbacks(callback); - } - - public void addSharedPreferences(String name, Map<String, Object> data) { - synchronized (mSharedPreferences) { - mSharedPreferences.put(name, new InMemorySharedPreferences(data)); - } - } - - public void setFlag(String key) { - mFlags.put(key, true); - } - - public void clearFlag(String key) { - mFlags.remove(key); - } - - public boolean isFlagSet(String key) { - return mFlags.containsKey(key) && mFlags.get(key); - } - - /** - * Builder for maps of type Map<String, Object> to be used with - * {@link #addSharedPreferences(String, java.util.Map)}. - */ - public static class MapBuilder { - - private final Map<String, Object> mData = new HashMap<String, Object>(); - - public static MapBuilder create() { - return new MapBuilder(); - } - - public MapBuilder add(String key, Object value) { - mData.put(key, value); - return this; - } - - public Map<String, Object> build() { - return mData; - } - - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java deleted file mode 100644 index d335412..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java +++ /dev/null
@@ -1,259 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.support.annotation.Nullable; - -import org.junit.runner.Description; - -import org.chromium.base.VisibleForTesting; - -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Queue; -import java.util.Set; - -/** - * Utility class to help with processing annotations, going around the code to collect them, etc. - */ -public abstract class AnnotationProcessingUtils { - /** - * Returns the closest instance of the requested annotation or null if there is none. - * See {@link AnnotationExtractor} for context of "closest". - */ - @SuppressWarnings("unchecked") - public static <A extends Annotation> A getAnnotation(Description description, Class<A> clazz) { - AnnotationExtractor extractor = new AnnotationExtractor(clazz); - return (A) extractor.getClosest(extractor.getMatchingAnnotations(description)); - } - - /** - * Returns the closest instance of the requested annotation or null if there is none. - * See {@link AnnotationExtractor} for context of "closest". - */ - @SuppressWarnings("unchecked") - public static <A extends Annotation> A getAnnotation(AnnotatedElement element, Class<A> clazz) { - AnnotationExtractor extractor = new AnnotationExtractor(clazz); - return (A) extractor.getClosest(extractor.getMatchingAnnotations(element)); - } - - /** See {@link AnnotationExtractor} for details about the output sorting order. */ - @SuppressWarnings("unchecked") - public static <A extends Annotation> List<A> getAnnotations( - Description description, Class<A> annotationType) { - return (List<A>) new AnnotationExtractor(annotationType) - .getMatchingAnnotations(description); - } - - /** See {@link AnnotationExtractor} for details about the output sorting order. */ - @SuppressWarnings("unchecked") - public static <A extends Annotation> List<A> getAnnotations( - AnnotatedElement annotatedElement, Class<A> annotationType) { - return (List<A>) new AnnotationExtractor(annotationType) - .getMatchingAnnotations(annotatedElement); - } - - private static boolean isChromiumAnnotation(Annotation annotation) { - Package pkg = annotation.annotationType().getPackage(); - return pkg != null && pkg.getName().startsWith("org.chromium"); - } - - /** - * Processes various types of annotated elements ({@link Class}es, {@link Annotation}s, - * {@link Description}s, etc.) and extracts the targeted annotations from it. The output will be - * sorted in BFS-like order. - * - * For example, for a method we would get in reverse order: - * - the method annotations - * - the meta-annotations present on the method annotations, - * - the class annotations - * - the meta-annotations present on the class annotations, - * - the annotations present on the super class, - * - the meta-annotations present on the super class annotations, - * - etc. - * - * When multiple annotations are targeted, if more than one is picked up at a given level (for - * example directly on the method), they will be returned in the reverse order that they were - * provided to the constructor. - * - * Note: We return the annotations in reverse order because we assume that if some processing - * is going to be made on related annotations, the later annotations would likely override - * modifications made by the former. - * - * Note: While resolving meta annotations, we don't expand the explorations to annotations types - * that have already been visited. Please file a bug and assign to dgn@ if you think it caused - * an issue. - */ - public static class AnnotationExtractor { - private final List<Class<? extends Annotation>> mAnnotationTypes; - private final Comparator<Class<? extends Annotation>> mAnnotationTypeComparator; - private final Comparator<Annotation> mAnnotationComparator; - - @SafeVarargs - public AnnotationExtractor(Class<? extends Annotation>... additionalTypes) { - this(Arrays.asList(additionalTypes)); - } - - public AnnotationExtractor(List<Class<? extends Annotation>> additionalTypes) { - assert !additionalTypes.isEmpty(); - mAnnotationTypes = Collections.unmodifiableList(additionalTypes); - mAnnotationTypeComparator = - (t1, t2) -> mAnnotationTypes.indexOf(t1) - mAnnotationTypes.indexOf(t2); - mAnnotationComparator = (t1, t2) - -> mAnnotationTypeComparator.compare(t1.annotationType(), t2.annotationType()); - } - - public List<Annotation> getMatchingAnnotations(Description description) { - return getMatchingAnnotations(new AnnotatedNode.DescriptionNode(description)); - } - - public List<Annotation> getMatchingAnnotations(AnnotatedElement annotatedElement) { - AnnotatedNode annotatedNode; - if (annotatedElement instanceof Method) { - annotatedNode = new AnnotatedNode.MethodNode((Method) annotatedElement); - } else if (annotatedElement instanceof Class) { - annotatedNode = new AnnotatedNode.ClassNode((Class) annotatedElement); - } else { - throw new IllegalArgumentException("Unsupported type for " + annotatedElement); - } - - return getMatchingAnnotations(annotatedNode); - } - - /** - * For a given list obtained from the extractor, returns the {@link Annotation} that would - * be closest from the extraction point, or {@code null} if the list is empty. - */ - @Nullable - public Annotation getClosest(List<Annotation> annotationList) { - return annotationList.isEmpty() ? null : annotationList.get(annotationList.size() - 1); - } - - @VisibleForTesting - Comparator<Class<? extends Annotation>> getTypeComparator() { - return mAnnotationTypeComparator; - } - - private List<Annotation> getMatchingAnnotations(AnnotatedNode annotatedNode) { - List<Annotation> collectedAnnotations = new ArrayList<>(); - Queue<Annotation> workingSet = new LinkedList<>(); - Set<Class<? extends Annotation>> visited = new HashSet<>(); - - AnnotatedNode currentAnnotationLayer = annotatedNode; - while (currentAnnotationLayer != null) { - queueAnnotations(currentAnnotationLayer.getAnnotations(), workingSet); - - while (!workingSet.isEmpty()) { - sweepAnnotations(collectedAnnotations, workingSet, visited); - } - - currentAnnotationLayer = currentAnnotationLayer.getParent(); - } - - return collectedAnnotations; - } - - private void queueAnnotations(List<Annotation> annotations, Queue<Annotation> workingSet) { - Collections.sort(annotations, mAnnotationComparator); - workingSet.addAll(annotations); - } - - private void sweepAnnotations(List<Annotation> collectedAnnotations, - Queue<Annotation> workingSet, Set<Class<? extends Annotation>> visited) { - // 1. Grab node at the front of the working set. - Annotation annotation = workingSet.remove(); - - // 2. If it's an annotation of interest, put it aside for the output. - if (mAnnotationTypes.contains(annotation.annotationType())) { - collectedAnnotations.add(0, annotation); - } - - // 3. Check if we can get skip some redundant iterations and avoid cycles. - if (!visited.add(annotation.annotationType())) return; - if (!isChromiumAnnotation(annotation)) return; - - // 4. Expand the working set - queueAnnotations(Arrays.asList(annotation.annotationType().getDeclaredAnnotations()), - workingSet); - } - } - - /** - * Abstraction to hide differences between Class, Method and Description with regards to their - * annotations and what should be analyzed next. - */ - private static abstract class AnnotatedNode { - @Nullable - abstract AnnotatedNode getParent(); - - abstract List<Annotation> getAnnotations(); - - static class DescriptionNode extends AnnotatedNode { - final Description mDescription; - - DescriptionNode(Description description) { - mDescription = description; - } - - @Nullable - @Override - AnnotatedNode getParent() { - return new ClassNode(mDescription.getTestClass()); - } - - @Override - List<Annotation> getAnnotations() { - return new ArrayList<>(mDescription.getAnnotations()); - } - } - - static class ClassNode extends AnnotatedNode { - final Class<?> mClass; - - ClassNode(Class<?> clazz) { - mClass = clazz; - } - - @Nullable - @Override - AnnotatedNode getParent() { - Class<?> superClass = mClass.getSuperclass(); - return superClass == null ? null : new ClassNode(superClass); - } - - @Override - List<Annotation> getAnnotations() { - return Arrays.asList(mClass.getDeclaredAnnotations()); - } - } - - static class MethodNode extends AnnotatedNode { - final Method mMethod; - - MethodNode(Method method) { - mMethod = method; - } - - @Nullable - @Override - AnnotatedNode getParent() { - return new ClassNode(mMethod.getDeclaringClass()); - } - - @Override - List<Annotation> getAnnotations() { - return Arrays.asList(mMethod.getDeclaredAnnotations()); - } - } - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java b/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java deleted file mode 100644 index a361ac3..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java +++ /dev/null
@@ -1,139 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.support.annotation.CallSuper; -import android.support.annotation.Nullable; - -import org.junit.rules.ExternalResource; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.ListIterator; - -/** - * Test rule that collects specific annotations to help with test set up and tear down. It is set up - * with a list of annotations to look for and exposes the ones picked up on the test through - * {@link #getAnnotations()} and related methods. - * - * Note: The rule always apply, whether it picked up annotations or not. - * - * Usage: - * - * <pre> - * public class Test { - * @Rule - * public AnnotationRule rule = new AnnotationRule(Foo.class) { - * @Override - * protected void before() { ... } - * - * @Override - * protected void after() { ... } - * }; - * - * @Test - * @Foo - * public void myTest() { ... } - * } - * </pre> - * - * It can also be used to trigger for multiple annotations: - * - * <pre> - * @DisableFoo - * public class Test { - * @Rule - * public AnnotationRule rule = new AnnotationRule(EnableFoo.class, DisableFoo.class) { - * @Override - * protected void before() { - * // Loops through all the picked up annotations. For myTest(), it would process - * // DisableFoo first, then EnableFoo. - * for (Annotation annotation : getAnnotations()) { - * if (annotation instanceof EnableFoo) { ... } - * else if (annotation instanceof DisableFoo) { ... } - * } - * } - * - * @Override - * protected void after() { - * // For myTest(), would return EnableFoo as it's directly set on the method. - * Annotation a = getClosestAnnotation(); - * ... - * } - * }; - * - * @Test - * @EnableFoo - * public void myTest() { ... } - * } - * </pre> - * - * @see AnnotationProcessingUtils.AnnotationExtractor - */ -public abstract class AnnotationRule extends ExternalResource { - private final AnnotationProcessingUtils.AnnotationExtractor mAnnotationExtractor; - private List<Annotation> mCollectedAnnotations; - private Description mTestDescription; - - @SafeVarargs - public AnnotationRule(Class<? extends Annotation> firstAnnotationType, - Class<? extends Annotation>... additionalTypes) { - List<Class<? extends Annotation>> mAnnotationTypes = new ArrayList<>(); - mAnnotationTypes.add(firstAnnotationType); - mAnnotationTypes.addAll(Arrays.asList(additionalTypes)); - mAnnotationExtractor = new AnnotationProcessingUtils.AnnotationExtractor(mAnnotationTypes); - } - - @CallSuper - @Override - public Statement apply(Statement base, Description description) { - mTestDescription = description; - - mCollectedAnnotations = mAnnotationExtractor.getMatchingAnnotations(description); - - // Return the wrapped statement to execute before() and after(). - return super.apply(base, description); - } - - /** @return {@link Description} of the current test. */ - protected Description getTestDescription() { - return mTestDescription; - } - - /** - * @return The collected annotations that match the declared type(s). - * @throws NullPointerException if this is called before annotations have been collected, - * which happens when the rule is applied to the {@link Statement}. - */ - protected List<Annotation> getAnnotations() { - return Collections.unmodifiableList(mCollectedAnnotations); - } - - /** - * @return The closest annotation matching the provided type, or {@code null} if there is none. - */ - @SuppressWarnings("unchecked") - protected @Nullable <A extends Annotation> A getAnnotation(Class<A> annnotationType) { - ListIterator<Annotation> iteratorFromEnd = - mCollectedAnnotations.listIterator(mCollectedAnnotations.size()); - while (iteratorFromEnd.hasPrevious()) { - Annotation annotation = iteratorFromEnd.previous(); - if (annnotationType.isAssignableFrom(annotation.annotationType())) { - return (A) annotation; - } - } - return null; - } - - protected @Nullable Annotation getClosestAnnotation() { - if (mCollectedAnnotations.isEmpty()) return null; - return mCollectedAnnotations.get(mCollectedAnnotations.size() - 1); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/CallbackHelper.java b/base/test/android/javatests/src/org/chromium/base/test/util/CallbackHelper.java deleted file mode 100644 index bf064c4..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/CallbackHelper.java +++ /dev/null
@@ -1,252 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; - -import org.junit.Assert; - -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -/** - * A helper class that encapsulates listening and blocking for callbacks. - * - * Sample usage: - * - * // Let us assume that this interface is defined by some piece of production code and is used - * // to communicate events that occur in that piece of code. Let us further assume that the - * // production code runs on the main thread test code runs on a separate test thread. - * // An instance that implements this interface would be injected by test code to ensure that the - * // methods are being called on another thread. - * interface Delegate { - * void onOperationFailed(String errorMessage); - * void onDataPersisted(); - * } - * - * // This is the inner class you'd write in your test case to later inject into the production - * // code. - * class TestDelegate implements Delegate { - * // This is the preferred way to create a helper that stores the parameters it receives - * // when called by production code. - * public static class OnOperationFailedHelper extends CallbackHelper { - * private String mErrorMessage; - * - * public void getErrorMessage() { - * assert getCallCount() > 0; - * return mErrorMessage; - * } - * - * public void notifyCalled(String errorMessage) { - * mErrorMessage = errorMessage; - * // It's important to call this after all parameter assignments. - * notifyCalled(); - * } - * } - * - * // There should be one CallbackHelper instance per method. - * private OnOperationFailedHelper mOnOperationFailedHelper; - * private CallbackHelper mOnDataPersistedHelper; - * - * public OnOperationFailedHelper getOnOperationFailedHelper() { - * return mOnOperationFailedHelper; - * } - * - * public CallbackHelper getOnDataPersistedHelper() { - * return mOnDataPersistedHelper; - * } - * - * @Override - * public void onOperationFailed(String errorMessage) { - * mOnOperationFailedHelper.notifyCalled(errorMessage); - * } - * - * @Override - * public void onDataPersisted() { - * mOnDataPersistedHelper.notifyCalled(); - * } - * } - * - * // This is a sample test case. - * public void testCase() throws Exception { - * // Create the TestDelegate to inject into production code. - * TestDelegate delegate = new TestDelegate(); - * // Create the production class instance that is being tested and inject the test delegate. - * CodeUnderTest codeUnderTest = new CodeUnderTest(); - * codeUnderTest.setDelegate(delegate); - * - * // Typically you'd get the current call count before performing the operation you expect to - * // trigger the callback. There can't be any callbacks 'in flight' at this moment, otherwise - * // the call count is unpredictable and the test will be flaky. - * int onOperationFailedCallCount = delegate.getOnOperationFailedHelper().getCallCount(); - * codeUnderTest.doSomethingThatEndsUpCallingOnOperationFailedFromAnotherThread(); - * // It's safe to do other stuff here, if needed. - * .... - * // Wait for the callback if it hadn't been called yet, otherwise return immediately. This - * // can throw an exception if the callback doesn't arrive within the timeout. - * delegate.getOnOperationFailedHelper().waitForCallback(onOperationFailedCallCount); - * // Access to method parameters is now safe. - * assertEquals("server error", delegate.getOnOperationFailedHelper().getErrorMessage()); - * - * // Being able to pass the helper around lets us build methods which encapsulate commonly - * // performed tasks. - * doSomeOperationAndWait(codeUnerTest, delegate.getOnOperationFailedHelper()); - * - * // The helper can be reused for as many calls as needed, just be sure to get the count each - * // time. - * onOperationFailedCallCount = delegate.getOnOperationFailedHelper().getCallCount(); - * codeUnderTest.doSomethingElseButStillFailOnAnotherThread(); - * delegate.getOnOperationFailedHelper().waitForCallback(onOperationFailedCallCount); - * - * // It is also possible to use more than one helper at a time. - * onOperationFailedCallCount = delegate.getOnOperationFailedHelper().getCallCount(); - * int onDataPersistedCallCount = delegate.getOnDataPersistedHelper().getCallCount(); - * codeUnderTest.doSomethingThatPersistsDataButFailsInSomeOtherWayOnAnotherThread(); - * delegate.getOnDataPersistedHelper().waitForCallback(onDataPersistedCallCount); - * delegate.getOnOperationFailedHelper().waitForCallback(onOperationFailedCallCount); - * } - * - * // Shows how to turn an async operation + completion callback into a synchronous operation. - * private void doSomeOperationAndWait(final CodeUnderTest underTest, - * CallbackHelper operationHelper) throws InterruptedException, TimeoutException { - * final int callCount = operationHelper.getCallCount(); - * getInstrumentation().runOnMainSync(new Runnable() { - * @Override - * public void run() { - * // This schedules a call to a method on the injected TestDelegate. The TestDelegate - * // implementation will then call operationHelper.notifyCalled(). - * underTest.operation(); - * } - * }); - * operationHelper.waitForCallback(callCount); - * } - * - */ -public class CallbackHelper { - /** The default timeout (in seconds) for a callback to wait. */ - public static final long WAIT_TIMEOUT_SECONDS = scaleTimeout(5); - - private final Object mLock = new Object(); - private int mCallCount; - private String mFailureString; - - /** - * Gets the number of times the callback has been called. - * - * The call count can be used with the waitForCallback() method, indicating a point - * in time after which the caller wishes to record calls to the callback. - * - * In order to wait for a callback caused by X, the call count should be obtained - * before X occurs. - * - * NOTE: any call to the callback that occurs after the call count is obtained - * will result in the corresponding wait call to resume execution. The call count - * is intended to 'catch' callbacks that occur after X but before waitForCallback() - * is called. - */ - public int getCallCount() { - synchronized (mLock) { - return mCallCount; - } - } - - /** - * Blocks until the callback is called the specified number of - * times or throws an exception if we exceeded the specified time frame. - * - * This will wait for a callback to be called a specified number of times after - * the point in time at which the call count was obtained. The method will return - * immediately if a call occurred the specified number of times after the - * call count was obtained but before the method was called, otherwise the method will - * block until the specified call count is reached. - * - * @param msg The error message to use if the callback times out. - * @param currentCallCount the value obtained by calling getCallCount(). - * @param numberOfCallsToWaitFor number of calls (counting since - * currentCallCount was obtained) that we will wait for. - * @param timeout timeout value. We will wait the specified amount of time for a single - * callback to occur so the method call may block up to - * <code>numberOfCallsToWaitFor * timeout</code> units. - * @param unit timeout unit. - * @throws InterruptedException - * @throws TimeoutException Thrown if the method times out before onPageFinished is called. - */ - public void waitForCallback(String msg, int currentCallCount, int numberOfCallsToWaitFor, - long timeout, TimeUnit unit) throws InterruptedException, TimeoutException { - assert mCallCount >= currentCallCount; - assert numberOfCallsToWaitFor > 0; - synchronized (mLock) { - int callCountWhenDoneWaiting = currentCallCount + numberOfCallsToWaitFor; - while (callCountWhenDoneWaiting > mCallCount) { - int callCountBeforeWait = mCallCount; - mLock.wait(unit.toMillis(timeout)); - if (mFailureString != null) { - String s = mFailureString; - mFailureString = null; - Assert.fail(s); - } - if (callCountBeforeWait == mCallCount) { - throw new TimeoutException(msg == null ? "waitForCallback timed out!" : msg); - } - } - } - } - - /** - * @see #waitForCallback(String, int, int, long, TimeUnit) - */ - public void waitForCallback(int currentCallCount, int numberOfCallsToWaitFor, long timeout, - TimeUnit unit) throws InterruptedException, TimeoutException { - waitForCallback(null, currentCallCount, numberOfCallsToWaitFor, timeout, unit); - } - - /** - * @see #waitForCallback(String, int, int, long, TimeUnit) - */ - public void waitForCallback(int currentCallCount, int numberOfCallsToWaitFor) - throws InterruptedException, TimeoutException { - waitForCallback(null, currentCallCount, numberOfCallsToWaitFor, - WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS); - } - - /** - * @see #waitForCallback(String, int, int, long, TimeUnit) - */ - public void waitForCallback(String msg, int currentCallCount) - throws InterruptedException, TimeoutException { - waitForCallback(msg, currentCallCount, 1, WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS); - } - - /** - * @see #waitForCallback(String, int, int, long, TimeUnit) - */ - public void waitForCallback(int currentCallCount) - throws InterruptedException, TimeoutException { - waitForCallback(null, currentCallCount, 1, WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS); - } - - /** - * Should be called when the callback associated with this helper object is called. - */ - public void notifyCalled() { - synchronized (mLock) { - mCallCount++; - mLock.notifyAll(); - } - } - - /** - * Should be called when the callback associated with this helper object wants to - * indicate a failure. - * - * @param s The failure message. - */ - public void notifyFailed(String s) { - synchronized (mLock) { - mFailureString = s; - mLock.notifyAll(); - } - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java b/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java deleted file mode 100644 index 71ef8e9..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java +++ /dev/null
@@ -1,188 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.text.TextUtils; - -import org.junit.Assert; -import org.junit.Rule; - -import org.chromium.base.CommandLine; -import org.chromium.base.CommandLineInitUtil; -import org.chromium.base.test.BaseTestResult.PreTestHook; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Provides annotations related to command-line flag handling. - * - * Uses of these annotations on a derived class will take precedence over uses on its base classes, - * so a derived class can add a command-line flag that a base class has removed (or vice versa). - * Similarly, uses of these annotations on a test method will take precedence over uses on the - * containing class. - * <p> - * These annonations may also be used on Junit4 Rule classes and on their base classes. Note, - * however that the annotation processor only looks at the declared type of the Rule, not its actual - * type, so in, for example: - * - * <pre> - * @Rule - * TestRule mRule = new ChromeActivityTestRule(); - * </pre> - * - * will only look for CommandLineFlags annotations on TestRule, not for CommandLineFlags annotations - * on ChromeActivityTestRule. - * <p> - * In addition a rule may not remove flags added by an independently invoked rule, although it may - * remove flags added by its base classes. - * <p> - * Uses of these annotations on the test class or methods take precedence over uses on Rule classes. - * <p> - * Note that this class should never be instantiated. - */ -public final class CommandLineFlags { - private static final String DISABLE_FEATURES = "disable-features"; - private static final String ENABLE_FEATURES = "enable-features"; - - /** - * Adds command-line flags to the {@link org.chromium.base.CommandLine} for this test. - */ - @Inherited - @Retention(RetentionPolicy.RUNTIME) - @Target({ElementType.METHOD, ElementType.TYPE}) - public @interface Add { - String[] value(); - } - - /** - * Removes command-line flags from the {@link org.chromium.base.CommandLine} from this test. - * - * Note that this can only remove flags added via {@link Add} above. - */ - @Inherited - @Retention(RetentionPolicy.RUNTIME) - @Target({ElementType.METHOD, ElementType.TYPE}) - public @interface Remove { - String[] value(); - } - - /** - * Sets up the CommandLine with the appropriate flags. - * - * This will add the difference of the sets of flags specified by {@link CommandLineFlags.Add} - * and {@link CommandLineFlags.Remove} to the {@link org.chromium.base.CommandLine}. Note that - * trying to remove a flag set externally, i.e. by the command-line flags file, will not work. - */ - public static void setUp(AnnotatedElement element) { - CommandLine.reset(); - CommandLineInitUtil.initCommandLine(getTestCmdLineFile()); - Set<String> enableFeatures = new HashSet<String>(); - Set<String> disableFeatures = new HashSet<String>(); - Set<String> flags = getFlags(element); - for (String flag : flags) { - String[] parsedFlags = flag.split("=", 2); - if (parsedFlags.length == 1) { - CommandLine.getInstance().appendSwitch(flag); - } else if (ENABLE_FEATURES.equals(parsedFlags[0])) { - // We collect enable/disable features flags separately and aggregate them because - // they may be specified multiple times, in which case the values will trample each - // other. - Collections.addAll(enableFeatures, parsedFlags[1].split(",")); - } else if (DISABLE_FEATURES.equals(parsedFlags[0])) { - Collections.addAll(disableFeatures, parsedFlags[1].split(",")); - } else { - CommandLine.getInstance().appendSwitchWithValue(parsedFlags[0], parsedFlags[1]); - } - } - - if (enableFeatures.size() > 0) { - CommandLine.getInstance().appendSwitchWithValue( - ENABLE_FEATURES, TextUtils.join(",", enableFeatures)); - } - if (disableFeatures.size() > 0) { - CommandLine.getInstance().appendSwitchWithValue( - DISABLE_FEATURES, TextUtils.join(",", disableFeatures)); - } - } - - private static Set<String> getFlags(AnnotatedElement type) { - Set<String> rule_flags = new HashSet<>(); - updateFlagsForElement(type, rule_flags); - return rule_flags; - } - - private static void updateFlagsForElement(AnnotatedElement element, Set<String> flags) { - if (element instanceof Class<?>) { - // Get flags from rules within the class. - for (Field field : ((Class<?>) element).getFields()) { - if (field.isAnnotationPresent(Rule.class)) { - // The order in which fields are returned is undefined, so, for consistency, - // a rule must not remove a flag added by a different rule. Ensure this by - // initially getting the flags into a new set. - Set<String> rule_flags = getFlags(field.getType()); - flags.addAll(rule_flags); - } - } - for (Method method : ((Class<?>) element).getMethods()) { - if (method.isAnnotationPresent(Rule.class)) { - // The order in which methods are returned is undefined, so, for consistency, - // a rule must not remove a flag added by a different rule. Ensure this by - // initially getting the flags into a new set. - Set<String> rule_flags = getFlags(method.getReturnType()); - flags.addAll(rule_flags); - } - } - } - - // Add the flags from the parent. Override any flags defined by the rules. - AnnotatedElement parent = (element instanceof Method) - ? ((Method) element).getDeclaringClass() - : ((Class<?>) element).getSuperclass(); - if (parent != null) updateFlagsForElement(parent, flags); - - // Flags on the element itself override all other flag sources. - if (element.isAnnotationPresent(CommandLineFlags.Add.class)) { - flags.addAll( - Arrays.asList(element.getAnnotation(CommandLineFlags.Add.class).value())); - } - - if (element.isAnnotationPresent(CommandLineFlags.Remove.class)) { - List<String> flagsToRemove = - Arrays.asList(element.getAnnotation(CommandLineFlags.Remove.class).value()); - for (String flagToRemove : flagsToRemove) { - // If your test fails here, you have tried to remove a command-line flag via - // CommandLineFlags.Remove that was loaded into CommandLine via something other - // than CommandLineFlags.Add (probably the command-line flag file). - Assert.assertFalse("Unable to remove command-line flag \"" + flagToRemove + "\".", - CommandLine.getInstance().hasSwitch(flagToRemove)); - } - flags.removeAll(flagsToRemove); - } - } - - private CommandLineFlags() { - throw new AssertionError("CommandLineFlags is a non-instantiable class"); - } - - public static PreTestHook getRegistrationHook() { - return (targetContext, testMethod) -> CommandLineFlags.setUp(testMethod); - } - - public static String getTestCmdLineFile() { - return "test-cmdline-file"; - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIf.java b/base/test/android/javatests/src/org/chromium/base/test/util/DisableIf.java deleted file mode 100644 index c0303b6..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIf.java +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotations to support conditional test disabling. - * - * These annotations should only be used to disable tests that are temporarily failing - * in some configurations. If a test should never run at all in some configurations, use - * {@link Restriction}. - */ -public class DisableIf { - - /** Conditional disabling based on {@link android.os.Build}. - */ - @Target({ElementType.METHOD, ElementType.TYPE}) - @Retention(RetentionPolicy.RUNTIME) - public static @interface Build { - String message() default ""; - - int sdk_is_greater_than() default 0; - int sdk_is_less_than() default Integer.MAX_VALUE; - - String supported_abis_includes() default ""; - - String hardware_is() default ""; - - String product_name_includes() default ""; - } - - @Target({ElementType.METHOD, ElementType.TYPE}) - @Retention(RetentionPolicy.RUNTIME) - public static @interface Device { - /** - * @return A list of disabled types. - */ - public String[] type(); - } - - /* Objects of this type should not be created. */ - private DisableIf() {} -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java deleted file mode 100644 index e46b979..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java +++ /dev/null
@@ -1,84 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.os.Build; - -import org.junit.runners.model.FrameworkMethod; - -import org.chromium.base.Log; - -import java.util.Arrays; - -/** - * Checks for conditional disables. - * - * Currently, this only includes checks against a few {@link android.os.Build} values. - */ -public class DisableIfSkipCheck extends SkipCheck { - - private static final String TAG = "cr_base_test"; - - @Override - public boolean shouldSkip(FrameworkMethod method) { - if (method == null) return true; - for (DisableIf.Build v : AnnotationProcessingUtils.getAnnotations( - method.getMethod(), DisableIf.Build.class)) { - if (abi(v) && hardware(v) && product(v) && sdk(v)) { - if (!v.message().isEmpty()) { - Log.i(TAG, "%s is disabled: %s", method.getName(), v.message()); - } - return true; - } - } - - for (DisableIf.Device d : AnnotationProcessingUtils.getAnnotations( - method.getMethod(), DisableIf.Device.class)) { - for (String deviceType : d.type()) { - if (deviceTypeApplies(deviceType)) { - Log.i(TAG, "Test " + method.getDeclaringClass().getName() + "#" - + method.getName() + " disabled because of " - + d); - return true; - } - } - } - - return false; - } - - @SuppressWarnings("deprecation") - private boolean abi(DisableIf.Build v) { - if (v.supported_abis_includes().isEmpty()) return true; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - return Arrays.asList(Build.SUPPORTED_ABIS).contains( - v.supported_abis_includes()); - } else { - return Build.CPU_ABI.equals(v.supported_abis_includes()) - || Build.CPU_ABI2.equals(v.supported_abis_includes()); - } - } - - private boolean hardware(DisableIf.Build v) { - return v.hardware_is().isEmpty() || Build.HARDWARE.equals(v.hardware_is()); - } - - private boolean product(DisableIf.Build v) { - return v.product_name_includes().isEmpty() - || Build.PRODUCT.contains(v.product_name_includes()); - } - - private boolean sdk(DisableIf.Build v) { - return Build.VERSION.SDK_INT > v.sdk_is_greater_than() - && Build.VERSION.SDK_INT < v.sdk_is_less_than(); - } - - protected boolean deviceTypeApplies(String type) { - return false; - } - -} -
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/DisabledTest.java b/base/test/android/javatests/src/org/chromium/base/test/util/DisabledTest.java deleted file mode 100644 index a3e4e8e..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/DisabledTest.java +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * This annotation is for disabled tests. - * <p> - * Tests with this annotation will not be run on any of the normal bots. - * Please note that they might eventually run on a special bot. - */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface DisabledTest { - String message() default ""; -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/EnormousTest.java b/base/test/android/javatests/src/org/chromium/base/test/util/EnormousTest.java deleted file mode 100644 index af483ec..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/EnormousTest.java +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * This annotation is for enormous tests. - * <p> - * Examples of enormous tests are tests that depend on external web sites or - * tests that are long running. - * <p> - * Such tests are likely NOT reliable enough to run on tree closing bots and - * should only be run on FYI bots. - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface EnormousTest { -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/Feature.java b/base/test/android/javatests/src/org/chromium/base/test/util/Feature.java deleted file mode 100644 index 1bc9226..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/Feature.java +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * The java instrumentation tests are normally fairly large (in terms of - * dependencies), and the test suite ends up containing a large amount of - * tests that are not trivial to filter / group just by their names. - * Instead, we use this annotation: each test should be annotated as: - * @Feature({"Foo", "Bar"}) - * in order for the test runner scripts to be able to filter and group - * them accordingly (for instance, this enable us to run all tests that exercise - * feature Foo). - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Feature { - /** - * @return A list of feature names. - */ - public String[] value(); -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/FlakyTest.java b/base/test/android/javatests/src/org/chromium/base/test/util/FlakyTest.java deleted file mode 100644 index 83f8e9f..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/FlakyTest.java +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * This annotation is for flaky tests. - * <p> - * Tests with this annotation will not be run on any of the normal bots. - * Please note that they might eventually run on a special bot. - */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface FlakyTest { - String message() default ""; -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/InMemorySharedPreferences.java b/base/test/android/javatests/src/org/chromium/base/test/util/InMemorySharedPreferences.java deleted file mode 100644 index 2587d72..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/InMemorySharedPreferences.java +++ /dev/null
@@ -1,238 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.content.SharedPreferences; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -/** - * An implementation of SharedPreferences that can be used in tests. - * <p/> - * It keeps all state in memory, and there is no difference between apply() and commit(). - */ -public class InMemorySharedPreferences implements SharedPreferences { - - // Guarded on its own monitor. - private final Map<String, Object> mData; - - public InMemorySharedPreferences() { - mData = new HashMap<String, Object>(); - } - - public InMemorySharedPreferences(Map<String, Object> data) { - mData = data; - } - - @Override - public Map<String, ?> getAll() { - synchronized (mData) { - return Collections.unmodifiableMap(mData); - } - } - - @Override - public String getString(String key, String defValue) { - synchronized (mData) { - if (mData.containsKey(key)) { - return (String) mData.get(key); - } - } - return defValue; - } - - @SuppressWarnings("unchecked") - @Override - public Set<String> getStringSet(String key, Set<String> defValues) { - synchronized (mData) { - if (mData.containsKey(key)) { - return Collections.unmodifiableSet((Set<String>) mData.get(key)); - } - } - return defValues; - } - - @Override - public int getInt(String key, int defValue) { - synchronized (mData) { - if (mData.containsKey(key)) { - return (Integer) mData.get(key); - } - } - return defValue; - } - - @Override - public long getLong(String key, long defValue) { - synchronized (mData) { - if (mData.containsKey(key)) { - return (Long) mData.get(key); - } - } - return defValue; - } - - @Override - public float getFloat(String key, float defValue) { - synchronized (mData) { - if (mData.containsKey(key)) { - return (Float) mData.get(key); - } - } - return defValue; - } - - @Override - public boolean getBoolean(String key, boolean defValue) { - synchronized (mData) { - if (mData.containsKey(key)) { - return (Boolean) mData.get(key); - } - } - return defValue; - } - - @Override - public boolean contains(String key) { - synchronized (mData) { - return mData.containsKey(key); - } - } - - @Override - public SharedPreferences.Editor edit() { - return new InMemoryEditor(); - } - - @Override - public void registerOnSharedPreferenceChangeListener( - SharedPreferences.OnSharedPreferenceChangeListener - listener) { - throw new UnsupportedOperationException(); - } - - @Override - public void unregisterOnSharedPreferenceChangeListener( - SharedPreferences.OnSharedPreferenceChangeListener listener) { - throw new UnsupportedOperationException(); - } - - private class InMemoryEditor implements SharedPreferences.Editor { - - // All guarded by |mChanges| - private boolean mClearCalled; - private volatile boolean mApplyCalled; - private final Map<String, Object> mChanges = new HashMap<String, Object>(); - - @Override - public SharedPreferences.Editor putString(String key, String value) { - synchronized (mChanges) { - if (mApplyCalled) throw new IllegalStateException(); - mChanges.put(key, value); - return this; - } - } - - @Override - public SharedPreferences.Editor putStringSet(String key, Set<String> values) { - synchronized (mChanges) { - if (mApplyCalled) throw new IllegalStateException(); - mChanges.put(key, values); - return this; - } - } - - @Override - public SharedPreferences.Editor putInt(String key, int value) { - synchronized (mChanges) { - if (mApplyCalled) throw new IllegalStateException(); - mChanges.put(key, value); - return this; - } - } - - @Override - public SharedPreferences.Editor putLong(String key, long value) { - synchronized (mChanges) { - if (mApplyCalled) throw new IllegalStateException(); - mChanges.put(key, value); - return this; - } - } - - @Override - public SharedPreferences.Editor putFloat(String key, float value) { - synchronized (mChanges) { - if (mApplyCalled) throw new IllegalStateException(); - mChanges.put(key, value); - return this; - } - } - - @Override - public SharedPreferences.Editor putBoolean(String key, boolean value) { - synchronized (mChanges) { - if (mApplyCalled) throw new IllegalStateException(); - mChanges.put(key, value); - return this; - } - } - - @Override - public SharedPreferences.Editor remove(String key) { - synchronized (mChanges) { - if (mApplyCalled) throw new IllegalStateException(); - // Magic value for removes - mChanges.put(key, this); - return this; - } - } - - @Override - public SharedPreferences.Editor clear() { - synchronized (mChanges) { - if (mApplyCalled) throw new IllegalStateException(); - mClearCalled = true; - return this; - } - } - - @Override - public boolean commit() { - apply(); - return true; - } - - @Override - public void apply() { - synchronized (mData) { - synchronized (mChanges) { - if (mApplyCalled) throw new IllegalStateException(); - if (mClearCalled) { - mData.clear(); - } - for (Map.Entry<String, Object> entry : mChanges.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - if (value == this) { - // Special value for removal - mData.remove(key); - } else { - mData.put(key, value); - } - } - // The real shared prefs clears out the temporaries allowing the caller to - // reuse the Editor instance, however this is undocumented behavior and subtle - // to read, so instead we just ban any future use of this instance. - mApplyCalled = true; - } - } - } - } - -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/InstrumentationUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/InstrumentationUtils.java deleted file mode 100644 index 20cfd9d..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/InstrumentationUtils.java +++ /dev/null
@@ -1,32 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.app.Instrumentation; - -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.FutureTask; - -/** - * Utility methods built around the android.app.Instrumentation class. - */ -public final class InstrumentationUtils { - - private InstrumentationUtils() { - } - - public static <R> R runOnMainSyncAndGetResult(Instrumentation instrumentation, - Callable<R> callable) throws Throwable { - FutureTask<R> task = new FutureTask<R>(callable); - instrumentation.runOnMainSync(task); - try { - return task.get(); - } catch (ExecutionException e) { - // Unwrap the cause of the exception and re-throw it. - throw e.getCause(); - } - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/IntegrationTest.java b/base/test/android/javatests/src/org/chromium/base/test/util/IntegrationTest.java deleted file mode 100644 index 8b6550d..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/IntegrationTest.java +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * This annotation is for integration tests. - * <p> - * Examples of integration tests are tests that rely on real instances of the - * application's services and components (e.g. Search) to test the system as - * a whole. These tests may use additional command-line flags to configure the - * existing backends to use. - * <p> - * Such tests are likely NOT reliable enough to run on tree closing bots and - * should only be run on FYI bots. - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface IntegrationTest { -} \ No newline at end of file
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/Manual.java b/base/test/android/javatests/src/org/chromium/base/test/util/Manual.java deleted file mode 100644 index 31f3977..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/Manual.java +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * This annotation can be used to mark a test that should only be run manually. - * <p> - * Tests with this annotation will not be run on bots, because they take too long - * or need manual monitoring. - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Manual { -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/ManualSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/ManualSkipCheck.java deleted file mode 100644 index a916bdf..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/ManualSkipCheck.java +++ /dev/null
@@ -1,18 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import org.junit.runners.model.FrameworkMethod; - -/** - * Skips any test methods annotated with {@code @}{@link Manual}. - */ -public class ManualSkipCheck extends SkipCheck { - @Override - public boolean shouldSkip(FrameworkMethod testMethod) { - return !AnnotationProcessingUtils.getAnnotations(testMethod.getMethod(), Manual.class) - .isEmpty(); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/Matchers.java b/base/test/android/javatests/src/org/chromium/base/test/util/Matchers.java deleted file mode 100644 index fc9d689..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/Matchers.java +++ /dev/null
@@ -1,44 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import org.hamcrest.CoreMatchers; -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeMatcher; - -/** - * Helper class containing Hamcrest matchers. - */ -public class Matchers extends CoreMatchers { - private static class GreaterThanOrEqualTo<T extends Comparable<T>> - extends TypeSafeMatcher<T> { - - private final T mComparisonValue; - - public GreaterThanOrEqualTo(T comparisonValue) { - mComparisonValue = comparisonValue; - } - - @Override - public void describeTo(Description description) { - description.appendText("greater than or equal to ").appendValue(mComparisonValue); - } - - @Override - protected boolean matchesSafely(T item) { - return item.compareTo(mComparisonValue) >= 0; - } - } - - /** - * @param <T> A Comparable type. - * @param comparisonValue The value to be compared against. - * @return A matcher that expects the value to be greater than the |comparisonValue|. - */ - public static <T extends Comparable<T>> Matcher<T> greaterThanOrEqualTo(T comparisonValue) { - return new GreaterThanOrEqualTo<>(comparisonValue); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/MetricsUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/MetricsUtils.java deleted file mode 100644 index c4664d6..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/MetricsUtils.java +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import org.chromium.base.metrics.RecordHistogram; - -/** - * Helpers for testing UMA metrics. - */ -public class MetricsUtils { - /** - * Helper class that snapshots the given bucket of the given UMA histogram on its creation, - * allowing to inspect the number of samples recorded during its lifetime. - */ - public static class HistogramDelta { - private final String mHistogram; - private final int mSampleValue; - - private final int mInitialCount; - - private int get() { - return RecordHistogram.getHistogramValueCountForTesting(mHistogram, mSampleValue); - } - - /** - * Snapshots the given bucket of the given histogram. - * @param histogram name of the histogram to snapshot - * @param sampleValue the bucket that contains this value will be snapshot - */ - public HistogramDelta(String histogram, int sampleValue) { - mHistogram = histogram; - mSampleValue = sampleValue; - mInitialCount = get(); - } - - /** Returns the number of samples of the snapshot bucket recorded since creation */ - public int getDelta() { - return get() - mInitialCount; - } - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevel.java b/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevel.java deleted file mode 100644 index 13e2578..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevel.java +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.METHOD, ElementType.TYPE}) -public @interface MinAndroidSdkLevel { - int value() default 0; -} -
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java deleted file mode 100644 index 8b07c0f..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.os.Build; - -import org.junit.runners.model.FrameworkMethod; - -import org.chromium.base.Log; - -/** - * Checks the device's SDK level against any specified minimum requirement. - */ -public class MinAndroidSdkLevelSkipCheck extends SkipCheck { - - private static final String TAG = "base_test"; - - /** - * If {@link MinAndroidSdkLevel} is present, checks its value - * against the device's SDK level. - * - * @param testCase The test to check. - * @return true if the device's SDK level is below the specified minimum. - */ - @Override - public boolean shouldSkip(FrameworkMethod frameworkMethod) { - int minSdkLevel = 0; - for (MinAndroidSdkLevel m : AnnotationProcessingUtils.getAnnotations( - frameworkMethod.getMethod(), MinAndroidSdkLevel.class)) { - minSdkLevel = Math.max(minSdkLevel, m.value()); - } - if (Build.VERSION.SDK_INT < minSdkLevel) { - Log.i(TAG, "Test " + frameworkMethod.getDeclaringClass().getName() + "#" - + frameworkMethod.getName() + " is not enabled at SDK level " - + Build.VERSION.SDK_INT + "."); - return true; - } - return false; - } - -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java b/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java deleted file mode 100644 index f39bfbd..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * An annotation for listing restrictions for a test method. For example, if a test method is only - * applicable on a phone with small memory: - * @Restriction({RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_SMALL_MEMORY}) - * Test classes are free to define restrictions and enforce them using reflection at runtime. - */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface Restriction { - /** Specifies the test is only valid on low end devices that have less memory. */ - public static final String RESTRICTION_TYPE_LOW_END_DEVICE = "Low_End_Device"; - - /** Specifies the test is only valid on non-low end devices. */ - public static final String RESTRICTION_TYPE_NON_LOW_END_DEVICE = "Non_Low_End_Device"; - - /** Specifies the test is only valid on a device that can reach the internet. */ - public static final String RESTRICTION_TYPE_INTERNET = "Internet"; - - /** Specifies the test is only valid on a device that has a camera. */ - public static final String RESTRICTION_TYPE_HAS_CAMERA = "Has_Camera"; - - /** - * @return A list of restrictions. - */ - public String[] value(); -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java deleted file mode 100644 index a27dd1f..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java +++ /dev/null
@@ -1,78 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.text.TextUtils; - -import org.junit.runners.model.FrameworkMethod; - -import org.chromium.base.Log; -import org.chromium.base.SysUtils; - -/** - * Checks if any restrictions exist and skip the test if it meets those restrictions. - */ -public class RestrictionSkipCheck extends SkipCheck { - - private static final String TAG = "base_test"; - - private final Context mTargetContext; - - public RestrictionSkipCheck(Context targetContext) { - mTargetContext = targetContext; - } - - protected Context getTargetContext() { - return mTargetContext; - } - - @Override - public boolean shouldSkip(FrameworkMethod frameworkMethod) { - if (frameworkMethod == null) return true; - - for (Restriction restriction : AnnotationProcessingUtils.getAnnotations( - frameworkMethod.getMethod(), Restriction.class)) { - for (String restrictionVal : restriction.value()) { - if (restrictionApplies(restrictionVal)) { - Log.i(TAG, "Test " + frameworkMethod.getDeclaringClass().getName() + "#" - + frameworkMethod.getName() + " skipped because of restriction " - + restriction); - return true; - } - } - } - return false; - } - - protected boolean restrictionApplies(String restriction) { - if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_LOW_END_DEVICE) - && !SysUtils.isLowEndDevice()) { - return true; - } - if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE) - && SysUtils.isLowEndDevice()) { - return true; - } - if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_INTERNET) - && !isNetworkAvailable()) { - return true; - } - if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_HAS_CAMERA) - && !SysUtils.hasCamera(mTargetContext)) { - return true; - } - return false; - } - - private boolean isNetworkAvailable() { - final ConnectivityManager connectivityManager = (ConnectivityManager) - mTargetContext.getSystemService(Context.CONNECTIVITY_SERVICE); - final NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); - return activeNetworkInfo != null && activeNetworkInfo.isConnected(); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/RetryOnFailure.java b/base/test/android/javatests/src/org/chromium/base/test/util/RetryOnFailure.java deleted file mode 100644 index eb98008..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/RetryOnFailure.java +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -// Note this annotation may be a NOOP. Check http://crbug.com/797002 for latest status (also see -// http://crbug.com/619055). Current default behavior is to retry all tests on failure. -/** - * Mark a test as flaky and should be retried on failure. The test is - * considered passed by the test script if any retry succeeds. - * - * Long term, this should be merged with @FlakyTest. But @FlakyTest means - * has specific meaning that is currently different from RetryOnFailure. - */ -@Target({ElementType.METHOD, ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface RetryOnFailure { - String message() default ""; -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/ScalableTimeout.java b/base/test/android/javatests/src/org/chromium/base/test/util/ScalableTimeout.java deleted file mode 100644 index 7a815c0..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/ScalableTimeout.java +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -/** - * Utility class for scaling various timeouts by a common factor. - * For example, to run tests under slow memory tools, you might do - * something like this: - * adb shell "echo 20.0 > /data/local/tmp/chrome_timeout_scale" - */ -public class ScalableTimeout { - private static Double sTimeoutScale; - public static final String PROPERTY_FILE = "/data/local/tmp/chrome_timeout_scale"; - - public static long scaleTimeout(long timeout) { - if (sTimeoutScale == null) { - try { - char[] data = TestFileUtil.readUtf8File(PROPERTY_FILE, 32); - sTimeoutScale = Double.parseDouble(new String(data)); - } catch (Exception e) { - // NumberFormatException, FileNotFoundException, IOException - sTimeoutScale = 1.0; - } - } - return (long) (timeout * sTimeoutScale); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java deleted file mode 100644 index d1dd7be..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import junit.framework.TestCase; - -import org.junit.runners.model.FrameworkMethod; - -import org.chromium.base.Log; - -import java.lang.reflect.Method; - -/** - * Check whether a test case should be skipped. - */ -public abstract class SkipCheck { - - private static final String TAG = "base_test"; - - /** - * - * Checks whether the given test method should be skipped. - * - * @param testMethod The test method to check. - * @return Whether the test case should be skipped. - */ - public abstract boolean shouldSkip(FrameworkMethod testMethod); - - /** - * - * Checks whether the given test case should be skipped. - * - * @param testCase The test case to check. - * @return Whether the test case should be skipped. - */ - public boolean shouldSkip(TestCase testCase) { - try { - Method m = testCase.getClass().getMethod(testCase.getName(), (Class[]) null); - return shouldSkip(new FrameworkMethod(m)); - } catch (NoSuchMethodException e) { - Log.e(TAG, "Unable to find %s in %s", testCase.getName(), - testCase.getClass().getName(), e); - return false; - } - } -} -
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/TestFileUtil.java b/base/test/android/javatests/src/org/chromium/base/test/util/TestFileUtil.java deleted file mode 100644 index 6d89121..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/TestFileUtil.java +++ /dev/null
@@ -1,85 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.io.Reader; -import java.io.Writer; -import java.util.Arrays; - -/** - * Utility class for dealing with files for test. - */ -public class TestFileUtil { - public static void createNewHtmlFile(String name, String title, String body) - throws IOException { - createNewHtmlFile(new File(name), title, body); - } - - public static void createNewHtmlFile(File file, String title, String body) - throws IOException { - if (!file.createNewFile()) { - throw new IOException("File \"" + file.getAbsolutePath() + "\" already exists"); - } - - Writer writer = null; - try { - writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8"); - writer.write("<html><meta charset=\"UTF-8\" />" - + " <head><title>" + title + "</title></head>" - + " <body>" - + (body != null ? body : "") - + " </body>" - + " </html>"); - } finally { - if (writer != null) { - writer.close(); - } - } - } - - public static void deleteFile(String name) { - deleteFile(new File(name)); - } - - public static void deleteFile(File file) { - boolean deleted = file.delete(); - assert (deleted || !file.exists()); - } - - /** - * @param fileName the file to read in. - * @param sizeLimit cap on the file size: will throw an exception if exceeded - * @return Array of chars read from the file - * @throws FileNotFoundException file does not exceed - * @throws IOException error encountered accessing the file - */ - public static char[] readUtf8File(String fileName, int sizeLimit) throws - FileNotFoundException, IOException { - Reader reader = null; - try { - File f = new File(fileName); - if (f.length() > sizeLimit) { - throw new IOException("File " + fileName + " length " + f.length() - + " exceeds limit " + sizeLimit); - } - char[] buffer = new char[(int) f.length()]; - reader = new InputStreamReader(new FileInputStream(f), "UTF-8"); - int charsRead = reader.read(buffer); - // Debug check that we've exhausted the input stream (will fail e.g. if the - // file grew after we inspected its length). - assert !reader.ready(); - return charsRead < buffer.length ? Arrays.copyOfRange(buffer, 0, charsRead) : buffer; - } finally { - if (reader != null) reader.close(); - } - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/TestThread.java b/base/test/android/javatests/src/org/chromium/base/test/util/TestThread.java deleted file mode 100644 index 4f62969..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/TestThread.java +++ /dev/null
@@ -1,143 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.os.Handler; -import android.os.Looper; - -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * This class is usefull when writing instrumentation tests that exercise code that posts tasks - * (to the same thread). - * Since the test code is run in a single thread, the posted tasks are never executed. - * The TestThread class lets you run that code on a specific thread synchronously and flush the - * message loop on that thread. - * - * Example of test using this: - * - * public void testMyAwesomeClass() { - * TestThread testThread = new TestThread(); - * testThread.startAndWaitForReadyState(); - * - * testThread.runOnTestThreadSyncAndProcessPendingTasks(new Runnable() { - * @Override - * public void run() { - * MyAwesomeClass.doStuffAsync(); - * } - * }); - * // Once we get there we know doStuffAsync has been executed and all the tasks it posted. - * assertTrue(MyAwesomeClass.stuffWasDone()); - * } - * - * Notes: - * - this is only for tasks posted to the same thread. Anyway if you were posting to a different - * thread, you'd probably need to set that other thread up. - * - this only supports tasks posted using Handler.post(), it won't work with postDelayed and - * postAtTime. - * - if your test instanciates an object and that object is the one doing the posting of tasks, you - * probably want to instanciate it on the test thread as it might create the Handler it posts - * tasks to in the constructor. - */ - -public class TestThread extends Thread { - private final Object mThreadReadyLock; - private AtomicBoolean mThreadReady; - private Handler mMainThreadHandler; - private Handler mTestThreadHandler; - - public TestThread() { - mMainThreadHandler = new Handler(); - // We can't use the AtomicBoolean as the lock or findbugs will freak out... - mThreadReadyLock = new Object(); - mThreadReady = new AtomicBoolean(); - } - - @Override - public void run() { - Looper.prepare(); - mTestThreadHandler = new Handler(); - mTestThreadHandler.post(new Runnable() { - @Override - public void run() { - synchronized (mThreadReadyLock) { - mThreadReady.set(true); - mThreadReadyLock.notify(); - } - } - }); - Looper.loop(); - } - - /** - * Starts this TestThread and blocks until it's ready to accept calls. - */ - public void startAndWaitForReadyState() { - checkOnMainThread(); - start(); - synchronized (mThreadReadyLock) { - try { - // Note the mThreadReady and while are not really needed. - // There are there so findbugs don't report warnings. - while (!mThreadReady.get()) { - mThreadReadyLock.wait(); - } - } catch (InterruptedException ie) { - System.err.println("Error starting TestThread."); - ie.printStackTrace(); - } - } - } - - /** - * Runs the passed Runnable synchronously on the TestThread and returns when all pending - * runnables have been excuted. - * Should be called from the main thread. - */ - public void runOnTestThreadSyncAndProcessPendingTasks(Runnable r) { - checkOnMainThread(); - - runOnTestThreadSync(r); - - // Run another task, when it's done it means all pendings tasks have executed. - runOnTestThreadSync(null); - } - - /** - * Runs the passed Runnable on the test thread and blocks until it has finished executing. - * Should be called from the main thread. - * @param r The runnable to be executed. - */ - public void runOnTestThreadSync(final Runnable r) { - checkOnMainThread(); - final Object lock = new Object(); - // Task executed is not really needed since we are only on one thread, it is here to appease - // findbugs. - final AtomicBoolean taskExecuted = new AtomicBoolean(); - mTestThreadHandler.post(new Runnable() { - @Override - public void run() { - if (r != null) r.run(); - synchronized (lock) { - taskExecuted.set(true); - lock.notify(); - } - } - }); - synchronized (lock) { - try { - while (!taskExecuted.get()) { - lock.wait(); - } - } catch (InterruptedException ie) { - ie.printStackTrace(); - } - } - } - - private void checkOnMainThread() { - assert Looper.myLooper() == mMainThreadHandler.getLooper(); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/TimeoutScale.java b/base/test/android/javatests/src/org/chromium/base/test/util/TimeoutScale.java deleted file mode 100644 index 5aee05e..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/TimeoutScale.java +++ /dev/null
@@ -1,22 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * This annotation can be used to scale a specific test timeout. - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface TimeoutScale { - /** - * @return A number to scale the test timeout. - */ - public int value(); -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java deleted file mode 100644 index 9ca3fcc..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java +++ /dev/null
@@ -1,84 +0,0 @@ -// Copyright 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import org.junit.Assert; - -import org.chromium.base.PathUtils; -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.MainDex; - -/** - * Collection of URL utilities. - */ -@MainDex -public class UrlUtils { - private static final String DATA_DIR = "/chrome/test/data/"; - - /** - * Construct the full path of a test data file. - * @param path Pathname relative to external/chrome/test/data - */ - public static String getTestFilePath(String path) { - // TODO(jbudorick): Remove DATA_DIR once everything has been isolated. crbug/400499 - return getIsolatedTestFilePath(DATA_DIR + path); - } - - // TODO(jbudorick): Remove this function once everything has been isolated and switched back - // to getTestFilePath. crbug/400499 - /** - * Construct the full path of a test data file. - * @param path Pathname relative to external/ - */ - public static String getIsolatedTestFilePath(String path) { - return getIsolatedTestRoot() + "/" + path; - } - - /** - * Returns the root of the test data directory. - */ - @CalledByNative - public static String getIsolatedTestRoot() { - return PathUtils.getExternalStorageDirectory() + "/chromium_tests_root"; - } - - /** - * Construct a suitable URL for loading a test data file. - * @param path Pathname relative to external/chrome/test/data - */ - public static String getTestFileUrl(String path) { - return "file://" + getTestFilePath(path); - } - - // TODO(jbudorick): Remove this function once everything has been isolated and switched back - // to getTestFileUrl. crbug/400499 - /** - * Construct a suitable URL for loading a test data file. - * @param path Pathname relative to external/ - */ - public static String getIsolatedTestFileUrl(String path) { - return "file://" + getIsolatedTestFilePath(path); - } - - /** - * Construct a data:text/html URI for loading from an inline HTML. - * @param html An unencoded HTML - * @return String An URI that contains the given HTML - */ - public static String encodeHtmlDataUri(String html) { - try { - // URLEncoder encodes into application/x-www-form-encoded, so - // ' '->'+' needs to be undone and replaced with ' '->'%20' - // to match the Data URI requirements. - String encoded = - "data:text/html;utf-8," + java.net.URLEncoder.encode(html, "UTF-8"); - encoded = encoded.replace("+", "%20"); - return encoded; - } catch (java.io.UnsupportedEncodingException e) { - Assert.fail("Unsupported encoding: " + e.getMessage()); - return null; - } - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java b/base/test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java deleted file mode 100644 index 88e3551..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java +++ /dev/null
@@ -1,51 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import org.chromium.base.ThreadUtils; -import org.chromium.base.metrics.RecordUserAction; - -import java.util.ArrayList; -import java.util.List; - -/** - * A util class that records UserActions. - */ -public class UserActionTester implements RecordUserAction.UserActionCallback { - private List<String> mActions; - - public UserActionTester() { - mActions = new ArrayList<>(); - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - RecordUserAction.setActionCallbackForTesting(UserActionTester.this); - } - }); - } - - public void tearDown() { - ThreadUtils.runOnUiThreadBlocking(new Runnable() { - @Override - public void run() { - RecordUserAction.removeActionCallbackForTesting(); - } - }); - } - - @Override - public void onActionRecorded(String action) { - mActions.add(action); - } - - public List<String> getActions() { - return mActions; - } - - @Override - public String toString() { - return "Actions: " + mActions.toString(); - } -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/parameter/CommandLineParameter.java b/base/test/android/javatests/src/org/chromium/base/test/util/parameter/CommandLineParameter.java deleted file mode 100644 index e6f5506..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/parameter/CommandLineParameter.java +++ /dev/null
@@ -1,32 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util.parameter; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * The annotation for parametering CommandLineFlags in JUnit3 instrumentation tests. - * - * E.g. if you add the following annotation to your test class: - * - * <code> - * @CommandLineParameter({"", FLAG_A, FLAG_B}) - * public class MyTestClass - * </code> - * - * The test harness would run the test 3 times with each of the flag added to commandline - * file. - */ - -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.METHOD, ElementType.TYPE}) -public @interface CommandLineParameter { - String[] value() default {}; -}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/parameter/SkipCommandLineParameterization.java b/base/test/android/javatests/src/org/chromium/base/test/util/parameter/SkipCommandLineParameterization.java deleted file mode 100644 index 2181031..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/util/parameter/SkipCommandLineParameterization.java +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -package org.chromium.base.test.util.parameter; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * BaseJUnit4ClassRunner and host side test harness skips commandline parameterization for test - * classes or methods annotated with SkipCommandLineParameterization. - * - * This usually used by test that only runs in WebView javatests that only runs in sandboxed mode - * or single process mode. - */ - -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.METHOD, ElementType.TYPE}) -public @interface SkipCommandLineParameterization {}
diff --git a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java deleted file mode 100644 index 3ca756a..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import org.junit.runners.model.InitializationError; -import org.robolectric.DefaultTestLifecycle; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.TestLifecycle; - -import org.chromium.base.ApplicationStatus; -import org.chromium.base.CommandLine; -import org.chromium.base.ContextUtils; -import org.chromium.testing.local.LocalRobolectricTestRunner; - -import java.lang.reflect.Method; - -/** - * A Robolectric Test Runner that initializes base globals. - */ -public class BaseRobolectricTestRunner extends LocalRobolectricTestRunner { - /** - * Enables a per-test setUp / tearDown hook. - */ - public static class BaseTestLifecycle extends DefaultTestLifecycle { - @Override - public void beforeTest(Method method) { - ContextUtils.initApplicationContextForTests(RuntimeEnvironment.application); - CommandLine.init(null); - super.beforeTest(method); - } - - @Override - public void afterTest(Method method) { - ApplicationStatus.destroyForJUnitTests(); - super.afterTest(method); - } - } - - public BaseRobolectricTestRunner(Class<?> testClass) throws InitializationError { - super(testClass); - } - - @Override - protected Class<? extends TestLifecycle> getTestLifecycleClass() { - return BaseTestLifecycle.class; - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java b/base/test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java deleted file mode 100644 index 722bd1a..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java +++ /dev/null
@@ -1,64 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.rules.TestRule; -import org.junit.runner.RunWith; -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.model.Statement; - -import java.util.ArrayList; -import java.util.List; - -/** - * Test SetUpStatement is working as intended with SetUpTestRule. - */ -@RunWith(BlockJUnit4ClassRunner.class) -public class SetUpStatementTest { - private Statement mBase; - private SetUpTestRule<TestRule> mRule; - private List<Integer> mList; - - @Before - public void setUp() { - mBase = new Statement() { - @Override - public void evaluate() { - mList.add(1); - } - }; - mList = new ArrayList<>(); - mRule = new SetUpTestRule<TestRule>() { - @Override - public void setUp() { - mList.add(0); - } - - @Override - public TestRule shouldSetUp(boolean toSetUp) { - return null; - } - }; - } - - @Test - public void testSetUpStatementShouldSetUp() throws Throwable { - SetUpStatement statement = new SetUpStatement(mBase, mRule, true); - statement.evaluate(); - Integer[] expected = {0, 1}; - Assert.assertArrayEquals(expected, mList.toArray()); - } - - @Test - public void testSetUpStatementShouldNotSetUp() throws Throwable { - SetUpStatement statement = new SetUpStatement(mBase, mRule, false); - statement.evaluate(); - Integer[] expected = {1}; - Assert.assertArrayEquals(expected, mList.toArray()); - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java b/base/test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java deleted file mode 100644 index 63fa560..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java +++ /dev/null
@@ -1,119 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import static org.chromium.base.test.TestListInstrumentationRunListener.getAnnotationJSON; -import static org.chromium.base.test.TestListInstrumentationRunListener.getTestMethodJSON; - -import org.json.JSONObject; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.Description; -import org.junit.runner.RunWith; -import org.robolectric.annotation.Config; - -import org.chromium.base.test.util.CommandLineFlags; - -import java.util.Arrays; - -/** - * Robolectric test to ensure static methods in TestListInstrumentationRunListener works properly. - */ -@RunWith(BaseRobolectricTestRunner.class) -@Config(manifest = Config.NONE) -public class TestListInstrumentationRunListenerTest { - @CommandLineFlags.Add("hello") - private static class ParentClass { - public void testA() {} - - @CommandLineFlags.Add("world") - public void testB() {} - } - - @CommandLineFlags.Remove("hello") - private static class ChildClass extends ParentClass { - } - - @Test - public void testGetTestMethodJSON_testA() throws Throwable { - Description desc = Description.createTestDescription( - ParentClass.class, "testA", - ParentClass.class.getMethod("testA").getAnnotations()); - JSONObject json = getTestMethodJSON(desc); - String expectedJsonString = - "{" - + "'method': 'testA'," - + "'annotations': {}" - + "}"; - expectedJsonString = expectedJsonString - .replaceAll("\\s", "") - .replaceAll("'", "\""); - Assert.assertEquals(expectedJsonString, json.toString()); - } - - @Test - public void testGetTestMethodJSON_testB() throws Throwable { - Description desc = Description.createTestDescription( - ParentClass.class, "testB", - ParentClass.class.getMethod("testB").getAnnotations()); - JSONObject json = getTestMethodJSON(desc); - String expectedJsonString = - "{" - + "'method': 'testB'," - + "'annotations': {" - + " 'Add': {" - + " 'value': ['world']" - + " }" - + " }" - + "}"; - expectedJsonString = expectedJsonString - .replaceAll("\\s", "") - .replaceAll("'", "\""); - Assert.assertEquals(expectedJsonString, json.toString()); - } - - - @Test - public void testGetTestMethodJSONForInheritedClass() throws Throwable { - Description desc = Description.createTestDescription( - ChildClass.class, "testB", - ChildClass.class.getMethod("testB").getAnnotations()); - JSONObject json = getTestMethodJSON(desc); - String expectedJsonString = - "{" - + "'method': 'testB'," - + "'annotations': {" - + " 'Add': {" - + " 'value': ['world']" - + " }" - + " }" - + "}"; - expectedJsonString = expectedJsonString - .replaceAll("\\s", "") - .replaceAll("'", "\""); - Assert.assertEquals(expectedJsonString, json.toString()); - } - - @Test - public void testGetAnnotationJSONForParentClass() throws Throwable { - JSONObject json = getAnnotationJSON(Arrays.asList(ParentClass.class.getAnnotations())); - String expectedJsonString = "{'Add':{'value':['hello']}}"; - expectedJsonString = expectedJsonString - .replaceAll("\\s", "") - .replaceAll("'", "\""); - Assert.assertEquals(expectedJsonString, json.toString()); - } - - @Test - public void testGetAnnotationJSONForChildClass() throws Throwable { - JSONObject json = getAnnotationJSON(Arrays.asList(ChildClass.class.getAnnotations())); - String expectedJsonString = "{'Add':{'value':['hello']},'Remove':{'value':['hello']}}"; - expectedJsonString = expectedJsonString - .replaceAll("\\s", "") - .replaceAll("'", "\""); - Assert.assertEquals(expectedJsonString, json.toString()); - } -} -
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java deleted file mode 100644 index 6ffccad..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java +++ /dev/null
@@ -1,105 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.Assert; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.MethodRule; -import org.junit.runner.RunWith; - -import org.chromium.base.test.params.ParameterAnnotations.ClassParameter; -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter; -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameterAfter; -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameterBefore; -import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate; - -import java.util.Arrays; -import java.util.List; - -/** - * Example test that uses ParameterizedRunner - */ -@RunWith(ParameterizedRunner.class) -@UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) -public class ExampleParameterizedTest { - @ClassParameter - private static List<ParameterSet> sClassParams = - Arrays.asList(new ParameterSet().value("hello", "world").name("HelloWorld"), - new ParameterSet().value("Xxxx", "Yyyy").name("XxxxYyyy"), - new ParameterSet().value("aa", "yy").name("AaYy")); - - public static class MethodParamsA implements ParameterProvider { - private static List<ParameterSet> sMethodParamA = - Arrays.asList(new ParameterSet().value(1, 2).name("OneTwo"), - new ParameterSet().value(2, 3).name("TwoThree"), - new ParameterSet().value(3, 4).name("ThreeFour")); - - @Override - public List<ParameterSet> getParameters() { - return sMethodParamA; - } - } - - public static class MethodParamsB implements ParameterProvider { - private static List<ParameterSet> sMethodParamB = - Arrays.asList(new ParameterSet().value("a", "b").name("Ab"), - new ParameterSet().value("b", "c").name("Bc"), - new ParameterSet().value("c", "d").name("Cd"), - new ParameterSet().value("d", "e").name("De")); - - @Override - public List<ParameterSet> getParameters() { - return sMethodParamB; - } - } - - private String mStringA; - private String mStringB; - - public ExampleParameterizedTest(String a, String b) { - mStringA = a; - mStringB = b; - } - - @Test - public void testSimple() { - Assert.assertEquals( - "A and B string length aren't equal", mStringA.length(), mStringB.length()); - } - - @Rule - public MethodRule mMethodParamAnnotationProcessor = new MethodParamAnnotationRule(); - - private Integer mSum; - - @UseMethodParameterBefore(MethodParamsA.class) - public void setupWithOnlyA(int intA, int intB) { - mSum = intA + intB; - } - - @Test - @UseMethodParameter(MethodParamsA.class) - public void testWithOnlyA(int intA, int intB) { - Assert.assertEquals(intA + 1, intB); - Assert.assertEquals(mSum, Integer.valueOf(intA + intB)); - mSum = null; - } - - private String mConcatenation; - - @Test - @UseMethodParameter(MethodParamsB.class) - public void testWithOnlyB(String a, String b) { - Assert.assertTrue(!a.equals(b)); - mConcatenation = a + b; - } - - @UseMethodParameterAfter(MethodParamsB.class) - public void teardownWithOnlyB(String a, String b) { - Assert.assertEquals(mConcatenation, a + b); - mConcatenation = null; - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommonTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommonTest.java deleted file mode 100644 index 6d854c5..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommonTest.java +++ /dev/null
@@ -1,77 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.model.TestClass; - -import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException; - -import java.util.Collections; - -@RunWith(BlockJUnit4ClassRunner.class) -public class ParameterizedRunnerDelegateCommonTest { - /** - * Create a test object using the list of class parameter set - * - * @param testClass the {@link TestClass} object for current test class - * @param classParameterSet the parameter set needed for the test class constructor - */ - private static Object createTest(TestClass testClass, ParameterSet classParameterSet) - throws ParameterizedTestInstantiationException { - return new ParameterizedRunnerDelegateCommon( - testClass, classParameterSet, Collections.emptyList()) - .createTest(); - } - - static class BadTestClassWithMoreThanOneConstructor { - public BadTestClassWithMoreThanOneConstructor() {} - @SuppressWarnings("unused") - public BadTestClassWithMoreThanOneConstructor(String argument) {} - } - - static class BadTestClassWithTwoArgumentConstructor { - @SuppressWarnings("unused") - public BadTestClassWithTwoArgumentConstructor(int a, int b) {} - } - - static abstract class BadTestClassAbstract { - public BadTestClassAbstract() {} - } - - static class BadTestClassConstructorThrows { - public BadTestClassConstructorThrows() { - throw new RuntimeException(); - } - } - - @Test(expected = IllegalArgumentException.class) - public void testCreateTestWithMoreThanOneConstructor() throws Throwable { - TestClass testClass = new TestClass(BadTestClassWithMoreThanOneConstructor.class); - createTest(testClass, null); - } - - @Test(expected = IllegalArgumentException.class) - public void testCreateTestWithIncorrectArguments() throws Throwable { - TestClass testClass = new TestClass(BadTestClassWithTwoArgumentConstructor.class); - ParameterSet pSet = new ParameterSet().value(1, 2, 3); - createTest(testClass, pSet); - } - - @Test(expected = ParameterizedTestInstantiationException.class) - public void testCreateTestWithAbstractClass() throws ParameterizedTestInstantiationException { - TestClass testClass = new TestClass(BadTestClassAbstract.class); - createTest(testClass, null); - } - - @Test(expected = ParameterizedTestInstantiationException.class) - public void testCreateTestWithThrowingConstructor() - throws ParameterizedTestInstantiationException { - TestClass testClass = new TestClass(BadTestClassConstructorThrows.class); - createTest(testClass, null); - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactoryTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactoryTest.java deleted file mode 100644 index 723382d..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactoryTest.java +++ /dev/null
@@ -1,133 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.InitializationError; -import org.junit.runners.model.TestClass; - -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter; -import org.chromium.base.test.params.ParameterizedRunnerDelegateFactory.ParameterizedRunnerDelegateInstantiationException; - -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Test for org.chromium.base.test.params.ParameterizedRunnerDelegateFactory - */ -@RunWith(BlockJUnit4ClassRunner.class) -public class ParameterizedRunnerDelegateFactoryTest { - /** - * This RunnerDelegate calls `super.collectInitializationErrors()` and would - * cause BlockJUnit4ClassRunner to validate test classes. - */ - public static class BadExampleRunnerDelegate - extends BlockJUnit4ClassRunner implements ParameterizedRunnerDelegate { - public static class LalaTestClass {} - - private final List<FrameworkMethod> mParameterizedFrameworkMethodList; - - BadExampleRunnerDelegate(Class<?> klass, - List<FrameworkMethod> parameterizedFrameworkMethods) throws InitializationError { - super(klass); - mParameterizedFrameworkMethodList = parameterizedFrameworkMethods; - } - - @Override - public void collectInitializationErrors(List<Throwable> errors) { - super.collectInitializationErrors(errors); // This is wrong!! - } - - @Override - public List<FrameworkMethod> computeTestMethods() { - return mParameterizedFrameworkMethodList; - } - - @Override - public Object createTest() { - return null; - } - } - - static class ExampleTestClass { - static class MethodParamsA implements ParameterProvider { - @Override - public Iterable<ParameterSet> getParameters() { - return Arrays.asList( - new ParameterSet().value("a").name("testWithValue_a"), - new ParameterSet().value("b").name("testWithValue_b") - ); - } - } - - @SuppressWarnings("unused") - @UseMethodParameter(MethodParamsA.class) - @Test - public void testA(String a) {} - - static class MethodParamsB implements ParameterProvider { - @Override - public Iterable<ParameterSet> getParameters() { - return Arrays.asList( - new ParameterSet().value(1).name("testWithValue_1"), - new ParameterSet().value(2).name("testWithValue_2"), - new ParameterSet().value(3).name("testWithValue_3") - ); - } - } - - @SuppressWarnings("unused") - @UseMethodParameter(MethodParamsB.class) - @Test - public void testB(int b) {} - - @Test - public void testByMyself() {} - } - - /** - * This test validates ParameterizedRunnerDelegateFactory throws exception when - * a runner delegate does not override the collectInitializationErrors method. - */ - @Test(expected = ParameterizedRunnerDelegateInstantiationException.class) - public void testBadRunnerDelegateWithIncorrectValidationCall() throws Throwable { - ParameterizedRunnerDelegateFactory factory = new ParameterizedRunnerDelegateFactory(); - TestClass testClass = new TestClass(BadExampleRunnerDelegate.LalaTestClass.class); - factory.createRunner(testClass, null, BadExampleRunnerDelegate.class); - } - - @Test - public void testGenerateParameterizedFrameworkMethod() throws Throwable { - List<FrameworkMethod> methods = - ParameterizedRunnerDelegateFactory.generateUnmodifiableFrameworkMethodList( - new TestClass(ExampleTestClass.class), ""); - - Assert.assertEquals(methods.size(), 6); - - Map<String, Method> expectedTests = new HashMap<>(); - Method testMethodA = ExampleTestClass.class.getDeclaredMethod("testA", String.class); - Method testMethodB = ExampleTestClass.class.getDeclaredMethod("testB", int.class); - Method testMethodByMyself = ExampleTestClass.class.getDeclaredMethod("testByMyself"); - expectedTests.put("testA__testWithValue_a", testMethodA); - expectedTests.put("testA__testWithValue_b", testMethodA); - expectedTests.put("testB__testWithValue_1", testMethodB); - expectedTests.put("testB__testWithValue_2", testMethodB); - expectedTests.put("testB__testWithValue_3", testMethodB); - expectedTests.put("testByMyself", testMethodByMyself); - for (FrameworkMethod method : methods) { - Assert.assertNotNull(expectedTests.get(method.getName())); - Assert.assertEquals(expectedTests.get(method.getName()), method.getMethod()); - expectedTests.remove(method.getName()); - } - Assert.assertTrue(expectedTests.isEmpty()); - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java deleted file mode 100644 index 170ff69..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java +++ /dev/null
@@ -1,108 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.BlockJUnit4ClassRunner; - -import org.chromium.base.test.params.ParameterAnnotations.ClassParameter; -import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate; -import org.chromium.base.test.params.ParameterizedRunner.IllegalParameterArgumentException; - -import java.util.ArrayList; -import java.util.List; - -/** - * Test for org.chromium.base.test.params.ParameterizedRunner - */ -@RunWith(BlockJUnit4ClassRunner.class) -public class ParameterizedRunnerTest { - @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) - public static class BadTestClassWithMoreThanOneConstructor { - @ClassParameter - static List<ParameterSet> sClassParams = new ArrayList<>(); - - public BadTestClassWithMoreThanOneConstructor() {} - - public BadTestClassWithMoreThanOneConstructor(String x) {} - } - - @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) - public static class BadTestClassWithNonListParameters { - @ClassParameter - static String[] sMethodParamA = {"1", "2"}; - - @Test - public void test() {} - } - - @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) - public static class BadTestClassWithoutNeedForParameterization { - @Test - public void test() {} - } - - @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) - public static class BadTestClassWithNonStaticParameterSetList { - @ClassParameter - public List<ParameterSet> mClassParams = new ArrayList<>(); - - @Test - public void test() {} - } - - @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) - public static class BadTestClassWithMultipleClassParameter { - @ClassParameter - private static List<ParameterSet> sParamA = new ArrayList<>(); - - @ClassParameter - private static List<ParameterSet> sParamB = new ArrayList<>(); - } - - @Test(expected = ParameterizedRunner.IllegalParameterArgumentException.class) - public void testEmptyParameterSet() { - List<ParameterSet> paramList = new ArrayList<>(); - paramList.add(new ParameterSet()); - ParameterizedRunner.validateWidth(paramList); - } - - @Test(expected = ParameterizedRunner.IllegalParameterArgumentException.class) - public void testUnequalWidthParameterSetList() { - List<ParameterSet> paramList = new ArrayList<>(); - paramList.add(new ParameterSet().value(1, 2)); - paramList.add(new ParameterSet().value(3, 4, 5)); - ParameterizedRunner.validateWidth(paramList); - } - - @Test(expected = ParameterizedRunner.IllegalParameterArgumentException.class) - public void testUnequalWidthParameterSetListWithNull() { - List<ParameterSet> paramList = new ArrayList<>(); - paramList.add(new ParameterSet().value(null)); - paramList.add(new ParameterSet().value(1, 2)); - ParameterizedRunner.validateWidth(paramList); - } - - @Test(expected = IllegalArgumentException.class) - public void testBadClassWithNonListParameters() throws Throwable { - new ParameterizedRunner(BadTestClassWithNonListParameters.class); - } - - @Test(expected = IllegalParameterArgumentException.class) - public void testBadClassWithNonStaticParameterSetList() throws Throwable { - new ParameterizedRunner(BadTestClassWithNonStaticParameterSetList.class); - } - - @Test(expected = IllegalArgumentException.class) - public void testBadClassWithoutNeedForParameterization() throws Throwable { - new ParameterizedRunner(BadTestClassWithoutNeedForParameterization.class); - } - - @Test(expected = Exception.class) - public void testBadClassWithMoreThanOneConstructor() throws Throwable { - new ParameterizedRunner(BadTestClassWithMoreThanOneConstructor.class); - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedTestNameTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedTestNameTest.java deleted file mode 100644 index e79f5c5..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedTestNameTest.java +++ /dev/null
@@ -1,201 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.params; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runner.Runner; -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.TestClass; - -import org.chromium.base.test.params.ParameterAnnotations.ClassParameter; -import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter; -import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; - -/** - * Test for verify the names and test method Description works properly - */ -@RunWith(BlockJUnit4ClassRunner.class) -public class ParameterizedTestNameTest { - @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) - public static class TestClassWithClassParameterAppendName { - @ClassParameter - static List<ParameterSet> sAllName = Arrays.asList( - new ParameterSet().value("hello").name("Hello"), - new ParameterSet().value("world").name("World") - ); - - public TestClassWithClassParameterAppendName(String a) {} - - @Test - public void test() {} - } - - @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) - public static class TestClassWithClassParameterDefaultName { - @ClassParameter - static List<ParameterSet> sAllName = Arrays.asList( - new ParameterSet().value("hello"), - new ParameterSet().value("world") - ); - - public TestClassWithClassParameterDefaultName(String a) {} - - @Test - public void test() {} - } - - @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) - public static class TestClassWithMethodParameter { - static class AppendNameParams implements ParameterProvider { - @Override - public Iterable<ParameterSet> getParameters() { - return Arrays.asList( - new ParameterSet().value("hello").name("Hello"), - new ParameterSet().value("world").name("World") - ); - } - } - - static class DefaultNameParams implements ParameterProvider { - @Override - public Iterable<ParameterSet> getParameters() { - return Arrays.asList( - new ParameterSet().value("hello"), - new ParameterSet().value("world") - ); - } - } - - @UseMethodParameter(AppendNameParams.class) - @Test - public void test(String a) {} - - @UseMethodParameter(DefaultNameParams.class) - @Test - public void testDefaultName(String b) {} - } - - @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) - public static class TestClassWithMixedParameter { - @ClassParameter - static List<ParameterSet> sAllName = Arrays.asList( - new ParameterSet().value("hello").name("Hello"), - new ParameterSet().value("world").name("World") - ); - - static class AppendNameParams implements ParameterProvider { - @Override - public Iterable<ParameterSet> getParameters() { - return Arrays.asList( - new ParameterSet().value("1").name("A"), - new ParameterSet().value("2").name("B") - ); - } - } - - public TestClassWithMixedParameter(String a) {} - - @UseMethodParameter(AppendNameParams.class) - @Test - public void testA(String a) {} - - @Test - public void test() {} - } - - @Test - public void testClassParameterAppendName() throws Throwable { - List<Runner> runners = ParameterizedRunner.createRunners( - new TestClass(TestClassWithClassParameterAppendName.class)); - List<String> expectedTestNames = - new LinkedList<String>(Arrays.asList("test__Hello", "test__World")); - List<String> computedMethodNames = new ArrayList<>(); - for (Runner r : runners) { - BlockJUnit4RunnerDelegate castedRunner = (BlockJUnit4RunnerDelegate) r; - for (FrameworkMethod method : castedRunner.computeTestMethods()) { - computedMethodNames.add(method.getName()); - Assert.assertTrue("This test name is not expected: " + method.getName(), - expectedTestNames.contains(method.getName())); - expectedTestNames.remove(method.getName()); - method.getName(); - } - } - Assert.assertTrue( - String.format( - "These names were provided: %s, these expected names are not found: %s", - Arrays.toString(computedMethodNames.toArray()), - Arrays.toString(expectedTestNames.toArray())), - expectedTestNames.isEmpty()); - } - - @Test - public void testClassParameterDefaultName() throws Throwable { - List<Runner> runners = ParameterizedRunner.createRunners( - new TestClass(TestClassWithClassParameterDefaultName.class)); - List<String> expectedTestNames = new LinkedList<String>(Arrays.asList("test", "test")); - for (Runner r : runners) { - @SuppressWarnings("unchecked") - BlockJUnit4RunnerDelegate castedRunner = (BlockJUnit4RunnerDelegate) r; - for (FrameworkMethod method : castedRunner.computeTestMethods()) { - Assert.assertTrue("This test name is not expected: " + method.getName(), - expectedTestNames.contains(method.getName())); - expectedTestNames.remove(method.getName()); - method.getName(); - } - } - Assert.assertTrue("These expected names are not found: " - + Arrays.toString(expectedTestNames.toArray()), - expectedTestNames.isEmpty()); - } - - @Test - public void testMethodParameter() throws Throwable { - List<Runner> runners = ParameterizedRunner.createRunners( - new TestClass(TestClassWithMethodParameter.class)); - List<String> expectedTestNames = new LinkedList<String>( - Arrays.asList("test__Hello", "test__World", "testDefaultName", "testDefaultName")); - for (Runner r : runners) { - BlockJUnit4RunnerDelegate castedRunner = (BlockJUnit4RunnerDelegate) r; - for (FrameworkMethod method : castedRunner.computeTestMethods()) { - Assert.assertTrue("This test name is not expected: " + method.getName(), - expectedTestNames.contains(method.getName())); - expectedTestNames.remove(method.getName()); - method.getName(); - } - } - Assert.assertTrue("These expected names are not found: " - + Arrays.toString(expectedTestNames.toArray()), - expectedTestNames.isEmpty()); - } - - @Test - public void testMixedParameterTestA() throws Throwable { - List<Runner> runners = - ParameterizedRunner.createRunners(new TestClass(TestClassWithMixedParameter.class)); - List<String> expectedTestNames = - new LinkedList<String>(Arrays.asList("testA__Hello_A", "testA__World_A", - "testA__Hello_B", "testA__World_B", "test__Hello", "test__World")); - for (Runner r : runners) { - BlockJUnit4RunnerDelegate castedRunner = (BlockJUnit4RunnerDelegate) r; - for (FrameworkMethod method : castedRunner.computeTestMethods()) { - Assert.assertTrue("This test name is not expected: " + method.getName(), - expectedTestNames.contains(method.getName())); - expectedTestNames.remove(method.getName()); - method.getName(); - } - } - Assert.assertTrue("These expected names are not found: " - + Arrays.toString(expectedTestNames.toArray()), - expectedTestNames.isEmpty()); - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java b/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java deleted file mode 100644 index 9acd141..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java +++ /dev/null
@@ -1,377 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import static org.hamcrest.Matchers.contains; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; -import static org.junit.runner.Description.createTestDescription; - -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runner.RunWith; -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.InitializationError; -import org.junit.runners.model.Statement; - -import org.chromium.base.test.util.AnnotationProcessingUtils.AnnotationExtractor; - -import java.lang.annotation.Annotation; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; - -/** Test for {@link AnnotationProcessingUtils}. */ -@RunWith(BlockJUnit4ClassRunner.class) -public class AnnotationProcessingUtilsTest { - @Test - public void testGetTargetAnnotation_NotOnClassNorMethod() { - TargetAnnotation retrievedAnnotation; - - retrievedAnnotation = AnnotationProcessingUtils.getAnnotation( - createTestDescription( - ClassWithoutTargetAnnotation.class, "methodWithoutAnnotation"), - TargetAnnotation.class); - assertNull(retrievedAnnotation); - } - - @Test - public void testGetTargetAnnotation_NotOnClassButOnMethod() { - TargetAnnotation retrievedAnnotation; - - retrievedAnnotation = AnnotationProcessingUtils.getAnnotation( - getTest(ClassWithoutTargetAnnotation.class, "methodWithTargetAnnotation"), - TargetAnnotation.class); - assertNotNull(retrievedAnnotation); - } - - @Test - public void testGetTargetAnnotation_NotOnClassDifferentOneOnMethod() { - TargetAnnotation retrievedAnnotation; - - retrievedAnnotation = AnnotationProcessingUtils.getAnnotation( - getTest(ClassWithoutTargetAnnotation.class, "methodWithAnnotatedAnnotation"), - TargetAnnotation.class); - assertNull(retrievedAnnotation); - } - - @Test - public void testGetTargetAnnotation_OnClassButNotOnMethod() { - TargetAnnotation retrievedAnnotation; - - retrievedAnnotation = AnnotationProcessingUtils.getAnnotation( - getTest(ClassWithAnnotation.class, "methodWithoutAnnotation"), - TargetAnnotation.class); - assertNotNull(retrievedAnnotation); - assertEquals(Location.Class, retrievedAnnotation.value()); - } - - @Test - public void testGetTargetAnnotation_OnClassAndMethod() { - TargetAnnotation retrievedAnnotation; - - retrievedAnnotation = AnnotationProcessingUtils.getAnnotation( - getTest(ClassWithAnnotation.class, "methodWithTargetAnnotation"), - TargetAnnotation.class); - assertNotNull(retrievedAnnotation); - assertEquals(Location.Method, retrievedAnnotation.value()); - } - - @Test - @Ignore("Rules not supported yet.") - public void testGetTargetAnnotation_OnRuleButNotOnMethod() { - TargetAnnotation retrievedAnnotation; - - retrievedAnnotation = AnnotationProcessingUtils.getAnnotation( - getTest(ClassWithRule.class, "methodWithoutAnnotation"), TargetAnnotation.class); - assertNotNull(retrievedAnnotation); - assertEquals(Location.Rule, retrievedAnnotation.value()); - } - - @Test - @Ignore("Rules not supported yet.") - public void testGetTargetAnnotation_OnRuleAndMethod() { - TargetAnnotation retrievedAnnotation; - - retrievedAnnotation = AnnotationProcessingUtils.getAnnotation( - getTest(ClassWithRule.class, "methodWithTargetAnnotation"), TargetAnnotation.class); - assertNotNull(retrievedAnnotation); - assertEquals(Location.Method, retrievedAnnotation.value()); - } - - @Test - public void testGetMetaAnnotation_Indirectly() { - MetaAnnotation retrievedAnnotation; - - retrievedAnnotation = AnnotationProcessingUtils.getAnnotation( - getTest(ClassWithoutTargetAnnotation.class, "methodWithAnnotatedAnnotation"), - MetaAnnotation.class); - assertNotNull(retrievedAnnotation); - } - - @Test - public void testGetAllTargetAnnotations() { - List<TargetAnnotation> retrievedAnnotations; - - retrievedAnnotations = AnnotationProcessingUtils.getAnnotations( - getTest(ClassWithAnnotation.class, "methodWithTargetAnnotation"), - TargetAnnotation.class); - assertEquals(2, retrievedAnnotations.size()); - assertEquals(Location.Class, retrievedAnnotations.get(0).value()); - assertEquals(Location.Method, retrievedAnnotations.get(1).value()); - } - - @Test - public void testGetAllTargetAnnotations_OnParentClass() { - List<TargetAnnotation> retrievedAnnotations; - - retrievedAnnotations = AnnotationProcessingUtils.getAnnotations( - getTest(DerivedClassWithoutAnnotation.class, "newMethodWithoutAnnotation"), - TargetAnnotation.class); - assertEquals(1, retrievedAnnotations.size()); - assertEquals(Location.Class, retrievedAnnotations.get(0).value()); - } - - @Test - public void testGetAllTargetAnnotations_OnDerivedMethodAndParentClass() { - List<TargetAnnotation> retrievedAnnotations; - - retrievedAnnotations = AnnotationProcessingUtils.getAnnotations( - getTest(DerivedClassWithoutAnnotation.class, "newMethodWithTargetAnnotation"), - TargetAnnotation.class); - assertEquals(2, retrievedAnnotations.size()); - assertEquals(Location.Class, retrievedAnnotations.get(0).value()); - assertEquals(Location.DerivedMethod, retrievedAnnotations.get(1).value()); - } - - @Test - public void testGetAllTargetAnnotations_OnDerivedMethodAndParentClassAndMethod() { - List<TargetAnnotation> retrievedAnnotations; - - retrievedAnnotations = AnnotationProcessingUtils.getAnnotations( - getTest(DerivedClassWithoutAnnotation.class, "methodWithTargetAnnotation"), - TargetAnnotation.class); - // We should not look at the base implementation of the method. Mostly it should not happen - // in the context of tests. - assertEquals(2, retrievedAnnotations.size()); - assertEquals(Location.Class, retrievedAnnotations.get(0).value()); - assertEquals(Location.DerivedMethod, retrievedAnnotations.get(1).value()); - } - - @Test - public void testGetAllTargetAnnotations_OnDerivedParentAndParentClass() { - List<TargetAnnotation> retrievedAnnotations; - - retrievedAnnotations = AnnotationProcessingUtils.getAnnotations( - getTest(DerivedClassWithAnnotation.class, "methodWithoutAnnotation"), - TargetAnnotation.class); - assertEquals(2, retrievedAnnotations.size()); - assertEquals(Location.Class, retrievedAnnotations.get(0).value()); - assertEquals(Location.DerivedClass, retrievedAnnotations.get(1).value()); - } - - @Test - public void testGetAllAnnotations() { - List<Annotation> annotations; - - AnnotationExtractor annotationExtractor = new AnnotationExtractor( - TargetAnnotation.class, MetaAnnotation.class, AnnotatedAnnotation.class); - annotations = annotationExtractor.getMatchingAnnotations( - getTest(DerivedClassWithAnnotation.class, "methodWithTwoAnnotations")); - assertEquals(5, annotations.size()); - - // Retrieved annotation order: - // On Parent Class - assertEquals(TargetAnnotation.class, annotations.get(0).annotationType()); - assertEquals(Location.Class, ((TargetAnnotation) annotations.get(0)).value()); - - // On Class - assertEquals(TargetAnnotation.class, annotations.get(1).annotationType()); - assertEquals(Location.DerivedClass, ((TargetAnnotation) annotations.get(1)).value()); - - // Meta-annotations from method - assertEquals(MetaAnnotation.class, annotations.get(2).annotationType()); - - // On Method - assertEquals(AnnotatedAnnotation.class, annotations.get(3).annotationType()); - assertEquals(TargetAnnotation.class, annotations.get(4).annotationType()); - assertEquals(Location.DerivedMethod, ((TargetAnnotation) annotations.get(4)).value()); - } - - @SuppressWarnings("unchecked") - @Test - public void testAnnotationExtractorSortOrder_UnknownAnnotations() { - AnnotationExtractor annotationExtractor = new AnnotationExtractor(Target.class); - Comparator<Class<? extends Annotation>> comparator = - annotationExtractor.getTypeComparator(); - List<Class<? extends Annotation>> testList = - Arrays.asList(Rule.class, Test.class, Override.class, Target.class, Rule.class); - testList.sort(comparator); - assertThat("Unknown annotations should not be reordered and come before the known ones.", - testList, - contains(Rule.class, Test.class, Override.class, Rule.class, Target.class)); - } - - @SuppressWarnings("unchecked") - @Test - public void testAnnotationExtractorSortOrder_KnownAnnotations() { - AnnotationExtractor annotationExtractor = - new AnnotationExtractor(Test.class, Target.class, Rule.class); - Comparator<Class<? extends Annotation>> comparator = - annotationExtractor.getTypeComparator(); - List<Class<? extends Annotation>> testList = - Arrays.asList(Rule.class, Test.class, Override.class, Target.class, Rule.class); - testList.sort(comparator); - assertThat( - "Known annotations should be sorted in the same order as provided to the extractor", - testList, - contains(Override.class, Test.class, Target.class, Rule.class, Rule.class)); - } - - private static Description getTest(Class<?> klass, String testName) { - Description description = null; - try { - description = new DummyTestRunner(klass).describe(testName); - } catch (InitializationError initializationError) { - initializationError.printStackTrace(); - fail("DummyTestRunner initialization failed:" + initializationError.getMessage()); - } - if (description == null) { - fail("Not test named '" + testName + "' in class" + klass.getSimpleName()); - } - return description; - } - - // region Test Data: Annotations and dummy test classes - private enum Location { Unspecified, Class, Method, Rule, DerivedClass, DerivedMethod } - - @Retention(RetentionPolicy.RUNTIME) - @Target({ElementType.TYPE, ElementType.METHOD}) - private @interface TargetAnnotation { - Location value() default Location.Unspecified; - } - - @Retention(RetentionPolicy.RUNTIME) - @Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD}) - private @interface MetaAnnotation {} - - @Retention(RetentionPolicy.RUNTIME) - @Target({ElementType.TYPE, ElementType.METHOD}) - @MetaAnnotation - private @interface AnnotatedAnnotation {} - - private @interface SimpleAnnotation {} - - @SimpleAnnotation - private static class ClassWithoutTargetAnnotation { - @Test - public void methodWithoutAnnotation() {} - - @Test - @TargetAnnotation - public void methodWithTargetAnnotation() {} - - @Test - @AnnotatedAnnotation - public void methodWithAnnotatedAnnotation() {} - } - - @TargetAnnotation(Location.Class) - private static class ClassWithAnnotation { - @Test - public void methodWithoutAnnotation() {} - - @Test - @TargetAnnotation(Location.Method) - public void methodWithTargetAnnotation() {} - - @Test - @MetaAnnotation - public void methodWithMetaAnnotation() {} - - @Test - @AnnotatedAnnotation - public void methodWithAnnotatedAnnotation() {} - } - - private static class DerivedClassWithoutAnnotation extends ClassWithAnnotation { - @Test - public void newMethodWithoutAnnotation() {} - - @Test - @TargetAnnotation(Location.DerivedMethod) - public void newMethodWithTargetAnnotation() {} - - @Test - @Override - @TargetAnnotation(Location.DerivedMethod) - public void methodWithTargetAnnotation() {} - } - - @TargetAnnotation(Location.DerivedClass) - private static class DerivedClassWithAnnotation extends ClassWithAnnotation { - @Test - public void newMethodWithoutAnnotation() {} - - @Test - @AnnotatedAnnotation - @TargetAnnotation(Location.DerivedMethod) - public void methodWithTwoAnnotations() {} - } - - private static class ClassWithRule { - @Rule - Rule1 mRule = new Rule1(); - - @Test - public void methodWithoutAnnotation() {} - - @Test - @TargetAnnotation - public void methodWithTargetAnnotation() {} - } - - @TargetAnnotation(Location.Rule) - @MetaAnnotation - private static class Rule1 implements TestRule { - @Override - public Statement apply(Statement statement, Description description) { - return null; - } - } - - private static class DummyTestRunner extends BlockJUnit4ClassRunner { - public DummyTestRunner(Class<?> klass) throws InitializationError { - super(klass); - } - - @Override - protected void collectInitializationErrors(List<Throwable> errors) { - // Do nothing. BlockJUnit4ClassRunner requires the class to be public, but we don't - // want/need it. - } - - public Description describe(String testName) { - List<FrameworkMethod> tests = getTestClass().getAnnotatedMethods(Test.class); - for (FrameworkMethod testMethod : tests) { - if (testMethod.getName().equals(testName)) return describeChild(testMethod); - } - return null; - } - } - - // endregion - }
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java b/base/test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java deleted file mode 100644 index a147435..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java +++ /dev/null
@@ -1,193 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.os.Build; - -import junit.framework.TestCase; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.annotation.Config; -import org.robolectric.util.ReflectionHelpers; - -import org.chromium.base.test.BaseRobolectricTestRunner; - -/** Unit tests for the DisableIf annotation and its SkipCheck implementation. */ -@RunWith(BaseRobolectricTestRunner.class) -@Config(manifest = Config.NONE, sdk = 21) -public class DisableIfTest { - @Test - public void testSdkIsLessThanAndIsLessThan() { - TestCase sdkIsLessThan = new TestCase("sdkIsLessThan") { - @DisableIf.Build(sdk_is_less_than = 22) - public void sdkIsLessThan() {} - }; - Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(sdkIsLessThan)); - } - - @Test - public void testSdkIsLessThanButIsEqual() { - TestCase sdkIsEqual = new TestCase("sdkIsEqual") { - @DisableIf.Build(sdk_is_less_than = 21) - public void sdkIsEqual() {} - }; - Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(sdkIsEqual)); - } - - @Test - public void testSdkIsLessThanButIsGreaterThan() { - TestCase sdkIsGreaterThan = new TestCase("sdkIsGreaterThan") { - @DisableIf.Build(sdk_is_less_than = 20) - public void sdkIsGreaterThan() {} - }; - Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(sdkIsGreaterThan)); - } - - @Test - public void testSdkIsGreaterThanButIsLessThan() { - TestCase sdkIsLessThan = new TestCase("sdkIsLessThan") { - @DisableIf.Build(sdk_is_greater_than = 22) - public void sdkIsLessThan() {} - }; - Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(sdkIsLessThan)); - } - - @Test - public void testSdkIsGreaterThanButIsEqual() { - TestCase sdkIsEqual = new TestCase("sdkIsEqual") { - @DisableIf.Build(sdk_is_greater_than = 21) - public void sdkIsEqual() {} - }; - Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(sdkIsEqual)); - } - - @Test - public void testSdkIsGreaterThanAndIsGreaterThan() { - TestCase sdkIsGreaterThan = new TestCase("sdkIsGreaterThan") { - @DisableIf.Build(sdk_is_greater_than = 20) - public void sdkIsGreaterThan() {} - }; - Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(sdkIsGreaterThan)); - } - - @Test - public void testSupportedAbiIncludesAndCpuAbiMatches() { - TestCase supportedAbisCpuAbiMatch = new TestCase("supportedAbisCpuAbiMatch") { - @DisableIf.Build(supported_abis_includes = "foo") - public void supportedAbisCpuAbiMatch() {} - }; - String[] originalAbis = Build.SUPPORTED_ABIS; - try { - ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", - new String[] {"foo", "bar"}); - Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(supportedAbisCpuAbiMatch)); - } finally { - ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", originalAbis); - } - } - - @Test - public void testSupportedAbiIncludesAndCpuAbi2Matches() { - TestCase supportedAbisCpuAbi2Match = new TestCase("supportedAbisCpuAbi2Match") { - @DisableIf.Build(supported_abis_includes = "bar") - public void supportedAbisCpuAbi2Match() {} - }; - String[] originalAbis = Build.SUPPORTED_ABIS; - try { - ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", - new String[] {"foo", "bar"}); - Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(supportedAbisCpuAbi2Match)); - } finally { - ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", originalAbis); - } - } - - @Test - public void testSupportedAbiIncludesButNoMatch() { - TestCase supportedAbisNoMatch = new TestCase("supportedAbisNoMatch") { - @DisableIf.Build(supported_abis_includes = "baz") - public void supportedAbisNoMatch() {} - }; - String[] originalAbis = Build.SUPPORTED_ABIS; - try { - ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", - new String[] {"foo", "bar"}); - Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(supportedAbisNoMatch)); - } finally { - ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", originalAbis); - } - } - - @Test - public void testHardwareIsMatches() { - TestCase hardwareIsMatches = new TestCase("hardwareIsMatches") { - @DisableIf.Build(hardware_is = "hammerhead") - public void hardwareIsMatches() {} - }; - String originalHardware = Build.HARDWARE; - try { - ReflectionHelpers.setStaticField(Build.class, "HARDWARE", "hammerhead"); - Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(hardwareIsMatches)); - } finally { - ReflectionHelpers.setStaticField(Build.class, "HARDWARE", originalHardware); - } - } - - @Test - public void testHardwareIsDoesntMatch() { - TestCase hardwareIsDoesntMatch = new TestCase("hardwareIsDoesntMatch") { - @DisableIf.Build(hardware_is = "hammerhead") - public void hardwareIsDoesntMatch() {} - }; - String originalHardware = Build.HARDWARE; - try { - ReflectionHelpers.setStaticField(Build.class, "HARDWARE", "mako"); - Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(hardwareIsDoesntMatch)); - } finally { - ReflectionHelpers.setStaticField(Build.class, "HARDWARE", originalHardware); - } - } - - @DisableIf.Build(supported_abis_includes = "foo") - private static class DisableIfSuperclassTestCase extends TestCase { - public DisableIfSuperclassTestCase(String name) { - super(name); - } - } - - @DisableIf.Build(hardware_is = "hammerhead") - private static class DisableIfTestCase extends DisableIfSuperclassTestCase { - public DisableIfTestCase(String name) { - super(name); - } - public void sampleTestMethod() {} - } - - @Test - public void testDisableClass() { - TestCase sampleTestMethod = new DisableIfTestCase("sampleTestMethod"); - String originalHardware = Build.HARDWARE; - try { - ReflectionHelpers.setStaticField(Build.class, "HARDWARE", "hammerhead"); - Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(sampleTestMethod)); - } finally { - ReflectionHelpers.setStaticField(Build.class, "HARDWARE", originalHardware); - } - } - - @Test - public void testDisableSuperClass() { - TestCase sampleTestMethod = new DisableIfTestCase("sampleTestMethod"); - String[] originalAbis = Build.SUPPORTED_ABIS; - try { - ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", new String[] {"foo"}); - Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(sampleTestMethod)); - } finally { - ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", originalAbis); - } - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/ManualSkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/ManualSkipCheckTest.java deleted file mode 100644 index 0c3e955..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/util/ManualSkipCheckTest.java +++ /dev/null
@@ -1,145 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.isIn; - -import android.app.Instrumentation; -import android.content.Context; -import android.os.Bundle; -import android.support.test.InstrumentationRegistry; - -import org.junit.Assert; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ErrorCollector; -import org.junit.rules.ExternalResource; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runner.RunWith; -import org.junit.runner.notification.Failure; -import org.junit.runner.notification.RunListener; -import org.junit.runner.notification.RunNotifier; -import org.junit.runners.model.FrameworkMethod; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; - -import org.chromium.base.test.BaseJUnit4ClassRunner; -import org.chromium.base.test.BaseRobolectricTestRunner; - -import java.util.ArrayList; -import java.util.List; - -/** - * Unit tests for skipping tests annotated with {@code @}{@link Manual}. - */ -@RunWith(BaseRobolectricTestRunner.class) -@Config(manifest = Config.NONE) -public class ManualSkipCheckTest { - /** - * Example test class. - */ - public static class ManualTest { - @Test - @Manual - public void manualTest() {} - - @Test - public void nonManualTest() {} - } - - @Test - public void testManual() throws NoSuchMethodException { - FrameworkMethod method = new FrameworkMethod(ManualTest.class.getMethod("manualTest")); - Assert.assertTrue(new ManualSkipCheck().shouldSkip(method)); - } - - @Test - public void testNonManual() throws NoSuchMethodException { - FrameworkMethod method = new FrameworkMethod(ManualTest.class.getMethod("nonManualTest")); - Assert.assertFalse(new ManualSkipCheck().shouldSkip(method)); - } - - private static class MockRunListener extends RunListener { - private List<Description> mRunTests = new ArrayList<>(); - private List<Description> mSkippedTests = new ArrayList<>(); - - public List<Description> getRunTests() { - return mRunTests; - } - - public List<Description> getSkippedTests() { - return mSkippedTests; - } - - @Override - public void testStarted(Description description) throws Exception { - mRunTests.add(description); - } - - @Override - public void testFinished(Description description) throws Exception { - Assert.assertThat(description, isIn(mRunTests)); - } - - @Override - public void testFailure(Failure failure) throws Exception { - Assert.fail(failure.toString()); - } - - @Override - public void testAssumptionFailure(Failure failure) { - Assert.fail(failure.toString()); - } - - @Override - public void testIgnored(Description description) throws Exception { - mSkippedTests.add(description); - } - } - - /** - * Registers a fake {@link Instrumentation} so that class runners for instrumentation tests can - * be run even in Robolectric tests. - */ - private static class MockInstrumentationRule extends ExternalResource { - @Override - protected void before() throws Throwable { - Instrumentation instrumentation = new Instrumentation() { - @Override - public Context getTargetContext() { - return RuntimeEnvironment.application; - } - }; - InstrumentationRegistry.registerInstance(instrumentation, new Bundle()); - } - - @Override - protected void after() { - InstrumentationRegistry.registerInstance(null, new Bundle()); - } - } - - @Rule - public TestRule mMockInstrumentationRule = new MockInstrumentationRule(); - - @Rule - public ErrorCollector mErrorCollector = new ErrorCollector(); - - @Test - public void testWithTestRunner() throws Exception { - // TODO(bauerb): Using Mockito mock() or spy() throws a ClassCastException. - MockRunListener runListener = new MockRunListener(); - RunNotifier runNotifier = new RunNotifier(); - runNotifier.addListener(runListener); - new BaseJUnit4ClassRunner(ManualTest.class).run(runNotifier); - - mErrorCollector.checkThat(runListener.getRunTests(), - contains(Description.createTestDescription(ManualTest.class, "nonManualTest"))); - mErrorCollector.checkThat(runListener.getSkippedTests(), - contains(Description.createTestDescription(ManualTest.class, "manualTest"))); - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java deleted file mode 100644 index 050cb10..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java +++ /dev/null
@@ -1,95 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import junit.framework.TestCase; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.annotation.Config; - -import org.chromium.base.test.BaseRobolectricTestRunner; - -/** Unit tests for MinAndroidSdkLevelSkipCheck. */ -@RunWith(BaseRobolectricTestRunner.class) -@Config(manifest = Config.NONE, sdk = 18) -public class MinAndroidSdkLevelSkipCheckTest { - private static class UnannotatedBaseClass extends TestCase { - public UnannotatedBaseClass(String name) { - super(name); - } - @MinAndroidSdkLevel(17) public void min17Method() {} - @MinAndroidSdkLevel(20) public void min20Method() {} - } - - @MinAndroidSdkLevel(17) - private static class Min17Class extends UnannotatedBaseClass { - public Min17Class(String name) { - super(name); - } - public void unannotatedMethod() {} - } - - @MinAndroidSdkLevel(20) - private static class Min20Class extends UnannotatedBaseClass { - public Min20Class(String name) { - super(name); - } - public void unannotatedMethod() {} - } - - private static class ExtendsMin17Class extends Min17Class { - public ExtendsMin17Class(String name) { - super(name); - } - @Override - public void unannotatedMethod() {} - } - - private static class ExtendsMin20Class extends Min20Class { - public ExtendsMin20Class(String name) { - super(name); - } - @Override - public void unannotatedMethod() {} - } - - @Test - public void testAnnotatedMethodAboveMin() { - Assert.assertFalse(new MinAndroidSdkLevelSkipCheck().shouldSkip( - new UnannotatedBaseClass("min17Method"))); - } - - @Test - public void testAnnotatedMethodBelowMin() { - Assert.assertTrue(new MinAndroidSdkLevelSkipCheck().shouldSkip( - new UnannotatedBaseClass("min20Method"))); - } - - @Test - public void testAnnotatedClassAboveMin() { - Assert.assertFalse(new MinAndroidSdkLevelSkipCheck().shouldSkip( - new Min17Class("unannotatedMethod"))); - } - - @Test - public void testAnnotatedClassBelowMin() { - Assert.assertTrue(new MinAndroidSdkLevelSkipCheck().shouldSkip( - new Min20Class("unannotatedMethod"))); - } - - @Test - public void testAnnotatedSuperclassAboveMin() { - Assert.assertFalse(new MinAndroidSdkLevelSkipCheck().shouldSkip( - new ExtendsMin17Class("unannotatedMethod"))); - } - - @Test - public void testAnnotatedSuperclassBelowMin() { - Assert.assertTrue(new MinAndroidSdkLevelSkipCheck().shouldSkip( - new ExtendsMin20Class("unannotatedMethod"))); - } -}
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java deleted file mode 100644 index 86285de..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java +++ /dev/null
@@ -1,129 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import android.text.TextUtils; - -import junit.framework.TestCase; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.annotation.Config; - -import org.chromium.base.test.BaseRobolectricTestRunner; - -/** Unit tests for RestrictionSkipCheck. */ -@RunWith(BaseRobolectricTestRunner.class) -@Config(manifest = Config.NONE) -public class RestrictionSkipCheckTest { - private static final String TEST_RESTRICTION_APPLIES = - "org.chromium.base.test.util.RestrictionSkipCheckTest.TEST_RESTRICTION_APPLIES"; - private static final String TEST_RESTRICTION_DOES_NOT_APPLY = - "org.chromium.base.test.util.RestrictionSkipCheckTest.TEST_RESTRICTION_DOES_NOT_APPLY"; - - private static class TestRestrictionSkipCheck extends RestrictionSkipCheck { - public TestRestrictionSkipCheck() { - super(null); - } - @Override - protected boolean restrictionApplies(String restriction) { - return TextUtils.equals(restriction, TEST_RESTRICTION_APPLIES); - } - } - - private static class UnannotatedBaseClass extends TestCase { - public UnannotatedBaseClass(String name) { - super(name); - } - @Restriction({TEST_RESTRICTION_APPLIES}) public void restrictedMethod() {} - @Restriction({TEST_RESTRICTION_DOES_NOT_APPLY}) public void unrestrictedMethod() {} - } - - @Restriction({TEST_RESTRICTION_APPLIES}) - private static class RestrictedClass extends UnannotatedBaseClass { - public RestrictedClass(String name) { - super(name); - } - public void unannotatedMethod() {} - } - - @Restriction({TEST_RESTRICTION_DOES_NOT_APPLY}) - private static class UnrestrictedClass extends UnannotatedBaseClass { - public UnrestrictedClass(String name) { - super(name); - } - public void unannotatedMethod() {} - } - - @Restriction({ - TEST_RESTRICTION_APPLIES, - TEST_RESTRICTION_DOES_NOT_APPLY}) - private static class MultipleRestrictionsRestrictedClass extends UnannotatedBaseClass { - public MultipleRestrictionsRestrictedClass(String name) { - super(name); - } - public void unannotatedMethod() {} - } - - private static class ExtendsRestrictedClass extends RestrictedClass { - public ExtendsRestrictedClass(String name) { - super(name); - } - @Override - public void unannotatedMethod() {} - } - - private static class ExtendsUnrestrictedClass extends UnrestrictedClass { - public ExtendsUnrestrictedClass(String name) { - super(name); - } - @Override - public void unannotatedMethod() {} - } - - @Test - public void testMethodRestricted() { - Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip( - new UnannotatedBaseClass("restrictedMethod"))); - } - - @Test - public void testMethodUnrestricted() { - Assert.assertFalse(new TestRestrictionSkipCheck().shouldSkip( - new UnannotatedBaseClass("unrestrictedMethod"))); - } - - @Test - public void testClassRestricted() { - Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip( - new RestrictedClass("unannotatedMethod"))); - } - - @Test - public void testClassUnrestricted() { - Assert.assertFalse(new TestRestrictionSkipCheck().shouldSkip( - new UnrestrictedClass("unannotatedMethod"))); - } - - @Test - public void testMultipleRestrictionsClassRestricted() { - Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip( - new MultipleRestrictionsRestrictedClass("unannotatedMethod"))); - } - - @Test - public void testSuperclassRestricted() { - Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip( - new ExtendsRestrictedClass("unannotatedMethod"))); - } - - @Test - public void testSuperclassUnrestricted() { - Assert.assertFalse(new TestRestrictionSkipCheck().shouldSkip( - new ExtendsUnrestrictedClass("unannotatedMethod"))); - } -} -
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java deleted file mode 100644 index 51c7516..0000000 --- a/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java +++ /dev/null
@@ -1,130 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test.util; - -import junit.framework.TestCase; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.model.FrameworkMethod; -import org.robolectric.annotation.Config; - -import org.chromium.base.test.BaseRobolectricTestRunner; - -import java.lang.annotation.Annotation; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Method; -import java.util.List; - -/** Unit tests for SkipCheck. */ -@RunWith(BaseRobolectricTestRunner.class) -@Config(manifest = Config.NONE) -public class SkipCheckTest { - private static class TestableSkipCheck extends SkipCheck { - public static <T extends Annotation> List<T> getAnnotationsForTesting( - AnnotatedElement element, Class<T> annotationClass) { - return AnnotationProcessingUtils.getAnnotations(element, annotationClass); - } - - @Override - public boolean shouldSkip(FrameworkMethod m) { - return false; - } - } - - @Retention(RetentionPolicy.RUNTIME) - private @interface TestAnnotation {} - - @TestAnnotation - private class AnnotatedBaseClass { - public void unannotatedMethod() {} - @TestAnnotation public void annotatedMethod() {} - } - - private class ExtendsAnnotatedBaseClass extends AnnotatedBaseClass { - public void anotherUnannotatedMethod() {} - } - - private class ExtendsTestCaseClass extends TestCase { - public ExtendsTestCaseClass(String name) { - super(name); - } - public void testMethodA() {} - } - - private class UnannotatedBaseClass { - public void unannotatedMethod() {} - @TestAnnotation public void annotatedMethod() {} - } - - @Test - public void getAnnotationsForClassNone() { - List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( - UnannotatedBaseClass.class, TestAnnotation.class); - Assert.assertEquals(0, annotations.size()); - } - - @Test - public void getAnnotationsForClassOnClass() { - List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( - AnnotatedBaseClass.class, TestAnnotation.class); - Assert.assertEquals(1, annotations.size()); - } - - @Test - public void getAnnotationsForClassOnSuperclass() { - List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( - ExtendsAnnotatedBaseClass.class, TestAnnotation.class); - Assert.assertEquals(1, annotations.size()); - } - - @Test - public void getAnnotationsForMethodNone() throws NoSuchMethodException { - Method testMethod = UnannotatedBaseClass.class.getMethod("unannotatedMethod", - (Class[]) null); - List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( - testMethod, TestAnnotation.class); - Assert.assertEquals(0, annotations.size()); - } - - @Test - public void getAnnotationsForMethodOnMethod() throws NoSuchMethodException { - Method testMethod = UnannotatedBaseClass.class.getMethod("annotatedMethod", - (Class[]) null); - List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( - testMethod, TestAnnotation.class); - Assert.assertEquals(1, annotations.size()); - } - - @Test - public void getAnnotationsForMethodOnClass() throws NoSuchMethodException { - Method testMethod = AnnotatedBaseClass.class.getMethod("unannotatedMethod", - (Class[]) null); - List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( - testMethod, TestAnnotation.class); - Assert.assertEquals(1, annotations.size()); - } - - @Test - public void getAnnotationsForMethodOnSuperclass() throws NoSuchMethodException { - Method testMethod = ExtendsAnnotatedBaseClass.class.getMethod("unannotatedMethod", - (Class[]) null); - List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( - testMethod, TestAnnotation.class); - Assert.assertEquals(1, annotations.size()); - } - - @Test - public void getAnnotationsOverlapping() throws NoSuchMethodException { - Method testMethod = AnnotatedBaseClass.class.getMethod("annotatedMethod", - (Class[]) null); - List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting( - testMethod, TestAnnotation.class); - Assert.assertEquals(2, annotations.size()); - } -}
diff --git a/base/test/android/url_utils.cc b/base/test/android/url_utils.cc deleted file mode 100644 index 7d2a8ed..0000000 --- a/base/test/android/url_utils.cc +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/test/android/url_utils.h" - -#include "base/android/jni_string.h" -#include "base/android/scoped_java_ref.h" -#include "jni/UrlUtils_jni.h" - -namespace base { -namespace android { - -FilePath GetIsolatedTestRoot() { - JNIEnv* env = base::android::AttachCurrentThread(); - ScopedJavaLocalRef<jstring> jtest_data_dir = - Java_UrlUtils_getIsolatedTestRoot(env); - base::FilePath test_data_dir( - base::android::ConvertJavaStringToUTF8(env, jtest_data_dir)); - return test_data_dir; -} - -} // namespace android -} // namespace base
diff --git a/base/test/android/url_utils.h b/base/test/android/url_utils.h deleted file mode 100644 index 3769bd2..0000000 --- a/base/test/android/url_utils.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_TEST_ANDROID_URL_UTILS_H_ -#define BASE_TEST_ANDROID_URL_UTILS_H_ - -#include <jni.h> - -#include "base/base_export.h" -#include "base/files/file_path.h" - -namespace base { -namespace android { - -// Returns the root of the test data directory. This function will call into -// Java class UrlUtils through JNI bridge. -BASE_EXPORT FilePath GetIsolatedTestRoot(); - -} // namespace android -} // namespace base - -#endif // BASE_TEST_ANDROID_URL_UTILS_H_
diff --git a/base/test/multiprocess_test_android.cc b/base/test/multiprocess_test_android.cc deleted file mode 100644 index 4108593..0000000 --- a/base/test/multiprocess_test_android.cc +++ /dev/null
@@ -1,86 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/test/multiprocess_test.h" - -#include <string.h> -#include <vector> - -#include "base/android/jni_android.h" -#include "base/android/jni_array.h" -#include "base/android/scoped_java_ref.h" -#include "base/base_switches.h" -#include "base/command_line.h" -#include "base/logging.h" -#include "jni/MainReturnCodeResult_jni.h" -#include "jni/MultiprocessTestClientLauncher_jni.h" - -namespace base { - -// A very basic implementation for Android. On Android tests can run in an APK -// and we don't have an executable to exec*. This implementation does the bare -// minimum to execute the method specified by procname (in the child process). -// - All options except |fds_to_remap| are ignored. -// -// NOTE: This MUST NOT run on the main thread of the NativeTest application. -Process SpawnMultiProcessTestChild(const std::string& procname, - const CommandLine& base_command_line, - const LaunchOptions& options) { - JNIEnv* env = android::AttachCurrentThread(); - DCHECK(env); - - std::vector<int> fd_keys; - std::vector<int> fd_fds; - for (auto& iter : options.fds_to_remap) { - fd_keys.push_back(iter.second); - fd_fds.push_back(iter.first); - } - - android::ScopedJavaLocalRef<jobjectArray> fds = - android::Java_MultiprocessTestClientLauncher_makeFdInfoArray( - env, base::android::ToJavaIntArray(env, fd_keys), - base::android::ToJavaIntArray(env, fd_fds)); - - CommandLine command_line(base_command_line); - if (!command_line.HasSwitch(switches::kTestChildProcess)) { - command_line.AppendSwitchASCII(switches::kTestChildProcess, procname); - } - - android::ScopedJavaLocalRef<jobjectArray> j_argv = - android::ToJavaArrayOfStrings(env, command_line.argv()); - jint pid = android::Java_MultiprocessTestClientLauncher_launchClient( - env, j_argv, fds); - return Process(pid); -} - -bool WaitForMultiprocessTestChildExit(const Process& process, - TimeDelta timeout, - int* exit_code) { - JNIEnv* env = android::AttachCurrentThread(); - DCHECK(env); - - base::android::ScopedJavaLocalRef<jobject> result_code = - android::Java_MultiprocessTestClientLauncher_waitForMainToReturn( - env, process.Pid(), static_cast<int32_t>(timeout.InMilliseconds())); - if (result_code.is_null() || - Java_MainReturnCodeResult_hasTimedOut(env, result_code)) { - return false; - } - if (exit_code) { - *exit_code = Java_MainReturnCodeResult_getReturnCode(env, result_code); - } - return true; -} - -bool TerminateMultiProcessTestChild(const Process& process, - int exit_code, - bool wait) { - JNIEnv* env = android::AttachCurrentThread(); - DCHECK(env); - - return android::Java_MultiprocessTestClientLauncher_terminate( - env, process.Pid(), exit_code, wait); -} - -} // namespace base
diff --git a/base/test/test_file_util_android.cc b/base/test/test_file_util_android.cc deleted file mode 100644 index 6e93e24..0000000 --- a/base/test/test_file_util_android.cc +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/test/test_file_util.h" - -#include "base/android/jni_android.h" -#include "base/android/jni_string.h" -#include "base/files/file_path.h" -#include "jni/ContentUriTestUtils_jni.h" - -using base::android::ScopedJavaLocalRef; - -namespace base { - -FilePath InsertImageIntoMediaStore(const FilePath& path) { - JNIEnv* env = base::android::AttachCurrentThread(); - ScopedJavaLocalRef<jstring> j_path = - base::android::ConvertUTF8ToJavaString(env, path.value()); - ScopedJavaLocalRef<jstring> j_uri = - Java_ContentUriTestUtils_insertImageIntoMediaStore(env, j_path); - std::string uri = base::android::ConvertJavaStringToUTF8(j_uri); - return FilePath(uri); -} - -} // namespace base
diff --git a/base/test/test_support_android.cc b/base/test/test_support_android.cc deleted file mode 100644 index 33a6628..0000000 --- a/base/test/test_support_android.cc +++ /dev/null
@@ -1,194 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <stdarg.h> -#include <string.h> - -#include "base/android/path_utils.h" -#include "base/files/file_path.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/memory/singleton.h" -#include "base/message_loop/message_loop.h" -#include "base/message_loop/message_pump_android.h" -#include "base/path_service.h" -#include "base/synchronization/waitable_event.h" -#include "base/test/multiprocess_test.h" - -namespace { - -base::FilePath* g_test_data_dir = nullptr; - -struct RunState { - RunState(base::MessagePump::Delegate* delegate, int run_depth) - : delegate(delegate), - run_depth(run_depth), - should_quit(false) { - } - - base::MessagePump::Delegate* delegate; - - // Used to count how many Run() invocations are on the stack. - int run_depth; - - // Used to flag that the current Run() invocation should return ASAP. - bool should_quit; -}; - -RunState* g_state = NULL; - -// A singleton WaitableEvent wrapper so we avoid a busy loop in -// MessagePumpForUIStub. Other platforms use the native event loop which blocks -// when there are no pending messages. -class Waitable { - public: - static Waitable* GetInstance() { - return base::Singleton<Waitable, - base::LeakySingletonTraits<Waitable>>::get(); - } - - // Signals that there are more work to do. - void Signal() { waitable_event_.Signal(); } - - // Blocks until more work is scheduled. - void Block() { waitable_event_.Wait(); } - - void Quit() { - g_state->should_quit = true; - Signal(); - } - - private: - friend struct base::DefaultSingletonTraits<Waitable>; - - Waitable() - : waitable_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC, - base::WaitableEvent::InitialState::NOT_SIGNALED) {} - - base::WaitableEvent waitable_event_; - - DISALLOW_COPY_AND_ASSIGN(Waitable); -}; - -// The MessagePumpForUI implementation for test purpose. -class MessagePumpForUIStub : public base::MessagePumpForUI { - ~MessagePumpForUIStub() override {} - - void Start(base::MessagePump::Delegate* delegate) override { - NOTREACHED() << "The Start() method shouldn't be called in test, using" - " Run() method should be used."; - } - - void Run(base::MessagePump::Delegate* delegate) override { - // The following was based on message_pump_glib.cc, except we're using a - // WaitableEvent since there are no native message loop to use. - RunState state(delegate, g_state ? g_state->run_depth + 1 : 1); - - RunState* previous_state = g_state; - g_state = &state; - - bool more_work_is_plausible = true; - - for (;;) { - if (!more_work_is_plausible) { - Waitable::GetInstance()->Block(); - if (g_state->should_quit) - break; - } - - more_work_is_plausible = g_state->delegate->DoWork(); - if (g_state->should_quit) - break; - - base::TimeTicks delayed_work_time; - more_work_is_plausible |= - g_state->delegate->DoDelayedWork(&delayed_work_time); - if (g_state->should_quit) - break; - - if (more_work_is_plausible) - continue; - - more_work_is_plausible = g_state->delegate->DoIdleWork(); - if (g_state->should_quit) - break; - - more_work_is_plausible |= !delayed_work_time.is_null(); - } - - g_state = previous_state; - } - - void Quit() override { Waitable::GetInstance()->Quit(); } - - void ScheduleWork() override { Waitable::GetInstance()->Signal(); } - - void ScheduleDelayedWork(const base::TimeTicks& delayed_work_time) override { - Waitable::GetInstance()->Signal(); - } -}; - -std::unique_ptr<base::MessagePump> CreateMessagePumpForUIStub() { - return std::unique_ptr<base::MessagePump>(new MessagePumpForUIStub()); -}; - -// Provides the test path for DIR_SOURCE_ROOT and DIR_ANDROID_APP_DATA. -bool GetTestProviderPath(int key, base::FilePath* result) { - switch (key) { - // TODO(agrieve): Stop overriding DIR_ANDROID_APP_DATA. - // https://crbug.com/617734 - // Instead DIR_ASSETS should be used to discover assets file location in - // tests. - case base::DIR_ANDROID_APP_DATA: - case base::DIR_ASSETS: - case base::DIR_SOURCE_ROOT: - CHECK(g_test_data_dir != nullptr); - *result = *g_test_data_dir; - return true; - default: - return false; - } -} - -void InitPathProvider(int key) { - base::FilePath path; - // If failed to override the key, that means the way has not been registered. - if (GetTestProviderPath(key, &path) && - !base::PathService::Override(key, path)) { - base::PathService::RegisterProvider(&GetTestProviderPath, key, key + 1); - } -} - -} // namespace - -namespace base { - -void InitAndroidTestLogging() { - logging::LoggingSettings settings; - settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; - logging::InitLogging(settings); - // To view log output with IDs and timestamps use "adb logcat -v threadtime". - logging::SetLogItems(false, // Process ID - false, // Thread ID - false, // Timestamp - false); // Tick count -} - -void InitAndroidTestPaths(const FilePath& test_data_dir) { - if (g_test_data_dir) { - CHECK(test_data_dir == *g_test_data_dir); - return; - } - g_test_data_dir = new FilePath(test_data_dir); - InitPathProvider(DIR_SOURCE_ROOT); - InitPathProvider(DIR_ANDROID_APP_DATA); - InitPathProvider(DIR_ASSETS); -} - -void InitAndroidTestMessageLoop() { - if (!MessageLoop::InitMessagePumpForUIFactory(&CreateMessagePumpForUIStub)) - LOG(INFO) << "MessagePumpForUIFactory already set, unable to override."; -} - -} // namespace base
diff --git a/base/test/test_support_android.h b/base/test/test_support_android.h deleted file mode 100644 index 4942e54..0000000 --- a/base/test/test_support_android.h +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_TEST_TEST_SUPPORT_ANDROID_H_ -#define BASE_TEST_TEST_SUPPORT_ANDROID_H_ - -#include "base/base_export.h" - -namespace base { - -class FilePath; - -// Init logging for tests on Android. Logs will be output into Android's logcat. -BASE_EXPORT void InitAndroidTestLogging(); - -// Init path providers for tests on Android. -BASE_EXPORT void InitAndroidTestPaths(const FilePath& test_data_dir); - -// Init the message loop for tests on Android. -BASE_EXPORT void InitAndroidTestMessageLoop(); - -} // namespace base - -#endif // BASE_TEST_TEST_SUPPORT_ANDROID_H_
diff --git a/base/test/test_ui_thread_android.cc b/base/test/test_ui_thread_android.cc deleted file mode 100644 index d19fefa..0000000 --- a/base/test/test_ui_thread_android.cc +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -#include "base/test/test_ui_thread_android.h" - -#include "jni/TestUiThread_jni.h" - -namespace base { - -void StartTestUiThreadLooper() { - Java_TestUiThread_loop(base::android::AttachCurrentThread()); -} - -} // namespace base
diff --git a/base/test/test_ui_thread_android.h b/base/test/test_ui_thread_android.h deleted file mode 100644 index 233911a..0000000 --- a/base/test/test_ui_thread_android.h +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_TEST_TEST_UI_THREAD_ANDROID_ -#define BASE_TEST_TEST_UI_THREAD_ANDROID_ - -#include <jni.h> - -namespace base { - -// Set up a thread as the Chromium UI Thread, and run its looper. This is is -// intended for C++ unit tests (e.g. the net unit tests) that don't run with the -// UI thread as their main looper, but test code that, on Android, uses UI -// thread events, so need a running UI thread. -void StartTestUiThreadLooper(); - -} // namespace base - -#endif // BASE_TEST_TEST_UI_THREAD_ANDROID_
diff --git a/base/third_party/libevent/android/config.h b/base/third_party/libevent/android/config.h deleted file mode 100644 index 91f4dda..0000000 --- a/base/third_party/libevent/android/config.h +++ /dev/null
@@ -1,266 +0,0 @@ -/* Copied from Linux version and changed the features according Android, which - * is close to Linux */ - -/* Define if clock_gettime is available in libc */ -#define DNS_USE_CPU_CLOCK_FOR_ID 1 - -/* Define is no secure id variant is available */ -/* #undef DNS_USE_GETTIMEOFDAY_FOR_ID */ - -/* Define to 1 if you have the `clock_gettime' function. */ -#define HAVE_CLOCK_GETTIME 1 - -/* Define if /dev/poll is available */ -/* #undef HAVE_DEVPOLL */ - -/* Define to 1 if you have the <dlfcn.h> header file. */ -#define HAVE_DLFCN_H 1 - -/* Define if your system supports the epoll system calls */ -#define HAVE_EPOLL 1 - -/* Define to 1 if you have the `epoll_ctl' function. */ -#define HAVE_EPOLL_CTL 1 - -/* Define if your system supports event ports */ -/* #undef HAVE_EVENT_PORTS */ - -/* Define to 1 if you have the `fcntl' function. */ -#define HAVE_FCNTL 1 - -/* Define to 1 if you have the <fcntl.h> header file. */ -#define HAVE_FCNTL_H 1 - -/* Define to 1 if the system has the type `fd_mask'. */ -/* #undef HAVE_FD_MASK */ - -/* Define to 1 if you have the `getaddrinfo' function. */ -#define HAVE_GETADDRINFO 1 - -/* Define to 1 if you have the `getegid' function. */ -#define HAVE_GETEGID 1 - -/* Define to 1 if you have the `geteuid' function. */ -#define HAVE_GETEUID 1 - -/* Define to 1 if you have the `getnameinfo' function. */ -#define HAVE_GETNAMEINFO 1 - -/* Define to 1 if you have the `gettimeofday' function. */ -#define HAVE_GETTIMEOFDAY 1 - -/* Define to 1 if you have the `inet_ntop' function. */ -#define HAVE_INET_NTOP 1 - -/* Define to 1 if you have the <inttypes.h> header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the `issetugid' function. */ -/* #undef HAVE_ISSETUGID */ - -/* Define to 1 if you have the `kqueue' function. */ -/* #undef HAVE_KQUEUE */ - -/* Define to 1 if you have the `nsl' library (-lnsl). */ -#define HAVE_LIBNSL 1 - -/* Define to 1 if you have the `resolv' library (-lresolv). */ -#define HAVE_LIBRESOLV 1 - -/* Define to 1 if you have the `rt' library (-lrt). */ -#define HAVE_LIBRT 1 - -/* Define to 1 if you have the `socket' library (-lsocket). */ -/* #undef HAVE_LIBSOCKET */ - -/* Define to 1 if you have the <memory.h> header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the <netinet/in6.h> header file. */ -/* #undef HAVE_NETINET_IN6_H */ - -/* Define to 1 if you have the `poll' function. */ -#define HAVE_POLL 1 - -/* Define to 1 if you have the <poll.h> header file. */ -#define HAVE_POLL_H 1 - -/* Define to 1 if you have the `port_create' function. */ -/* #undef HAVE_PORT_CREATE */ - -/* Define to 1 if you have the <port.h> header file. */ -/* #undef HAVE_PORT_H */ - -/* Define to 1 if you have the `select' function. */ -#define HAVE_SELECT 1 - -/* Define if F_SETFD is defined in <fcntl.h> */ -#define HAVE_SETFD 1 - -/* Define to 1 if you have the `sigaction' function. */ -#define HAVE_SIGACTION 1 - -/* Define to 1 if you have the `signal' function. */ -#define HAVE_SIGNAL 1 - -/* Define to 1 if you have the <signal.h> header file. */ -#define HAVE_SIGNAL_H 1 - -/* Define to 1 if you have the <stdarg.h> header file. */ -#define HAVE_STDARG_H 1 - -/* Define to 1 if you have the <stdint.h> header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the <stdlib.h> header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the <strings.h> header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the <string.h> header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the `strlcpy' function. */ -#define HAVE_STRLCPY 1 - -/* Define to 1 if you have the `strsep' function. */ -#define HAVE_STRSEP 1 - -/* Define to 1 if you have the `strtok_r' function. */ -#define HAVE_STRTOK_R 1 - -/* Define to 1 if you have the `strtoll' function. */ -#define HAVE_STRTOLL 1 - -/* Define to 1 if the system has the type `struct in6_addr'. */ -#define HAVE_STRUCT_IN6_ADDR 1 - -/* Define to 1 if you have the <sys/devpoll.h> header file. */ -/* #undef HAVE_SYS_DEVPOLL_H */ - -/* Define to 1 if you have the <sys/epoll.h> header file. */ -#define HAVE_SYS_EPOLL_H 1 - -/* Define to 1 if you have the <sys/event.h> header file. */ -/* #undef HAVE_SYS_EVENT_H */ - -/* Define to 1 if you have the <sys/ioctl.h> header file. */ -#define HAVE_SYS_IOCTL_H 1 - -/* Define to 1 if you have the <sys/param.h> header file. */ -#define HAVE_SYS_PARAM_H 1 - -/* Define to 1 if you have the <sys/queue.h> header file. */ -#define HAVE_SYS_QUEUE_H 1 - -/* Define to 1 if you have the <sys/select.h> header file. */ -#define HAVE_SYS_SELECT_H 1 - -/* Define to 1 if you have the <sys/socket.h> header file. */ -#define HAVE_SYS_SOCKET_H 1 - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the <sys/time.h> header file. */ -#define HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the <sys/types.h> header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define if TAILQ_FOREACH is defined in <sys/queue.h> */ -#define HAVE_TAILQFOREACH 1 - -/* Define if timeradd is defined in <sys/time.h> */ -#define HAVE_TIMERADD 1 - -/* Define if timerclear is defined in <sys/time.h> */ -#define HAVE_TIMERCLEAR 1 - -/* Define if timercmp is defined in <sys/time.h> */ -#define HAVE_TIMERCMP 1 - -/* Define if timerisset is defined in <sys/time.h> */ -#define HAVE_TIMERISSET 1 - -/* Define to 1 if the system has the type `uint16_t'. */ -#define HAVE_UINT16_T 1 - -/* Define to 1 if the system has the type `uint32_t'. */ -#define HAVE_UINT32_T 1 - -/* Define to 1 if the system has the type `uint64_t'. */ -#define HAVE_UINT64_T 1 - -/* Define to 1 if the system has the type `uint8_t'. */ -#define HAVE_UINT8_T 1 - -/* Define to 1 if you have the <unistd.h> header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to 1 if you have the `vasprintf' function. */ -#define HAVE_VASPRINTF 1 - -/* Define if kqueue works correctly with pipes */ -/* #undef HAVE_WORKING_KQUEUE */ - -/* Name of package */ -#define PACKAGE "libevent" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "" - -/* The size of `int', as computed by sizeof. */ -#define SIZEOF_INT 4 - -/* The size of `long', as computed by sizeof. */ -#define SIZEOF_LONG 8 - -/* The size of `long long', as computed by sizeof. */ -#define SIZEOF_LONG_LONG 8 - -/* The size of `short', as computed by sizeof. */ -#define SIZEOF_SHORT 2 - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ -#define TIME_WITH_SYS_TIME 1 - -/* Version number of package */ -#define VERSION "1.4.13-stable" - -/* Define to appropriate substitue if compiler doesnt have __func__ */ -/* #undef __func__ */ - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -/* #undef inline */ -#endif - -/* Define to `int' if <sys/types.h> does not define. */ -/* #undef pid_t */ - -/* Define to `unsigned int' if <sys/types.h> does not define. */ -/* #undef size_t */ - -/* Define to unsigned int if you dont have it */ -/* #undef socklen_t */
diff --git a/base/third_party/libevent/android/event-config.h b/base/third_party/libevent/android/event-config.h deleted file mode 100644 index 6563cb7..0000000 --- a/base/third_party/libevent/android/event-config.h +++ /dev/null
@@ -1,281 +0,0 @@ -/* Copied from Linux version and changed the features according Android, which - * is close to Linux */ -#ifndef _EVENT_CONFIG_H_ -#define _EVENT_CONFIG_H_ -/* config.h. Generated from config.h.in by configure. */ -/* config.h.in. Generated from configure.in by autoheader. */ - -/* Define if clock_gettime is available in libc */ -#define _EVENT_DNS_USE_CPU_CLOCK_FOR_ID 1 - -/* Define is no secure id variant is available */ -/* #undef _EVENT_DNS_USE_GETTIMEOFDAY_FOR_ID */ - -/* Define to 1 if you have the `clock_gettime' function. */ -#define _EVENT_HAVE_CLOCK_GETTIME 1 - -/* Define if /dev/poll is available */ -/* #undef _EVENT_HAVE_DEVPOLL */ - -/* Define to 1 if you have the <dlfcn.h> header file. */ -#define _EVENT_HAVE_DLFCN_H 1 - -/* Define if your system supports the epoll system calls */ -#define _EVENT_HAVE_EPOLL 1 - -/* Define to 1 if you have the `epoll_ctl' function. */ -#define _EVENT_HAVE_EPOLL_CTL 1 - -/* Define if your system supports event ports */ -/* #undef _EVENT_HAVE_EVENT_PORTS */ - -/* Define to 1 if you have the `fcntl' function. */ -#define _EVENT_HAVE_FCNTL 1 - -/* Define to 1 if you have the <fcntl.h> header file. */ -#define _EVENT_HAVE_FCNTL_H 1 - -/* Define to 1 if the system has the type `fd_mask'. */ -/* #undef _EVENT_HAVE_FD_MASK 1 */ - -/* Define to 1 if you have the `getaddrinfo' function. */ -#define _EVENT_HAVE_GETADDRINFO 1 - -/* Define to 1 if you have the `getegid' function. */ -#define _EVENT_HAVE_GETEGID 1 - -/* Define to 1 if you have the `geteuid' function. */ -#define _EVENT_HAVE_GETEUID 1 - -/* Define to 1 if you have the `getnameinfo' function. */ -#define _EVENT_HAVE_GETNAMEINFO 1 - -/* Define to 1 if you have the `gettimeofday' function. */ -#define _EVENT_HAVE_GETTIMEOFDAY 1 - -/* Define to 1 if you have the `inet_ntop' function. */ -#define _EVENT_HAVE_INET_NTOP 1 - -/* Define to 1 if you have the <inttypes.h> header file. */ -#define _EVENT_HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the `issetugid' function. */ -/* #undef _EVENT_HAVE_ISSETUGID */ - -/* Define to 1 if you have the `kqueue' function. */ -/* #undef _EVENT_HAVE_KQUEUE */ - -/* Define to 1 if you have the `nsl' library (-lnsl). */ -#define _EVENT_HAVE_LIBNSL 1 - -/* Define to 1 if you have the `resolv' library (-lresolv). */ -#define _EVENT_HAVE_LIBRESOLV 1 - -/* Define to 1 if you have the `rt' library (-lrt). */ -#define _EVENT_HAVE_LIBRT 1 - -/* Define to 1 if you have the `socket' library (-lsocket). */ -/* #undef _EVENT_HAVE_LIBSOCKET */ - -/* Define to 1 if you have the <memory.h> header file. */ -#define _EVENT_HAVE_MEMORY_H 1 - -/* Define to 1 if you have the <netinet/in6.h> header file. */ -/* #undef _EVENT_HAVE_NETINET_IN6_H */ - -/* Define to 1 if you have the `poll' function. */ -#define _EVENT_HAVE_POLL 1 - -/* Define to 1 if you have the <poll.h> header file. */ -#define _EVENT_HAVE_POLL_H 1 - -/* Define to 1 if you have the `port_create' function. */ -/* #undef _EVENT_HAVE_PORT_CREATE */ - -/* Define to 1 if you have the <port.h> header file. */ -/* #undef _EVENT_HAVE_PORT_H */ - -/* Define to 1 if you have the `select' function. */ -#define _EVENT_HAVE_SELECT 1 - -/* Define if F_SETFD is defined in <fcntl.h> */ -#define _EVENT_HAVE_SETFD 1 - -/* Define to 1 if you have the `sigaction' function. */ -#define _EVENT_HAVE_SIGACTION 1 - -/* Define to 1 if you have the `signal' function. */ -#define _EVENT_HAVE_SIGNAL 1 - -/* Define to 1 if you have the <signal.h> header file. */ -#define _EVENT_HAVE_SIGNAL_H 1 - -/* Define to 1 if you have the <stdarg.h> header file. */ -#define _EVENT_HAVE_STDARG_H 1 - -/* Define to 1 if you have the <stdint.h> header file. */ -#define _EVENT_HAVE_STDINT_H 1 - -/* Define to 1 if you have the <stdlib.h> header file. */ -#define _EVENT_HAVE_STDLIB_H 1 - -/* Define to 1 if you have the <strings.h> header file. */ -#define _EVENT_HAVE_STRINGS_H 1 - -/* Define to 1 if you have the <string.h> header file. */ -#define _EVENT_HAVE_STRING_H 1 - -/* Define to 1 if you have the `strlcpy' function. */ -#define _EVENT_HAVE_STRLCPY 1 - -/* Define to 1 if you have the `strsep' function. */ -#define _EVENT_HAVE_STRSEP 1 - -/* Define to 1 if you have the `strtok_r' function. */ -#define _EVENT_HAVE_STRTOK_R 1 - -/* Define to 1 if you have the `strtoll' function. */ -#define _EVENT_HAVE_STRTOLL 1 - -/* Define to 1 if the system has the type `struct in6_addr'. */ -#define _EVENT_HAVE_STRUCT_IN6_ADDR 1 - -/* Define to 1 if you have the <sys/devpoll.h> header file. */ -/* #undef _EVENT_HAVE_SYS_DEVPOLL_H */ - -/* Define to 1 if you have the <sys/epoll.h> header file. */ -#define _EVENT_HAVE_SYS_EPOLL_H 1 - -/* Define to 1 if you have the <sys/event.h> header file. */ -/* #undef _EVENT_HAVE_SYS_EVENT_H */ - -/* Define to 1 if you have the <sys/ioctl.h> header file. */ -#define _EVENT_HAVE_SYS_IOCTL_H 1 - -/* Define to 1 if you have the <sys/param.h> header file. */ -#define _EVENT_HAVE_SYS_PARAM_H 1 - -/* Define to 1 if you have the <sys/queue.h> header file. */ -#define _EVENT_HAVE_SYS_QUEUE_H 1 - -/* Define to 1 if you have the <sys/select.h> header file. */ -#define _EVENT_HAVE_SYS_SELECT_H 1 - -/* Define to 1 if you have the <sys/socket.h> header file. */ -#define _EVENT_HAVE_SYS_SOCKET_H 1 - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#define _EVENT_HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the <sys/time.h> header file. */ -#define _EVENT_HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the <sys/types.h> header file. */ -#define _EVENT_HAVE_SYS_TYPES_H 1 - -/* Define if TAILQ_FOREACH is defined in <sys/queue.h> */ -#define _EVENT_HAVE_TAILQFOREACH 1 - -/* Define if timeradd is defined in <sys/time.h> */ -#define _EVENT_HAVE_TIMERADD 1 - -/* Define if timerclear is defined in <sys/time.h> */ -#define _EVENT_HAVE_TIMERCLEAR 1 - -/* Define if timercmp is defined in <sys/time.h> */ -#define _EVENT_HAVE_TIMERCMP 1 - -/* Define if timerisset is defined in <sys/time.h> */ -#define _EVENT_HAVE_TIMERISSET 1 - -/* Define to 1 if the system has the type `uint16_t'. */ -#define _EVENT_HAVE_UINT16_T 1 - -/* Define to 1 if the system has the type `uint32_t'. */ -#define _EVENT_HAVE_UINT32_T 1 - -/* Define to 1 if the system has the type `uint64_t'. */ -#define _EVENT_HAVE_UINT64_T 1 - -/* Define to 1 if the system has the type `uint8_t'. */ -#define _EVENT_HAVE_UINT8_T 1 - -/* Define to 1 if you have the <unistd.h> header file. */ -#define _EVENT_HAVE_UNISTD_H 1 - -/* Define to 1 if you have the `vasprintf' function. */ -#define _EVENT_HAVE_VASPRINTF 1 - -/* Define if kqueue works correctly with pipes */ -/* #undef _EVENT_HAVE_WORKING_KQUEUE */ - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#define _EVENT_LT_OBJDIR ".libs/" - -/* Numeric representation of the version */ -#define _EVENT_NUMERIC_VERSION 0x01040f00 - -/* Name of package */ -#define _EVENT_PACKAGE "libevent" - -/* Define to the address where bug reports for this package should be sent. */ -#define _EVENT_PACKAGE_BUGREPORT "" - -/* Define to the full name of this package. */ -#define _EVENT_PACKAGE_NAME "" - -/* Define to the full name and version of this package. */ -#define _EVENT_PACKAGE_STRING "" - -/* Define to the one symbol short name of this package. */ -#define _EVENT_PACKAGE_TARNAME "" - -/* Define to the home page for this package. */ -#define _EVENT_PACKAGE_URL "" - -/* Define to the version of this package. */ -#define _EVENT_PACKAGE_VERSION "" - -/* The size of `int', as computed by sizeof. */ -#define _EVENT_SIZEOF_INT 4 - -/* The size of `long', as computed by sizeof. */ -#define _EVENT_SIZEOF_LONG 8 - -/* The size of `long long', as computed by sizeof. */ -#define _EVENT_SIZEOF_LONG_LONG 8 - -/* The size of `short', as computed by sizeof. */ -#define _EVENT_SIZEOF_SHORT 2 - -/* Define to 1 if you have the ANSI C header files. */ -#define _EVENT_STDC_HEADERS 1 - -/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ -#define _EVENT_TIME_WITH_SYS_TIME 1 - -/* Version number of package */ -#define _EVENT_VERSION "1.4.15" - -/* Define to appropriate substitue if compiler doesnt have __func__ */ -/* #undef _EVENT___func__ */ - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef _EVENT_const */ - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef _EVENT___cplusplus -/* #undef _EVENT_inline */ -#endif - -/* Define to `int' if <sys/types.h> does not define. */ -/* #undef _EVENT_pid_t */ - -/* Define to `unsigned int' if <sys/types.h> does not define. */ -/* #undef _EVENT_size_t */ - -/* Define to unsigned int if you dont have it */ -/* #undef _EVENT_socklen_t */ -#endif
diff --git a/base/threading/platform_thread_android.cc b/base/threading/platform_thread_android.cc deleted file mode 100644 index fd90d35..0000000 --- a/base/threading/platform_thread_android.cc +++ /dev/null
@@ -1,96 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/threading/platform_thread.h" - -#include <errno.h> -#include <stddef.h> -#include <sys/prctl.h> -#include <sys/resource.h> -#include <sys/types.h> -#include <unistd.h> - -#include "base/android/jni_android.h" -#include "base/lazy_instance.h" -#include "base/logging.h" -#include "base/threading/platform_thread_internal_posix.h" -#include "base/threading/thread_id_name_manager.h" -#include "jni/ThreadUtils_jni.h" - -namespace base { - -namespace internal { - -// - BACKGROUND corresponds to Android's PRIORITY_BACKGROUND = 10 value and can -// result in heavy throttling and force the thread onto a little core on -// big.LITTLE devices. -// - DISPLAY corresponds to Android's PRIORITY_DISPLAY = -4 value. -// - REALTIME_AUDIO corresponds to Android's PRIORITY_AUDIO = -16 value. -const ThreadPriorityToNiceValuePair kThreadPriorityToNiceValueMap[4] = { - {ThreadPriority::BACKGROUND, 10}, - {ThreadPriority::NORMAL, 0}, - {ThreadPriority::DISPLAY, -4}, - {ThreadPriority::REALTIME_AUDIO, -16}, -}; - -bool SetCurrentThreadPriorityForPlatform(ThreadPriority priority) { - // On Android, we set the Audio priority through JNI as Audio priority - // will also allow the process to run while it is backgrounded. - if (priority == ThreadPriority::REALTIME_AUDIO) { - JNIEnv* env = base::android::AttachCurrentThread(); - Java_ThreadUtils_setThreadPriorityAudio(env, PlatformThread::CurrentId()); - return true; - } - return false; -} - -bool GetCurrentThreadPriorityForPlatform(ThreadPriority* priority) { - DCHECK(priority); - *priority = ThreadPriority::NORMAL; - JNIEnv* env = base::android::AttachCurrentThread(); - if (Java_ThreadUtils_isThreadPriorityAudio( - env, PlatformThread::CurrentId())) { - *priority = ThreadPriority::REALTIME_AUDIO; - return true; - } - return false; -} - -} // namespace internal - -void PlatformThread::SetName(const std::string& name) { - ThreadIdNameManager::GetInstance()->SetName(name); - - // Like linux, on android we can get the thread names to show up in the - // debugger by setting the process name for the LWP. - // We don't want to do this for the main thread because that would rename - // the process, causing tools like killall to stop working. - if (PlatformThread::CurrentId() == getpid()) - return; - - // Set the name for the LWP (which gets truncated to 15 characters). - int err = prctl(PR_SET_NAME, name.c_str()); - if (err < 0 && errno != EPERM) - DPLOG(ERROR) << "prctl(PR_SET_NAME)"; -} - - -void InitThreading() { -} - -void TerminateOnThread() { - base::android::DetachFromVM(); -} - -size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) { -#if !defined(ADDRESS_SANITIZER) - return 0; -#else - // AddressSanitizer bloats the stack approximately 2x. Default stack size of - // 1Mb is not enough for some tests (see http://crbug.com/263749 for example). - return 2 * (1 << 20); // 2Mb -#endif -} - -} // namespace base
diff --git a/base/time/time_android.cc b/base/time/time_android.cc deleted file mode 100644 index e0c4914..0000000 --- a/base/time/time_android.cc +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/time/time.h" - -namespace base { - -// static -TimeTicks TimeTicks::FromUptimeMillis(jlong uptime_millis_value) { - // The implementation of the SystemClock.uptimeMillis() in AOSP uses the same - // clock as base::TimeTicks::Now(): clock_gettime(CLOCK_MONOTONIC), see in - // platform/system/code: - // 1. libutils/SystemClock.cpp - // 2. libutils/Timers.cpp - // - // We are not aware of any motivations for Android OEMs to modify the AOSP - // implementation of either uptimeMillis() or clock_gettime(CLOCK_MONOTONIC), - // so we assume that there are no such customizations. - // - // Under these assumptions the conversion is as safe as copying the value of - // base::TimeTicks::Now() with a loss of sub-millisecond precision. - return TimeTicks(uptime_millis_value * Time::kMicrosecondsPerMillisecond); -} - -} // namespace base