// Copyright (c) 2005-2009 Hartmut Kaiser // Copyright (c) 2005-2006 Andre Merzky (andre@merzky.net) // Copyright (c) 2005-2006 Chris Miceli (cmicel1@cct.lsu.edu) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #if !defined(SAGA_TEST_FILE_API_HPP) #define SAGA_TEST_FILE_API_HPP #include #include #include #include #include #include "../test_saga.hpp" #include "../macros.hpp" /////////////////////////////////////////////////////////////////////////////// namespace test_file { namespace api { struct equipment { saga::url file; std::string scheme; std::string host; saga::test::test_helper_utils *utils; }; /////////////////////////////////////////////////////////////////////////// struct PlainSync {}; typedef boost::mpl::vector< saga::task_base::Sync, saga::task_base::Async, saga::task_base::Task, PlainSync > apitypes; /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// inline void wait_on_futures(boost::futures::future current) { current(); } /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// template struct call_test_exception { call_test_exception(equipment equipment) : equipment_(equipment) {} typedef int result_type; template int operator()(Tag) { saga::error err = (saga::error)E::value; equipment_.file = equipment_.utils->create_temp_file_for_exception( (saga::error)E::value); equipment_.file.set_scheme(equipment_.scheme); equipment_.file.set_host(equipment_.host); SAGA_REQUIRE_THROW(TestFunctor::test(Tag(), E(), equipment_), err); // if(err == saga::NotImplemented) // NotImplemented // { // std::string message(TestFunctor::name); // message += " is not Implemented"; // BOOST_ERROR(message.c_str()); // } // else if(err != (saga::error)E::value) { std::string message(""); message += "Test " + std::string(TestFunctor::name) + " with exception " + std::string(saga::error_names[err]) + " expecting " + std::string(saga::error_names[E::value]) + " with threading "; if(boost::is_same::value) message += "on"; else message += "off"; message += " and api_type "; if(boost::is_same::value) message += "Sync"; else if(boost::is_same::value) message += "Async"; else if(boost::is_same::value) message += "Task"; else if(boost::is_same::value) message += "Plain"; BOOST_ERROR(message.c_str()); } equipment_.utils->delete_temp_file(equipment_.file); return 0; } equipment equipment_; }; /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// template struct call_test; template struct call_test { call_test(equipment equipment, std::vector > &futures) : equipment_(equipment), futures_(futures){} template void operator()(Tag) { // Call test with appropriate file from vector // to throw appropriate exception boost::futures::simple_future f( boost::bind(call_test_exception(equipment_), Tag())); futures_.push_back(f); } equipment equipment_; std::vector > &futures_; }; template struct call_test { call_test(equipment equipment) : equipment_(equipment) {} template void operator()(Tag) { // Call test with appropriate file from vector // to throw appropriate exception boost::bind(call_test_exception(equipment_), Tag())(); } equipment equipment_; }; /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// template struct api_test; template struct api_test { api_test(equipment equipment) : equipment_(equipment) {} // The error is from the list of error_codes defined in the test // structure the api_test is instantiated with template void operator()(Error) { std::vector > futures; boost::mpl::for_each( call_test( equipment_, futures)); std::for_each(futures.begin(), futures.end(), wait_on_futures); } equipment equipment_; }; template struct api_test { api_test(equipment equipment) : equipment_(equipment) {} // The error is from the list of error_codes defined in the test // structure the api_test is instantiated with template void operator()(Error) { boost::mpl::for_each( call_test( equipment_)); } equipment equipment_; }; /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// template struct run_test { static void execute(equipment equipment_) { // run tests in a non-futurized manner boost::mpl::for_each( api_test(equipment_)); // run tests in a futurized manner (highly parallel) boost::mpl::for_each( api_test(equipment_)); } }; } // api } // test_file #endif // !SAGA_TEST_FILE_API_HPP