190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/job_queue.h" 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace drive { 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(JobQueueTest, BasicJobQueueOperations) { 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int kNumMaxConcurrentJobs = 3; 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const int kNumPriorityLevels = 2; 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) enum {HIGH_PRIORITY, LOW_PRIORITY}; 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create a queue. Number of jobs are initially zero. 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) JobQueue queue(kNumMaxConcurrentJobs, kNumPriorityLevels); 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0U, queue.GetNumberOfJobs()); 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Push 4 jobs. 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.Push(101, LOW_PRIORITY); 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.Push(102, HIGH_PRIORITY); 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.Push(103, LOW_PRIORITY); 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.Push(104, HIGH_PRIORITY); 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // High priority jobs should be popped first. 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) JobID id; 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id)); 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(102, id); 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id)); 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(104, id); 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Then low priority jobs follow. 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id)); 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(101, id); 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The queue allows at most 3 parallel runs. So returns false here. 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(queue.PopForRun(LOW_PRIORITY, &id)); 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // No jobs finished yet, so the job count is four. 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(4U, queue.GetNumberOfJobs()); 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Mark one job as finished. 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.MarkFinished(104); 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(3U, queue.GetNumberOfJobs()); 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Then the next jobs can be popped. 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id)); 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(103, id); 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Push 1 more job. 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.Push(105, LOW_PRIORITY); 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Finish all 3 running jobs. 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.MarkFinished(101); 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.MarkFinished(102); 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.MarkFinished(103); 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1U, queue.GetNumberOfJobs()); 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The remaining jobs is of low priority, so under HIGH_PRIORITY context, it 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // cannot be popped for running. 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(queue.PopForRun(HIGH_PRIORITY, &id)); 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Under the low priority context, it is fine. 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id)); 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(105, id); 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(JobQueueTest, JobQueueRemove) { 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const int kNumMaxConcurrentJobs = 3; 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const int kNumPriorityLevels = 2; 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch enum {HIGH_PRIORITY, LOW_PRIORITY}; 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create a queue. Number of jobs are initially zero. 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch JobQueue queue(kNumMaxConcurrentJobs, kNumPriorityLevels); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0U, queue.GetNumberOfJobs()); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Push 4 jobs. 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch queue.Push(101, LOW_PRIORITY); 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch queue.Push(102, HIGH_PRIORITY); 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch queue.Push(103, LOW_PRIORITY); 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch queue.Push(104, HIGH_PRIORITY); 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(4U, queue.GetNumberOfJobs()); 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Remove 2. 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch queue.Remove(101); 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch queue.Remove(104); 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(2U, queue.GetNumberOfJobs()); 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Pop the 2 jobs. 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch JobID id; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id)); 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(102, id); 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(queue.PopForRun(LOW_PRIORITY, &id)); 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(103, id); 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch queue.MarkFinished(102); 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch queue.MarkFinished(103); 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // 0 job left. 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0U, queue.GetNumberOfJobs()); 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(queue.PopForRun(LOW_PRIORITY, &id)); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace drive 105