summaryrefslogtreecommitdiff
path: root/cpp/test
diff options
context:
space:
mode:
authorJoe George <joe@zeroc.com>2020-07-07 16:57:51 -0400
committerGitHub <noreply@github.com>2020-07-07 16:57:51 -0400
commit6c0e7e6fcabde691e7c38a814b6171f9f4e77d09 (patch)
treeaed41fdff6561e134c73da214e580be0910e6f6a /cpp/test
parentCopy python dependencies to the extension directory - Close #926 (#927) (diff)
downloadice-6c0e7e6fcabde691e7c38a814b6171f9f4e77d09.tar.bz2
ice-6c0e7e6fcabde691e7c38a814b6171f9f4e77d09.tar.xz
ice-6c0e7e6fcabde691e7c38a814b6171f9f4e77d09.zip
Add class cycle detection during unmarshaling (#946)
Add support for detection of class cycles during unmarshaling in languages which do no have garbage collection: C++, Swift, and Objective-C. A `MarshalException` is thrown when a cycle is detected. The property `Ice.AcceptClassCycles` can be set to a value greater than `0` to change this behavior.
Diffstat (limited to 'cpp/test')
-rw-r--r--cpp/test/Ice/objects/AllTests.cpp20
-rw-r--r--cpp/test/Ice/objects/Client.cpp2
-rw-r--r--cpp/test/Ice/objects/Collocated.cpp1
-rw-r--r--cpp/test/Ice/objects/Test.ice3
-rw-r--r--cpp/test/Ice/objects/TestI.cpp14
-rw-r--r--cpp/test/Ice/objects/TestI.h3
-rw-r--r--cpp/test/Ice/optional/AllTests.cpp1
-rw-r--r--cpp/test/Ice/optional/Client.cpp1
-rw-r--r--cpp/test/Ice/optional/Server.cpp1
-rw-r--r--cpp/test/Ice/optional/ServerAMD.cpp1
-rw-r--r--cpp/test/Ice/slicing/objects/Client.cpp1
-rw-r--r--cpp/test/Ice/slicing/objects/Server.cpp1
-rw-r--r--cpp/test/Ice/slicing/objects/ServerAMD.cpp1
-rw-r--r--cpp/test/Ice/stream/Client.cpp4
14 files changed, 52 insertions, 2 deletions
diff --git a/cpp/test/Ice/objects/AllTests.cpp b/cpp/test/Ice/objects/AllTests.cpp
index 65134a2c49e..c84b73d51a9 100644
--- a/cpp/test/Ice/objects/AllTests.cpp
+++ b/cpp/test/Ice/objects/AllTests.cpp
@@ -604,5 +604,25 @@ allTests(Test::TestHelper* helper)
}
cout << "ok" << endl;
+ cout << "testing sending class cycle... " << flush;
+ {
+ RecursivePtr rec = ICE_MAKE_SHARED(Recursive);
+ rec->v = rec;
+ bool acceptsCycles = initial->acceptsClassCycles();
+ try
+ {
+ initial->setCycle(rec);
+ test(acceptsCycles);
+ }
+ catch(const Ice::UnknownLocalException&)
+ {
+ // expected when the remote server does not accept cycles
+ // and throws a MarshalException
+ test(!acceptsCycles);
+ }
+ rec->v = ICE_NULLPTR;
+ }
+ cout << "ok" << endl;
+
return initial;
}
diff --git a/cpp/test/Ice/objects/Client.cpp b/cpp/test/Ice/objects/Client.cpp
index 4d5dc868b83..a27c51e17f6 100644
--- a/cpp/test/Ice/objects/Client.cpp
+++ b/cpp/test/Ice/objects/Client.cpp
@@ -118,7 +118,7 @@ void
Client::run(int argc, char** argv)
{
Ice::PropertiesPtr properties = createTestProperties(argc, argv);
-
+ properties->setProperty("Ice.AcceptClassCycles", "1");
#ifndef ICE_CPP11_MAPPING
properties->setProperty("Ice.CollectObjects", "1");
#endif
diff --git a/cpp/test/Ice/objects/Collocated.cpp b/cpp/test/Ice/objects/Collocated.cpp
index eb4434fbe39..0633cfa5d13 100644
--- a/cpp/test/Ice/objects/Collocated.cpp
+++ b/cpp/test/Ice/objects/Collocated.cpp
@@ -110,6 +110,7 @@ void
Collocated::run(int argc, char** argv)
{
Ice::PropertiesPtr properties = createTestProperties(argc, argv);
+ properties->setProperty("Ice.AcceptClassCycles", "1");
#ifndef ICE_CPP11_MAPPING
properties->setProperty("Ice.CollectObjects", "1");
#endif
diff --git a/cpp/test/Ice/objects/Test.ice b/cpp/test/Ice/objects/Test.ice
index 38214e39951..a89b9beb0e8 100644
--- a/cpp/test/Ice/objects/Test.ice
+++ b/cpp/test/Ice/objects/Test.ice
@@ -222,6 +222,9 @@ interface Initial
void setRecursive(Recursive p);
bool supportsClassGraphDepthMax();
+ void setCycle(Recursive r);
+ bool acceptsClassCycles();
+
["marshaled-result"] B getMB();
["amd", "marshaled-result"] B getAMDMB();
diff --git a/cpp/test/Ice/objects/TestI.cpp b/cpp/test/Ice/objects/TestI.cpp
index 9cfd4c395eb..abf4154e59e 100644
--- a/cpp/test/Ice/objects/TestI.cpp
+++ b/cpp/test/Ice/objects/TestI.cpp
@@ -187,6 +187,20 @@ InitialI::supportsClassGraphDepthMax(const Ice::Current&)
return true;
}
+void
+InitialI::setCycle(ICE_IN(RecursivePtr) r, const Ice::Current&)
+{
+ // break the cycle
+ assert(r);
+ r->v = ICE_NULLPTR;
+}
+
+bool
+InitialI::acceptsClassCycles(const Ice::Current& c)
+{
+ return c.adapter->getCommunicator()->getProperties()->getPropertyAsInt("Ice.AcceptClassCycles") > 0;
+}
+
#ifdef ICE_CPP11_MAPPING
InitialI::GetMBMarshaledResult
InitialI::getMB(const Ice::Current& current)
diff --git a/cpp/test/Ice/objects/TestI.h b/cpp/test/Ice/objects/TestI.h
index 3b265a19664..78874dbb91b 100644
--- a/cpp/test/Ice/objects/TestI.h
+++ b/cpp/test/Ice/objects/TestI.h
@@ -93,6 +93,9 @@ public:
virtual void setRecursive(ICE_IN(Test::RecursivePtr), const Ice::Current&);
virtual bool supportsClassGraphDepthMax(const Ice::Current&);
+ virtual void setCycle(ICE_IN(Test::RecursivePtr), const Ice::Current&);
+ virtual bool acceptsClassCycles(const Ice::Current&);
+
#ifdef ICE_CPP11_MAPPING
virtual GetMBMarshaledResult getMB(const Ice::Current&);
virtual void getAMDMBAsync(std::function<void(const GetAMDMBMarshaledResult&)>,
diff --git a/cpp/test/Ice/optional/AllTests.cpp b/cpp/test/Ice/optional/AllTests.cpp
index 7b00e0a421c..369d2228cc6 100644
--- a/cpp/test/Ice/optional/AllTests.cpp
+++ b/cpp/test/Ice/optional/AllTests.cpp
@@ -587,6 +587,7 @@ allTests(Test::TestHelper* helper, bool)
mo1->k = mo1;
MultiOptionalPtr mo5 = ICE_DYNAMIC_CAST(MultiOptional, initial->pingPong(mo1));
+
test(mo5->a == mo1->a);
test(mo5->b == mo1->b);
test(mo5->c == mo1->c);
diff --git a/cpp/test/Ice/optional/Client.cpp b/cpp/test/Ice/optional/Client.cpp
index 1f2bb2edb45..4806e2f02cf 100644
--- a/cpp/test/Ice/optional/Client.cpp
+++ b/cpp/test/Ice/optional/Client.cpp
@@ -20,6 +20,7 @@ void
Client::run(int argc, char** argv)
{
Ice::PropertiesPtr properties = createTestProperties(argc, argv);
+ properties->setProperty("Ice.AcceptClassCycles", "1");
#ifndef ICE_CPP11_MAPPING
properties->setProperty("Ice.CollectObjects", "1");
#endif
diff --git a/cpp/test/Ice/optional/Server.cpp b/cpp/test/Ice/optional/Server.cpp
index f526d0355d9..a84d6694b7e 100644
--- a/cpp/test/Ice/optional/Server.cpp
+++ b/cpp/test/Ice/optional/Server.cpp
@@ -20,6 +20,7 @@ void
Server::run(int argc, char** argv)
{
Ice::PropertiesPtr properties = createTestProperties(argc, argv);
+ properties->setProperty("Ice.AcceptClassCycles", "1");
#ifndef ICE_CPP11_MAPPING
properties->setProperty("Ice.CollectObjects", "1");
#endif
diff --git a/cpp/test/Ice/optional/ServerAMD.cpp b/cpp/test/Ice/optional/ServerAMD.cpp
index bdc012694ce..f9d16fed20f 100644
--- a/cpp/test/Ice/optional/ServerAMD.cpp
+++ b/cpp/test/Ice/optional/ServerAMD.cpp
@@ -19,6 +19,7 @@ void
ServerAMD::run(int argc, char** argv)
{
Ice::PropertiesPtr properties = createTestProperties(argc, argv);
+ properties->setProperty("Ice.AcceptClassCycles", "1");
#ifndef ICE_CPP11_MAPPING
properties->setProperty("Ice.CollectObjects", "1");
#endif
diff --git a/cpp/test/Ice/slicing/objects/Client.cpp b/cpp/test/Ice/slicing/objects/Client.cpp
index 537d7e9d216..b9f217e495d 100644
--- a/cpp/test/Ice/slicing/objects/Client.cpp
+++ b/cpp/test/Ice/slicing/objects/Client.cpp
@@ -23,6 +23,7 @@ Client::run(int argc, char** argv)
//
// For this test, we enable object collection.
//
+ properties->setProperty("Ice.AcceptClassCycles", "1");
properties->setProperty("Ice.CollectObjects", "1");
Ice::CommunicatorHolder communicator = initialize(argc, argv, properties);
diff --git a/cpp/test/Ice/slicing/objects/Server.cpp b/cpp/test/Ice/slicing/objects/Server.cpp
index f1cd93e6ae3..b7ca13be31b 100644
--- a/cpp/test/Ice/slicing/objects/Server.cpp
+++ b/cpp/test/Ice/slicing/objects/Server.cpp
@@ -19,6 +19,7 @@ void
Server::run(int argc, char** argv)
{
Ice::PropertiesPtr properties = createTestProperties(argc, argv);
+ properties->setProperty("Ice.AcceptClassCycles", "1");
#ifndef ICE_CPP11_MAPPING
properties->setProperty("Ice.CollectObjects", "1");
#endif
diff --git a/cpp/test/Ice/slicing/objects/ServerAMD.cpp b/cpp/test/Ice/slicing/objects/ServerAMD.cpp
index ab4df8a0f5e..e7e60f6998f 100644
--- a/cpp/test/Ice/slicing/objects/ServerAMD.cpp
+++ b/cpp/test/Ice/slicing/objects/ServerAMD.cpp
@@ -19,6 +19,7 @@ void
ServerAMD::run(int argc, char** argv)
{
Ice::PropertiesPtr properties = createTestProperties(argc, argv);
+ properties->setProperty("Ice.AcceptClassCycles", "1");
#ifndef ICE_CPP11_MAPPING
properties->setProperty("Ice.CollectObjects", "1");
#endif
diff --git a/cpp/test/Ice/stream/Client.cpp b/cpp/test/Ice/stream/Client.cpp
index 23a2be692df..879b93ffb61 100644
--- a/cpp/test/Ice/stream/Client.cpp
+++ b/cpp/test/Ice/stream/Client.cpp
@@ -1365,7 +1365,9 @@ public:
void
Client::run(int argc, char** argv)
{
- Ice::CommunicatorHolder communicator = initialize(argc, argv);
+ Ice::PropertiesPtr properties = createTestProperties(argc, argv);
+ properties->setProperty("Ice.AcceptClassCycles", "1");
+ Ice::CommunicatorHolder communicator = initialize(argc, argv, properties);
void allTests(Test::TestHelper*);
allTests(this);
}