1// Copyright (c) 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// MTPDeviceObjectEnumerator unit tests.
6
7#include "chrome/browser/media_galleries/win/mtp_device_object_enumerator.h"
8
9#include <ctime>
10
11#include "base/basictypes.h"
12#include "base/strings/string16.h"
13#include "base/time/time.h"
14#include "chrome/browser/media_galleries/win/mtp_device_object_entry.h"
15#include "testing/gtest/include/gtest/gtest.h"
16
17namespace {
18
19struct MTPDeviceObjectEntryData {
20  // Friendly name of the object, e.g. "IMG_9911.jpeg".
21  base::string16 name;
22
23  // The object identifier, e.g. "o299".
24  base::string16 object_id;
25
26  // True if the current object is a directory/folder/album content type.
27  bool is_directory;
28
29  // The object file size in bytes, e.g. "882992".
30  int64 size;
31
32  // Last modified time of the object.
33  time_t last_modified_time;
34};
35
36const MTPDeviceObjectEntryData kTestCases[] = {
37  { L"File_1", L"o100", false, 10023, 1121 },
38  { L"Directory_1", L"o52", true, 99833, 2231 },
39  { L"File_2", L"o230", false, 8733, 7372 },
40};
41
42void TestEnumeratorIsEmpty(MTPDeviceObjectEnumerator* enumerator) {
43  EXPECT_EQ(base::string16(), enumerator->GetObjectId());
44  EXPECT_EQ(0, enumerator->Size());
45  EXPECT_FALSE(enumerator->IsDirectory());
46  EXPECT_TRUE(enumerator->LastModifiedTime().is_null());
47}
48
49void TestNextEntryIsEmpty(MTPDeviceObjectEnumerator* enumerator) {
50  EXPECT_TRUE(enumerator->Next().empty());
51}
52
53typedef testing::Test MTPDeviceObjectEnumeratorWinTest;
54
55TEST_F(MTPDeviceObjectEnumeratorWinTest, Empty) {
56  MTPDeviceObjectEntries entries;
57  MTPDeviceObjectEnumerator enumerator(entries);
58  TestEnumeratorIsEmpty(&enumerator);
59  TestNextEntryIsEmpty(&enumerator);
60  TestNextEntryIsEmpty(&enumerator);
61  TestEnumeratorIsEmpty(&enumerator);
62}
63
64TEST_F(MTPDeviceObjectEnumeratorWinTest, Traversal) {
65  MTPDeviceObjectEntries entries;
66  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
67    entries.push_back(MTPDeviceObjectEntry(
68        kTestCases[i].object_id,
69        kTestCases[i].name,
70        kTestCases[i].is_directory,
71        kTestCases[i].size,
72        base::Time::FromTimeT(kTestCases[i].last_modified_time)));
73  }
74  MTPDeviceObjectEnumerator enumerator(entries);
75  TestEnumeratorIsEmpty(&enumerator);
76  TestEnumeratorIsEmpty(&enumerator);
77  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
78    EXPECT_EQ(kTestCases[i].name, enumerator.Next().value());
79    EXPECT_EQ(kTestCases[i].object_id, enumerator.GetObjectId());
80    EXPECT_EQ(kTestCases[i].size, enumerator.Size());
81    EXPECT_EQ(kTestCases[i].is_directory, enumerator.IsDirectory());
82    EXPECT_EQ(kTestCases[i].last_modified_time,
83              enumerator.LastModifiedTime().ToTimeT());
84  }
85  TestNextEntryIsEmpty(&enumerator);
86  TestNextEntryIsEmpty(&enumerator);
87  TestEnumeratorIsEmpty(&enumerator);
88  TestNextEntryIsEmpty(&enumerator);
89  TestEnumeratorIsEmpty(&enumerator);
90}
91
92}  // namespace
93