]> git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/tests/unit/smp_test.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / seastar / tests / unit / smp_test.cc
1 /*
2 * This file is open source software, licensed to you under the terms
3 * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 * distributed with this work for additional information regarding copyright
5 * ownership. You may not use this file except in compliance with the License.
6 *
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
16 * under the License.
17 */
18 /*
19 * Copyright (C) 2014 Cloudius Systems, Ltd.
20 */
21
22 #include <seastar/core/reactor.hh>
23 #include <seastar/core/smp.hh>
24 #include <seastar/core/app-template.hh>
25 #include <seastar/core/print.hh>
26
27 using namespace seastar;
28
29 future<bool> test_smp_call() {
30 return smp::submit_to(1, [] {
31 return make_ready_future<int>(3);
32 }).then([] (int ret) {
33 return make_ready_future<bool>(ret == 3);
34 });
35 }
36
37 struct nasty_exception {};
38
39 future<bool> test_smp_exception() {
40 fmt::print("1\n");
41 return smp::submit_to(1, [] {
42 fmt::print("2\n");
43 auto x = make_exception_future<int>(nasty_exception());
44 fmt::print("3\n");
45 return x;
46 }).then_wrapped([] (future<int> result) {
47 fmt::print("4\n");
48 try {
49 result.get();
50 return make_ready_future<bool>(false); // expected an exception
51 } catch (nasty_exception&) {
52 // all is well
53 return make_ready_future<bool>(true);
54 } catch (...) {
55 // incorrect exception type
56 return make_ready_future<bool>(false);
57 }
58 });
59 }
60
61 int tests, fails;
62
63 future<>
64 report(sstring msg, future<bool>&& result) {
65 return std::move(result).then([msg] (bool result) {
66 fmt::print("{}: {}\n", (result ? "PASS" : "FAIL"), msg);
67 tests += 1;
68 fails += !result;
69 });
70 }
71
72 int main(int ac, char** av) {
73 return app_template().run_deprecated(ac, av, [] {
74 return report("smp call", test_smp_call()).then([] {
75 return report("smp exception", test_smp_exception());
76 }).then([] {
77 fmt::print("\n{:d} tests / {:d} failures\n", tests, fails);
78 engine().exit(fails ? 1 : 0);
79 });
80 });
81 }