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