Home | History | Annotate | Download | only in cctest
      1 // Copyright 2013 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 #include "src/v8.h"
     29 
     30 #include "src/libplatform/task-queue.h"
     31 #include "test/cctest/cctest.h"
     32 #include "test/cctest/test-libplatform.h"
     33 
     34 using namespace v8::internal;
     35 
     36 
     37 TEST(TaskQueueBasic) {
     38   TaskCounter task_counter;
     39 
     40   TaskQueue queue;
     41 
     42   TestTask* task = new TestTask(&task_counter);
     43   queue.Append(task);
     44   CHECK_EQ(1, task_counter.GetCount());
     45   CHECK_EQ(task, queue.GetNext());
     46   delete task;
     47   CHECK_EQ(0, task_counter.GetCount());
     48 
     49   queue.Terminate();
     50   CHECK_EQ(NULL, queue.GetNext());
     51 }
     52 
     53 
     54 class ReadQueueTask : public TestTask {
     55  public:
     56   ReadQueueTask(TaskCounter* task_counter, TaskQueue* queue)
     57       : TestTask(task_counter, true), queue_(queue) {}
     58   virtual ~ReadQueueTask() {}
     59 
     60   virtual void Run() V8_OVERRIDE {
     61     TestTask::Run();
     62     CHECK_EQ(NULL, queue_->GetNext());
     63   }
     64 
     65  private:
     66   TaskQueue* queue_;
     67 
     68   DISALLOW_COPY_AND_ASSIGN(ReadQueueTask);
     69 };
     70 
     71 
     72 TEST(TaskQueueTerminateMultipleReaders) {
     73   TaskQueue queue;
     74   TaskCounter task_counter;
     75   ReadQueueTask* read1 = new ReadQueueTask(&task_counter, &queue);
     76   ReadQueueTask* read2 = new ReadQueueTask(&task_counter, &queue);
     77 
     78   TestWorkerThread thread1(read1);
     79   TestWorkerThread thread2(read2);
     80 
     81   thread1.Start();
     82   thread2.Start();
     83 
     84   CHECK_EQ(2, task_counter.GetCount());
     85 
     86   thread1.Signal();
     87   thread2.Signal();
     88 
     89   queue.Terminate();
     90 
     91   thread1.Join();
     92   thread2.Join();
     93 
     94   CHECK_EQ(0, task_counter.GetCount());
     95 }
     96