root/chrome/browser/chromeos/drive/job_queue_unittest.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. TEST
  2. TEST

// 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

/* [<][>][^][v][top][bottom][index][help] */