int run(int, char**, const Ice::CommunicatorPtr& communicator) { InitialPrx allTests(const Ice::CommunicatorPtr&); InitialPrx initial = allTests(communicator); initial->shutdown(); return EXIT_SUCCESS; }
int run(int, char**, const Ice::CommunicatorPtr& communicator) { Ice::ObjectFactoryPtr factory = new MyObjectFactory; communicator->addObjectFactory(factory, "::Test::B"); communicator->addObjectFactory(factory, "::Test::C"); communicator->addObjectFactory(factory, "::Test::D"); communicator->addObjectFactory(factory, "::Test::E"); communicator->addObjectFactory(factory, "::Test::F"); communicator->addObjectFactory(factory, "::Test::I"); communicator->addObjectFactory(factory, "::Test::J"); communicator->addObjectFactory(factory, "::Test::H"); InitialPrx allTests(const Ice::CommunicatorPtr&); InitialPrx initial = allTests(communicator); initial->shutdown(); return EXIT_SUCCESS; }
InitialPrx allTests(const Ice::CommunicatorPtr& communicator) { cout << "testing stringToProxy... " << flush; string ref = "initial:default -p 12010"; Ice::ObjectPrx base = communicator->stringToProxy(ref); test(base); cout << "ok" << endl; cout << "testing checked cast... " << flush; InitialPrx initial = InitialPrx::checkedCast(base); test(initial); test(initial == base); cout << "ok" << endl; cout << "testing constructor, copy constructor, and assignment operator... " << flush; BasePtr ba1 = new Base; test(ba1->theS.str == ""); test(ba1->str == ""); S s; s.str = "hello"; BasePtr ba2 = new Base(s, "hi"); test(ba2->theS.str == "hello"); test(ba2->str == "hi"); *ba1 = *ba2; test(ba1->theS.str == "hello"); test(ba1->str == "hi"); BasePtr bp1 = new Base(); *bp1 = *ba2; test(bp1->theS.str == "hello"); test(bp1->str == "hi"); cout << "ok" << endl; cout << "testing ice_clone..." << flush; BasePtr bp2 = BasePtr::dynamicCast(bp1->ice_clone()); test(bp1->theS.str == bp2->theS.str); test(bp1->str == bp2->str); AbstractBasePtr abp1 = new AbstractBaseI; try { abp1->ice_clone(); test(false); } catch(const Ice::CloneNotImplementedException&) { } cout << "ok" << endl; cout << "getting B1... " << flush; BPtr b1 = initial->getB1(); test(b1); cout << "ok" << endl; cout << "getting B2... " << flush; BPtr b2 = initial->getB2(); test(b2); cout << "ok" << endl; cout << "getting C... " << flush; CPtr c = initial->getC(); test(c); cout << "ok" << endl; cout << "getting D... " << flush; DPtr d = initial->getD(); test(d); cout << "ok" << endl; cout << "checking consistency... " << flush; test(b1 != b2); test(b1 != c); test(b1 != d); test(b2 != c); test(b2 != d); test(c != d); test(b1->theB == b1); test(b1->theC == 0); test(BPtr::dynamicCast(b1->theA)); test(BPtr::dynamicCast(b1->theA)->theA == b1->theA); test(BPtr::dynamicCast(b1->theA)->theB == b1); test(CPtr::dynamicCast(BPtr::dynamicCast(b1->theA)->theC)); test(CPtr::dynamicCast(BPtr::dynamicCast(b1->theA)->theC)->theB == b1->theA); test(b1->preMarshalInvoked); test(b1->postUnmarshalInvoked()); test(b1->theA->preMarshalInvoked); test(b1->theA->postUnmarshalInvoked()); test(BPtr::dynamicCast(b1->theA)->theC->preMarshalInvoked); test(BPtr::dynamicCast(b1->theA)->theC->postUnmarshalInvoked()); // More tests possible for b2 and d, but I think this is already sufficient. test(b2->theA == b2); test(d->theC == 0); cout << "ok" << endl; cout << "getting B1, B2, C, and D all at once... " << flush; initial->getAll(b1, b2, c, d); test(b1); test(b2); test(c); test(d); cout << "ok" << endl; cout << "checking consistency... " << flush; test(b1 != b2); test(b1 != c); test(b1 != d); test(b2 != c); test(b2 != d); test(c != d); test(b1->theA == b2); test(b1->theB == b1); test(b1->theC == 0); test(b2->theA == b2); test(b2->theB == b1); test(b2->theC == c); test(c->theB == b2); test(d->theA == b1); test(d->theB == b2); test(d->theC == 0); test(d->preMarshalInvoked); test(d->postUnmarshalInvoked()); test(d->theA->preMarshalInvoked); test(d->theA->postUnmarshalInvoked()); test(d->theB->preMarshalInvoked); test(d->theB->postUnmarshalInvoked()); test(d->theB->theC->preMarshalInvoked); test(d->theB->theC->postUnmarshalInvoked()); cout << "ok" << endl; cout << "testing protected members... " << flush; EPtr e = initial->getE(); test(e->checkValues()); FPtr f = initial->getF(); test(f->checkValues()); test(f->e2->checkValues()); cout << "ok" << endl; cout << "getting I, J and H... " << flush; IPtr i = initial->getI(); test(i); IPtr j = initial->getJ(); test(j && JPtr::dynamicCast(j)); IPtr h = initial->getH(); test(h && HPtr::dynamicCast(h)); cout << "ok" << endl; cout << "setting I... " << flush; initial->setI(i); initial->setI(j); initial->setI(h); cout << "ok" << endl; cout << "testing sequences... " << flush; BaseSeq inS, outS, retS; retS = initial->opBaseSeq(inS, outS); inS.resize(1); inS[0] = new Base(); retS = initial->opBaseSeq(inS, outS); test(retS.size() == 1 && outS.size() == 1); cout << "ok" << endl; cout << "testing compact ID..." << flush; try { test(initial->getCompact()); } catch(const Ice::OperationNotExistException&) { } cout << "ok" << endl; cout << "testing UnexpectedObjectException... " << flush; testUOE(communicator); cout << "ok" << endl; return initial; }
int ValueClient::run(int argc, char* argv[]) { if(argc > 1) { cerr << appName() << ": too many arguments" << endl; return EXIT_FAILURE; } InitialPrx initial = InitialPrx::checkedCast(communicator()->propertyToProxy("Initial.Proxy")); if(!initial) { cerr << argv[0] << ": invalid object reference" << endl; return EXIT_FAILURE; } char c[2]; cout << '\n' << "Let's first transfer a simple object, for a class without\n" << "operations, and print its contents. No factory is required\n" << "for this.\n" << "[press enter]\n"; cin.getline(c, 2); SimplePtr simple = initial->getSimple(); cout << "==> " << simple->message << endl; cout << '\n' << "Yes, this worked. Now let's try to transfer an object for a class\n" << "with operations as type ::Demo::Printer, without installing a factory first.\n" << "This should give us a `no factory' exception.\n" << "[press enter]\n"; cin.getline(c, 2); PrinterPtr printer; PrinterPrx printerProxy; try { initial->getPrinter(printer, printerProxy); cerr << argv[0] << "Did not get the expected NoObjectFactoryException!" << endl; exit(EXIT_FAILURE); } catch(const Ice::NoObjectFactoryException& ex) { cout << "==> " << ex << endl; } cout << '\n' << "Yep, that's what we expected. Now let's try again, but with\n" << "installing an appropriate factory first. If successful, we print\n" << "the object's content.\n" << "[press enter]\n"; cin.getline(c, 2); Ice::ObjectFactoryPtr factory = new ObjectFactory; communicator()->addObjectFactory(factory, Demo::Printer::ice_staticId()); initial->getPrinter(printer, printerProxy); cout << "==> " << printer->message << endl; cout << '\n' << "Cool, it worked! Let's try calling the printBackwards() method\n" << "on the object we just received locally.\n" << "[press enter]\n"; cin.getline(c, 2); cout << "==> "; printer->printBackwards(); cout << '\n' << "Now we call the same method, but on the remote object. Watch the\n" << "server's output.\n" << "[press enter]\n"; cin.getline(c, 2); printerProxy->printBackwards(); cout << '\n' << "Next, we transfer a derived object from the server as a base\n" << "object. Since we haven't yet installed a factory for the derived\n" << "class, the derived class (::Demo::DerivedPrinter) is sliced\n" << "to its base class (::Demo::Printer).\n" << "[press enter]\n"; cin.getline(c, 2); PrinterPtr derivedAsBase; derivedAsBase = initial->getDerivedPrinter(); cout << "==> The type ID of the received object is \"" << derivedAsBase->ice_id() << "\"" << endl; assert(derivedAsBase->ice_id() == Demo::Printer::ice_staticId()); cout << '\n' << "Now we install a factory for the derived class, and try again.\n" << "Because we receive the derived object as a base object, we\n" << "we need to do a dynamic_cast<> to get from the base to the derived object.\n" << "[press enter]\n"; cin.getline(c, 2); communicator()->addObjectFactory(factory, Demo::DerivedPrinter::ice_staticId()); derivedAsBase = initial->getDerivedPrinter(); DerivedPrinterPtr derived = DerivedPrinterPtr::dynamicCast(derivedAsBase); assert(derived); cout << "==> dynamic_cast<> to derived object succeded" << endl; cout << "==> The type ID of the received object is \"" << derived->ice_id() << "\"" << endl; cout << '\n' << "Let's print the message contained in the derived object, and\n" << "call the operation printUppercase() on the derived object\n" << "locally.\n" << "[press enter]\n"; cin.getline(c, 2); cout << "==> " << derived->derivedMessage << endl; cout << "==> "; derived->printUppercase(); cout << '\n' << "Finally, we try the same again, but instead of returning the\n" << "derived object, we throw an exception containing the derived\n" << "object.\n" << "[press enter]\n"; cin.getline(c, 2); try { initial->throwDerivedPrinter(); cerr << argv[0] << ": Did not get the expected DerivedPrinterException!" << endl; exit(EXIT_FAILURE); } catch(const DerivedPrinterException& ex) { derived = ex.derived; if(!derived) { cerr << argv[0] << "Unexpected null pointer for `derived'" << endl; exit(EXIT_FAILURE); } } cout << "==> " << derived->derivedMessage << endl; cout << "==> "; derived->printUppercase(); cout << '\n' << "That's it for this demo. Have fun with Ice!\n"; initial->shutdown(); return EXIT_SUCCESS; }