Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/policy/device_status_collector.h" | 5 #include "chrome/browser/policy/device_status_collector.h" |
| 6 | 6 |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/time.h" | 8 #include "base/time.h" |
| 9 #include "chrome/browser/idle.h" | 9 #include "chrome/browser/idle.h" |
| 10 #include "chrome/browser/chromeos/cros_settings.h" | 10 #include "chrome/browser/chromeos/cros_settings.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 namespace em = enterprise_management; | 25 namespace em = enterprise_management; |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 class TestingDeviceStatusCollector : public policy::DeviceStatusCollector { | 29 class TestingDeviceStatusCollector : public policy::DeviceStatusCollector { |
| 30 public: | 30 public: |
| 31 TestingDeviceStatusCollector( | 31 TestingDeviceStatusCollector( |
| 32 PrefService* local_state, | 32 PrefService* local_state, |
| 33 chromeos::system::StatisticsProvider* provider) | 33 chromeos::system::StatisticsProvider* provider) |
| 34 : policy::DeviceStatusCollector(local_state, provider), | 34 : policy::DeviceStatusCollector(local_state, provider), |
| 35 local_state_(local_state), | 35 local_state_(local_state) { |
| 36 baseline_time_(Time::Now()) { | 36 // Set the baseline time to a fixed value (1 AM) to prevent test flakiness |
| 37 // due to a single activity period spanning two days. | |
| 38 SetBaselineTime(Time::Now().LocalMidnight() + TimeDelta::FromHours(1)); | |
| 37 } | 39 } |
| 38 | 40 |
| 39 void Simulate(IdleState* states, int len) { | 41 void Simulate(IdleState* states, int len) { |
| 40 for (int i = 0; i < len; i++) | 42 for (int i = 0; i < len; i++) |
| 41 IdleStateCallback(states[i]); | 43 IdleStateCallback(states[i]); |
| 42 } | 44 } |
| 43 | 45 |
| 44 void SimulateWithSleep(IdleState* states, int len, int ) { | 46 void set_max_stored_past_activity_days(unsigned int value) { |
| 45 for (int i = 0; i < len; i++) | 47 max_stored_past_activity_days_ = value; |
| 46 IdleStateCallback(states[i]); | |
| 47 } | 48 } |
| 48 | 49 |
| 49 void set_max_stored_active_periods(unsigned int value) { | 50 void set_max_stored_future_activity_days(unsigned int value) { |
| 50 max_stored_active_periods_ = value; | 51 max_stored_future_activity_days_ = value; |
| 52 } | |
| 53 | |
| 54 // Reset the baseline time. | |
| 55 void SetBaselineTime(Time time) { | |
| 56 baseline_time_ = time; | |
| 57 baseline_offset_periods_ = 0; | |
| 51 } | 58 } |
| 52 | 59 |
| 53 protected: | 60 protected: |
| 54 virtual void CheckIdleState() OVERRIDE { | 61 virtual void CheckIdleState() OVERRIDE { |
| 55 // This should never be called in testing, as it results in a dbus call. | 62 // This should never be called in testing, as it results in a dbus call. |
| 56 NOTREACHED(); | 63 NOTREACHED(); |
| 57 } | 64 } |
| 58 | 65 |
| 59 // Each time this is called, returns a time that is a fixed increment | 66 // Each time this is called, returns a time that is a fixed increment |
| 60 // later than the previous time. | 67 // later than the previous time. |
| 61 virtual Time GetCurrentTime() OVERRIDE { | 68 virtual Time GetCurrentTime() OVERRIDE { |
| 62 static int call_count = 0; | 69 int poll_interval = policy::DeviceStatusCollector::kPollIntervalSeconds; |
| 63 return baseline_time_ + TimeDelta::FromSeconds( | 70 return baseline_time_ + |
| 64 policy::DeviceStatusCollector::kPollIntervalSeconds * call_count++); | 71 TimeDelta::FromSeconds(poll_interval * baseline_offset_periods_++); |
| 65 } | 72 } |
| 66 | 73 |
| 67 private: | 74 private: |
| 68 PrefService* local_state_; | 75 PrefService* local_state_; |
| 69 | 76 |
| 70 // Baseline time for the fake times returned from GetCurrentTime(). | 77 // Baseline time for the fake times returned from GetCurrentTime(). |
| 71 // It doesn't really matter what this is, as long as it stays the same over | |
| 72 // the lifetime of the object. | |
| 73 Time baseline_time_; | 78 Time baseline_time_; |
| 79 | |
| 80 // The number of simulated periods since the baseline time. | |
| 81 int baseline_offset_periods_; | |
| 74 }; | 82 }; |
| 75 | 83 |
| 76 // Return the total number of active milliseconds contained in a device | 84 // Return the total number of active milliseconds contained in a device |
| 77 // status report. | 85 // status report. |
| 78 int64 GetActiveMilliseconds(em::DeviceStatusReportRequest& status) { | 86 int64 GetActiveMilliseconds(em::DeviceStatusReportRequest& status) { |
| 79 int64 active_milliseconds = 0; | 87 int64 active_milliseconds = 0; |
| 80 for (int i = 0; i < status.active_time_size(); i++) { | 88 for (int i = 0; i < status.active_period_size(); i++) { |
| 81 const em::TimePeriod& period = status.active_time(i); | 89 active_milliseconds += status.active_period(i).active_duration(); |
| 82 active_milliseconds += period.end_timestamp() - period.start_timestamp(); | |
| 83 } | 90 } |
| 84 return active_milliseconds; | 91 return active_milliseconds; |
| 85 } | 92 } |
| 86 | 93 |
| 87 } // namespace | 94 } // namespace |
| 88 | 95 |
| 89 namespace policy { | 96 namespace policy { |
| 90 | 97 |
| 91 using ::testing::_; | 98 using ::testing::_; |
| 92 using ::testing::NotNull; | 99 using ::testing::NotNull; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 145 TEST_F(DeviceStatusCollectorTest, AllIdle) { | 152 TEST_F(DeviceStatusCollectorTest, AllIdle) { |
| 146 IdleState test_states[] = { | 153 IdleState test_states[] = { |
| 147 IDLE_STATE_IDLE, | 154 IDLE_STATE_IDLE, |
| 148 IDLE_STATE_IDLE, | 155 IDLE_STATE_IDLE, |
| 149 IDLE_STATE_IDLE | 156 IDLE_STATE_IDLE |
| 150 }; | 157 }; |
| 151 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); | 158 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); |
| 152 | 159 |
| 153 // Test reporting with no data. | 160 // Test reporting with no data. |
| 154 status_collector_.GetStatus(&status_); | 161 status_collector_.GetStatus(&status_); |
| 155 EXPECT_EQ(0, status_.active_time_size()); | 162 EXPECT_EQ(0, status_.active_period_size()); |
| 156 EXPECT_EQ(0, GetActiveMilliseconds(status_)); | 163 EXPECT_EQ(0, GetActiveMilliseconds(status_)); |
| 157 | 164 |
| 158 // Test reporting with a single idle sample. | 165 // Test reporting with a single idle sample. |
| 159 status_collector_.Simulate(test_states, 1); | 166 status_collector_.Simulate(test_states, 1); |
| 160 status_collector_.GetStatus(&status_); | 167 status_collector_.GetStatus(&status_); |
| 161 EXPECT_EQ(0, status_.active_time_size()); | 168 EXPECT_EQ(0, status_.active_period_size()); |
| 162 EXPECT_EQ(0, GetActiveMilliseconds(status_)); | 169 EXPECT_EQ(0, GetActiveMilliseconds(status_)); |
| 163 | 170 |
| 164 // Test reporting with multiple consecutive idle samples. | 171 // Test reporting with multiple consecutive idle samples. |
| 165 status_collector_.Simulate(test_states, | 172 status_collector_.Simulate(test_states, |
| 166 sizeof(test_states) / sizeof(IdleState)); | 173 sizeof(test_states) / sizeof(IdleState)); |
| 167 status_collector_.GetStatus(&status_); | 174 status_collector_.GetStatus(&status_); |
| 168 EXPECT_EQ(0, status_.active_time_size()); | 175 EXPECT_EQ(0, status_.active_period_size()); |
| 169 EXPECT_EQ(0, GetActiveMilliseconds(status_)); | 176 EXPECT_EQ(0, GetActiveMilliseconds(status_)); |
| 170 } | 177 } |
| 171 | 178 |
| 172 TEST_F(DeviceStatusCollectorTest, AllActive) { | 179 TEST_F(DeviceStatusCollectorTest, AllActive) { |
| 173 IdleState test_states[] = { | 180 IdleState test_states[] = { |
| 174 IDLE_STATE_ACTIVE, | 181 IDLE_STATE_ACTIVE, |
| 175 IDLE_STATE_ACTIVE, | 182 IDLE_STATE_ACTIVE, |
| 176 IDLE_STATE_ACTIVE | 183 IDLE_STATE_ACTIVE |
| 177 }; | 184 }; |
| 178 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); | 185 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); |
| 179 | 186 |
| 180 // Test a single active sample. | 187 // Test a single active sample. |
| 181 status_collector_.Simulate(test_states, 1); | 188 status_collector_.Simulate(test_states, 1); |
| 182 status_collector_.GetStatus(&status_); | 189 status_collector_.GetStatus(&status_); |
| 183 EXPECT_EQ(1, status_.active_time_size()); | 190 EXPECT_EQ(1, status_.active_period_size()); |
| 184 EXPECT_EQ(1 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); | 191 EXPECT_EQ(1 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); |
| 185 status_.clear_active_time(); // Clear the result protobuf. | 192 status_.clear_active_period(); // Clear the result protobuf. |
| 186 | 193 |
| 187 // Test multiple consecutive active samples -- they should be coalesced | 194 // Test multiple consecutive active samples. |
| 188 // into a single active period. | |
| 189 status_collector_.Simulate(test_states, | 195 status_collector_.Simulate(test_states, |
| 190 sizeof(test_states) / sizeof(IdleState)); | 196 sizeof(test_states) / sizeof(IdleState)); |
| 191 status_collector_.GetStatus(&status_); | 197 status_collector_.GetStatus(&status_); |
| 192 EXPECT_EQ(1, status_.active_time_size()); | 198 EXPECT_EQ(1, status_.active_period_size()); |
| 193 EXPECT_EQ(3 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); | 199 EXPECT_EQ(3 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); |
| 194 } | 200 } |
| 195 | 201 |
| 196 TEST_F(DeviceStatusCollectorTest, MixedStates) { | 202 TEST_F(DeviceStatusCollectorTest, MixedStates) { |
| 197 IdleState test_states[] = { | 203 IdleState test_states[] = { |
| 198 IDLE_STATE_ACTIVE, | 204 IDLE_STATE_ACTIVE, |
| 199 IDLE_STATE_IDLE, | 205 IDLE_STATE_IDLE, |
| 200 IDLE_STATE_ACTIVE, | 206 IDLE_STATE_ACTIVE, |
| 201 IDLE_STATE_ACTIVE, | 207 IDLE_STATE_ACTIVE, |
| 202 IDLE_STATE_IDLE, | 208 IDLE_STATE_IDLE, |
| 203 IDLE_STATE_IDLE, | 209 IDLE_STATE_IDLE, |
| 204 IDLE_STATE_ACTIVE | 210 IDLE_STATE_ACTIVE |
| 205 }; | 211 }; |
| 206 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); | 212 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); |
| 207 status_collector_.Simulate(test_states, | 213 status_collector_.Simulate(test_states, |
| 208 sizeof(test_states) / sizeof(IdleState)); | 214 sizeof(test_states) / sizeof(IdleState)); |
| 209 status_collector_.GetStatus(&status_); | 215 status_collector_.GetStatus(&status_); |
| 210 EXPECT_EQ(3, status_.active_time_size()); | |
| 211 EXPECT_EQ(4 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); | 216 EXPECT_EQ(4 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); |
| 212 } | 217 } |
| 213 | 218 |
| 214 TEST_F(DeviceStatusCollectorTest, StateKeptInPref) { | 219 TEST_F(DeviceStatusCollectorTest, StateKeptInPref) { |
| 215 IdleState test_states[] = { | 220 IdleState test_states[] = { |
| 216 IDLE_STATE_ACTIVE, | 221 IDLE_STATE_ACTIVE, |
| 217 IDLE_STATE_IDLE, | 222 IDLE_STATE_IDLE, |
| 218 IDLE_STATE_ACTIVE, | 223 IDLE_STATE_ACTIVE, |
| 219 IDLE_STATE_ACTIVE, | 224 IDLE_STATE_ACTIVE, |
| 220 IDLE_STATE_IDLE, | 225 IDLE_STATE_IDLE, |
| 221 IDLE_STATE_IDLE | 226 IDLE_STATE_IDLE |
| 222 }; | 227 }; |
| 223 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); | 228 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); |
| 224 status_collector_.Simulate(test_states, | 229 status_collector_.Simulate(test_states, |
| 225 sizeof(test_states) / sizeof(IdleState)); | 230 sizeof(test_states) / sizeof(IdleState)); |
| 226 | 231 |
| 227 // Process the list a second time with a different collector. | 232 // Process the list a second time with a different collector. |
| 228 // It should be able to count the active periods found by the first | 233 // It should be able to count the active periods found by the first |
| 229 // collector, because the results are stored in a pref. | 234 // collector, because the results are stored in a pref. |
| 230 TestingDeviceStatusCollector second_collector(&prefs_, | 235 TestingDeviceStatusCollector second_collector(&prefs_, |
| 231 &statistics_provider_); | 236 &statistics_provider_); |
| 232 second_collector.Simulate(test_states, | 237 second_collector.Simulate(test_states, |
| 233 sizeof(test_states) / sizeof(IdleState)); | 238 sizeof(test_states) / sizeof(IdleState)); |
| 234 | 239 |
| 235 second_collector.GetStatus(&status_); | 240 second_collector.GetStatus(&status_); |
| 236 EXPECT_EQ(4, status_.active_time_size()); | |
| 237 EXPECT_EQ(6 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); | 241 EXPECT_EQ(6 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); |
| 238 } | 242 } |
| 239 | 243 |
| 240 TEST_F(DeviceStatusCollectorTest, Times) { | 244 TEST_F(DeviceStatusCollectorTest, Times) { |
| 241 IdleState test_states[] = { | 245 IdleState test_states[] = { |
| 242 IDLE_STATE_ACTIVE, | 246 IDLE_STATE_ACTIVE, |
| 243 IDLE_STATE_IDLE, | 247 IDLE_STATE_IDLE, |
| 244 IDLE_STATE_ACTIVE, | 248 IDLE_STATE_ACTIVE, |
| 245 IDLE_STATE_ACTIVE, | 249 IDLE_STATE_ACTIVE, |
| 246 IDLE_STATE_IDLE, | 250 IDLE_STATE_IDLE, |
| 247 IDLE_STATE_IDLE | 251 IDLE_STATE_IDLE |
| 248 }; | 252 }; |
| 249 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); | 253 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); |
| 250 status_collector_.Simulate(test_states, | 254 status_collector_.Simulate(test_states, |
| 251 sizeof(test_states) / sizeof(IdleState)); | 255 sizeof(test_states) / sizeof(IdleState)); |
| 252 status_collector_.GetStatus(&status_); | 256 status_collector_.GetStatus(&status_); |
| 253 EXPECT_EQ(2, status_.active_time_size()); | |
| 254 | |
| 255 EXPECT_EQ(3 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); | 257 EXPECT_EQ(3 * ActivePeriodMilliseconds(), GetActiveMilliseconds(status_)); |
| 256 } | 258 } |
| 257 | 259 |
| 258 TEST_F(DeviceStatusCollectorTest, MaxStoredPeriods) { | 260 TEST_F(DeviceStatusCollectorTest, MaxStoredPeriods) { |
| 259 IdleState test_states[] = { | 261 IdleState test_states[] = { |
| 260 IDLE_STATE_ACTIVE, | 262 IDLE_STATE_ACTIVE, |
| 261 IDLE_STATE_IDLE | 263 IDLE_STATE_IDLE |
| 262 }; | 264 }; |
| 263 unsigned int max_periods = 10; | 265 unsigned int max_days = 10; |
| 264 | 266 |
| 265 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); | 267 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); |
| 266 status_collector_.set_max_stored_active_periods(max_periods); | 268 status_collector_.set_max_stored_past_activity_days(max_days - 1); |
| 269 status_collector_.set_max_stored_future_activity_days(1); | |
| 270 Time baseline = Time::Now().LocalMidnight(); | |
| 267 | 271 |
| 268 // Simulate 12 active periods. | 272 // Simulate 12 active periods. |
| 269 for (int i = 0; i < 12; i++) { | 273 for (int i = 0; i < static_cast<int>(max_days) + 2; i++) { |
| 270 status_collector_.Simulate(test_states, | 274 status_collector_.Simulate(test_states, |
| 271 sizeof(test_states) / sizeof(IdleState)); | 275 sizeof(test_states) / sizeof(IdleState)); |
| 276 // Advance the simulated clock by a day. | |
| 277 baseline += TimeDelta::FromDays(1); | |
| 278 status_collector_.SetBaselineTime(baseline); | |
| 272 } | 279 } |
| 273 | 280 |
| 274 // Check that we don't exceed the max number of periods. | 281 // Check that we don't exceed the max number of periods. |
| 275 status_collector_.GetStatus(&status_); | 282 status_collector_.GetStatus(&status_); |
| 276 EXPECT_EQ(static_cast<int>(max_periods), status_.active_time_size()); | 283 EXPECT_EQ(static_cast<int>(max_days), status_.active_period_size()); |
| 284 | |
| 285 // Simulate some future times. | |
| 286 for (int i = 0; i < static_cast<int>(max_days) + 2; i++) { | |
| 287 status_collector_.Simulate(test_states, | |
| 288 sizeof(test_states) / sizeof(IdleState)); | |
| 289 // Advance the simulated clock by a day. | |
| 290 baseline += TimeDelta::FromDays(1); | |
| 291 status_collector_.SetBaselineTime(baseline); | |
| 292 } | |
| 293 // Set the clock back so the previous simulated times are in the future. | |
| 294 baseline -= TimeDelta::FromDays(20); | |
| 295 status_collector_.SetBaselineTime(baseline); | |
| 296 | |
| 297 // Collect one more data point to trigger pruning. | |
| 298 status_collector_.Simulate(test_states, 1); | |
| 299 | |
| 300 // Check that we don't exceed the max number of periods. | |
| 301 status_.clear_active_period(); | |
| 302 status_collector_.GetStatus(&status_); | |
| 303 EXPECT_LT(status_.active_period_size(), static_cast<int>(max_days)); | |
| 277 } | 304 } |
| 278 | 305 |
| 279 TEST_F(DeviceStatusCollectorTest, ActivityTimesDisabledByDefault) { | 306 TEST_F(DeviceStatusCollectorTest, ActivityTimesDisabledByDefault) { |
| 280 // If the pref for collecting device activity times isn't explicitly turned | 307 // If the pref for collecting device activity times isn't explicitly turned |
| 281 // on, no data on activity times should be reported. | 308 // on, no data on activity times should be reported. |
| 282 | 309 |
| 283 IdleState test_states[] = { | 310 IdleState test_states[] = { |
| 284 IDLE_STATE_ACTIVE, | 311 IDLE_STATE_ACTIVE, |
| 285 IDLE_STATE_ACTIVE, | 312 IDLE_STATE_ACTIVE, |
| 286 IDLE_STATE_ACTIVE | 313 IDLE_STATE_ACTIVE |
| 287 }; | 314 }; |
| 288 status_collector_.Simulate(test_states, | 315 status_collector_.Simulate(test_states, |
| 289 sizeof(test_states) / sizeof(IdleState)); | 316 sizeof(test_states) / sizeof(IdleState)); |
| 290 status_collector_.GetStatus(&status_); | 317 status_collector_.GetStatus(&status_); |
| 291 EXPECT_EQ(0, status_.active_time_size()); | 318 EXPECT_EQ(0, status_.active_period_size()); |
| 292 EXPECT_EQ(0, GetActiveMilliseconds(status_)); | 319 EXPECT_EQ(0, GetActiveMilliseconds(status_)); |
| 293 } | 320 } |
| 294 | 321 |
| 322 TEST_F(DeviceStatusCollectorTest, ActivityCrossingMidnight) { | |
| 323 IdleState test_states[] = { | |
| 324 IDLE_STATE_ACTIVE | |
| 325 }; | |
| 326 cros_settings_->SetBoolean(chromeos::kReportDeviceActivityTimes, true); | |
| 327 status_collector_.SetBaselineTime( | |
| 328 Time::Now().LocalMidnight() + TimeDelta::FromSeconds(10)); | |
| 329 | |
| 330 status_collector_.Simulate(test_states, 1); | |
| 331 status_collector_.GetStatus(&status_); | |
| 332 EXPECT_EQ(2, status_.active_period_size()); | |
|
Mattias Nissler (ping if slow)
2012/02/15 14:56:21
We should check that we get correct times for both
Patrick Dubroy
2012/02/15 15:37:25
Done.
| |
| 333 } | |
| 334 | |
| 295 TEST_F(DeviceStatusCollectorTest, DevSwitchBootMode) { | 335 TEST_F(DeviceStatusCollectorTest, DevSwitchBootMode) { |
| 296 // Test that boot mode data is not reported if the pref is not turned on. | 336 // Test that boot mode data is not reported if the pref is not turned on. |
| 297 status_collector_.GetStatus(&status_); | 337 status_collector_.GetStatus(&status_); |
| 298 EXPECT_EQ(false, status_.has_boot_mode()); | 338 EXPECT_EQ(false, status_.has_boot_mode()); |
| 299 | 339 |
| 300 EXPECT_CALL(statistics_provider_, | 340 EXPECT_CALL(statistics_provider_, |
| 301 GetMachineStatistic("devsw_boot", NotNull())) | 341 GetMachineStatistic("devsw_boot", NotNull())) |
| 302 .WillRepeatedly(DoAll(SetArgPointee<1>("0"), Return(true))); | 342 .WillRepeatedly(DoAll(SetArgPointee<1>("0"), Return(true))); |
| 303 EXPECT_EQ(false, status_.has_boot_mode()); | 343 EXPECT_EQ(false, status_.has_boot_mode()); |
| 304 | 344 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 345 EXPECT_EQ(true, status_.has_os_version()); | 385 EXPECT_EQ(true, status_.has_os_version()); |
| 346 EXPECT_EQ(true, status_.has_firmware_version()); | 386 EXPECT_EQ(true, status_.has_firmware_version()); |
| 347 | 387 |
| 348 // Check that the browser version is not empty. OS version & firmware | 388 // Check that the browser version is not empty. OS version & firmware |
| 349 // don't have any reasonable values inside the unit test, so those | 389 // don't have any reasonable values inside the unit test, so those |
| 350 // aren't checked. | 390 // aren't checked. |
| 351 EXPECT_NE("", status_.browser_version()); | 391 EXPECT_NE("", status_.browser_version()); |
| 352 } | 392 } |
| 353 | 393 |
| 354 } // namespace policy | 394 } // namespace policy |
| OLD | NEW |