File: TestHelper.hpp

package info (click to toggle)
ecflow 5.15.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 51,868 kB
  • sloc: cpp: 269,341; python: 22,756; sh: 3,609; perl: 770; xml: 333; f90: 204; ansic: 141; makefile: 70
file content (127 lines) | stat: -rw-r--r-- 5,348 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
 * Copyright 2009- ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 * In applying this licence, ECMWF does not waive the privileges and immunities
 * granted to it by virtue of its status as an intergovernmental organisation
 * nor does it submit to any jurisdiction.
 */

#ifndef ecflow_base_test_harness_TestHelper_HPP
#define ecflow_base_test_harness_TestHelper_HPP

#include <boost/test/test_tools.hpp>

#include "MockServer.hpp"
#include "ecflow/base/ClientToServerRequest.hpp"
#include "ecflow/base/cts/ClientToServerCmd.hpp"
#include "ecflow/base/stc/ServerToClientCmd.hpp"
#include "ecflow/node/Node.hpp"

// defines statics utility functions used by more than one test
class TestHelper {
public:
    static std::string invokeRequest(Defs* defs, Cmd_ptr theCmd, bool check_change_numbers = true) {

        // Check that state change happens
        unsigned int state_change_no  = Ecf::state_change_no();
        unsigned int modify_change_no = Ecf::modify_change_no();

        // Setup command for invocation
        ClientToServerRequest cmd_request;
        cmd_request.set_cmd(theCmd);
        // std::cout << cmd_request << "\n";

        MockServer server(defs);
        STC_Cmd_ptr result = cmd_request.handleRequest(&server);
        BOOST_CHECK_MESSAGE(result, "ClientToServerRequest " << cmd_request << " returned NULL\n");
        BOOST_CHECK_MESSAGE(result->error().empty(), cmd_request << " " << result->error());
        if (check_change_numbers) {
            BOOST_CHECK_MESSAGE(state_change_no != Ecf::state_change_no() ||
                                    modify_change_no != Ecf::modify_change_no(),
                                "State & modify change numbers unaltered by command " << cmd_request);

            // Some tests(TestSSyncCmd_CH1.cpp), create defs where invariants like change numbers are deliberately
            // different
            std::string error_msg;
            BOOST_CHECK_MESSAGE(defs->checkInvariants(error_msg),
                                "invokeRequest checkInvariants failed " << error_msg << " for cmd " << cmd_request);
        }
        if (result) {
            return result->get_string();
        }
        return std::string();
    }

    static std::string invokeRequest(AbstractServer* server, Cmd_ptr theCmd, bool check_change_numbers = true) {

        // Check that state change happens
        unsigned int state_change_no  = Ecf::state_change_no();
        unsigned int modify_change_no = Ecf::modify_change_no();

        // Setup command for invocation
        ClientToServerRequest cmd_request;
        cmd_request.set_cmd(theCmd);
        // std::cout << cmd_request << "\n";

        STC_Cmd_ptr result = cmd_request.handleRequest(server);
        BOOST_CHECK_MESSAGE(result, "ClientToServerRequest " << cmd_request << " returned NULL\n");
        BOOST_CHECK_MESSAGE(result->error().empty(), cmd_request << " " << result->error());
        if (check_change_numbers) {
            BOOST_CHECK_MESSAGE(state_change_no != Ecf::state_change_no() ||
                                    modify_change_no != Ecf::modify_change_no(),
                                "State & modify change numbers unaltered by command " << cmd_request);

            // Some tests(TestSSyncCmd_CH1.cpp), create defs where invariants like change numbers are deliberately
            // different
            std::string error_msg;
            BOOST_CHECK_MESSAGE(server->defs()->checkInvariants(error_msg),
                                "invokeRequest checkInvariants failed " << error_msg << " for cmd " << cmd_request);
        }
        if (result) {
            return result->get_string();
        }
        return std::string();
    }

    static void invokeFailureRequest(Defs* defs, Cmd_ptr theCmd) {

        ClientToServerRequest cmd_request;
        cmd_request.set_cmd(theCmd);

        MockServer server(defs);

        // We expect this to fail
        BOOST_CHECK_THROW(cmd_request.handleRequest(&server), std::runtime_error);
    }

    static void invokeFailureRequest(MockServer& server, Cmd_ptr theCmd) {

        ClientToServerRequest cmd_request;
        cmd_request.set_cmd(theCmd);

        BOOST_CHECK_THROW(cmd_request.handleRequest(&server), std::runtime_error);

        //		STC_Cmd_ptr result = cmd_request.handleRequest(&server);
        //		BOOST_CHECK_MESSAGE( !result->ok(), "ClientToServerRequest " << cmd_request << " was expected to
        // fail \n");
    }

    static void test_state(node_ptr n, NState::State expected) {
        BOOST_REQUIRE_MESSAGE(n->state() == expected,
                              "Expected state " << NState::toString(expected) << " but found "
                                                << NState::toString(n->state()) << " for " << n->debugNodePath());
    }

    static void test_state(node_ptr n, DState::State expected) {
        BOOST_REQUIRE_MESSAGE(n->dstate() == expected,
                              "Expected state " << DState::toString(expected) << " but found "
                                                << DState::toString(n->dstate()) << " for " << n->debugNodePath());
    }

private:
    TestHelper() = default;
};

#endif /* ecflow_base_test_harness_TestHelper_HPP */