File: catch2_nodb_connection.cpp

package info (click to toggle)
tango 10.0.2%2Bdfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 89,936 kB
  • sloc: cpp: 201,786; sh: 1,645; python: 953; java: 800; perl: 467; javascript: 447; xml: 325; makefile: 272; sql: 72; ruby: 24
file content (97 lines) | stat: -rw-r--r-- 3,088 bytes parent folder | download | duplicates (3)
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
#include "catch2_common.h"

SCENARIO("Connection to invalid nodb device name")
{
    REQUIRE_NOTHROW(Tango::DeviceProxy("tango://localhost:0/invalid/test/dev#dbase=no"));
}

template <class Base>
class DoubleROAttrServer : public Base
{
  public:
    using Base::Base;

    Tango::DevDouble *attr_double_value_read;
    constexpr static Tango::DevDouble SIMPLE_SERVER_DOUBLE_VALUE = 42.1234;

    ~DoubleROAttrServer() override
    {
        std::cout << "DoubleROAttrServer: in destructor" << std::endl;
        delete_device();
    }

    void delete_device() override
    {
        std::cout << "DoubleROAttrServer: in delete_device()" << std::endl;
        delete[] attr_double_value_read;
    }

    void init_device() override
    {
        // at server initialization
        std::cout << "DoubleROAttrServer: in init_device" << std::endl;
        attr_double_value_read = new Tango::DevDouble[1];
        *attr_double_value_read = SIMPLE_SERVER_DOUBLE_VALUE;
    }

    void read_attribute(Tango::Attribute &attr)
    {
        std::cout << "DoubleROAttrServer: Reading attribute... " << std::endl;
        attr.set_value(attr_double_value_read);
    }

    static void attribute_factory(std::vector<Tango::Attr *> &attrs)
    {
        attrs.push_back(
            new TangoTest::AutoAttr<&DoubleROAttrServer::read_attribute>("double_value", Tango::DEV_DOUBLE));
    }
};

TANGO_TEST_AUTO_DEV_TMPL_INSTANTIATE(DoubleROAttrServer, 3)

SCENARIO("Test connection and reading a double RO attribute on a nodb device")
{
    int idlver = GENERATE(TangoTest::idlversion(3));
    GIVEN("a device proxy to a IDLv" << idlver << " nodb device")
    {
        TangoTest::Context ctx{"no_db_connection", "DoubleROAttrServer", idlver};
        auto dp_ptr = ctx.get_proxy();
        REQUIRE(idlver == dp_ptr->get_idl_version());
        Tango::DevDouble double_val = 0.0;

        THEN("we can ping the device")
        {
            REQUIRE_NOTHROW(dp_ptr->ping());
            AND_THEN("we can read the double_value attribute")
            {
                REQUIRE_NOTHROW(
                    [&]()
                    {
                        auto da = dp_ptr->read_attribute("double_value");
                        da >> double_val;
                    }());
                REQUIRE(double_val == DoubleROAttrServer<TANGO_BASE_CLASS>::SIMPLE_SERVER_DOUBLE_VALUE);
            }
        }

        AND_WHEN("we stop the server")
        {
            REQUIRE_NOTHROW(ctx.stop_server());
            double_val = 0.0;
            THEN("We can no longer read the double_value attribute")
            {
                using TangoTest::FirstErrorMatches, TangoTest::Reason;

                REQUIRE_THROWS_MATCHES(
                    [&]()
                    {
                        auto da = dp_ptr->read_attribute("double_value");
                        da >> double_val;
                    }(),
                    Tango::DevFailed,
                    FirstErrorMatches(Reason(Tango::API_CorbaException)));
            }
            REQUIRE(double_val == 0.0);
        }
    }
}