Index: cloud_print/virtual_driver/win/port_monitor/port_monitor_unittest.cc |
=================================================================== |
--- cloud_print/virtual_driver/win/port_monitor/port_monitor_unittest.cc (revision 0) |
+++ cloud_print/virtual_driver/win/port_monitor/port_monitor_unittest.cc (revision 0) |
@@ -0,0 +1,220 @@ |
+// 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 "cloud_print/virtual_driver/win/port_monitor/port_monitor.h" |
+#include <winspool.h> |
+#include "base/file_util.h" |
+#include "base/path_service.h" |
+#include "base/string16.h" |
+#include "base/win/registry.h" |
+#include "cloud_print/virtual_driver/win/port_monitor/spooler_win.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace cloud_print { |
+const wchar_t kChromeExePath[] = L"google\\chrome\\application\\chrometest.exe"; |
+const wchar_t kAlternateChromeExePath[] = |
+ L"google\\chrome\\application\\chrometestalternate.exe"; |
+const wchar_t kChromePathRegValue[] =L"PathToChromeTestExe"; |
+ |
+class PortMonitorTest : public testing::Test { |
+ public: |
+ PortMonitorTest() {} |
+ protected: |
+ // Creates a registry entry pointing at a chrome |
+ virtual void SetUpChromeExeRegistry() { |
+ // Create a temporary chrome.exe location value. |
+ base::win::RegKey key(HKEY_CURRENT_USER, |
+ cloud_print::kChromePathRegKey, |
+ KEY_ALL_ACCESS); |
+ |
+ FilePath path; |
+ PathService::Get(base::DIR_LOCAL_APP_DATA, &path); |
+ path = path.Append(kAlternateChromeExePath); |
+ ASSERT_EQ(ERROR_SUCCESS, |
+ key.WriteValue(cloud_print::kChromePathRegValue, |
+ path.value().c_str())); |
+ } |
+ // Deletes the registry entry created in SetUpChromeExeRegistry |
+ virtual void DeleteChromeExeRegistry() { |
+ base::win::RegKey key(HKEY_CURRENT_USER, |
+ cloud_print::kChromePathRegKey, |
+ KEY_ALL_ACCESS); |
+ key.DeleteValue(cloud_print::kChromePathRegValue); |
+ } |
+ |
+ virtual void CreateTempChromeExeFiles() { |
+ FilePath path; |
+ PathService::Get(base::DIR_LOCAL_APP_DATA, &path); |
+ FilePath main_path = path.Append(kChromeExePath); |
+ ASSERT_TRUE(file_util::CreateDirectory(main_path)); |
+ FilePath alternate_path = path.Append(kAlternateChromeExePath); |
+ ASSERT_TRUE(file_util::CreateDirectory(alternate_path)); |
+ } |
+ |
+ virtual void DeleteTempChromeExeFiles() { |
+ FilePath path; |
+ PathService::Get(base::DIR_LOCAL_APP_DATA, &path); |
+ FilePath main_path = path.Append(kChromeExePath); |
+ ASSERT_TRUE(file_util::Delete(main_path, true)); |
+ PathService::Get(base::DIR_LOCAL_APP_DATA, &path); |
+ FilePath alternate_path = path.Append(kAlternateChromeExePath); |
+ ASSERT_TRUE(file_util::Delete(alternate_path, true)); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(PortMonitorTest); |
+}; |
+ |
+TEST_F(PortMonitorTest, GetChromeExePathTest) { |
+ FilePath chrome_path; |
+ SetUpChromeExeRegistry(); |
+ CreateTempChromeExeFiles(); |
+ EXPECT_TRUE(cloud_print::GetChromeExePath(&chrome_path)); |
+ EXPECT_TRUE( |
+ chrome_path.value().rfind(kAlternateChromeExePath) != std::string::npos); |
+ DeleteChromeExeRegistry(); |
+ chrome_path.clear(); |
+ EXPECT_TRUE(cloud_print::GetChromeExePath(&chrome_path)); |
+ EXPECT_TRUE(chrome_path.value().rfind(kChromeExePath) != std::string::npos); |
+ EXPECT_TRUE(file_util::PathExists(FilePath(chrome_path))); |
+ DeleteTempChromeExeFiles(); |
+ EXPECT_FALSE(cloud_print::GetChromeExePath(&chrome_path)); |
+} |
+ |
+TEST_F(PortMonitorTest, EnumPortsTest) { |
+ DWORD needed_bytes = 0; |
+ DWORD returned = 0; |
+ EXPECT_FALSE(Monitor2EnumPorts(NULL, |
+ NULL, |
+ 1, |
+ NULL, |
+ 0, |
+ &needed_bytes, |
+ &returned)); |
+ EXPECT_EQ(ERROR_INSUFFICIENT_BUFFER, GetLastError()); |
+ EXPECT_NE(0u, needed_bytes); |
+ EXPECT_EQ(0u, returned); |
+ |
+ BYTE* buffer = new BYTE[needed_bytes]; |
+ ASSERT_TRUE(buffer != NULL); |
+ EXPECT_TRUE(Monitor2EnumPorts(NULL, |
+ NULL, |
+ 1, |
+ buffer, |
+ needed_bytes, |
+ &needed_bytes, |
+ &returned)); |
+ EXPECT_NE(0u, needed_bytes); |
+ EXPECT_EQ(1u, returned); |
+ PORT_INFO_1* port_info_1 = reinterpret_cast<PORT_INFO_1*>(buffer); |
+ EXPECT_TRUE(port_info_1->pName != NULL); |
+ delete[] buffer; |
+ |
+ returned = 0; |
+ needed_bytes = 0; |
+ EXPECT_FALSE(Monitor2EnumPorts(NULL, |
+ NULL, |
+ 2, |
+ NULL, |
+ 0, |
+ &needed_bytes, |
+ &returned)); |
+ EXPECT_EQ(ERROR_INSUFFICIENT_BUFFER, GetLastError()); |
+ EXPECT_NE(0u, needed_bytes); |
+ EXPECT_EQ(0u, returned); |
+ |
+ buffer = new BYTE[needed_bytes]; |
+ ASSERT_TRUE(buffer != NULL); |
+ EXPECT_TRUE(Monitor2EnumPorts(NULL, |
+ NULL, |
+ 2, |
+ buffer, |
+ needed_bytes, |
+ &needed_bytes, |
+ &returned)); |
+ EXPECT_NE(0u, needed_bytes); |
+ EXPECT_EQ(1u, returned); |
+ PORT_INFO_2* port_info_2 = reinterpret_cast<PORT_INFO_2*>(buffer); |
+ EXPECT_TRUE(port_info_2->pPortName != NULL); |
+ delete[] buffer; |
+} |
+ |
+TEST_F(PortMonitorTest, FlowTest) { |
+ const wchar_t kXcvDataItem[] = L"MonitorUI"; |
+ MONITORINIT monitor_init = {0}; |
+ HANDLE monitor_handle = NULL; |
+ HANDLE port_handle = NULL; |
+ HANDLE xcv_handle = NULL; |
+ DWORD bytes_processed = 0; |
+ DWORD bytes_needed = 0; |
+ const size_t kBufferSize = 100; |
+ BYTE buffer[kBufferSize] = {0}; |
+ |
+ // Initialize the print monitor |
+ MONITOR2* monitor2 = InitializePrintMonitor2(&monitor_init, &monitor_handle); |
+ EXPECT_TRUE(monitor2 != NULL); |
+ EXPECT_TRUE(monitor_handle != NULL); |
+ |
+ // Test the XCV functions. Used for reporting the location of the |
+ // UI portion of the port monitor. |
+ EXPECT_TRUE(monitor2->pfnXcvOpenPort != NULL); |
+ EXPECT_TRUE(monitor2->pfnXcvOpenPort(monitor_handle, NULL, 0, &xcv_handle)); |
+ EXPECT_TRUE(xcv_handle != NULL); |
+ EXPECT_TRUE(monitor2->pfnXcvDataPort != NULL); |
+ EXPECT_EQ(ERROR_ACCESS_DENIED, |
+ monitor2->pfnXcvDataPort(xcv_handle, |
+ kXcvDataItem, |
+ NULL, |
+ 0, |
+ buffer, |
+ kBufferSize, |
+ &bytes_needed)); |
+ EXPECT_TRUE(monitor2->pfnXcvClosePort != NULL); |
+ EXPECT_TRUE(monitor2->pfnXcvClosePort(xcv_handle)); |
+ EXPECT_TRUE(monitor2->pfnXcvOpenPort(monitor_handle, |
+ NULL, |
+ SERVER_ACCESS_ADMINISTER, |
+ &xcv_handle)); |
+ EXPECT_TRUE(xcv_handle != NULL); |
+ EXPECT_TRUE(monitor2->pfnXcvDataPort != NULL); |
+ EXPECT_EQ(ERROR_SUCCESS, |
+ monitor2->pfnXcvDataPort(xcv_handle, |
+ kXcvDataItem, |
+ NULL, |
+ 0, |
+ buffer, |
+ kBufferSize, |
+ &bytes_needed)); |
+ EXPECT_TRUE(monitor2->pfnXcvClosePort != NULL); |
+ EXPECT_TRUE(monitor2->pfnXcvClosePort(xcv_handle)); |
+ |
+ // Test opening the port and running a print job. |
+ EXPECT_TRUE(monitor2->pfnOpenPort != NULL); |
+ EXPECT_TRUE(monitor2->pfnOpenPort(monitor_handle, NULL, &port_handle)); |
+ EXPECT_TRUE(port_handle != NULL); |
+ EXPECT_TRUE(monitor2->pfnStartDocPort != NULL); |
+ EXPECT_TRUE(monitor2->pfnStartDocPort(port_handle, L"", 0, 0, NULL)); |
+ EXPECT_TRUE(monitor2->pfnWritePort != NULL); |
+ EXPECT_TRUE(monitor2->pfnWritePort(port_handle, |
+ buffer, |
+ kBufferSize, |
+ &bytes_processed)); |
+ EXPECT_EQ(kBufferSize, bytes_processed); |
+ EXPECT_TRUE(monitor2->pfnReadPort != NULL); |
+ EXPECT_FALSE(monitor2->pfnReadPort(port_handle, |
+ buffer, |
+ sizeof(buffer), |
+ &bytes_processed)); |
+ EXPECT_EQ(0u, bytes_processed); |
+ EXPECT_TRUE(monitor2->pfnEndDocPort != NULL); |
+ EXPECT_TRUE(monitor2->pfnEndDocPort(port_handle)); |
+ EXPECT_TRUE(monitor2->pfnClosePort != NULL); |
+ EXPECT_TRUE(monitor2->pfnClosePort(port_handle)); |
+ |
+ // Shutdown the port monitor. |
+ Monitor2Shutdown(monitor_handle); |
+} |
+ |
+} // namespace cloud_print |
+ |
Property changes on: cloud_print\virtual_driver\win\port_monitor\port_monitor_unittest.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |