/************************************************************************
 *
 * 22.locale.time.get.mt.cpp
 *
 * test exercising the thread safety of the time_get facet
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 2002-2007 Rogue Wave Software.
 * 
 **************************************************************************/
#include <ios>        // for ios
#include <iterator>   // for ostreambuf_iterator
#include <locale>     // for locale, time_put
#include <cstring>    // for strlen ()
#include <ctime>      // for tm

#include <rw_locale.h>
#include <rw_thread.h>
#include <rw_driver.h>    // for rw_assert ()
#include <rw_valcmp.h>    // for rw_strncmp ()

#define MAX_THREADS      32
#define MAX_LOOPS    100000

// default number of threads (will be adjusted to the number
// of processors/cores later)
int opt_nthreads = 1;

// the number of times each thread should iterate
int opt_nloops = 50000;

// number of locales to use
int opt_nlocales = MAX_THREADS;

// should all threads share the same set of locale objects instead
// of creating their own?
int opt_shared_locale;

// default timeout used by each threaded section of this test
int opt_timeout = 60;

/**************************************************************************/

// array of locale names to use for testing
static const char*
locales [MAX_THREADS];

// number of locale names in the array
static std::size_t
nlocales;

/**************************************************************************/

//
struct MyTimeData
{
    enum { BufferSize = 64 };

    // name of the locale the data corresponds to
    const char* locale_name_;

    // optionally set to the named locale for threads to share
    std::locale locale_;

    // the time struct used to generate strings below
    std::tm time_;

    // the type specifier
    char format_;

    // narrow representations of time_ given the 
    // locale_name_ and the format_
    char ncs_ [BufferSize];
    
#ifndef _RWSTD_NO_WCHAR_T

    // wide representations of time_
    wchar_t wcs_ [BufferSize];

#endif // _RWSTD_NO_WCHAR_T

} my_time_data [MAX_THREADS];


template <class charT, class Traits>
struct MyIos: std::basic_ios<charT, Traits>
{
    MyIos () {
        this->init (0);
    }
};


template <class charT, class Traits>
struct MyStreambuf: std::basic_streambuf<charT, Traits>
{
    typedef std::basic_streambuf<charT, Traits> Base;

    MyStreambuf ()
        : Base () {
    }

    void pubsetg (const charT *gbeg, std::streamsize n) {
        this->setg (_RWSTD_CONST_CAST (charT*, gbeg),
                    _RWSTD_CONST_CAST (charT*, gbeg),
                    _RWSTD_CONST_CAST (charT*, gbeg) + n);
    }

    void pubsetp (charT *pbeg, std::streamsize n) {
        this->setp (pbeg, pbeg + n);
    }
};

void verify_fields (const std::tm& a, const std::tm& b)
{
    RW_ASSERT (a.tm_sec  == b.tm_sec);
    RW_ASSERT (a.tm_min  == b.tm_min);
    RW_ASSERT (a.tm_hour == b.tm_hour);
    RW_ASSERT (a.tm_mday == b.tm_mday);
    RW_ASSERT (a.tm_mon  == b.tm_mon);
    RW_ASSERT (a.tm_year == b.tm_year);
    RW_ASSERT (a.tm_wday == b.tm_wday);
    RW_ASSERT (a.tm_yday == b.tm_yday);
}
#define RW_ASSERT_FIELDS(a,b) verify_fields(a,b)

