diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/src/IceGrid/DescriptorBuilder.cpp | 6 | ||||
-rw-r--r-- | cpp/src/IceGrid/DescriptorHelper.cpp | 27 | ||||
-rw-r--r-- | cpp/test/IceGrid/deployer/AllTests.cpp | 34 |
3 files changed, 63 insertions, 4 deletions
diff --git a/cpp/src/IceGrid/DescriptorBuilder.cpp b/cpp/src/IceGrid/DescriptorBuilder.cpp index 44be7f678ef..c10abbe9acb 100644 --- a/cpp/src/IceGrid/DescriptorBuilder.cpp +++ b/cpp/src/IceGrid/DescriptorBuilder.cpp @@ -495,6 +495,12 @@ TemplateDescriptorBuilder::TemplateDescriptorBuilder(ApplicationDescriptorBuilde void TemplateDescriptorBuilder::addParameter(const XmlAttributesHelper& attrs) { + if(find(_descriptor.parameters.begin(), _descriptor.parameters.end(), attrs("name")) != + _descriptor.parameters.end()) + { + throw "duplicate parameter `" + attrs("name") + "'"; + } + _descriptor.parameters.push_back(attrs("name")); if(attrs.contains("default")) { diff --git a/cpp/src/IceGrid/DescriptorHelper.cpp b/cpp/src/IceGrid/DescriptorHelper.cpp index 031d9b15a71..e897cd56d74 100644 --- a/cpp/src/IceGrid/DescriptorHelper.cpp +++ b/cpp/src/IceGrid/DescriptorHelper.cpp @@ -302,7 +302,19 @@ Resolver::Resolver(const ApplicationDescriptor& app, const Ice::CommunicatorPtr& } if(!t->second.descriptor) { - exception("invalid server template: server definition is empty"); + exception("invalid server template `" + t->first + "': server definition is empty"); + } + + Ice::StringSeq params = t->second.parameters; + sort(params.begin(), params.end()); + Ice::StringSeq wdups = params; + Ice::StringSeq dups; + set_difference(wdups.begin(), wdups.end(), params.begin(), unique(params.begin(), params.end()), + back_inserter(dups)); + if(!dups.empty()) + { + dups.erase(unique(dups.begin(), dups.end()), dups.end()); + exception("invalid server template `" + t->first + "': duplicate parameters " + toString(dups)); } } for(t = _application->serviceTemplates.begin(); t != _application->serviceTemplates.end(); ++t) @@ -313,7 +325,18 @@ Resolver::Resolver(const ApplicationDescriptor& app, const Ice::CommunicatorPtr& } if(!t->second.descriptor) { - exception("invalid service template: service definition is empty"); + exception("invalid service template `" + t->first + "': service definition is empty"); + } + Ice::StringSeq params = t->second.parameters; + sort(params.begin(), params.end()); + Ice::StringSeq wdups = params; + Ice::StringSeq dups; + set_difference(wdups.begin(), wdups.end(), params.begin(), unique(params.begin(), params.end()), + back_inserter(dups)); + if(!dups.empty()) + { + dups.erase(unique(dups.begin(), dups.end()), dups.end()); + exception("invalid server template `" + t->first + "': duplicate parameters " + toString(dups)); } } } diff --git a/cpp/test/IceGrid/deployer/AllTests.cpp b/cpp/test/IceGrid/deployer/AllTests.cpp index a33d10487fa..bbefc798469 100644 --- a/cpp/test/IceGrid/deployer/AllTests.cpp +++ b/cpp/test/IceGrid/deployer/AllTests.cpp @@ -92,8 +92,7 @@ typedef IceUtil::Handle<SessionKeepAliveThread> SessionKeepAliveThreadPtr; void allTests(const Ice::CommunicatorPtr& comm) { - RegistryPrx registry = IceGrid::RegistryPrx::checkedCast( - comm->stringToProxy("IceGrid/Registry")); + RegistryPrx registry = IceGrid::RegistryPrx::checkedCast(comm->stringToProxy("IceGrid/Registry")); test(registry); AdminSessionPrx session = registry->createAdminSession("foo", "bar"); @@ -349,6 +348,37 @@ allTests(const Ice::CommunicatorPtr& comm) cout << "ok" << endl; + cout << "testing validation... " << flush; + TemplateDescriptor templ; + templ.parameters.push_back("name"); + templ.parameters.push_back("nam3"); + templ.parameters.push_back("nam2"); + templ.parameters.push_back("nam3"); + templ.descriptor = new ServerDescriptor(); + ServerDescriptorPtr server = ServerDescriptorPtr::dynamicCast(templ.descriptor); + server->id = "test"; + server->exe = "${test.dir}/server"; + ApplicationDescriptor desc; + desc.name = "App"; + desc.serverTemplates["ServerTemplate"] = templ; + try + { + session->startUpdate(); + admin->addApplication(desc); + session->finishUpdate(); + test(false); + } + catch(const DeploymentException& ex) + { + test(ex.reason.find("duplicate parameters") != string::npos); + } + catch(const Ice::Exception& ex) + { + cerr << ex << endl; + test(false); + } + cout << "ok" << endl; + keepAlive->destroy(); keepAlive->getThreadControl().join(); keepAlive = 0; |