diff --git a/3FD.sln b/3FD.sln index 6cafe82..3ab36f4 100644 --- a/3FD.sln +++ b/3FD.sln @@ -57,7 +57,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IntegrationTestsApp.WinRT.W EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IntegrationTestsApp.WinRT.WindowsPhone", "IntegrationTestsApp.WinRT\IntegrationTestsApp.WinRT.WindowsPhone\IntegrationTestsApp.WinRT.WindowsPhone.vcxproj", "{CEB9F9FD-5E2A-49FB-AC14-2DEF01DC80B8}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestClient", "TestClient\TestClient.vcxproj", "{6ADF3A4B-1E22-41BA-9293-96593E6A45BE}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestRpcClient", "TestRpcClient\TestRpcClient.vcxproj", "{6ADF3A4B-1E22-41BA-9293-96593E6A45BE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestWwsClient", "TestWwsClient\TestWwsClient.vcxproj", "{4913E097-136E-4BC4-BF8C-D3341FB1425A}" EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution @@ -291,6 +293,20 @@ Global {6ADF3A4B-1E22-41BA-9293-96593E6A45BE}.Release|Win32.Build.0 = Release|Win32 {6ADF3A4B-1E22-41BA-9293-96593E6A45BE}.Release|x64.ActiveCfg = Release|x64 {6ADF3A4B-1E22-41BA-9293-96593E6A45BE}.Release|x64.Build.0 = Release|x64 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Debug|ARM.ActiveCfg = Debug|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Debug|Win32.ActiveCfg = Debug|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Debug|Win32.Build.0 = Debug|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Debug|x64.ActiveCfg = Debug|x64 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Debug|x64.Build.0 = Debug|x64 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Release|ARM.ActiveCfg = Release|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Release|Win32.ActiveCfg = Release|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Release|Win32.Build.0 = Release|Win32 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Release|x64.ActiveCfg = Release|x64 + {4913E097-136E-4BC4-BF8C-D3341FB1425A}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -315,6 +331,7 @@ Global {09ED5B36-D345-4D62-9F01-DC41168BCB35} = {35A12F43-25FF-406A-8CCF-B203F688A791} {CEB9F9FD-5E2A-49FB-AC14-2DEF01DC80B8} = {35A12F43-25FF-406A-8CCF-B203F688A791} {6ADF3A4B-1E22-41BA-9293-96593E6A45BE} = {8E00B911-43B2-49D5-9B4A-AB6E1ED097A1} + {4913E097-136E-4BC4-BF8C-D3341FB1425A} = {8E00B911-43B2-49D5-9B4A-AB6E1ED097A1} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution VisualSVNWorkingCopyRoot = . diff --git a/IntegrationTests/IntegrationTests.vcxproj b/IntegrationTests/IntegrationTests.vcxproj index a2ab4a5..adf7c71 100644 --- a/IntegrationTests/IntegrationTests.vcxproj +++ b/IntegrationTests/IntegrationTests.vcxproj @@ -107,7 +107,7 @@ copy "$(ProjectDir)application.config" "$(TargetPath).3fd.config" -copy "$(ProjectDir)calculator.wsdl" "$(TargetDir)" +copy "$(SolutionDir)TestShared\calculator.wsdl" "$(TargetDir)" @@ -127,7 +127,7 @@ copy "$(ProjectDir)calculator.wsdl" "$(TargetDir)" copy "$(ProjectDir)application.config" "$(TargetPath).3fd.config" -copy "$(ProjectDir)calculator.wsdl" "$(TargetDir)" +copy "$(SolutionDir)TestShared\calculator.wsdl" "$(TargetDir)" @@ -151,7 +151,7 @@ copy "$(ProjectDir)calculator.wsdl" "$(TargetDir)" copy "$(ProjectDir)application.config" "$(TargetPath).3fd.config" -copy "$(ProjectDir)calculator.wsdl" "$(TargetDir)" +copy "$(SolutionDir)TestShared\calculator.wsdl" "$(TargetDir)" @@ -175,7 +175,7 @@ copy "$(ProjectDir)calculator.wsdl" "$(TargetDir)" copy "$(ProjectDir)application.config" "$(TargetPath).3fd.config" -copy "$(ProjectDir)calculator.wsdl" "$(TargetDir)" +copy "$(SolutionDir)TestShared\calculator.wsdl" "$(TargetDir)" diff --git a/IntegrationTests/tests_rpc.cpp b/IntegrationTests/tests_rpc.cpp index b70ba5a..211ca8c 100644 --- a/IntegrationTests/tests_rpc.cpp +++ b/IntegrationTests/tests_rpc.cpp @@ -220,7 +220,7 @@ namespace integration_tests auto shutdownTimeSpan = duration_cast( now - startTimeForSrvShutdown - ); + ); if (shutdownTimeSpan > maxTimeSpanForSrvShutdown) maxTimeSpanForSrvShutdown = shutdownTimeSpan; @@ -246,12 +246,15 @@ namespace integration_tests /// static uint32_t GetMaxCycleTime() { - auto maxCycleTime = static_cast ( - maxTimeSpanForSrvShutdown.count() - + maxTimeSpanForSrvSetupAndStart.count() - ); - - return maxCycleTime > 0 ? maxCycleTime : 32U; + auto maxCycleTime = + maxTimeSpanForSrvShutdown.count() + + maxTimeSpanForSrvSetupAndStart.count(); + + /* In practice, measured time must be linearly augmented + for adjustment (using field data), because apparently the + server takes longer to be available, which is a little + after RpcServer::Start returns... */ + return maxCycleTime > 0 ? static_cast (100 + 1.2 * maxCycleTime) : 150; } }; @@ -325,6 +328,58 @@ namespace integration_tests } } + class Framework_RpcNoAuth2_TestCase : public ::testing::Test {}; + + /// + /// Tests the RPC server normal operation (responding requests), trying + /// several combinations of protocol sequence and authentication level. + /// + TEST_F(Framework_RpcNoAuth2_TestCase, ServerRun_ResponseTest) + { + // Ensures proper initialization/finalization of the framework + FrameworkInstance _framework; + + CALL_STACK_TRACE; + + try + { + // Initialize the RPC server (resource allocation takes place) + RpcServer::Initialize(ProtocolSequence::Local, "TestClient3FD"); + + // RPC interface implementation 1: + AcmeTesting_v1_0_epv_t intfImplFuncTable1 = { Operate, ChangeCase, WriteOnStorage, Shutdown }; + + // RPC interface implementation 2: + AcmeTesting_v1_0_epv_t intfImplFuncTable2 = { Operate2, ChangeCase2, WriteOnStorage, Shutdown }; + + std::vector objects; + objects.reserve(2); + + // This object will run impl 1: + objects.emplace_back( + objectsUuidsImpl1[5], + AcmeTesting_v1_0_s_ifspec, // this is the interface (generated from IDL) + &intfImplFuncTable1 + ); + + // This object will run impl 2: + objects.emplace_back( + objectsUuidsImpl2[5], + AcmeTesting_v1_0_s_ifspec, // this is the interface (generated from IDL) + &intfImplFuncTable2 + ); + + EXPECT_EQ(STATUS_OKAY, RpcServer::Start(objects)); + EXPECT_EQ(STATUS_OKAY, RpcServer::Wait()); + EXPECT_EQ(STATUS_OKAY, RpcServer::Finalize()); + } + catch (...) + { + RpcServer::Finalize(); + HandleException(); + } + } + // The set of options for some test template instantiations struct AuthnTestOptions { @@ -418,13 +473,15 @@ namespace integration_tests ) ); - class Framework_RpcNoAuth2_TestCase : public ::testing::Test {}; + class Framework_RpcAuthn2_TestCase : + public ::testing::TestWithParam {}; /// /// Tests the RPC server normal operation (responding requests), trying - /// several combinations of protocol sequence and authentication level. + /// several combinations of protocol sequence and authentication level + /// using Microsoft NTLM/Negotiate/Kerberos SSP's. /// - TEST_F(Framework_RpcNoAuth2_TestCase, ServerRun_ResponseTest) + TEST_P(Framework_RpcAuthn2_TestCase, ServerRun_ResponseTest) { // Ensures proper initialization/finalization of the framework FrameworkInstance _framework; @@ -433,8 +490,12 @@ namespace integration_tests try { - // Initialize the RPC server (resource allocation takes place) - RpcServer::Initialize(ProtocolSequence::Local, "TestClient3FD"); + // Initialize the RPC server (authn svc reg & resource allocation takes place) + RpcServer::Initialize( + GetParam().protocolSequence, + "TestClient3FD", + GetParam().authenticationLevel + ); // RPC interface implementation 1: AcmeTesting_v1_0_epv_t intfImplFuncTable1 = { Operate, ChangeCase, WriteOnStorage, Shutdown }; @@ -447,14 +508,14 @@ namespace integration_tests // This object will run impl 1: objects.emplace_back( - objectsUuidsImpl1[5], + GetParam().objectUUID1, AcmeTesting_v1_0_s_ifspec, // this is the interface (generated from IDL) &intfImplFuncTable1 ); // This object will run impl 2: objects.emplace_back( - objectsUuidsImpl2[5], + GetParam().objectUUID2, AcmeTesting_v1_0_s_ifspec, // this is the interface (generated from IDL) &intfImplFuncTable2 ); @@ -470,15 +531,42 @@ namespace integration_tests } } - class Framework_RpcAuthn2_TestCase : - public ::testing::TestWithParam {}; + /* Implementation of test template takes care of switching + protocol sequences and authentication level: */ + INSTANTIATE_TEST_CASE_P( + SwitchProtAndAuthLevel, + Framework_RpcAuthn2_TestCase, + ::testing::Values( + AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[6], objectsUuidsImpl2[6], AuthenticationLevel::Integrity }, + AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[7], objectsUuidsImpl2[7], AuthenticationLevel::Privacy }, + AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[8], objectsUuidsImpl2[8], AuthenticationLevel::Integrity }, + AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[9], objectsUuidsImpl2[9], AuthenticationLevel::Privacy } + /*, + AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[10], objectsUuidsImpl2[10], AuthenticationLevel::Integrity }, + AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[11], objectsUuidsImpl2[11], AuthenticationLevel::Privacy }, + */ + /* + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[6], objectsUuidsImpl2[6], AuthenticationLevel::Integrity }, + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[7], objectsUuidsImpl2[7], AuthenticationLevel::Privacy }, + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[8], objectsUuidsImpl2[8], AuthenticationLevel::Integrity }, + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[9], objectsUuidsImpl2[9], AuthenticationLevel::Privacy } + */ + /*, + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[10], objectsUuidsImpl2[10], AuthenticationLevel::Integrity }, + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[11], objectsUuidsImpl2[11], AuthenticationLevel::Privacy } + */ + ) + ); + + class Framework_RpcSchannel_TestCase : + public ::testing::TestWithParam {}; /// - /// Tests the RPC server normal operation (responding requests), trying - /// several combinations of protocol sequence and authentication level - /// using Microsoft NTLM/Negotiate/Kerberos SSP's. + /// Tests the cycle init/start/stop/resume/stop/finalize of the RPC server, + /// for several combinations of protocol sequence and authentication level + /// using Schannel SSP. /// - TEST_P(Framework_RpcAuthn2_TestCase, ServerRun_ResponseTest) + TEST_P(Framework_RpcSchannel_TestCase, ServerRun_StatesCycleTest) { // Ensures proper initialization/finalization of the framework FrameworkInstance _framework; @@ -487,10 +575,17 @@ namespace integration_tests try { - // Initialize the RPC server (authn svc reg & resource allocation takes place) + CertInfo certInfo( + CERT_SYSTEM_STORE_LOCAL_MACHINE, + "My", + "MySelfSignedCert4DevTestsServer", + GetParam().useStrongSec + ); + + // Initialize the RPC server (resource allocation takes place) RpcServer::Initialize( - GetParam().protocolSequence, "TestClient3FD", + &certInfo, GetParam().authenticationLevel ); @@ -517,9 +612,21 @@ namespace integration_tests &intfImplFuncTable2 ); + // Now cycle through the states: + EXPECT_EQ(STATUS_OKAY, RpcServer::Start(objects)); - EXPECT_EQ(STATUS_OKAY, RpcServer::Wait()); + RpcTestTimer::StopTimeCountServerSetupAndStart(); + + EXPECT_EQ(STATUS_OKAY, RpcServer::Stop()); + EXPECT_EQ(STATUS_OKAY, RpcServer::Resume()); + + RpcTestTimer::StartTimeCountServerShutdown(); + + // Upon finalization (shutdown), resources will be released: + EXPECT_EQ(STATUS_OKAY, RpcServer::Stop()); EXPECT_EQ(STATUS_OKAY, RpcServer::Finalize()); + + RpcTestTimer::StopTimeCountServerShutdown(); } catch (...) { @@ -532,39 +639,16 @@ namespace integration_tests protocol sequences and authentication level: */ INSTANTIATE_TEST_CASE_P( SwitchProtAndAuthLevel, - Framework_RpcAuthn2_TestCase, + Framework_RpcSchannel_TestCase, ::testing::Values( - AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[6], objectsUuidsImpl2[6], AuthenticationLevel::Integrity }, - AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[7], objectsUuidsImpl2[7], AuthenticationLevel::Privacy }, - AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[8], objectsUuidsImpl2[8], AuthenticationLevel::Integrity }, - AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[9], objectsUuidsImpl2[9], AuthenticationLevel::Privacy } - /*, - AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[10], objectsUuidsImpl2[10], AuthenticationLevel::Integrity }, - AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[11], objectsUuidsImpl2[11], AuthenticationLevel::Privacy }, - */ - /* - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[6], objectsUuidsImpl2[6], AuthenticationLevel::Integrity }, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[7], objectsUuidsImpl2[7], AuthenticationLevel::Privacy }, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[8], objectsUuidsImpl2[8], AuthenticationLevel::Integrity }, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[9], objectsUuidsImpl2[9], AuthenticationLevel::Privacy } - */ - /*, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[10], objectsUuidsImpl2[10], AuthenticationLevel::Integrity }, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[11], objectsUuidsImpl2[11], AuthenticationLevel::Privacy } - */ + SchannelTestOptions{ objectsUuidsImpl1[12], objectsUuidsImpl2[12], AuthenticationLevel::Privacy, false }, + SchannelTestOptions{ objectsUuidsImpl1[13], objectsUuidsImpl2[13], AuthenticationLevel::Privacy, true }, + SchannelTestOptions{ objectsUuidsImpl1[14], objectsUuidsImpl2[14], AuthenticationLevel::Integrity, false }, + SchannelTestOptions{ objectsUuidsImpl1[15], objectsUuidsImpl2[15], AuthenticationLevel::Integrity, true } ) ); - // The set of options for some test template instantiations - struct SchannelTestOptions - { - const char *objectUUID1; - const char *objectUUID2; - AuthenticationLevel authenticationLevel; - bool useStrongSec; - }; - - class Framework_RpcSchannel_TestCase : + class Framework_RpcSchannel2_TestCase : public ::testing::TestWithParam {}; /// @@ -572,7 +656,7 @@ namespace integration_tests /// several combinations of protocol sequence and authentication level /// using Schannel SSP. /// - TEST_P(Framework_RpcSchannel_TestCase, ServerRun_Schannel_ResponseTest) + TEST_P(Framework_RpcSchannel2_TestCase, ServerRun_ResponseTest) { // Ensures proper initialization/finalization of the framework FrameworkInstance _framework; @@ -629,18 +713,13 @@ namespace integration_tests } } - /* Implementation of test template takes care of switching - protocol sequences and authentication level: */ + // Implementation of test template takes care of switching parameters: INSTANTIATE_TEST_CASE_P( SwitchProtAndAuthLevel, - Framework_RpcSchannel_TestCase, - ::testing::Values( - SchannelTestOptions{ objectsUuidsImpl1[12], objectsUuidsImpl2[12], AuthenticationLevel::Privacy, false }, - SchannelTestOptions{ objectsUuidsImpl1[13], objectsUuidsImpl2[13], AuthenticationLevel::Privacy, true }, - SchannelTestOptions{ objectsUuidsImpl1[14], objectsUuidsImpl2[14], AuthenticationLevel::Integrity, false }, - SchannelTestOptions{ objectsUuidsImpl1[15], objectsUuidsImpl2[15], AuthenticationLevel::Integrity, true } - ) + Framework_RpcSchannel2_TestCase, + paramsForSchannelTests // shared by both client & server side ); + }// end of namespace integration_tests }// end of namespace _3fd diff --git a/IntegrationTests/tests_wws.cpp b/IntegrationTests/tests_wws.cpp index 9bb97b7..5579d75 100644 --- a/IntegrationTests/tests_wws.cpp +++ b/IntegrationTests/tests_wws.cpp @@ -174,7 +174,16 @@ namespace integration_tests /// static uint32_t GetMaxCycleTime() { - return static_cast (maxTimeSpanForSvcCycle.count()); + if (maxTimeSpanForSvcCycle.count() > 0) + { + /* In practice, measured time must be proportionally + augmented for adjustment (using field data), because + apparently the server takes longer to be available, + which is a little after WebServiceHost::Open returns... */ + return static_cast (maxTimeSpanForSvcCycle.count() * 4); + } + + return 500U; } /// diff --git a/MidlCompileRpcTestIDL.bat b/MidlCompileRpcTestIDL.bat index f60703e..4c008d1 100644 --- a/MidlCompileRpcTestIDL.bat +++ b/MidlCompileRpcTestIDL.bat @@ -4,6 +4,6 @@ midl /Oicf /osf /use_epv /win32 /client none /out IntegrationTests /h AcmeTestin midl /Oicf /osf /use_epv /amd64 /client none /out IntegrationTests /h AcmeTesting_x64.h /sstub AcmeTesting_x64_srv.c TestShared\AcmeTesting.idl -midl /Oicf /osf /use_epv /win32 /server none /out TestClient /h AcmeTesting_w32.h /cstub AcmeTesting_w32_cli.c TestShared\AcmeTesting.idl +midl /Oicf /osf /use_epv /win32 /server none /out TestRpcClient /h AcmeTesting_w32.h /cstub AcmeTesting_w32_cli.c TestShared\AcmeTesting.idl -midl /Oicf /osf /use_epv /amd64 /server none /out TestClient /h AcmeTesting_x64.h /cstub AcmeTesting_x64_cli.c TestShared\AcmeTesting.idl +midl /Oicf /osf /use_epv /amd64 /server none /out TestRpcClient /h AcmeTesting_x64.h /cstub AcmeTesting_x64_cli.c TestShared\AcmeTesting.idl diff --git a/TestClient/AcmeTesting_w32.h b/TestRpcClient/AcmeTesting_w32.h similarity index 100% rename from TestClient/AcmeTesting_w32.h rename to TestRpcClient/AcmeTesting_w32.h diff --git a/TestClient/AcmeTesting_w32_cli.c b/TestRpcClient/AcmeTesting_w32_cli.c similarity index 100% rename from TestClient/AcmeTesting_w32_cli.c rename to TestRpcClient/AcmeTesting_w32_cli.c diff --git a/TestClient/AcmeTesting_x64.h b/TestRpcClient/AcmeTesting_x64.h similarity index 100% rename from TestClient/AcmeTesting_x64.h rename to TestRpcClient/AcmeTesting_x64.h diff --git a/TestClient/AcmeTesting_x64_cli.c b/TestRpcClient/AcmeTesting_x64_cli.c similarity index 100% rename from TestClient/AcmeTesting_x64_cli.c rename to TestRpcClient/AcmeTesting_x64_cli.c diff --git a/TestClient/ReadMe.txt b/TestRpcClient/ReadMe.txt similarity index 82% rename from TestClient/ReadMe.txt rename to TestRpcClient/ReadMe.txt index 8caf316..b8e678f 100644 --- a/TestClient/ReadMe.txt +++ b/TestRpcClient/ReadMe.txt @@ -1,27 +1,27 @@ ======================================================================== - CONSOLE APPLICATION : TestClient Project Overview + CONSOLE APPLICATION : TestRpcClient Project Overview ======================================================================== -AppWizard has created this TestClient application for you. +AppWizard has created this TestRpcClient application for you. This file contains a summary of what you will find in each of the files that -make up your TestClient application. +make up your TestRpcClient application. -TestClient.vcxproj +TestRpcClient.vcxproj This is the main project file for VC++ projects generated using an Application Wizard. It contains information about the version of Visual C++ that generated the file, and information about the platforms, configurations, and project features selected with the Application Wizard. -TestClient.vcxproj.filters +TestRpcClient.vcxproj.filters This is the filters file for VC++ projects generated using an Application Wizard. It contains information about the association between the files in your project and the filters. This association is used in the IDE to show grouping of files with similar extensions under a specific node (for e.g. ".cpp" files are associated with the "Source Files" filter). -TestClient.cpp +TestRpcClient.cpp This is the main application source file. ///////////////////////////////////////////////////////////////////////////// @@ -29,7 +29,7 @@ Other standard files: StdAfx.h, StdAfx.cpp These files are used to build a precompiled header (PCH) file - named TestClient.pch and a precompiled types file named StdAfx.obj. + named TestRpcClient.pch and a precompiled types file named StdAfx.obj. ///////////////////////////////////////////////////////////////////////////// Other notes: diff --git a/TestClient/TestClient.cpp b/TestRpcClient/TestRpcClient.cpp similarity index 88% rename from TestClient/TestClient.cpp rename to TestRpcClient/TestRpcClient.cpp index 54d072a..4d602d5 100644 --- a/TestClient/TestClient.cpp +++ b/TestRpcClient/TestRpcClient.cpp @@ -1,4 +1,4 @@ -// TestClient.cpp : Defines the entry point for the console application. +// TestRpcClient.cpp : Defines the entry point for the console application. // #include "stdafx.h" @@ -9,7 +9,7 @@ int wmain(int argc, wchar_t *argv[]) { - std::cout << "Running main() from \'TestClient.cpp\'\n"; + std::cout << "Running main() from \'TestRpcClient.cpp\'\n"; testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } diff --git a/TestClient/TestClient.vcxproj b/TestRpcClient/TestRpcClient.vcxproj similarity index 95% rename from TestClient/TestClient.vcxproj rename to TestRpcClient/TestRpcClient.vcxproj index bc7902b..746925b 100644 --- a/TestClient/TestClient.vcxproj +++ b/TestRpcClient/TestRpcClient.vcxproj @@ -21,8 +21,9 @@ {6ADF3A4B-1E22-41BA-9293-96593E6A45BE} Win32Proj - TestClient + TestRpcClient 8.1 + TestRpcClient @@ -180,7 +181,6 @@ - @@ -203,21 +203,14 @@ NotUsing NotUsing - - NotUsing - NotUsing - NotUsing - NotUsing - Create Create Create Create - + - diff --git a/TestClient/TestClient.vcxproj.filters b/TestRpcClient/TestRpcClient.vcxproj.filters similarity index 87% rename from TestClient/TestClient.vcxproj.filters rename to TestRpcClient/TestRpcClient.vcxproj.filters index 09fb15d..592e0a2 100644 --- a/TestClient/TestClient.vcxproj.filters +++ b/TestRpcClient/TestRpcClient.vcxproj.filters @@ -36,17 +36,11 @@ Shared - - Header Files - Source Files - - Source Files - Source Files @@ -59,10 +53,7 @@ Shared - - Source Files - - + Source Files diff --git a/TestClient/application.config b/TestRpcClient/application.config similarity index 100% rename from TestClient/application.config rename to TestRpcClient/application.config diff --git a/TestClient/stdafx.cpp b/TestRpcClient/stdafx.cpp similarity index 81% rename from TestClient/stdafx.cpp rename to TestRpcClient/stdafx.cpp index efecb69..08c6e2f 100644 --- a/TestClient/stdafx.cpp +++ b/TestRpcClient/stdafx.cpp @@ -1,5 +1,5 @@ // stdafx.cpp : source file that includes just the standard includes -// TestClient.pch will be the pre-compiled header +// TestRpcClient.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" diff --git a/TestClient/stdafx.h b/TestRpcClient/stdafx.h similarity index 100% rename from TestClient/stdafx.h rename to TestRpcClient/stdafx.h diff --git a/TestClient/targetver.h b/TestRpcClient/targetver.h similarity index 100% rename from TestClient/targetver.h rename to TestRpcClient/targetver.h diff --git a/TestClient/tests_rpc.cpp b/TestRpcClient/tests_rpc.cpp similarity index 89% rename from TestClient/tests_rpc.cpp rename to TestRpcClient/tests_rpc.cpp index ae05e20..b6b3571 100644 --- a/TestClient/tests_rpc.cpp +++ b/TestRpcClient/tests_rpc.cpp @@ -144,6 +144,8 @@ namespace integration_tests auto timeout = client2.Shutdown(); + /* Awaits for the setup and start of the RPC server in the + next test, using data measured in the server side... */ std::this_thread::sleep_for(std::chrono::milliseconds(timeout)); } catch (...) @@ -221,6 +223,8 @@ namespace integration_tests auto timeout = client2.Shutdown(); + /* Awaits for the setup and start of the RPC server in the + next test, using data measured in the server side... */ std::this_thread::sleep_for(std::chrono::milliseconds(timeout)); } catch (...) @@ -244,27 +248,18 @@ namespace integration_tests AuthnTestOptions{ ProtocolSequence::Local, objectsUuidsImpl1[11], objectsUuidsImpl2[11], AuthenticationLevel::Privacy, AuthenticationSecurity::RequireMutualAuthn, ImpersonationLevel::Impersonate } */ /*, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[5], objectsUuidsImpl2[5], AuthenticationLevel::Integrity, AuthenticationSecurity::NTLM, ImpersonationLevel::Impersonate }, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[6], objectsUuidsImpl2[6], AuthenticationLevel::Privacy, AuthenticationSecurity::NTLM, ImpersonationLevel::Impersonate }, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[7], objectsUuidsImpl2[7], AuthenticationLevel::Integrity, AuthenticationSecurity::TryKerberos, ImpersonationLevel::Impersonate }, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[8], objectsUuidsImpl2[8], AuthenticationLevel::Privacy, AuthenticationSecurity::TryKerberos, ImpersonationLevel::Impersonate } + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[6], objectsUuidsImpl2[6], AuthenticationLevel::Integrity, AuthenticationSecurity::NTLM, ImpersonationLevel::Impersonate }, + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[7], objectsUuidsImpl2[7], AuthenticationLevel::Privacy, AuthenticationSecurity::NTLM, ImpersonationLevel::Impersonate }, + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[8], objectsUuidsImpl2[8], AuthenticationLevel::Integrity, AuthenticationSecurity::TryKerberos, ImpersonationLevel::Impersonate }, + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[9], objectsUuidsImpl2[9], AuthenticationLevel::Privacy, AuthenticationSecurity::TryKerberos, ImpersonationLevel::Impersonate } */ /*, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[9], objectsUuidsImpl2[9], AuthenticationLevel::Integrity, AuthenticationSecurity::RequireMutualAuthn, ImpersonationLevel::Impersonate }, - AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[10], objectsUuidsImpl2[10], AuthenticationLevel::Privacy, AuthenticationSecurity::RequireMutualAuthn, ImpersonationLevel::Impersonate } + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[10], objectsUuidsImpl2[10], AuthenticationLevel::Integrity, AuthenticationSecurity::RequireMutualAuthn, ImpersonationLevel::Impersonate }, + AuthnTestOptions{ ProtocolSequence::TCP, objectsUuidsImpl1[11], objectsUuidsImpl2[11], AuthenticationLevel::Privacy, AuthenticationSecurity::RequireMutualAuthn, ImpersonationLevel::Impersonate } */ ) ); - // The set of options for each test template instantiation - struct SchannelTestOptions - { - const char *objectUUID1; - const char *objectUUID2; - AuthenticationLevel authenticationLevel; - bool useStrongSec; - }; - /// /// Test case for RPC client with SCHANNEL authentication. /// @@ -322,6 +317,8 @@ namespace integration_tests auto timeout = client2.Shutdown(); + /* Awaits for the setup and start of the RPC server in the + next test, using data measured in the server side... */ std::this_thread::sleep_for(std::chrono::milliseconds(timeout)); } catch (...) @@ -330,17 +327,11 @@ namespace integration_tests } } - /* Implementation of test template takes care of switching - protocol sequences and authentication level: */ + // Implementation of test template takes care of switching parameters: INSTANTIATE_TEST_CASE_P( SwitchProtAndAuthLevel, Framework_RpcSchannel_TestCase, - ::testing::Values( - SchannelTestOptions{ objectsUuidsImpl1[12], objectsUuidsImpl2[12], AuthenticationLevel::Privacy, false }, - SchannelTestOptions{ objectsUuidsImpl1[13], objectsUuidsImpl2[13], AuthenticationLevel::Privacy, true }, - SchannelTestOptions{ objectsUuidsImpl1[14], objectsUuidsImpl2[14], AuthenticationLevel::Integrity, false }, - SchannelTestOptions{ objectsUuidsImpl1[15], objectsUuidsImpl2[15], AuthenticationLevel::Integrity, true } - ) + paramsForSchannelTests // shared by both client & server side ); }// end of namespace integration_tests diff --git a/IntegrationTests/calculator.wsdl b/TestShared/calculator.wsdl similarity index 100% rename from IntegrationTests/calculator.wsdl rename to TestShared/calculator.wsdl diff --git a/TestShared/rpc_test_shared.cpp b/TestShared/rpc_test_shared.cpp index 5628667..6e14c45 100644 --- a/TestShared/rpc_test_shared.cpp +++ b/TestShared/rpc_test_shared.cpp @@ -2,7 +2,7 @@ namespace _3fd { -namespace rpc +namespace integration_tests { const std::array objectsUuidsImpl1 = { @@ -52,5 +52,5 @@ namespace rpc "97273BD4-45CB-47B4-B03A-6C3597EB8F86" }; -}// end of namespace rpc +}// end of namespace integration_tests }// end of namespace _3fd \ No newline at end of file diff --git a/TestShared/rpc_test_shared.h b/TestShared/rpc_test_shared.h index 765b009..0293ad9 100644 --- a/TestShared/rpc_test_shared.h +++ b/TestShared/rpc_test_shared.h @@ -1,25 +1,46 @@ #ifndef RPC_TEST_SHARED_H // header guard #define RPC_TEST_SHARED_H +#include "rpc_helpers.h" +#include #include namespace _3fd { - namespace rpc +namespace integration_tests +{ + /* In this implementation: + Operate(left, right) = left * right + ChangeCase(input) = toUpper(input) + */ + extern const std::array objectsUuidsImpl1; + + /* In this implementation: + Operate(left, right) = left + right + ChangeCase(input) = toLower(input) + */ + extern const std::array objectsUuidsImpl2; + + /// + /// A set of options to be used as variable parameters of test cases + /// for RPC module with Schannel SSP in both server & client sides. + /// + struct SchannelTestOptions { - /* In this implementation: - Operate(left, right) = left * right - ChangeCase(input) = toUpper(input) - */ - extern const std::array objectsUuidsImpl1; + const char *objectUUID1; + const char *objectUUID2; + rpc::AuthenticationLevel authenticationLevel; + bool useStrongSec; + }; - /* In this implementation: - Operate(left, right) = left + right - ChangeCase(input) = toLower(input) - */ - extern const std::array objectsUuidsImpl2; + const auto paramsForSchannelTests = ::testing::Values( + SchannelTestOptions{ objectsUuidsImpl1[16], objectsUuidsImpl2[16], rpc::AuthenticationLevel::Privacy, false }, + SchannelTestOptions{ objectsUuidsImpl1[17], objectsUuidsImpl2[17], rpc::AuthenticationLevel::Privacy, true }, + SchannelTestOptions{ objectsUuidsImpl1[18], objectsUuidsImpl2[18], rpc::AuthenticationLevel::Integrity, false }, + SchannelTestOptions{ objectsUuidsImpl1[19], objectsUuidsImpl2[19], rpc::AuthenticationLevel::Integrity, true } + ); - }// end of namespace rpc +}// end of namespace integration_tests }// end of namespace _3fd #endif // end of header guard diff --git a/TestWwsClient/ReadMe.txt b/TestWwsClient/ReadMe.txt new file mode 100644 index 0000000..7ed8edb --- /dev/null +++ b/TestWwsClient/ReadMe.txt @@ -0,0 +1,40 @@ +======================================================================== + CONSOLE APPLICATION : TestWwsClient Project Overview +======================================================================== + +AppWizard has created this TestWwsClient application for you. + +This file contains a summary of what you will find in each of the files that +make up your TestWwsClient application. + + +TestWwsClient.vcxproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +TestWwsClient.vcxproj.filters + This is the filters file for VC++ projects generated using an Application Wizard. + It contains information about the association between the files in your project + and the filters. This association is used in the IDE to show grouping of files with + similar extensions under a specific node (for e.g. ".cpp" files are associated with the + "Source Files" filter). + +TestWwsClient.cpp + This is the main application source file. + +///////////////////////////////////////////////////////////////////////////// +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named TestWwsClient.pch and a precompiled types file named StdAfx.obj. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/TestWwsClient/TestWwsClient.cpp b/TestWwsClient/TestWwsClient.cpp new file mode 100644 index 0000000..99df39b --- /dev/null +++ b/TestWwsClient/TestWwsClient.cpp @@ -0,0 +1,50 @@ +// TestWwsClient.cpp : Defines the entry point for the console application. +// + +#include "stdafx.h" +#include "exceptions.h" +#include "logger.h" +#include +#include + +int wmain(int argc, wchar_t *argv[]) +{ + std::cout << "Running main() from \'TestWwsClient.cpp\'\n"; + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + +namespace _3fd +{ + namespace integration_tests + { + using namespace _3fd::core; + + /// + /// Handles several types of exception. + /// + void HandleException() + { + try + { + throw; + } + catch (IAppException &appEx) + { + //std::cerr << appEx.ToString() << std::endl; + core::Logger::Write(appEx, core::Logger::PRIO_ERROR); + } + catch (std::exception &stdEx) + { + std::cerr << stdEx.what() << std::endl; + } + catch (...) + { + std::cerr << "An unexpected exception has been caught." << std::endl; + } + + FAIL(); + } + + }// end of namespace integration_tests +}// end of namespace _3fd diff --git a/TestWwsClient/TestWwsClient.vcxproj b/TestWwsClient/TestWwsClient.vcxproj new file mode 100644 index 0000000..5541090 --- /dev/null +++ b/TestWwsClient/TestWwsClient.vcxproj @@ -0,0 +1,210 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {4913E097-136E-4BC4-BF8C-D3341FB1425A} + Win32Proj + TestWwsClient + 8.1 + + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + $(BOOST_HOME);$(POCO_ROOT)\Foundation\include;$(POCO_ROOT)\XML\include;$(POCO_ROOT)\Util\include;C:\Program Files (x86)\Visual Leak Detector\include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + $(BOOST_HOME)\stage\lib\desktop\Win32;$(POCO_ROOT)\lib;C:\Program Files (x86)\Visual Leak Detector\lib\Win32;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86 + + + true + $(BOOST_HOME);$(POCO_ROOT)\Foundation\include;$(POCO_ROOT)\XML\include;$(POCO_ROOT)\Util\include;C:\Program Files (x86)\Visual Leak Detector\include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + $(BOOST_HOME)\stage\lib\desktop\x64;$(POCO_ROOT)\lib64;C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64 + + + false + $(BOOST_HOME);$(POCO_ROOT)\Foundation\include;$(POCO_ROOT)\XML\include;$(POCO_ROOT)\Util\include;C:\Program Files (x86)\Visual Leak Detector\include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + $(BOOST_HOME)\stage\lib\desktop\Win32;$(POCO_ROOT)\lib;C:\Program Files (x86)\Visual Leak Detector\lib\Win32;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86 + + + false + $(BOOST_HOME);$(POCO_ROOT)\Foundation\include;$(POCO_ROOT)\XML\include;$(POCO_ROOT)\Util\include;C:\Program Files (x86)\Visual Leak Detector\include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + $(BOOST_HOME)\stage\lib\desktop\x64;$(POCO_ROOT)\lib64;C:\Program Files (x86)\Visual Leak Detector\lib\Win64;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64 + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)3FD;$(SolutionDir)TestShared;$(SolutionDir)gtest\include + /D POCO_STATIC %(AdditionalOptions) + + + Console + true + + + copy "$(ProjectDir)application.config" "$(TargetPath).3fd.config" + + + + + Use + Level3 + Disabled + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)3FD;$(SolutionDir)TestShared;$(SolutionDir)gtest\include + /D POCO_STATIC %(AdditionalOptions) + + + Console + true + + + copy "$(ProjectDir)application.config" "$(TargetPath).3fd.config" + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)3FD;$(SolutionDir)TestShared;$(SolutionDir)gtest\include + /D POCO_STATIC %(AdditionalOptions) + + + Console + true + true + true + + + copy "$(ProjectDir)application.config" "$(TargetPath).3fd.config" + + + + + Level3 + Use + MaxSpeed + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)3FD;$(SolutionDir)TestShared;$(SolutionDir)gtest\include + /D POCO_STATIC %(AdditionalOptions) + + + Console + true + true + true + + + copy "$(ProjectDir)application.config" "$(TargetPath).3fd.config" + + + + + + + + + + + + + NotUsing + NotUsing + NotUsing + NotUsing + + + Create + Create + Create + Create + + + + + + + + + + {ccc4a0a2-15fd-4a6e-ac6c-094aaaaec80b} + + + {c8f6c172-56f2-4e76-b5fa-c3b423b31be8} + + + + + + \ No newline at end of file diff --git a/TestWwsClient/TestWwsClient.vcxproj.filters b/TestWwsClient/TestWwsClient.vcxproj.filters new file mode 100644 index 0000000..7f02fd4 --- /dev/null +++ b/TestWwsClient/TestWwsClient.vcxproj.filters @@ -0,0 +1,50 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/TestWwsClient/application.config b/TestWwsClient/application.config new file mode 100644 index 0000000..1a8f8a3 --- /dev/null +++ b/TestWwsClient/application.config @@ -0,0 +1,47 @@ + + + + + + false + 10 + + 30 + + 1024 + + + + + true + + + + 64 + + + 100 + + 128 + 1.0 + + + 8 + + 0.7 + + + + 128 + 5120 + + + true + + + + + + diff --git a/TestClient/calculator.wsdl.c b/TestWwsClient/calculator.wsdl.c similarity index 100% rename from TestClient/calculator.wsdl.c rename to TestWwsClient/calculator.wsdl.c diff --git a/TestClient/calculator.wsdl.h b/TestWwsClient/calculator.wsdl.h similarity index 100% rename from TestClient/calculator.wsdl.h rename to TestWwsClient/calculator.wsdl.h diff --git a/TestWwsClient/stdafx.cpp b/TestWwsClient/stdafx.cpp new file mode 100644 index 0000000..a6b0469 --- /dev/null +++ b/TestWwsClient/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// TestWwsClient.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/TestWwsClient/stdafx.h b/TestWwsClient/stdafx.h new file mode 100644 index 0000000..81cf32b --- /dev/null +++ b/TestWwsClient/stdafx.h @@ -0,0 +1,16 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#include +#include + + + +// TODO: reference additional headers your program requires here +#include \ No newline at end of file diff --git a/TestWwsClient/targetver.h b/TestWwsClient/targetver.h new file mode 100644 index 0000000..87c0086 --- /dev/null +++ b/TestWwsClient/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/TestClient/tests_wws.cpp b/TestWwsClient/tests_wws.cpp similarity index 100% rename from TestClient/tests_wws.cpp rename to TestWwsClient/tests_wws.cpp diff --git a/WsutilCompileWwsTestWsdl.bat b/WsutilCompileWwsTestWsdl.bat index 6793a1d..9ef88e0 100644 --- a/WsutilCompileWwsTestWsdl.bat +++ b/WsutilCompileWwsTestWsdl.bat @@ -1,9 +1,9 @@ call "%VS140COMNTOOLS%\VsDevCmd.bat" cd IntegrationTests -wsutil /noclient /wsdl:calculator.wsdl +wsutil /noclient /wsdl:..\TestShared\calculator.wsdl -cd ..\TestClient -wsutil /noservice /wsdl:..\IntegrationTests\calculator.wsdl +cd ..\TestWwsClient +wsutil /noservice /wsdl:..\TestShared\calculator.wsdl cd .. \ No newline at end of file