- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / drive / job_queue_unittest.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/drive/job_queue.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace drive {
10
11 TEST(JobQueueTest, BasicJobQueueOperations) {
12   const int kNumMaxConcurrentJobs = 3;
13   const int kNumPriorityLevels = 2;
14   enum {HIGH_PRIORITY, LOW_PRIORITY};
15
16   // Create a queue. Number of jobs are initially zero.
17   JobQueue queue(kNumMaxConcurrentJobs, kNumPriorityLevels);
18   EXPECT_EQ(0U, queue.GetNumberOfJobs());
19
20   // Push 4 jobs.
21   queue.Push(101, LOW_PRIORITY);
22   queue.Push(102, HIGH_PRIORITY);
23   queue.Push(103, LOW_PRIORITY);
24   queue.Push(104, HIGH_PRIORITY);
25
26   // High priority jobs should be popped first.
27   JobID id;
28   EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
29   EXPECT_EQ(102, id);
30   EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
31   EXPECT_EQ(104, id);
32
33   // Then low priority jobs follow.
34   EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
35   EXPECT_EQ(101, id);
36
37   // The queue allows at most 3 parallel runs. So returns false here.
38   EXPECT_FALSE(queue.PopForRun(LOW_PRIORITY, &id));
39
40   // No jobs finished yet, so the job count is four.
41   EXPECT_EQ(4U, queue.GetNumberOfJobs());
42
43   // Mark one job as finished.
44   queue.MarkFinished(104);
45   EXPECT_EQ(3U, queue.GetNumberOfJobs());
46
47   // Then the next jobs can be popped.
48   EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
49   EXPECT_EQ(103, id);
50
51   // Push 1 more job.
52   queue.Push(105, LOW_PRIORITY);
53
54   // Finish all 3 running jobs.
55   queue.MarkFinished(101);
56   queue.MarkFinished(102);
57   queue.MarkFinished(103);
58   EXPECT_EQ(1U, queue.GetNumberOfJobs());
59
60   // The remaining jobs is of low priority, so under HIGH_PRIORITY context, it
61   // cannot be popped for running.
62   EXPECT_FALSE(queue.PopForRun(HIGH_PRIORITY, &id));
63
64   // Under the low priority context, it is fine.
65   EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
66   EXPECT_EQ(105, id);
67 }
68
69 TEST(JobQueueTest, JobQueueRemove) {
70   const int kNumMaxConcurrentJobs = 3;
71   const int kNumPriorityLevels = 2;
72   enum {HIGH_PRIORITY, LOW_PRIORITY};
73
74   // Create a queue. Number of jobs are initially zero.
75   JobQueue queue(kNumMaxConcurrentJobs, kNumPriorityLevels);
76   EXPECT_EQ(0U, queue.GetNumberOfJobs());
77
78   // Push 4 jobs.
79   queue.Push(101, LOW_PRIORITY);
80   queue.Push(102, HIGH_PRIORITY);
81   queue.Push(103, LOW_PRIORITY);
82   queue.Push(104, HIGH_PRIORITY);
83   EXPECT_EQ(4U, queue.GetNumberOfJobs());
84
85   // Remove 2.
86   queue.Remove(101);
87   queue.Remove(104);
88   EXPECT_EQ(2U, queue.GetNumberOfJobs());
89
90   // Pop the 2 jobs.
91   JobID id;
92   EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
93   EXPECT_EQ(102, id);
94   EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
95   EXPECT_EQ(103, id);
96   queue.MarkFinished(102);
97   queue.MarkFinished(103);
98
99   // 0 job left.
100   EXPECT_EQ(0U, queue.GetNumberOfJobs());
101   EXPECT_FALSE(queue.PopForRun(LOW_PRIORITY, &id));
102 }
103
104 }  // namespace drive