File: TestFileCmd.cpp

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 (139 lines) | stat: -rw-r--r-- 5,609 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
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * 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.
 */

#include <iostream>

#include <boost/test/unit_test.hpp>

#include "ServerTestHarness.hpp"
#include "TestFixture.hpp"
#include "ecflow/attribute/VerifyAttr.hpp"
#include "ecflow/base/cts/user/CFileCmd.hpp"
#include "ecflow/core/Converter.hpp"
#include "ecflow/core/Timer.hpp"
#include "ecflow/node/Defs.hpp"
#include "ecflow/node/Family.hpp"
#include "ecflow/node/Suite.hpp"
#include "ecflow/node/Task.hpp"
#include "ecflow/test/scaffold/Naming.hpp"

using namespace ecf;

///
/// \note This is used to INVOKE a SINGLE test. Easier for debugging
///

BOOST_AUTO_TEST_SUITE(S_Test)

BOOST_AUTO_TEST_SUITE(T_FileCmd)

BOOST_AUTO_TEST_CASE(test_file_cmd) {
    ECF_NAME_THIS_TEST();

    DurationTimer timer;
    TestClean clean_at_start_and_end;

    // Create the defs file corresponding to the text below
    // ECF_HOME variable is automatically added by the test harness.
    // ECF_INCLUDE variable is automatically added by the test harness.
    // SLEEPTIME variable is automatically added by the test harness.
    // ECF_CLIENT_EXE_PATH variable is automatically added by the test harness.
    //                     This is substituted in sms includes
    //                     Allows test to run without requiring installation

    // # Note: we have to use relative paths, since these tests are relocate-able
    // suite test_file_cmd
    //  edit SLEEPTIME 1
    //  edit ECF_INCLUDE $ECF_HOME/includes
    //  family family
    //     task t1
    //     task t2
    //   endfamily
    // endsuite

    Defs theDefs;
    {
        suite_ptr suite = theDefs.add_suite("test_file_cmd");
        suite->addVerify(VerifyAttr(NState::COMPLETE, 1));
        family_ptr fam = suite->add_family("family");
        int taskSize   = 2; // on linux 1024 tasks take ~4 seconds for job submission
        for (int i = 0; i < taskSize; i++) {
            task_ptr task = fam->add_task("t" + ecf::convert_to<std::string>(i));
            task->addVerify(VerifyAttr(NState::COMPLETE, 1));
        }
    }

    // The test harness will create corresponding directory structure
    // and populate with standard ecf files AND will generate man files for node containers
    ServerTestHarness serverTestHarness;
    serverTestHarness.generateManFileForNodeContainers();
    serverTestHarness.run(theDefs, ServerTestHarness::testDataDefsLocation("test_file_cmd.def"));

    // Now invoke the file command to extract <ecffile,job file,job output, manual >
    // If the requests succeeded the client needs to create a temporary file, and populate it with
    // the contents of the string returned from the server
    TestFixture::client().set_throw_on_error(false);

    std::vector<Node*> nodeVec;
    theDefs.getAllNodes(nodeVec);

    for (Node* node : nodeVec) {

        std::string nodePath                       = node->absNodePath();
        std::vector<CFileCmd::File_t> fileTypesVec = CFileCmd::fileTypesVec();
        for (size_t i = 0; i < fileTypesVec.size(); i++) {

            std::string file_type            = CFileCmd::toString(fileTypesVec[i]);
            std::vector<std::string> theArgs = CtsApi::file(nodePath, file_type, "10000");
            std::string args;
            for (size_t x = 0; x < theArgs.size(); x++) {
                args += theArgs[x];
                args += " ";
            }

            int theResult = TestFixture::client().file(nodePath, file_type, "10000");
            //         cout << "nodePath = " << nodePath << " fileType = " << file_type << " args passed = " << args <<
            //         " pass = " << theResult << "\n";

            /// Expect KILL and STAT file types to fail, i.e since we have not called those commands
            if (fileTypesVec[i] == CFileCmd::KILL || fileTypesVec[i] == CFileCmd::STAT) {
                BOOST_CHECK_MESSAGE(theResult == 1,
                                    args << " Expected " << CFileCmd::toString(fileTypesVec[i]) << " to fail");
                continue;
            }

            if (node->isSubmittable() || fileTypesVec[i] == CFileCmd::MANUAL) {
                // For suite and families only manual is valid
                BOOST_CHECK_MESSAGE(theResult == 0,
                                    args << " failed for Node should return 0.\n"
                                         << TestFixture::client().errorMsg());
                BOOST_CHECK_MESSAGE(!TestFixture::client().get_string().empty(), " file contents empty for  " << args);
            }
            else {
                // Should fail
                BOOST_CHECK_MESSAGE(theResult != 0,
                                    args << " Expected failure for node " << node->debugNodePath()
                                         << " with file= " << CFileCmd::toString(fileTypesVec[i]));
                if (theResult == 0) {
                    std::cout << "Found file contents:''\n";
                    std::cout << TestFixture::client().get_string();
                    std::cout << "''\n";
                }
            }
        }
    }

    std::cout << timer.duration() << " update-calendar-count(" << serverTestHarness.serverUpdateCalendarCount()
              << ")\n";
}

BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE_END()