extern "C" {

bool test_char;    // exercise time_get<char>
bool test_wchar;   // exercise time_get<wchar_t>


static void*
thread_func (void*)
{
    MyIos<char, std::char_traits<char> >       nio;
    MyStreambuf<char, std::char_traits<char> > nsb;
    nio.rdbuf (&nsb);

#ifndef _RWSTD_NO_WCHAR_T
    MyIos<wchar_t, std::char_traits<wchar_t> >       wio;
    MyStreambuf<wchar_t, std::char_traits<wchar_t> > wsb;
    wio.rdbuf (&wsb);
#endif // _RWSTD_NO_WCHAR_T

    std::ios_base::iostate state = std::ios_base::goodbit;

    std::tm local;
    for (int i = 0; i != opt_nloops; ++i) {

        if (rw_thread_pool_timeout_expired ())
            break;

        // save the name of the locale
        const MyTimeData& data = my_time_data [i % nlocales];

        // construct a named locale, get a reference to the time_put
        // facet from it and use it to format a random time value
        // using a random conversion specifier
        const std::locale loc =
            opt_shared_locale ? data.locale_
                              : std::locale (data.locale_name_);

        if (test_char) {
            // exercise the narrow char specialization of the facet

            const std::time_get<char> &ng =
                std::use_facet<std::time_get<char> >(loc);

            nio.imbue (loc);
            nsb.pubsetg (data.ncs_, RW_COUNT_OF (data.ncs_));
            
            const std::istreambuf_iterator<char> iter (&nsb);
            const std::istreambuf_iterator<char> end;

            std::memset (&local, 0, sizeof local);

            switch (data.format_) {
            case 'X':
                ng.get_time (iter, end, nio, state, &local);
                break;
            case 'x':
                ng.get_date (iter, end, nio, state, &local);
                break;
            case 'a':
            case 'A':
                ng.get_weekday (iter, end, nio, state, &local);
                break;
            case 'b':
            case 'B':
                ng.get_monthname (iter, end, nio, state, &local);
                break;
            case 'y':
            case 'Y':
                ng.get_year (iter, end, nio, state, &local);
                break;
            default:

#ifndef _RWSTD_NO_EXT_TIME_GET
                ng.get (iter, end, nio, state, &local, data.format_);
#endif  // _RWSTD_NO_EXT_TIME_GET

                break;
            }

            RW_ASSERT (! (state & std::ios_base::failbit));
            RW_ASSERT_FIELDS (local, data.time_);
        }

        // both specializations may be tested at the same time

        if (test_wchar) {
            // exercise the wide char specialization of the facet

#ifndef _RWSTD_NO_WCHAR_T

            const std::time_get<wchar_t> &wg =
                std::use_facet<std::time_get<wchar_t> >(loc);

            wio.imbue (loc);
            wsb.pubsetg (data.wcs_, RW_COUNT_OF (data.wcs_));

            const std::istreambuf_iterator<wchar_t> iter (&wsb);
            const std::istreambuf_iterator<wchar_t> end;

            std::memset (&local, 0, sizeof local);
            
            switch (data.format_) {
            case 'X':
                wg.get_time (iter, end, wio, state, &local);
                break;
            case 'x':
                wg.get_date (iter, end, wio, state, &local);
                break;
            case 'a':
            case 'A':
                wg.get_weekday (iter, end, wio, state, &local);
                break;
            case 'b':
            case 'B':
                wg.get_monthname (iter, end, wio, state, &local);
                break;
            case 'y':
            case 'Y':
                wg.get_year (iter, end, wio, state, &local);
                break;
            default:

#ifndef _RWSTD_NO_EXT_TIME_GET
                wg.get (iter, end, wio, state, &local, data.format_);
#endif  // _RWSTD_NO_EXT_TIME_GET

                break;
            }

            RW_ASSERT (! (state & std::ios_base::failbit));
            RW_ASSERT_FIELDS (local, data.time_);

#endif // _RWSTD_NO_WCHAR_T

        }
    }

    return 0;
}

}   // extern "C"

/**************************************************************************/

