Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Unified Diff: cloud_print/virtual_driver/win/port_monitor/port_monitor_unittest.cc

Issue 6778001: Initial CL for a simple port monitor for Windows to be used by the Cloud Print Virtual Print driver. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698