~ubuntu-branches/ubuntu/karmic/gears/karmic

« back to all changes in this revision

Viewing changes to gears/base/common/event_test.cc

  • Committer: Bazaar Package Importer
  • Author(s): Stefan Lesicnik
  • Date: 2009-04-30 19:15:25 UTC
  • Revision ID: james.westby@ubuntu.com-20090430191525-0790sb5wzg8ou0xb
Tags: upstream-0.5.21.0~svn3334+dfsg
ImportĀ upstreamĀ versionĀ 0.5.21.0~svn3334+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2008, Google Inc.
 
2
//
 
3
// Redistribution and use in source and binary forms, with or without
 
4
// modification, are permitted provided that the following conditions are met:
 
5
//
 
6
//  1. Redistributions of source code must retain the above copyright notice,
 
7
//     this list of conditions and the following disclaimer.
 
8
//  2. Redistributions in binary form must reproduce the above copyright notice,
 
9
//     this list of conditions and the following disclaimer in the documentation
 
10
//     and/or other materials provided with the distribution.
 
11
//  3. Neither the name of Google Inc. nor the names of its contributors may be
 
12
//     used to endorse or promote products derived from this software without
 
13
//     specific prior written permission.
 
14
//
 
15
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 
16
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 
17
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 
18
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
19
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 
20
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 
21
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 
22
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 
23
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 
24
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
25
 
 
26
#if USING_CCTESTS
 
27
 
 
28
#include "gears/base/common/event.h"
 
29
#include "gears/base/common/string16.h"
 
30
#include "gears/localserver/common/async_task.h"
 
31
 
 
32
class AsyncTaskImpl : public AsyncTask {
 
33
 public:
 
34
   AsyncTaskImpl() : AsyncTask(NULL), result_(false) {
 
35
    if (!Init()) {
 
36
      assert(false);
 
37
    }
 
38
    if (!Start()) {
 
39
      assert(false);
 
40
    }
 
41
  }
 
42
  bool GetResultAndDelete() {
 
43
    get_result_event_.Signal();
 
44
    if (!have_result_event_.WaitWithTimeout(1000)) {
 
45
      return false;
 
46
    }
 
47
    bool result = result_;
 
48
    DeleteWhenDone();
 
49
    // Use a local variable since the class has been deleted.
 
50
    return result;
 
51
  }
 
52
 private:
 
53
  // Deleted with GetResultAndDelete().
 
54
  virtual ~AsyncTaskImpl() {}
 
55
  // AsyncTask implementation.
 
56
  virtual void Run() {
 
57
    get_result_event_.Wait();
 
58
    result_ = true;
 
59
    have_result_event_.Signal();
 
60
  }
 
61
  Event get_result_event_;
 
62
  Event have_result_event_;
 
63
  bool result_;
 
64
  DISALLOW_EVIL_CONSTRUCTORS(AsyncTaskImpl);
 
65
};
 
66
 
 
67
bool TestEvent(std::string16 *error) {
 
68
#undef TEST_ASSERT
 
69
#define TEST_ASSERT(b) \
 
70
{ \
 
71
  if (!(b)) { \
 
72
    LOG(("TestEvent - failed (%d)\n", __LINE__)); \
 
73
    assert(error); \
 
74
    *error += STRING16(L"TestEvent failed. "); \
 
75
    return false; \
 
76
  } \
 
77
}
 
78
 
 
79
  Event the_event;
 
80
  // Test timing out.
 
81
  TEST_ASSERT(the_event.WaitWithTimeout(10) == false);
 
82
  // Test calling Signal() before Wait() - Wait() should proceed immediately.
 
83
  the_event.Signal();
 
84
  TEST_ASSERT(the_event.WaitWithTimeout(10));
 
85
  // Test event gets reset
 
86
  TEST_ASSERT(the_event.WaitWithTimeout(10) == false);
 
87
  // Test multiple calls to Signal() make no difference.
 
88
  the_event.Signal();
 
89
  the_event.Signal();
 
90
  TEST_ASSERT(the_event.WaitWithTimeout(10));
 
91
  TEST_ASSERT(the_event.WaitWithTimeout(10) == false);
 
92
  // Test a simple AsyncTask implementation that uses events from two threads.
 
93
  AsyncTaskImpl *async_task = new AsyncTaskImpl();
 
94
  TEST_ASSERT(async_task->GetResultAndDelete());
 
95
 
 
96
  return true;
 
97
}
 
98
 
 
99
#endif  // USING_CCTESTS