static int
run_test (int, char**)
{
    MyIos<char, std::char_traits<char> >       nio;
    MyStreambuf<char, std::char_traits<char> > nsb;
    nio.rdbuf (&nsb);

#ifndef _RWSTD_NO_WCHAR_T
    MyIos<wchar_t, std::char_traits<wchar_t> >       wio;
    MyStreambuf<wchar_t, std::char_traits<wchar_t> > wsb;
    wio.rdbuf (&wsb);
#endif // _RWSTD_NO_WCHAR_T

    // find all installed locales for which setlocale (LC_ALL) succeeds
    const char* const locale_list =
        rw_opt_locales ? rw_opt_locales : rw_locales (_RWSTD_LC_ALL);

    const std::size_t maxinx = RW_COUNT_OF (locales);

    int j = 0;
    for (const char* name = locale_list;
         *name;
         name += std::strlen (name) + 1) {

        const std::size_t inx = nlocales;
        locales [inx] = name;

        // fill in the time and results for this locale
        MyTimeData& data = my_time_data [inx];
        data.locale_name_ = name;

        // initialize tm with random but valid values
        std::memset (&data.time_, 0, sizeof data.time_);
        data.time_.tm_sec  = ++j % 61;
        data.time_.tm_min  = ++j % 60;
        data.time_.tm_hour = ++j % 12;
        data.time_.tm_wday = ++j % 7;
        data.time_.tm_mon  = ++j % 12;
        data.time_.tm_mday = ++j % 31;
        data.time_.tm_yday = ++j % 366;
        data.time_.tm_year = ++j;

#ifndef _RWSTD_NO_EXT_TIME_GET
        // format specifiers that we can reliably parse
        // get_weekday, get_monthname, get_date, get_time,
        // get_year and the extension get.
        const char formats [] = "aAbBCdhHjmMnRStTwxXyY";
#else
        // formats that generate strings compatible with
        // get_weekday, get_monthname, get_date, get_time
        // and get_year.
        const char formats [] = "aAbBxXyY";
#endif

        // get the "random" data type used to generate representation
        data.format_ = formats [nlocales % (sizeof formats - 1)];

        try {
            const std::locale loc (data.locale_name_);

            const std::time_put<char> &np =
                std::use_facet<std::time_put<char> >(loc);

            const std::time_get<char> &ng = 
                std::use_facet<std::time_get<char> >(loc);

            std::ios::iostate state = std::ios::goodbit;

            nio.imbue (loc);

            // put the time representation on the stream
            nsb.pubsetp (data.ncs_, RW_COUNT_OF (data.ncs_));
            *np.put (std::ostreambuf_iterator<char>(&nsb), nio, ' ',
                     &data.time_, data.format_) = '\0';

            rw_fatal (!nio.fail (), __FILE__, __LINE__,
                      "time_put<char>::put(...) failed for locale(%#s)",
                      data.locale_name_);

            // read the data back out. this is what the thread
            // is expected to do, and the result it should get.

            nsb.pubsetg (data.ncs_, RW_COUNT_OF (data.ncs_));

            const std::istreambuf_iterator<char> iter (&nsb);
            const std::istreambuf_iterator<char> end;

            std::memset (&data.time_, 0, sizeof data.time_);

            switch (data.format_) {
            case 'a':
            case 'A':
                ng.get_weekday (iter, end, nio, state, &data.time_);
                break;
            case 'b':
            case 'B':
            case 'h':
                ng.get_monthname (iter, end, nio, state, &data.time_);
                break;
            case 'y':
            case 'Y':
                ng.get_year (iter, end, nio, state, &data.time_);
                break;
            case 'x':
                ng.get_date (iter, end, nio, state, &data.time_);
                break;
            case 'X':
                ng.get_time (iter, end, nio, state, &data.time_);
                break;
            default:

#ifndef _RWSTD_NO_EXT_TIME_GET
                ng.get (iter, end, nio, state, &data.time_, data.format_);
#endif  // _RWSTD_NO_EXT_TIME_GET

                break;
            }

            // we couldn't read the data back, so don't use this locale
            if (state & std::ios_base::failbit)
                continue;

#ifndef _RWSTD_NO_WCHAR_T

            const std::time_put<wchar_t> &wp =
                std::use_facet<std::time_put<wchar_t> >(loc);

            wio.imbue (loc);
            wsb.pubsetp (data.wcs_, RW_COUNT_OF (data.wcs_));

            *wp.put (std::ostreambuf_iterator<wchar_t>(&wsb),
                     wio, L' ', &data.time_, data.format_) = L'\0';

            rw_fatal (!wio.fail (), __FILE__, __LINE__,
                      "time_put<wchar_t>::put(...) failed for locale(%#s)",
                      data.locale_name_);

#endif // _RWSTD_NO_WCHAR_T

            if (opt_shared_locale)
                data.locale_ = loc;

            nlocales += 1;

        }
        catch (...) {
            rw_warn (!rw_opt_locales, 0, __LINE__,
                     "failed to create locale(%#s)", name);
        }

        if (nlocales == maxinx || nlocales == std::size_t (opt_nlocales))
            break;
    }

    // avoid divide by zero in thread if there are no locales to test
    rw_fatal (nlocales != 0, 0, __LINE__,
              "failed to create one or more usable locales!");

    rw_info (0, 0, 0,
             "testing std::time_get<charT> with %d thread%{?}s%{;}, "
             "%d iteration%{?}s%{;} each, in %zu locales { %{ .*A@} }",
             opt_nthreads, 1 != opt_nthreads,
             opt_nloops, 1 != opt_nloops,
             nlocales, int (nlocales), "%#s", locales);

    rw_info (0, 0, 0, "exercising std::time_get<char>");

    test_char  = true;
    test_wchar = false;

    // create and start a pool of threads and wait for them to finish
    int result =
        rw_thread_pool (0, std::size_t (opt_nthreads), 0,
                        thread_func, 0, std::size_t (opt_timeout));

    rw_error (result == 0, 0, __LINE__,
              "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
              opt_nthreads, thread_func);

#ifndef _RWSTD_NO_WCHAR_T

    rw_info (0, 0, 0, "exercising std::time_get<wchar_t>");

    test_char  = false;
    test_wchar = true;

    // start a pool of threads to exercise wstring thread safety
    result =
        rw_thread_pool (0, std::size_t (opt_nthreads), 0,
                        thread_func, 0, std::size_t (opt_timeout));

    rw_error (result == 0, 0, __LINE__,
              "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
              opt_nthreads, thread_func);

    // exercise both the char and the wchar_t specializations
    // at the same time

    rw_info (0, 0, 0,
             "exercising both std::time_get<char> and std::time_get<wchar_t>");

    test_char  = true;
    test_wchar = true;

    // start a pool of threads to exercise wstring thread safety
    result =
        rw_thread_pool (0, std::size_t (opt_nthreads), 0,
                        thread_func, 0, std::size_t (opt_timeout));

    rw_error (result == 0, 0, __LINE__,
              "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
              opt_nthreads, thread_func);

#endif   // _RWSTD_NO_WCHAR_T

    return result;
}

/**************************************************************************/

int main (int argc, char *argv[])
{
#ifdef _RWSTD_REENTRANT

    // set nthreads to the greater of the number of processors
    // and 2 (for uniprocessor systems) by default
    opt_nthreads = rw_get_cpus ();
    if (opt_nthreads < 2)
        opt_nthreads = 2;

#endif   // _RWSTD_REENTRANT

    return rw_test (argc, argv, __FILE__,
                    "lib.locale.time.get",
                    "thread safety", run_test,
                    "|-soft-timeout#0 "  // must be non-negative
                    "|-nloops#0 "       // must be non-negative
                    "|-nthreads#0-* "   // must be in [0, MAX_THREADS]
                    "|-nlocales#0 "     // arg must be non-negative
                    "|-locales= "       // must be provided
                    "|-shared-locale# ",
                    &opt_timeout,
                    &opt_nloops,
                    int (MAX_THREADS),
                    &opt_nthreads,
                    &opt_nlocales,
                    &rw_opt_setlocales,
                    &opt_shared_locale);
}
