event_win_unittest.cc (3763B)
1 // Copyright 2022 The Chromium Authors. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <memory> 6 7 #include "agent/src/event_win.h" 8 #include "common/utils_win.h" 9 #include "gtest/gtest.h" 10 11 namespace content_analysis { 12 namespace sdk { 13 namespace testing { 14 15 std::unique_ptr<ContentAnalysisEventWin> CreateEvent( 16 HANDLE handle, 17 const BrowserInfo& browser_info, 18 ContentAnalysisRequest request) { 19 return std::make_unique<ContentAnalysisEventWin>( 20 handle, browser_info, std::move(request)); 21 } 22 23 TEST(EventTest, Create_BrowserInfo) { 24 const BrowserInfo bi{12345, "/path/to/binary"}; 25 ContentAnalysisRequest request; 26 *request.add_tags() = "foo"; 27 request.set_request_token("req-token"); 28 29 auto event = CreateEvent(INVALID_HANDLE_VALUE, bi, request); 30 ASSERT_TRUE(event); 31 32 ASSERT_EQ(bi.pid, event->GetBrowserInfo().pid); 33 ASSERT_EQ(bi.binary_path, event->GetBrowserInfo().binary_path); 34 } 35 36 TEST(EventTest, Create_Request) { 37 const BrowserInfo bi{ 12345, "/path/to/binary" }; 38 ContentAnalysisRequest request; 39 *request.add_tags() = "foo"; 40 request.set_request_token("req-token"); 41 42 auto event = CreateEvent(INVALID_HANDLE_VALUE, bi, request); 43 ASSERT_TRUE(event); 44 45 ASSERT_EQ(1u, event->GetRequest().tags_size()); 46 ASSERT_EQ(request.tags(0), event->GetRequest().tags(0)); 47 ASSERT_TRUE(event->GetRequest().has_request_token()); 48 ASSERT_EQ(request.request_token(), event->GetRequest().request_token()); 49 } 50 51 TEST(EventTest, Create_Init) { 52 const BrowserInfo bi{ 12345, "/path/to/binary" }; 53 ContentAnalysisRequest request; 54 *request.add_tags() = "foo"; 55 request.set_request_token("req-token"); 56 57 auto event = CreateEvent(INVALID_HANDLE_VALUE, bi, request); 58 ASSERT_TRUE(event); 59 60 ASSERT_EQ(ResultCode::OK, event->Init()); 61 62 // Initializing an event should initialize the contained response for a 63 // success verdict that matches the request. 64 ASSERT_EQ(request.request_token(), event->GetResponse().request_token()); 65 ASSERT_EQ(1u, event->GetResponse().results_size()); 66 ASSERT_EQ(ContentAnalysisResponse::Result::SUCCESS, 67 event->GetResponse().results(0).status()); 68 ASSERT_TRUE(event->GetResponse().results(0).has_tag()); 69 ASSERT_EQ(request.tags(0), event->GetResponse().results(0).tag()); 70 ASSERT_EQ(0u, event->GetResponse().results(0).triggered_rules_size()); 71 } 72 73 // Initializing an event whose request has no request token is an error. 74 TEST(EventTest, Create_Init_RequestNoRequestToken) { 75 const BrowserInfo bi{ 12345, "/path/to/binary" }; 76 ContentAnalysisRequest request; 77 *request.add_tags() = "foo"; 78 79 auto event = CreateEvent(INVALID_HANDLE_VALUE, bi, request); 80 ASSERT_TRUE(event); 81 82 ASSERT_EQ(ResultCode::ERR_MISSING_REQUEST_TOKEN, event->Init()); 83 } 84 85 TEST(EventTest, Write_BadPipe) { 86 HANDLE pipe; 87 DWORD err = internal::CreatePipe( 88 internal::GetPipeNameForAgent("testpipe", false), false, true, &pipe); 89 ASSERT_EQ(ERROR_SUCCESS, err); 90 ASSERT_NE(INVALID_HANDLE_VALUE, pipe); 91 92 // Create an event with the dummy pipe and initilalize it. 93 const BrowserInfo bi{ 12345, "/path/to/binary" }; 94 ContentAnalysisRequest request; 95 request.set_request_token("req-token"); 96 *request.add_tags() = "dlp"; 97 request.set_text_content("test"); 98 auto event = std::make_unique<ContentAnalysisEventWin>( 99 pipe, bi, std::move(request)); 100 ASSERT_TRUE(event); 101 ResultCode rc = event->Init(); 102 ASSERT_EQ(ResultCode::OK, rc); 103 104 // Close the handle before trying to send the response. 105 // This simulates an error with the pipe. 106 CloseHandle(pipe); 107 ASSERT_EQ(ERROR_SUCCESS, GetLastError()); 108 109 // The following call should not hang. 110 event->Send(); 111 } 112 113 } // namespace testing 114 } // namespace sdk 115 } // namespace content_analysis