blob: 08d2ced1322b4d0ecc8b3e255316f0a1e591e56d [file] [log] [blame]
// 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 "chrome/browser/chromeos/drive/job_queue.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace drive {
TEST(JobQueueTest, BasicJobQueueOperations) {
const int kNumMaxConcurrentJobs = 3;
const int kNumPriorityLevels = 2;
enum {HIGH_PRIORITY, LOW_PRIORITY};
// Create a queue. Number of jobs are initially zero.
JobQueue queue(kNumMaxConcurrentJobs, kNumPriorityLevels);
EXPECT_EQ(0U, queue.GetNumberOfJobs());
// Push 4 jobs.
queue.Push(101, LOW_PRIORITY);
queue.Push(102, HIGH_PRIORITY);
queue.Push(103, LOW_PRIORITY);
queue.Push(104, HIGH_PRIORITY);
// High priority jobs should be popped first.
JobID id;
EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
EXPECT_EQ(102, id);
EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
EXPECT_EQ(104, id);
// Then low priority jobs follow.
EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
EXPECT_EQ(101, id);
// The queue allows at most 3 parallel runs. So returns false here.
EXPECT_FALSE(queue.PopForRun(LOW_PRIORITY, &id));
// No jobs finished yet, so the job count is four.
EXPECT_EQ(4U, queue.GetNumberOfJobs());
// Mark one job as finished.
queue.MarkFinished(104);
EXPECT_EQ(3U, queue.GetNumberOfJobs());
// Then the next jobs can be popped.
EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
EXPECT_EQ(103, id);
// Push 1 more job.
queue.Push(105, LOW_PRIORITY);
// Finish all 3 running jobs.
queue.MarkFinished(101);
queue.MarkFinished(102);
queue.MarkFinished(103);
EXPECT_EQ(1U, queue.GetNumberOfJobs());
// The remaining jobs is of low priority, so under HIGH_PRIORITY context, it
// cannot be popped for running.
EXPECT_FALSE(queue.PopForRun(HIGH_PRIORITY, &id));
// Under the low priority context, it is fine.
EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
EXPECT_EQ(105, id);
}
TEST(JobQueueTest, JobQueueRemove) {
const int kNumMaxConcurrentJobs = 3;
const int kNumPriorityLevels = 2;
enum {HIGH_PRIORITY, LOW_PRIORITY};
// Create a queue. Number of jobs are initially zero.
JobQueue queue(kNumMaxConcurrentJobs, kNumPriorityLevels);
EXPECT_EQ(0U, queue.GetNumberOfJobs());
// Push 4 jobs.
queue.Push(101, LOW_PRIORITY);
queue.Push(102, HIGH_PRIORITY);
queue.Push(103, LOW_PRIORITY);
queue.Push(104, HIGH_PRIORITY);
EXPECT_EQ(4U, queue.GetNumberOfJobs());
// Remove 2.
queue.Remove(101);
queue.Remove(104);
EXPECT_EQ(2U, queue.GetNumberOfJobs());
// Pop the 2 jobs.
JobID id;
EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
EXPECT_EQ(102, id);
EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id));
EXPECT_EQ(103, id);
queue.MarkFinished(102);
queue.MarkFinished(103);
// 0 job left.
EXPECT_EQ(0U, queue.GetNumberOfJobs());
EXPECT_FALSE(queue.PopForRun(LOW_PRIORITY, &id));
}
} // namespace drive