summaryrefslogtreecommitdiffstats
path: root/gin/modules/timer_unittest.cc
blob: 96972d562dad4fbfda2a2839d757e4f3b7eeae6b (plain)
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
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gin/modules/timer.h"

#include "base/message_loop/message_loop.h"
#include "gin/handle.h"
#include "gin/object_template_builder.h"
#include "gin/public/isolate_holder.h"
#include "gin/runner.h"
#include "gin/test/v8_test.h"
#include "gin/try_catch.h"
#include "gin/wrappable.h"
#include "v8/include/v8.h"

namespace gin {

namespace {

class Result : public Wrappable<Result> {
 public:
  static WrapperInfo kWrapperInfo;
  static Handle<Result> Create(v8::Isolate* isolate) {
    return CreateHandle(isolate, new Result());
  }

  int count() const { return count_; }
  void set_count(int count) { count_ = count; }

  void quit() {
    base::MessageLoop::current()->Quit();
  }

 private:
  Result() : count_(0) {
  }

  virtual ~Result() {
  }

  virtual ObjectTemplateBuilder GetObjectTemplateBuilder(
      v8::Isolate* isolate) OVERRIDE {
    return Wrappable<Result>::GetObjectTemplateBuilder(isolate)
        .SetProperty("count", &Result::count, &Result::set_count)
        .SetMethod("quit", &Result::quit);
  }

  int count_;
};

WrapperInfo Result::kWrapperInfo = { gin::kEmbedderNativeGin };

}  // namespace

typedef V8Test TimerUnittest;

TEST_F(TimerUnittest, OneShot) {
  v8::Isolate* isolate = instance_->isolate();

  RunnerDelegate delegate;
  Runner runner(&delegate, isolate);
  Runner::Scope scope(&runner);

  Handle<TimerModule> timer_module = TimerModule::Create(isolate);
  Handle<Result> result = Result::Create(isolate);

  EXPECT_FALSE(runner.global().IsEmpty());
  runner.global()->Set(StringToV8(isolate, "timer"),
                       timer_module->GetWrapper(isolate));
  runner.global()->Set(StringToV8(isolate, "result"),
                       result->GetWrapper(isolate));

  std::string source =
     "timer.createOneShot(100, function() {"
     "  result.count++;"
     "  result.quit();"
     "});";

  base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
  runner.Run(source, "script");
  EXPECT_EQ(0, result->count());

  loop.Run();
  loop.RunUntilIdle();

  EXPECT_EQ(1, result->count());
}

TEST_F(TimerUnittest, Repeating) {
  v8::Isolate* isolate = instance_->isolate();

  RunnerDelegate delegate;
  Runner runner(&delegate, isolate);
  Runner::Scope scope(&runner);

  Handle<TimerModule> timer_module = TimerModule::Create(isolate);
  Handle<Result> result = Result::Create(isolate);

  EXPECT_FALSE(runner.global().IsEmpty());
  runner.global()->Set(StringToV8(isolate, "timer"),
                       timer_module->GetWrapper(isolate));
  runner.global()->Set(StringToV8(isolate, "result"),
                       result->GetWrapper(isolate));

  // TODO(aa): Cannot do: if (++result.count == 3) because of v8 bug. Create
  // test case and report.
  std::string source =
     "timer.createRepeating(10, function() {"
     "  result.count++;"
     "  if (result.count == 3) {"
     "    result.quit();"
     "  }"
     "});";

  base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
  runner.Run(source, "script");
  EXPECT_EQ(0, result->count());

  loop.Run();
  EXPECT_EQ(3, result->count());
}

}  // namespace gin