diff options
Diffstat (limited to 'cli/coverage.rs')
-rw-r--r-- | cli/coverage.rs | 129 |
1 files changed, 13 insertions, 116 deletions
diff --git a/cli/coverage.rs b/cli/coverage.rs index 3006bd878..e44f025bf 100644 --- a/cli/coverage.rs +++ b/cli/coverage.rs @@ -2,137 +2,36 @@ use crate::colors; use crate::inspector::DenoInspector; -use deno_core::error::generic_error; +use crate::inspector::InspectorSession; use deno_core::error::AnyError; -use deno_core::futures::channel::oneshot; use deno_core::serde_json; use deno_core::serde_json::json; use deno_core::url::Url; -use deno_core::v8; use serde::Deserialize; -use std::collections::HashMap; -use std::mem::MaybeUninit; -use std::ops::Deref; -use std::ops::DerefMut; -use std::ptr; pub struct CoverageCollector { - v8_channel: v8::inspector::ChannelBase, - v8_session: v8::UniqueRef<v8::inspector::V8InspectorSession>, - response_map: HashMap<i32, oneshot::Sender<serde_json::Value>>, - next_message_id: i32, -} - -impl Deref for CoverageCollector { - type Target = v8::inspector::V8InspectorSession; - fn deref(&self) -> &Self::Target { - &self.v8_session - } -} - -impl DerefMut for CoverageCollector { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.v8_session - } -} - -impl v8::inspector::ChannelImpl for CoverageCollector { - fn base(&self) -> &v8::inspector::ChannelBase { - &self.v8_channel - } - - fn base_mut(&mut self) -> &mut v8::inspector::ChannelBase { - &mut self.v8_channel - } - - fn send_response( - &mut self, - call_id: i32, - message: v8::UniquePtr<v8::inspector::StringBuffer>, - ) { - let raw_message = message.unwrap().string().to_string(); - let message = serde_json::from_str(&raw_message).unwrap(); - self - .response_map - .remove(&call_id) - .unwrap() - .send(message) - .unwrap(); - } - - fn send_notification( - &mut self, - _message: v8::UniquePtr<v8::inspector::StringBuffer>, - ) { - } - - fn flush_protocol_notifications(&mut self) {} + session: Box<InspectorSession>, } impl CoverageCollector { - const CONTEXT_GROUP_ID: i32 = 1; - - pub fn new(inspector_ptr: *mut DenoInspector) -> Box<Self> { - new_box_with(move |self_ptr| { - let v8_channel = v8::inspector::ChannelBase::new::<Self>(); - let v8_session = unsafe { &mut *inspector_ptr }.connect( - Self::CONTEXT_GROUP_ID, - unsafe { &mut *self_ptr }, - v8::inspector::StringView::empty(), - ); - - let response_map = HashMap::new(); - let next_message_id = 0; - - Self { - v8_channel, - v8_session, - response_map, - next_message_id, - } - }) - } - - async fn post_message( - &mut self, - method: String, - params: Option<serde_json::Value>, - ) -> Result<serde_json::Value, AnyError> { - let id = self.next_message_id; - self.next_message_id += 1; - - let (sender, receiver) = oneshot::channel::<serde_json::Value>(); - self.response_map.insert(id, sender); - - let message = json!({ - "id": id, - "method": method, - "params": params, - }); - - let raw_message = serde_json::to_string(&message).unwrap(); - let raw_message = v8::inspector::StringView::from(raw_message.as_bytes()); - self.v8_session.dispatch_protocol_message(raw_message); - - let response = receiver.await.unwrap(); - if let Some(error) = response.get("error") { - return Err(generic_error(format!("{}", error))); - } - - let result = response.get("result").unwrap().clone(); - Ok(result) + pub fn new(inspector_ptr: *mut DenoInspector) -> Self { + let session = InspectorSession::new(inspector_ptr); + Self { session } } pub async fn start_collecting(&mut self) -> Result<(), AnyError> { self + .session .post_message("Debugger.enable".to_string(), None) .await?; self + .session .post_message("Profiler.enable".to_string(), None) .await?; self + .session .post_message( "Profiler.startPreciseCoverage".to_string(), Some(json!({"callCount": true, "detailed": true})), @@ -144,6 +43,7 @@ impl CoverageCollector { pub async fn collect(&mut self) -> Result<Vec<Coverage>, AnyError> { let result = self + .session .post_message("Profiler.takePreciseCoverage".to_string(), None) .await?; @@ -153,6 +53,7 @@ impl CoverageCollector { let mut coverages: Vec<Coverage> = Vec::new(); for script_coverage in take_coverage_result.result { let result = self + .session .post_message( "Debugger.getScriptSource".to_string(), Some(json!({ @@ -175,12 +76,15 @@ impl CoverageCollector { pub async fn stop_collecting(&mut self) -> Result<(), AnyError> { self + .session .post_message("Profiler.stopPreciseCoverage".to_string(), None) .await?; self + .session .post_message("Profiler.disable".to_string(), None) .await?; self + .session .post_message("Debugger.disable".to_string(), None) .await?; @@ -308,13 +212,6 @@ impl PrettyCoverageReporter { } } -fn new_box_with<T>(new_fn: impl FnOnce(*mut T) -> T) -> Box<T> { - let b = Box::new(MaybeUninit::<T>::uninit()); - let p = Box::into_raw(b) as *mut T; - unsafe { ptr::write(p, new_fn(p)) }; - unsafe { Box::from_raw(p) } -} - pub fn filter_script_coverages( coverages: Vec<Coverage>, test_file_url: Url, |