16958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org/*
26958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
36958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org *
46958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
56958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
66958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
76958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
86958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
96958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org */
106958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
116958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// Borrowed from Chromium's src/base/memory/scoped_vector_unittest.cc
126958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
136958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org#include "webrtc/system_wrappers/interface/scoped_vector.h"
146958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
156958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
166958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
176958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
186958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgnamespace webrtc {
196958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgnamespace {
206958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
216958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// The LifeCycleObject notifies its Observer upon construction & destruction.
226958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgclass LifeCycleObject {
236958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org public:
246958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  class Observer {
256958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org   public:
266958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    virtual void OnLifeCycleConstruct(LifeCycleObject* o) = 0;
276958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    virtual void OnLifeCycleDestroy(LifeCycleObject* o) = 0;
286958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
296958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org   protected:
306958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    virtual ~Observer() {}
316958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  };
326958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
336958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ~LifeCycleObject() {
346958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    observer_->OnLifeCycleDestroy(this);
356958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
366958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
376958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org private:
386958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  friend class LifeCycleWatcher;
396958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
406958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  explicit LifeCycleObject(Observer* observer)
416958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org      : observer_(observer) {
426958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    observer_->OnLifeCycleConstruct(this);
436958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
446958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
456958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  Observer* observer_;
466958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
476958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  DISALLOW_COPY_AND_ASSIGN(LifeCycleObject);
486958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org};
496958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
506958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// The life cycle states we care about for the purposes of testing ScopedVector
516958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// against objects.
526958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgenum LifeCycleState {
536958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LC_INITIAL,
546958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LC_CONSTRUCTED,
556958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LC_DESTROYED,
566958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org};
576958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
586958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// Because we wish to watch the life cycle of an object being constructed and
596958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// destroyed, and further wish to test expectations against the state of that
606958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// object, we cannot save state in that object itself. Instead, we use this
616958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// pairing of the watcher, which observes the object and notifies of
626958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// construction & destruction. Since we also may be testing assumptions about
636958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// things not getting freed, this class also acts like a scoping object and
646958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// deletes the |constructed_life_cycle_object_|, if any when the
656958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// LifeCycleWatcher is destroyed. To keep this simple, the only expected state
666958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// changes are:
676958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org//   INITIAL -> CONSTRUCTED -> DESTROYED.
686958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// Anything more complicated than that should start another test.
696958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgclass LifeCycleWatcher : public LifeCycleObject::Observer {
706958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org public:
716958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher() : life_cycle_state_(LC_INITIAL) {}
726958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  virtual ~LifeCycleWatcher() {}
736958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
746958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  // Assert INITIAL -> CONSTRUCTED and no LifeCycleObject associated with this
756958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  // LifeCycleWatcher.
766958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  virtual void OnLifeCycleConstruct(LifeCycleObject* object) OVERRIDE {
776958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ASSERT_EQ(LC_INITIAL, life_cycle_state_);
786958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ASSERT_EQ(NULL, constructed_life_cycle_object_.get());
796958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    life_cycle_state_ = LC_CONSTRUCTED;
806958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    constructed_life_cycle_object_.reset(object);
816958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
826958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
836958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  // Assert CONSTRUCTED -> DESTROYED and the |object| being destroyed is the
846958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  // same one we saw constructed.
856958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  virtual void OnLifeCycleDestroy(LifeCycleObject* object) OVERRIDE {
866958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ASSERT_EQ(LC_CONSTRUCTED, life_cycle_state_);
876958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    LifeCycleObject* constructed_life_cycle_object =
886958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org        constructed_life_cycle_object_.release();
896958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ASSERT_EQ(constructed_life_cycle_object, object);
906958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    life_cycle_state_ = LC_DESTROYED;
916958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
926958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
936958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleState life_cycle_state() const { return life_cycle_state_; }
946958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
956958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  // Factory method for creating a new LifeCycleObject tied to this
966958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  // LifeCycleWatcher.
976958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleObject* NewLifeCycleObject() {
986958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    return new LifeCycleObject(this);
996958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
1006958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1016958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  // Returns true iff |object| is the same object that this watcher is tracking.
1026958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  bool IsWatching(LifeCycleObject* object) const {
1036958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    return object == constructed_life_cycle_object_.get();
1046958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
1056958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1066958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org private:
1076958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleState life_cycle_state_;
1086958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_ptr<LifeCycleObject> constructed_life_cycle_object_;
1096958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1106958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  DISALLOW_COPY_AND_ASSIGN(LifeCycleWatcher);
1116958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org};
1126958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1136958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, LifeCycleWatcher) {
1146958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher watcher;
1156958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());
1166958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleObject* object = watcher.NewLifeCycleObject();
1176958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
1186958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  delete object;
1196958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_DESTROYED, watcher.life_cycle_state());
1206958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
1216958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1226958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, PopBack) {
1236958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher watcher;
1246958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());
1256958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ScopedVector<LifeCycleObject> scoped_vector;
1266958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.push_back(watcher.NewLifeCycleObject());
1276958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
1286958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(watcher.IsWatching(scoped_vector.back()));
1296958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.pop_back();
1306958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_DESTROYED, watcher.life_cycle_state());
1316958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(scoped_vector.empty());
1326958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
1336958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1346958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, Clear) {
1356958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher watcher;
1366958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());
1376958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ScopedVector<LifeCycleObject> scoped_vector;
1386958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.push_back(watcher.NewLifeCycleObject());
1396958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
1406958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(watcher.IsWatching(scoped_vector.back()));
1416958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.clear();
1426958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_DESTROYED, watcher.life_cycle_state());
1436958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(scoped_vector.empty());
1446958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
1456958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1466958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, WeakClear) {
1476958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher watcher;
1486958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());
1496958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ScopedVector<LifeCycleObject> scoped_vector;
1506958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.push_back(watcher.NewLifeCycleObject());
1516958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
1526958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(watcher.IsWatching(scoped_vector.back()));
1536958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.weak_clear();
1546958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
1556958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(scoped_vector.empty());
1566958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
1576958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1586958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, ResizeShrink) {
1596958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher first_watcher;
1606958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, first_watcher.life_cycle_state());
1616958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher second_watcher;
1626958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, second_watcher.life_cycle_state());
1636958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ScopedVector<LifeCycleObject> scoped_vector;
1646958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1656958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.push_back(first_watcher.NewLifeCycleObject());
1666958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, first_watcher.life_cycle_state());
1676958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, second_watcher.life_cycle_state());
1686958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(first_watcher.IsWatching(scoped_vector[0]));
1696958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_FALSE(second_watcher.IsWatching(scoped_vector[0]));
1706958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1716958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.push_back(second_watcher.NewLifeCycleObject());
1726958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, first_watcher.life_cycle_state());
1736958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, second_watcher.life_cycle_state());
1746958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_FALSE(first_watcher.IsWatching(scoped_vector[1]));
1756958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(second_watcher.IsWatching(scoped_vector[1]));
1766958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1776958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  // Test that shrinking a vector deletes elements in the disappearing range.
1786958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.resize(1);
1796958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, first_watcher.life_cycle_state());
1806958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_DESTROYED, second_watcher.life_cycle_state());
1816958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(1u, scoped_vector.size());
1826958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(first_watcher.IsWatching(scoped_vector[0]));
1836958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
1846958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1856958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, ResizeGrow) {
1866958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher watcher;
1876958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());
1886958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ScopedVector<LifeCycleObject> scoped_vector;
1896958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.push_back(watcher.NewLifeCycleObject());
1906958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
1916958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(watcher.IsWatching(scoped_vector.back()));
1926958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
1936958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  scoped_vector.resize(5);
1946958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
1956958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ASSERT_EQ(5u, scoped_vector.size());
1966958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_TRUE(watcher.IsWatching(scoped_vector[0]));
1976958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_FALSE(watcher.IsWatching(scoped_vector[1]));
1986958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_FALSE(watcher.IsWatching(scoped_vector[2]));
1996958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_FALSE(watcher.IsWatching(scoped_vector[3]));
2006958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_FALSE(watcher.IsWatching(scoped_vector[4]));
2016958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
2026958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2036958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, Scope) {
2046958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher watcher;
2056958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());
2066958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  {
2076958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ScopedVector<LifeCycleObject> scoped_vector;
2086958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    scoped_vector.push_back(watcher.NewLifeCycleObject());
2096958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
2106958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_TRUE(watcher.IsWatching(scoped_vector.back()));
2116958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
2126958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_DESTROYED, watcher.life_cycle_state());
2136958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
2146958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2156958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, MoveConstruct) {
2166958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher watcher;
2176958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());
2186958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  {
2196958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ScopedVector<LifeCycleObject> scoped_vector;
2206958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    scoped_vector.push_back(watcher.NewLifeCycleObject());
2216958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_FALSE(scoped_vector.empty());
2226958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_TRUE(watcher.IsWatching(scoped_vector.back()));
2236958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2246958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ScopedVector<LifeCycleObject> scoped_vector_copy(scoped_vector.Pass());
2256958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_TRUE(scoped_vector.empty());
2266958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_FALSE(scoped_vector_copy.empty());
2276958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_TRUE(watcher.IsWatching(scoped_vector_copy.back()));
2286958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2296958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
2306958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
2316958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_DESTROYED, watcher.life_cycle_state());
2326958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
2336958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2346958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, MoveAssign) {
2356958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher watcher;
2366958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_INITIAL, watcher.life_cycle_state());
2376958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  {
2386958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ScopedVector<LifeCycleObject> scoped_vector;
2396958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    scoped_vector.push_back(watcher.NewLifeCycleObject());
2406958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ScopedVector<LifeCycleObject> scoped_vector_assign;
2416958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_FALSE(scoped_vector.empty());
2426958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_TRUE(watcher.IsWatching(scoped_vector.back()));
2436958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2446958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    scoped_vector_assign = scoped_vector.Pass();
2456958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_TRUE(scoped_vector.empty());
2466958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_FALSE(scoped_vector_assign.empty());
2476958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_TRUE(watcher.IsWatching(scoped_vector_assign.back()));
2486958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2496958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_EQ(LC_CONSTRUCTED, watcher.life_cycle_state());
2506958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
2516958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(LC_DESTROYED, watcher.life_cycle_state());
2526958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
2536958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2546958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgclass DeleteCounter {
2556958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org public:
2566958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  explicit DeleteCounter(int* deletes)
2576958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org      : deletes_(deletes) {
2586958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
2596958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2606958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ~DeleteCounter() {
2616958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    (*deletes_)++;
2626958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
2636958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2646958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  void VoidMethod0() {}
2656958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2666958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org private:
2676958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  int* const deletes_;
2686958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2696958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  DISALLOW_COPY_AND_ASSIGN(DeleteCounter);
2706958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org};
2716958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2726958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org// This class is used in place of Chromium's base::Callback.
2736958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgtemplate <typename T>
2746958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgclass PassThru  {
2756958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org public:
2766958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  explicit PassThru(ScopedVector<T> scoper) : scoper_(scoper.Pass()) {}
2776958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2786958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ScopedVector<T> Run() {
2796958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    return scoper_.Pass();
2806958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
2816958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2826958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org private:
2836958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ScopedVector<T> scoper_;
2846958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org};
2856958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2866958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, Passed) {
2876958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  int deletes = 0;
2886958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ScopedVector<DeleteCounter> deleter_vector;
2896958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  deleter_vector.push_back(new DeleteCounter(&deletes));
2906958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(0, deletes);
2916958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  PassThru<DeleteCounter> pass_thru(deleter_vector.Pass());
2926958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(0, deletes);
2936958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  ScopedVector<DeleteCounter> result = pass_thru.Run();
2946958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(0, deletes);
2956958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  result.clear();
2966958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  EXPECT_EQ(1, deletes);
2976958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org};
2986958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
2996958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.orgTEST(ScopedVectorTest, InsertRange) {
3006958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  LifeCycleWatcher watchers[5];
3016958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  size_t watchers_size = sizeof(watchers) / sizeof(*watchers);
3026958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
3036958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  std::vector<LifeCycleObject*> vec;
3046958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  for (LifeCycleWatcher* it = watchers; it != watchers + watchers_size;
3056958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org       ++it) {
3066958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_EQ(LC_INITIAL, it->life_cycle_state());
3076958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    vec.push_back(it->NewLifeCycleObject());
3086958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_EQ(LC_CONSTRUCTED, it->life_cycle_state());
3096958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
3106958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  // Start scope for ScopedVector.
3116958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  {
3126958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    ScopedVector<LifeCycleObject> scoped_vector;
3136958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    scoped_vector.insert(scoped_vector.end(), vec.begin() + 1, vec.begin() + 3);
3146958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    for (LifeCycleWatcher* it = watchers; it != watchers + watchers_size;
3156958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org         ++it)
3166958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org      EXPECT_EQ(LC_CONSTRUCTED, it->life_cycle_state());
3176958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  }
3186958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  for (LifeCycleWatcher* it = watchers; it != watchers + 1; ++it)
3196958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_EQ(LC_CONSTRUCTED, it->life_cycle_state());
3206958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  for (LifeCycleWatcher* it = watchers + 1; it != watchers + 3; ++it)
3216958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_EQ(LC_DESTROYED, it->life_cycle_state());
3226958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org  for (LifeCycleWatcher* it = watchers + 3; it != watchers + watchers_size;
3236958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org      ++it)
3246958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org    EXPECT_EQ(LC_CONSTRUCTED, it->life_cycle_state());
3256958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}
3266958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org
3276958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}  // namespace
3286958c0fa5ef13bb11a209e003aca5a2a32e28c06andrew@webrtc.org}  // namespace webrtc
329