diff --git a/media/webrtc/signaling/test/FakeMediaStreams.h b/media/webrtc/signaling/test/FakeMediaStreams.h
index f15656a1d876da351ebf932a2b1d4290e1103619..2f1ec88be035c09a814961c704a26f06f72c8083 100644
--- a/media/webrtc/signaling/test/FakeMediaStreams.h
+++ b/media/webrtc/signaling/test/FakeMediaStreams.h
@@ -95,13 +95,46 @@ class Fake_SourceMediaStream : public Fake_MediaStream {
  public:
   Fake_SourceMediaStream() : mSegmentsAdded(0),
                              mPullEnabled(false),
+                             mStop(false),
                              mPeriodic(new Fake_MediaPeriodic(this)) {}
 
   void AddTrack(mozilla::TrackID aID, mozilla::TrackRate aRate, mozilla::TrackTicks aStart,
                 mozilla::MediaSegment* aSegment) {}
 
   void AppendToTrack(mozilla::TrackID aID, mozilla::MediaSegment* aSegment) {
-    ++mSegmentsAdded;
+    bool nonZeroSample = false;
+    MOZ_ASSERT(aSegment);
+    if(aSegment->GetType() == mozilla::MediaSegment::AUDIO) {
+      //On audio segment append, we verify for validity
+      //of the audio samples.
+      mozilla::AudioSegment* audio =
+              static_cast<mozilla::AudioSegment*>(aSegment);
+      mozilla::AudioSegment::ChunkIterator iter(*audio);
+      while(!iter.IsEnded()) {
+        mozilla::AudioChunk& chunk = *(iter);
+        MOZ_ASSERT(chunk.mBuffer);
+        const int16_t* buf =
+                static_cast<const int16_t*>(chunk.mBuffer->Data());
+        for(int i=0; i<chunk.mDuration; i++) {
+          if(buf[i]) {
+            //atleast one non-zero sample found.
+            nonZeroSample = true; 
+            break;
+          }
+        }
+        //process next chunk
+        iter.Next();
+      }
+      if(nonZeroSample) {
+          //we increment segments count if
+          //atleast one non-zero samples was found.
+          ++mSegmentsAdded;
+      }
+    } else {
+      //in the case of video segment appended, we just increase the
+      //segment count.
+      ++mSegmentsAdded;
+    }
   }
 
   void AdvanceKnownTracksTime(mozilla::StreamTime aKnownTime) {}
@@ -109,6 +142,10 @@ class Fake_SourceMediaStream : public Fake_MediaStream {
   void SetPullEnabled(bool aEnabled) {
     mPullEnabled = aEnabled;
   }
+  //Don't pull anymore data,if mStop is true.
+  void StopStream() {
+   mStop = true;
+  }
 
   virtual Fake_SourceMediaStream *AsSourceStream() { return this; }
 
@@ -124,6 +161,7 @@ class Fake_SourceMediaStream : public Fake_MediaStream {
  protected:
   int mSegmentsAdded;
   bool mPullEnabled;
+  bool mStop;
   nsRefPtr<Fake_MediaPeriodic> mPeriodic;
   nsCOMPtr<nsITimer> mTimer;
 };
@@ -202,9 +240,17 @@ class Fake_MediaStreamBase : public Fake_MediaStream {
 
 class Fake_AudioStreamSource : public Fake_MediaStreamBase {
  public:
-  Fake_AudioStreamSource() : Fake_MediaStreamBase() {}
-
+  Fake_AudioStreamSource() : Fake_MediaStreamBase(),
+                             mCount(0),
+                             mStop(false) {}
+  //Signaling Agent indicates us to stop generating
+  //further audio.
+  void StopStream() {
+    mStop = true;
+  }
   virtual void Periodic();
+  int mCount;
+  bool mStop;
 };
 
 class Fake_VideoStreamSource : public Fake_MediaStreamBase {
diff --git a/media/webrtc/signaling/test/FakeMediaStreamsImpl.h b/media/webrtc/signaling/test/FakeMediaStreamsImpl.h
index e48047c6b6cbe87e51e0e3df91c5f147176c8152..a6187ee0849c9e44c955f1a901921f0271a094c1 100644
--- a/media/webrtc/signaling/test/FakeMediaStreamsImpl.h
+++ b/media/webrtc/signaling/test/FakeMediaStreamsImpl.h
@@ -10,6 +10,9 @@
 #include "nspr.h"
 #include "nsError.h"
 
+static const int AUDIO_BUFFER_SIZE = 1600;
+static const int NUM_CHANNELS      = 2;
+
 NS_IMPL_THREADSAFE_ISUPPORTS1(Fake_nsDOMMediaStream, nsIDOMMediaStream)
 
 // DOM Media stream
@@ -42,7 +45,10 @@ nsresult Fake_SourceMediaStream::Stop() {
 }
 
 void Fake_SourceMediaStream::Periodic() {
-  if (mPullEnabled) {
+  // Pull more audio-samples iff pulling is enabled
+  // and we are not asked by the signaling agent to stop
+  //pulling data.
+  if (mPullEnabled && !mStop) {
     for (std::set<Fake_MediaStreamListener *>::iterator it =
              mListeners.begin(); it != mListeners.end(); ++it) {
       (*it)->NotifyPull(NULL, mozilla::MillisecondsToMediaTime(10));
@@ -50,7 +56,6 @@ void Fake_SourceMediaStream::Periodic() {
   }
 }
 
-
 // Fake_MediaStreamBase
 nsresult Fake_MediaStreamBase::Start() {
   mTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
@@ -71,11 +76,29 @@ nsresult Fake_MediaStreamBase::Stop() {
 
 // Fake_AudioStreamSource
 void Fake_AudioStreamSource::Periodic() {
+  //Are we asked to stop pumping audio samples ?
+  if(mStop) {
+    return;
+  }
+  //Generate Signed 16 Bit Audio samples
+  nsRefPtr<mozilla::SharedBuffer> samples =
+    mozilla::SharedBuffer::Create(AUDIO_BUFFER_SIZE * NUM_CHANNELS * sizeof(int16_t));
+  for(int i=0; i<(1600*2); i++) {
+    //saw tooth audio sample
+    reinterpret_cast<int16_t *>(samples->Data())[i] =
+                              ((mCount % 8) * 4000) - (7*4000)/2;
+    mCount++;
+  }
+
   mozilla::AudioSegment segment;
   segment.Init(1);
-  segment.InsertNullDataAtStart(160);
+  segment.AppendFrames(samples.forget(),
+                       AUDIO_BUFFER_SIZE,
+                       0,
+                       AUDIO_BUFFER_SIZE,
+                       mozilla::AUDIO_FORMAT_S16);
 
-  for (std::set<Fake_MediaStreamListener *>::iterator it = mListeners.begin();
+  for(std::set<Fake_MediaStreamListener *>::iterator it = mListeners.begin();
        it != mListeners.end(); ++it) {
     (*it)->NotifyQueuedTrackChanges(NULL, // Graph
                                     0, // TrackID
diff --git a/media/webrtc/signaling/test/signaling_unittests.cpp b/media/webrtc/signaling/test/signaling_unittests.cpp
index d053a184388f4dea084afb79002c0c297fc02b59..2348158537739cc387392eb32c64b67fa51f044f 100644
--- a/media/webrtc/signaling/test/signaling_unittests.cpp
+++ b/media/webrtc/signaling/test/signaling_unittests.cpp
@@ -677,6 +677,22 @@ void CreateAnswer(sipcc::MediaConstraints& constraints, std::string offer,
         domMediaStream_->GetStream())->GetSegmentsAdded();
   }
 
+  //Stops generating new audio data for transmission.
+  //Should be called before Cleanup of the peer connection.
+  void CloseSendStreams() {
+    static_cast<Fake_AudioStreamSource*>(
+        domMediaStream_->GetStream())->StopStream();
+  }
+
+  //Stops pulling audio data off the receivers.
+  //Should be called before Cleanup of the peer connection.
+  void CloseReceiveStreams() {
+    std::vector<nsDOMMediaStream *> streams =
+                            pObserver->GetStreams();
+    for(int i=0; i < streams.size(); i++) {
+      streams[i]->GetStream()->AsSourceStream()->StopStream();
+    }
+  }
 
 public:
   mozilla::RefPtr<sipcc::PeerConnectionImpl> pc;
@@ -1189,6 +1205,8 @@ TEST_F(SignalingTest, OfferModifiedAnswer)
   OfferModifiedAnswer(constraints, constraints, SHOULD_SENDRECV_AV,
                       SHOULD_SENDRECV_AV);
   PR_Sleep(kDefaultTimeout * 2); // Wait for completion
+  a1_.CloseSendStreams();
+  a2_.CloseReceiveStreams();
 }
 
 TEST_F(SignalingTest, FullCall)
@@ -1199,6 +1217,8 @@ TEST_F(SignalingTest, FullCall)
 
   PR_Sleep(kDefaultTimeout * 2); // Wait for some data to get written
 
+  a1_.CloseSendStreams();
+  a2_.CloseReceiveStreams();
   // Check that we wrote a bunch of data
   ASSERT_GE(a1_.GetPacketsSent(0), 40);
   //ASSERT_GE(a2_.GetPacketsSent(0), 40);
@@ -1214,6 +1234,8 @@ TEST_F(SignalingTest, FullCallTrickle)
 
   PR_Sleep(kDefaultTimeout * 2); // Wait for some data to get written
 
+  a1_.CloseSendStreams();
+  a2_.CloseReceiveStreams();
   ASSERT_GE(a1_.GetPacketsSent(0), 40);
   ASSERT_GE(a2_.GetPacketsReceived(0), 40);
 }