// Job_t.cxx #include "dial_job/Job_t.h" #include #include #include #include "dataset_util/XmlElement.h" #include "dataset_util/DtdRegistry.h" #include "dataset_id/SimpleUniqueIdGenerator.h" #include "dataset_base/Dataset_t.h" #include "dataset_base/DatasetRepository.h" #include "dataset_credential/CredentialSelectionCatalog.h" #include "dataset_credential/GssCredentialManager.h" #include "dial_task/Task.h" #include "dial_app/Application.h" #include "dial_job/ChildWatcher.h" using std::string; using std::ostream; using std::cout; using std::endl; using dset::CredentialSelectionCatalog; using dset::GssCredentialManager; using dset::Content; using dset::Dataset; using dial::TaskId; using dial::Task; using dial::Application; using dial::JobPreferences; using dial::JobId; using dial::Job; void msg(const char* msg) { cout << "----- "; cout << msg; cout << " -----" << endl; } int Job_t() { system("rm -rf resolver.dat dr.dat UniqueId myjob"); string jdir = "myjob"; msg("Create dataset repository"); assert( dset::DatasetRepository::create_default_instance() == 0 ); msg("Fetch default instance of CSC."); assert( CredentialSelectionCatalog::create_default_instance() == 0 ); CredentialSelectionCatalog& sc = CredentialSelectionCatalog::default_instance(); cout << sc << endl; assert( sc.is_valid() ); string owner = "me"; assert( GssCredentialManager::set_default() == 0 ); assert( GssCredentialManager::set_owner("me") == 0 ); msg("Invalid job"); { Job badjob; cout << badjob << endl; assert( ! badjob.is_valid() ); } msg("Create application"); SimpleUniqueIdGenerator::set_as_default(); SimpleUniqueIdGenerator::create_collection(Application::id_context(), 11, 101); Application app = Application::test_instance(); cout << app << endl; assert(app.is_valid()); assert(app.id().is_global()); msg("Create task"); SimpleUniqueIdGenerator::create_collection(Task::id_context(), 11, 101); Task tsk = Task::test_instance(); assert(tsk.is_valid()); cout << tsk << endl; msg("Create dataset"); SimpleUniqueIdGenerator::create_collection("Dataset", 12, 1001); EventIdList eids; eids.insert(EventIdRange(123,1,20)); ContentIdList cids; TestDataset dst(Content("TestDataset", "test", cids, eids)); dst.lock(); cout << dst << endl; msg("Create preferences"); JobPreferences prf; prf.lock(); msg("Create job."); TestJob job(JobId(101,1), app, tsk, dst, prf, jdir); cout << job << endl; assert( job.status() == Job::INITIALIZED ); assert( job.status_as_string() == "INITIALIZED" ); assert( job.is_valid() ); assert( job.is_initialized() ); assert( ! job.is_running() ); assert( ! job.is_done() ); assert( ! job.is_failed() ); assert( ! job.is_killed() ); assert( ! job.start_time().is_valid() ); assert( ! job.stop_time().is_valid() ); assert( job.error() == 0 ); assert( job.owner() == "me" ); assert( ! job.in_substate("subrunning") ); assert( job.substates().size() == 0 ); msg("Run job"); job.start(); cout << job << endl; assert( job.is_valid() ); assert( ! job.is_initialized() ); assert( job.is_running() ); assert( ! job.is_done() ); assert( ! job.is_failed() ); assert( ! job.is_killed() ); assert( job.start_time().is_valid() ); assert( ! job.stop_time().is_valid() ); assert( job.error() == 0 ); assert( job.in_substate("subrunning") ); assert( job.substates().size() == 1 ); assert( job.subjobs().size() == 5 ); assert( job.category_subjobs().size() == 2 ); assert( job.category_subjobs("one").size() == 3 ); assert( job.category_subjobs("two").size() == 2 ); sleep(2); msg("Write to xml"); const XmlElement* pxjob = job.xml(); assert( pxjob != 0 ); cout << *pxjob << endl; msg("Read back from XML"); { Job jobx(*pxjob); cout << jobx << endl; assert( jobx.is_valid() ); assert( jobx.is_running() ); assert( jobx.start_time().unix_time() == job.start_time().unix_time() ); assert( ! jobx.stop_time().is_valid() ); assert( jobx.error() == 0 ); assert( jobx.in_substate("subrunning") ); assert( jobx.substates().size() == 1 ); assert( jobx.subjobs().size() == 5 ); assert( jobx.category_subjobs().size() == 2 ); assert( jobx.category_subjobs("one").size() == 3 ); assert( jobx.category_subjobs("two").size() == 2 ); } msg("End job with success"); { TestJob job2 = job; assert( job2.end() == 0 ); cout << job2 << endl; assert( job.is_valid() ); assert( ! job.is_initialized() ); assert( ! job2.is_running() ); assert( job2.is_done() ); assert( ! job2.is_failed() ); assert( ! job2.is_killed() ); assert( job2.start_time().is_valid() ); assert( job2.stop_time().unix_time() > job2.start_time().unix_time() ); assert( job.error() == 0 ); assert( job2.set_killed(1) != 0 ); assert( job2.is_done() ); assert( ! job2.in_substate("subrunning") ); assert( job2.substates().size() == 0 ); } msg("End job with kill"); { TestJob job2 = job; assert( job2.set_killed(2) == 0 ); cout << job2 << endl; assert( job.is_valid() ); assert( ! job.is_initialized() ); assert( ! job2.is_running() ); assert( ! job2.is_done() ); assert( ! job2.is_failed() ); assert( job2.is_killed() ); assert( job2.start_time().is_valid() ); assert( job2.stop_time().unix_time() > job2.start_time().unix_time() ); assert( job.error() == 0 ); assert( job2.set_done() != 0 ); assert( job2.is_killed() ); } msg("End job with fail"); { TestJob job2 = job; assert( job2.set_failed(333) == 333 ); cout << job2 << endl; assert( job.is_valid() ); assert( ! job.is_initialized() ); assert( ! job2.is_running() ); assert( ! job2.is_done() ); assert( job2.is_failed() ); assert( ! job2.is_killed() ); assert( job2.start_time().is_valid() ); assert( job2.stop_time().unix_time() > job2.start_time().unix_time() ); assert( job2.error() == 333 ); assert( job2.set_done() != 0 ); assert( job2.set_killed(3) != 0 ); assert( job2.is_failed() ); } msg("Check DTD"); cout << Job::dtd() << endl; assert( Job::dtd().size() != 0 ); assert( DtdRegistry::instance("dial").has_type("Job") ); return 0; } #ifdef CTEST_MAIN int main() { return Job_t(); } #endif