blob: e1073cfadf204891f4b2523f7644373100abbdfa [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <gtest/gtest.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include "cras_alert.h"
namespace {
void callback1(void *arg);
void callback2(void *arg);
void prepare(struct cras_alert *alert);
static int cb1_called = 0;
static int cb2_called = 0;
static int cb2_set_pending = 0;
static int prepare_called = 0;
void ResetStub() {
cb1_called = 0;
cb2_called = 0;
cb2_set_pending = 0;
prepare_called = 0;
}
TEST(Alert, OneCallback) {
struct cras_alert *alert = cras_alert_create(NULL);
cras_alert_add_callback(alert, &callback1, NULL);
ResetStub();
cras_alert_pending(alert);
EXPECT_EQ(0, cb1_called);
cras_alert_process_all_pending_alerts();
EXPECT_EQ(1, cb1_called);
cras_alert_destroy(alert);
}
TEST(Alert, TwoCallbacks) {
struct cras_alert *alert = cras_alert_create(NULL);
cras_alert_add_callback(alert, &callback1, NULL);
cras_alert_add_callback(alert, &callback2, NULL);
ResetStub();
cras_alert_pending(alert);
EXPECT_EQ(0, cb1_called);
EXPECT_EQ(0, cb2_called);
cras_alert_process_all_pending_alerts();
EXPECT_EQ(1, cb1_called);
EXPECT_EQ(1, cb2_called);
cras_alert_destroy(alert);
}
TEST(Alert, NoPending) {
struct cras_alert *alert = cras_alert_create(NULL);
cras_alert_add_callback(alert, &callback1, NULL);
ResetStub();
EXPECT_EQ(0, cb1_called);
cras_alert_process_all_pending_alerts();
EXPECT_EQ(0, cb1_called);
cras_alert_destroy(alert);
}
TEST(Alert, PendingInCallback) {
struct cras_alert *alert1 = cras_alert_create(NULL);
struct cras_alert *alert2 = cras_alert_create(NULL);
cras_alert_add_callback(alert1, &callback1, NULL);
cras_alert_add_callback(alert2, &callback2, alert1);
ResetStub();
cras_alert_pending(alert2);
EXPECT_EQ(0, cb1_called);
EXPECT_EQ(0, cb2_called);
cb2_set_pending = 1;
cras_alert_process_all_pending_alerts();
EXPECT_EQ(1, cb1_called);
EXPECT_EQ(1, cb2_called);
cras_alert_destroy(alert1);
cras_alert_destroy(alert2);
}
TEST(Alert, Prepare) {
struct cras_alert *alert = cras_alert_create(prepare);
cras_alert_add_callback(alert, &callback1, NULL);
ResetStub();
cras_alert_pending(alert);
EXPECT_EQ(0, cb1_called);
cras_alert_process_all_pending_alerts();
EXPECT_EQ(1, prepare_called);
EXPECT_EQ(1, cb1_called);
cras_alert_destroy(alert);
}
TEST(Alert, TwoAlerts) {
struct cras_alert *alert1 = cras_alert_create(prepare);
struct cras_alert *alert2 = cras_alert_create(prepare);
cras_alert_add_callback(alert1, &callback1, NULL);
cras_alert_add_callback(alert2, &callback2, NULL);
ResetStub();
cras_alert_pending(alert1);
EXPECT_EQ(0, cb1_called);
EXPECT_EQ(0, cb2_called);
cras_alert_process_all_pending_alerts();
EXPECT_EQ(1, prepare_called);
EXPECT_EQ(1, cb1_called);
EXPECT_EQ(0, cb2_called);
ResetStub();
cras_alert_pending(alert2);
EXPECT_EQ(0, cb1_called);
EXPECT_EQ(0, cb2_called);
cras_alert_process_all_pending_alerts();
EXPECT_EQ(1, prepare_called);
EXPECT_EQ(0, cb1_called);
EXPECT_EQ(1, cb2_called);
ResetStub();
cras_alert_pending(alert1);
cras_alert_pending(alert2);
EXPECT_EQ(0, cb1_called);
EXPECT_EQ(0, cb2_called);
cras_alert_process_all_pending_alerts();
EXPECT_EQ(2, prepare_called);
EXPECT_EQ(1, cb1_called);
EXPECT_EQ(1, cb2_called);
cras_alert_destroy_all();
}
void callback1(void *arg)
{
cb1_called++;
}
void callback2(void *arg)
{
cb2_called++;
if (cb2_set_pending) {
cb2_set_pending = 0;
cras_alert_pending((struct cras_alert *)arg);
}
}
void prepare(struct cras_alert *alert)
{
prepare_called++;
return;
}
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}