OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/display/edid_parser.h" | 5 #include "ui/display/edid_parser.h" |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace ui { | 10 namespace ui { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 "\xB3\x00\xD1\xC0\xD1\x00\x28\x3C\x80\xA0\x70\xB0\x23\x40\x30\x20" | 90 "\xB3\x00\xD1\xC0\xD1\x00\x28\x3C\x80\xA0\x70\xB0\x23\x40\x30\x20" |
91 "\x36\x00\x07\x44\x21\x00\x00\x1A\x00\x00\x00\xFD\x00\x30\x55\x1E" | 91 "\x36\x00\x07\x44\x21\x00\x00\x1A\x00\x00\x00\xFD\x00\x30\x55\x1E" |
92 "\x5E\x15\x00\x0A\x20\x20\x20\x20\x20\x20\x00\x00\x00\xFC\x00\x48" | 92 "\x5E\x15\x00\x0A\x20\x20\x20\x20\x20\x20\x00\x00\x00\xFC\x00\x48" |
93 "\x50\x20\x4C\x50\x32\x34\x36\x35\x0A\x20\x20\x20\x00\x00\x00\xFF" | 93 "\x50\x20\x4C\x50\x32\x34\x36\x35\x0A\x20\x20\x20\x00\x00\x00\xFF" |
94 "\x00\x43\x4E\x4B\x38\x30\x32\x30\x34\x48\x4D\x0A\x20\x20\x00\x45"; | 94 "\x00\x43\x4E\x4B\x38\x30\x32\x30\x34\x48\x4D\x0A\x20\x20\x00\x45"; |
95 | 95 |
96 } // namespace | 96 } // namespace |
97 | 97 |
98 TEST(EDIDParserTest, ParseOverscanFlag) { | 98 TEST(EDIDParserTest, ParseOverscanFlag) { |
99 bool flag = false; | 99 bool flag = false; |
100 std::vector<uint8> edid( | 100 std::vector<uint8_t> edid( |
101 kNormalDisplay, kNormalDisplay + charsize(kNormalDisplay)); | 101 kNormalDisplay, kNormalDisplay + charsize(kNormalDisplay)); |
102 EXPECT_FALSE(ParseOutputOverscanFlag(edid, &flag)); | 102 EXPECT_FALSE(ParseOutputOverscanFlag(edid, &flag)); |
103 | 103 |
104 flag = false; | 104 flag = false; |
105 edid.assign(kInternalDisplay, kInternalDisplay + charsize(kInternalDisplay)); | 105 edid.assign(kInternalDisplay, kInternalDisplay + charsize(kInternalDisplay)); |
106 EXPECT_FALSE(ParseOutputOverscanFlag(edid, &flag)); | 106 EXPECT_FALSE(ParseOutputOverscanFlag(edid, &flag)); |
107 | 107 |
108 flag = false; | 108 flag = false; |
109 edid.assign(kOverscanDisplay, kOverscanDisplay + charsize(kOverscanDisplay)); | 109 edid.assign(kOverscanDisplay, kOverscanDisplay + charsize(kOverscanDisplay)); |
110 EXPECT_TRUE(ParseOutputOverscanFlag(edid, &flag)); | 110 EXPECT_TRUE(ParseOutputOverscanFlag(edid, &flag)); |
111 EXPECT_TRUE(flag); | 111 EXPECT_TRUE(flag); |
112 | 112 |
113 flag = false; | 113 flag = false; |
114 edid.assign( | 114 edid.assign( |
115 kMisdetectedDisplay, kMisdetectedDisplay + charsize(kMisdetectedDisplay)); | 115 kMisdetectedDisplay, kMisdetectedDisplay + charsize(kMisdetectedDisplay)); |
116 EXPECT_FALSE(ParseOutputOverscanFlag(edid, &flag)); | 116 EXPECT_FALSE(ParseOutputOverscanFlag(edid, &flag)); |
117 | 117 |
118 flag = false; | 118 flag = false; |
119 // Copy |kOverscanDisplay| and set flags to false in it. The overscan flags | 119 // Copy |kOverscanDisplay| and set flags to false in it. The overscan flags |
120 // are embedded at byte 150 in this specific example. Fix here too when the | 120 // are embedded at byte 150 in this specific example. Fix here too when the |
121 // contents of kOverscanDisplay is altered. | 121 // contents of kOverscanDisplay is altered. |
122 edid.assign(kOverscanDisplay, kOverscanDisplay + charsize(kOverscanDisplay)); | 122 edid.assign(kOverscanDisplay, kOverscanDisplay + charsize(kOverscanDisplay)); |
123 edid[150] = '\0'; | 123 edid[150] = '\0'; |
124 EXPECT_TRUE(ParseOutputOverscanFlag(edid, &flag)); | 124 EXPECT_TRUE(ParseOutputOverscanFlag(edid, &flag)); |
125 EXPECT_FALSE(flag); | 125 EXPECT_FALSE(flag); |
126 } | 126 } |
127 | 127 |
128 TEST(EDIDParserTest, ParseBrokenOverscanData) { | 128 TEST(EDIDParserTest, ParseBrokenOverscanData) { |
129 // Do not fill valid data here because it anyway fails to parse the data. | 129 // Do not fill valid data here because it anyway fails to parse the data. |
130 std::vector<uint8> data; | 130 std::vector<uint8_t> data; |
131 bool flag = false; | 131 bool flag = false; |
132 EXPECT_FALSE(ParseOutputOverscanFlag(data, &flag)); | 132 EXPECT_FALSE(ParseOutputOverscanFlag(data, &flag)); |
133 data.assign(126, '\0'); | 133 data.assign(126, '\0'); |
134 EXPECT_FALSE(ParseOutputOverscanFlag(data, &flag)); | 134 EXPECT_FALSE(ParseOutputOverscanFlag(data, &flag)); |
135 | 135 |
136 // extending data because ParseOutputOverscanFlag() will access the data. | 136 // extending data because ParseOutputOverscanFlag() will access the data. |
137 data.assign(128, '\0'); | 137 data.assign(128, '\0'); |
138 // The number of CEA extensions is stored at byte 126. | 138 // The number of CEA extensions is stored at byte 126. |
139 data[126] = '\x01'; | 139 data[126] = '\x01'; |
140 EXPECT_FALSE(ParseOutputOverscanFlag(data, &flag)); | 140 EXPECT_FALSE(ParseOutputOverscanFlag(data, &flag)); |
141 | 141 |
142 data.assign(150, '\0'); | 142 data.assign(150, '\0'); |
143 data[126] = '\x01'; | 143 data[126] = '\x01'; |
144 EXPECT_FALSE(ParseOutputOverscanFlag(data, &flag)); | 144 EXPECT_FALSE(ParseOutputOverscanFlag(data, &flag)); |
145 } | 145 } |
146 | 146 |
147 TEST(EDIDParserTest, ParseEDID) { | 147 TEST(EDIDParserTest, ParseEDID) { |
148 uint16 manufacturer_id = 0; | 148 uint16_t manufacturer_id = 0; |
149 std::string human_readable_name; | 149 std::string human_readable_name; |
150 std::vector<uint8> edid( | 150 std::vector<uint8_t> edid( |
151 kNormalDisplay, kNormalDisplay + charsize(kNormalDisplay)); | 151 kNormalDisplay, kNormalDisplay + charsize(kNormalDisplay)); |
152 EXPECT_TRUE(ParseOutputDeviceData( | 152 EXPECT_TRUE(ParseOutputDeviceData( |
153 edid, &manufacturer_id, &human_readable_name)); | 153 edid, &manufacturer_id, &human_readable_name)); |
154 EXPECT_EQ(0x22f0u, manufacturer_id); | 154 EXPECT_EQ(0x22f0u, manufacturer_id); |
155 EXPECT_EQ("HP ZR30w", human_readable_name); | 155 EXPECT_EQ("HP ZR30w", human_readable_name); |
156 | 156 |
157 manufacturer_id = 0; | 157 manufacturer_id = 0; |
158 human_readable_name.clear(); | 158 human_readable_name.clear(); |
159 edid.assign(kInternalDisplay, kInternalDisplay + charsize(kInternalDisplay)); | 159 edid.assign(kInternalDisplay, kInternalDisplay + charsize(kInternalDisplay)); |
160 EXPECT_TRUE(ParseOutputDeviceData(edid, &manufacturer_id, NULL)); | 160 EXPECT_TRUE(ParseOutputDeviceData(edid, &manufacturer_id, NULL)); |
161 EXPECT_EQ(0x4ca3u, manufacturer_id); | 161 EXPECT_EQ(0x4ca3u, manufacturer_id); |
162 EXPECT_EQ("", human_readable_name); | 162 EXPECT_EQ("", human_readable_name); |
163 | 163 |
164 // Internal display doesn't have name. | 164 // Internal display doesn't have name. |
165 EXPECT_TRUE(ParseOutputDeviceData(edid, NULL, &human_readable_name)); | 165 EXPECT_TRUE(ParseOutputDeviceData(edid, NULL, &human_readable_name)); |
166 EXPECT_TRUE(human_readable_name.empty()); | 166 EXPECT_TRUE(human_readable_name.empty()); |
167 | 167 |
168 manufacturer_id = 0; | 168 manufacturer_id = 0; |
169 human_readable_name.clear(); | 169 human_readable_name.clear(); |
170 edid.assign(kOverscanDisplay, kOverscanDisplay + charsize(kOverscanDisplay)); | 170 edid.assign(kOverscanDisplay, kOverscanDisplay + charsize(kOverscanDisplay)); |
171 EXPECT_TRUE(ParseOutputDeviceData( | 171 EXPECT_TRUE(ParseOutputDeviceData( |
172 edid, &manufacturer_id, &human_readable_name)); | 172 edid, &manufacturer_id, &human_readable_name)); |
173 EXPECT_EQ(0x4c2du, manufacturer_id); | 173 EXPECT_EQ(0x4c2du, manufacturer_id); |
174 EXPECT_EQ("SAMSUNG", human_readable_name); | 174 EXPECT_EQ("SAMSUNG", human_readable_name); |
175 } | 175 } |
176 | 176 |
177 TEST(EDIDParserTest, ParseBrokenEDID) { | 177 TEST(EDIDParserTest, ParseBrokenEDID) { |
178 uint16 manufacturer_id = 0; | 178 uint16_t manufacturer_id = 0; |
179 std::string human_readable_name; | 179 std::string human_readable_name; |
180 std::vector<uint8> edid; | 180 std::vector<uint8_t> edid; |
181 | 181 |
182 // length == 0 | 182 // length == 0 |
183 EXPECT_FALSE(ParseOutputDeviceData( | 183 EXPECT_FALSE(ParseOutputDeviceData( |
184 edid, &manufacturer_id, &human_readable_name)); | 184 edid, &manufacturer_id, &human_readable_name)); |
185 | 185 |
186 // name is broken. Copying kNormalDisplay and substitute its name data by | 186 // name is broken. Copying kNormalDisplay and substitute its name data by |
187 // some control code. | 187 // some control code. |
188 edid.assign(kNormalDisplay, kNormalDisplay + charsize(kNormalDisplay)); | 188 edid.assign(kNormalDisplay, kNormalDisplay + charsize(kNormalDisplay)); |
189 | 189 |
190 // display's name data is embedded in byte 95-107 in this specific example. | 190 // display's name data is embedded in byte 95-107 in this specific example. |
191 // Fix here too when the contents of kNormalDisplay is altered. | 191 // Fix here too when the contents of kNormalDisplay is altered. |
192 edid[97] = '\x1b'; | 192 edid[97] = '\x1b'; |
193 EXPECT_FALSE(ParseOutputDeviceData( | 193 EXPECT_FALSE(ParseOutputDeviceData( |
194 edid, &manufacturer_id, &human_readable_name)); | 194 edid, &manufacturer_id, &human_readable_name)); |
195 | 195 |
196 // If |human_readable_name| isn't specified, it skips parsing the name. | 196 // If |human_readable_name| isn't specified, it skips parsing the name. |
197 manufacturer_id = 0; | 197 manufacturer_id = 0; |
198 EXPECT_TRUE(ParseOutputDeviceData(edid, &manufacturer_id, NULL)); | 198 EXPECT_TRUE(ParseOutputDeviceData(edid, &manufacturer_id, NULL)); |
199 EXPECT_EQ(0x22f0u, manufacturer_id); | 199 EXPECT_EQ(0x22f0u, manufacturer_id); |
200 } | 200 } |
201 | 201 |
202 TEST(EDIDParserTest, GetDisplayId) { | 202 TEST(EDIDParserTest, GetDisplayId) { |
203 // EDID of kLP2565A and B are slightly different but actually the same device. | 203 // EDID of kLP2565A and B are slightly different but actually the same device. |
204 int64 id1 = -1; | 204 int64_t id1 = -1; |
205 int64 id2 = -1; | 205 int64_t id2 = -1; |
206 std::vector<uint8> edid(kLP2565A, kLP2565A + charsize(kLP2565A)); | 206 std::vector<uint8_t> edid(kLP2565A, kLP2565A + charsize(kLP2565A)); |
207 EXPECT_TRUE(GetDisplayIdFromEDID(edid, 0, &id1)); | 207 EXPECT_TRUE(GetDisplayIdFromEDID(edid, 0, &id1)); |
208 edid.assign(kLP2565B, kLP2565B + charsize(kLP2565B)); | 208 edid.assign(kLP2565B, kLP2565B + charsize(kLP2565B)); |
209 EXPECT_TRUE(GetDisplayIdFromEDID(edid, 0, &id2)); | 209 EXPECT_TRUE(GetDisplayIdFromEDID(edid, 0, &id2)); |
210 EXPECT_EQ(id1, id2); | 210 EXPECT_EQ(id1, id2); |
211 EXPECT_NE(-1, id1); | 211 EXPECT_NE(-1, id1); |
212 } | 212 } |
213 | 213 |
214 TEST(EDIDParserTest, GetDisplayIdFromInternal) { | 214 TEST(EDIDParserTest, GetDisplayIdFromInternal) { |
215 int64 id = -1; | 215 int64_t id = -1; |
216 std::vector<uint8> edid( | 216 std::vector<uint8_t> edid( |
217 kInternalDisplay, kInternalDisplay + charsize(kInternalDisplay)); | 217 kInternalDisplay, kInternalDisplay + charsize(kInternalDisplay)); |
218 EXPECT_TRUE(GetDisplayIdFromEDID(edid, 0, &id)); | 218 EXPECT_TRUE(GetDisplayIdFromEDID(edid, 0, &id)); |
219 EXPECT_NE(-1, id); | 219 EXPECT_NE(-1, id); |
220 } | 220 } |
221 | 221 |
222 TEST(EDIDParserTest, GetDisplayIdFailure) { | 222 TEST(EDIDParserTest, GetDisplayIdFailure) { |
223 int64 id = -1; | 223 int64_t id = -1; |
224 std::vector<uint8> edid; | 224 std::vector<uint8_t> edid; |
225 EXPECT_FALSE(GetDisplayIdFromEDID(edid, 0, &id)); | 225 EXPECT_FALSE(GetDisplayIdFromEDID(edid, 0, &id)); |
226 EXPECT_EQ(-1, id); | 226 EXPECT_EQ(-1, id); |
227 } | 227 } |
228 | 228 |
229 } // namespace ui | 229 } // namespace ui |
OLD | NEW |