]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/gather.cc
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / test / gather.cc
CommitLineData
7c673cae
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3/*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2011 Greg Farnum <gregory.farnum@dreamhost.com>
7 *
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
12 *
13 */
14#include "include/Context.h"
15#include "gtest/gtest.h"
16
17class C_Checker : public Context {
18public:
19 bool *finish_called;
20 int *result;
21 C_Checker(bool* _finish_called, int *r) :
22 finish_called(_finish_called), result(r) {}
23 void finish(int r) override { *finish_called = true; *result = r; }
24};
25
26TEST(ContextGather, Constructor) {
27 C_GatherBuilder gather(g_ceph_context);
28 EXPECT_FALSE(gather.has_subs());
29 EXPECT_TRUE(gather.get() == NULL);
30}
31
32TEST(ContextGather, OneSub) {
33 C_GatherBuilder gather(g_ceph_context);
34 Context *sub = gather.new_sub();
35 EXPECT_EQ(1, gather.num_subs_created());
36 EXPECT_EQ(1, gather.num_subs_remaining());
37
38 bool finish_called = false;
39 int result = 0;
40 C_Checker *checker = new C_Checker(&finish_called, &result);
41 gather.set_finisher(checker);
42 gather.activate();
43 sub->complete(0);
44 EXPECT_TRUE(finish_called);
45 EXPECT_EQ(0, result);
46}
47
48TEST(ContextGather, ManySubs) {
49 bool finish_called = false;
50 int result = 0;
51 C_GatherBuilder gather(g_ceph_context, new C_Checker(&finish_called, &result));
52 int sub_count = 8;
53 Context* subs[sub_count];
54 //create subs and test
55 for (int i = 0; i < sub_count; ++i) {
56 subs[i] = gather.new_sub();
57 EXPECT_EQ(i+1, gather.num_subs_created());
58 EXPECT_EQ(i+1, gather.num_subs_remaining());
59 }
60 EXPECT_TRUE(gather.has_subs());
61 gather.activate();
62
63 //finish all except one sub
64 for (int j = 0; j < sub_count - 1; ++j) {
65 subs[j]->complete(0);
66 EXPECT_FALSE(finish_called);
67 }
68
69 //finish last one and check asserts
70 subs[sub_count-1]->complete(0);
71 EXPECT_TRUE(finish_called);
72}
73
74TEST(ContextGather, AlternatingSubCreateFinish) {
75 C_GatherBuilder gather(g_ceph_context);
76 int sub_count = 8;
77 bool finish_called = false;
78 int result = 0;
79 C_Checker *checker = new C_Checker(&finish_called, &result);
80 gather.set_finisher(checker);
81 Context* subs[sub_count];
82
83 //create half the subs
84 for (int i = 0; i < sub_count / 2; ++i) {
85 subs[i] = gather.new_sub();
86 EXPECT_EQ(i + 1, gather.num_subs_created());
87 EXPECT_EQ(i + 1, gather.num_subs_remaining());
88 }
89
90 //alternate finishing first half of subs and creating last half of subs
91 for (int j = 0; j < sub_count / 2; ++j) {
92 subs[j]->complete(0);
93 subs[sub_count / 2 + j] = gather.new_sub();
94 }
95 gather.activate();
96
97 //finish last half of subs
98 for (int k = sub_count / 2; k < sub_count; ++k) {
99 subs[k]->complete(0);
100 }
101
102 EXPECT_TRUE(finish_called);
103}