| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "remoting/base/auto_thread.h" | 5 #include "remoting/base/auto_thread.h" |
| 6 #include "base/bind.h" | 6 #include "base/bind.h" |
| 7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| 11 #include "base/scoped_native_library.h" | 11 #include "base/scoped_native_library.h" |
| 12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 13 #include "build/build_config.h" | 13 #include "build/build_config.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 #if defined(OS_WIN) | 16 #if defined(OS_WIN) |
| 17 #include <objbase.h> | 17 #include <objbase.h> |
| 18 #include "base/win/windows_version.h" | |
| 19 #endif | 18 #endif |
| 20 | 19 |
| 21 namespace { | 20 namespace { |
| 22 | 21 |
| 23 const char kThreadName[] = "Test thread"; | 22 const char kThreadName[] = "Test thread"; |
| 24 | 23 |
| 25 void SetFlagTask(bool* success) { | 24 void SetFlagTask(bool* success) { |
| 26 *success = true; | 25 *success = true; |
| 27 } | 26 } |
| 28 | 27 |
| 29 void PostSetFlagTask( | 28 void PostSetFlagTask( |
| 30 scoped_refptr<base::TaskRunner> task_runner, | 29 scoped_refptr<base::TaskRunner> task_runner, |
| 31 bool* success) { | 30 bool* success) { |
| 32 task_runner->PostTask(FROM_HERE, base::Bind(&SetFlagTask, success)); | 31 task_runner->PostTask(FROM_HERE, base::Bind(&SetFlagTask, success)); |
| 33 } | 32 } |
| 34 | 33 |
| 35 #if defined(OS_WIN) | 34 #if defined(OS_WIN) |
| 36 void CheckComAptTypeTask(APTTYPE* apt_type_out, HRESULT* hresult) { | 35 void CheckComAptTypeTask(APTTYPE* apt_type_out, HRESULT* hresult) { |
| 37 typedef HRESULT (WINAPI * CoGetApartmentTypeFunc) | 36 typedef HRESULT (WINAPI * CoGetApartmentTypeFunc) |
| 38 (APTTYPE*, APTTYPEQUALIFIER*); | 37 (APTTYPE*, APTTYPEQUALIFIER*); |
| 39 | 38 |
| 40 // CoGetApartmentType requires Windows 7 or above. | |
| 41 if (base::win::GetVersion() < base::win::VERSION_WIN7) { | |
| 42 *hresult = E_NOTIMPL; | |
| 43 return; | |
| 44 } | |
| 45 | |
| 46 // Dynamic link to the API so the same test binary can run on older systems. | 39 // Dynamic link to the API so the same test binary can run on older systems. |
| 47 base::ScopedNativeLibrary com_library(base::FilePath(L"ole32.dll")); | 40 base::ScopedNativeLibrary com_library(base::FilePath(L"ole32.dll")); |
| 48 ASSERT_TRUE(com_library.is_valid()); | 41 ASSERT_TRUE(com_library.is_valid()); |
| 49 CoGetApartmentTypeFunc co_get_apartment_type = | 42 CoGetApartmentTypeFunc co_get_apartment_type = |
| 50 reinterpret_cast<CoGetApartmentTypeFunc>( | 43 reinterpret_cast<CoGetApartmentTypeFunc>( |
| 51 com_library.GetFunctionPointer("CoGetApartmentType")); | 44 com_library.GetFunctionPointer("CoGetApartmentType")); |
| 52 ASSERT_TRUE(co_get_apartment_type != NULL); | 45 ASSERT_TRUE(co_get_apartment_type != NULL); |
| 53 | 46 |
| 54 APTTYPEQUALIFIER apt_type_qualifier; | 47 APTTYPEQUALIFIER apt_type_qualifier; |
| 55 *hresult = (*co_get_apartment_type)(apt_type_out, &apt_type_qualifier); | 48 *hresult = (*co_get_apartment_type)(apt_type_out, &apt_type_qualifier); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 | 151 |
| 159 // Post a task to query the COM apartment type. | 152 // Post a task to query the COM apartment type. |
| 160 HRESULT hresult = E_FAIL; | 153 HRESULT hresult = E_FAIL; |
| 161 APTTYPE apt_type = APTTYPE_NA; | 154 APTTYPE apt_type = APTTYPE_NA; |
| 162 task_runner->PostTask(FROM_HERE, | 155 task_runner->PostTask(FROM_HERE, |
| 163 base::Bind(&CheckComAptTypeTask, &apt_type, &hresult)); | 156 base::Bind(&CheckComAptTypeTask, &apt_type, &hresult)); |
| 164 | 157 |
| 165 task_runner = NULL; | 158 task_runner = NULL; |
| 166 RunMessageLoop(); | 159 RunMessageLoop(); |
| 167 | 160 |
| 168 // CoGetApartmentType requires Windows 7 or above. | 161 EXPECT_EQ(S_OK, hresult); |
| 169 if (base::win::GetVersion() >= base::win::VERSION_WIN7) { | 162 EXPECT_EQ(APTTYPE_MTA, apt_type); |
| 170 EXPECT_EQ(S_OK, hresult); | |
| 171 EXPECT_EQ(APTTYPE_MTA, apt_type); | |
| 172 } else { | |
| 173 EXPECT_EQ(E_NOTIMPL, hresult); | |
| 174 } | |
| 175 } | 163 } |
| 176 | 164 |
| 177 TEST_F(AutoThreadTest, ThreadWithComSta) { | 165 TEST_F(AutoThreadTest, ThreadWithComSta) { |
| 178 scoped_refptr<base::TaskRunner> task_runner = | 166 scoped_refptr<base::TaskRunner> task_runner = |
| 179 AutoThread::CreateWithLoopAndComInitTypes(kThreadName, | 167 AutoThread::CreateWithLoopAndComInitTypes(kThreadName, |
| 180 main_task_runner_, | 168 main_task_runner_, |
| 181 base::MessageLoop::TYPE_UI, | 169 base::MessageLoop::TYPE_UI, |
| 182 AutoThread::COM_INIT_STA); | 170 AutoThread::COM_INIT_STA); |
| 183 EXPECT_TRUE(task_runner.get()); | 171 EXPECT_TRUE(task_runner.get()); |
| 184 | 172 |
| 185 // Post a task to query the COM apartment type. | 173 // Post a task to query the COM apartment type. |
| 186 HRESULT hresult = E_FAIL; | 174 HRESULT hresult = E_FAIL; |
| 187 APTTYPE apt_type = APTTYPE_NA; | 175 APTTYPE apt_type = APTTYPE_NA; |
| 188 task_runner->PostTask(FROM_HERE, | 176 task_runner->PostTask(FROM_HERE, |
| 189 base::Bind(&CheckComAptTypeTask, &apt_type, &hresult)); | 177 base::Bind(&CheckComAptTypeTask, &apt_type, &hresult)); |
| 190 | 178 |
| 191 task_runner = NULL; | 179 task_runner = NULL; |
| 192 RunMessageLoop(); | 180 RunMessageLoop(); |
| 193 | 181 |
| 194 // CoGetApartmentType requires Windows 7 or above. | 182 EXPECT_EQ(S_OK, hresult); |
| 195 if (base::win::GetVersion() >= base::win::VERSION_WIN7) { | 183 // Whether the thread is the "main" STA apartment depends upon previous |
| 196 EXPECT_EQ(S_OK, hresult); | 184 // COM activity in this test process, so allow both types here. |
| 197 // Whether the thread is the "main" STA apartment depends upon previous | 185 EXPECT_TRUE(apt_type == APTTYPE_MAINSTA || apt_type == APTTYPE_STA); |
| 198 // COM activity in this test process, so allow both types here. | |
| 199 EXPECT_TRUE(apt_type == APTTYPE_MAINSTA || apt_type == APTTYPE_STA); | |
| 200 } else { | |
| 201 EXPECT_EQ(E_NOTIMPL, hresult); | |
| 202 } | |
| 203 } | 186 } |
| 204 #endif // defined(OS_WIN) | 187 #endif // defined(OS_WIN) |
| 205 | 188 |
| 206 } // namespace remoting | 189 } // namespace remoting |
| OLD | NEW |