1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// Unit tests for AAudio Handle Tracker
18
19#include <stdlib.h>
20#include <math.h>
21
22#include <gtest/gtest.h>
23
24#include <aaudio/AAudio.h>
25#include "utility/HandleTracker.h"
26
27// Test adding one address.
28TEST(test_handle_tracker, aaudio_handle_tracker) {
29    const int MAX_HANDLES = 4;
30    HandleTracker tracker(MAX_HANDLES);
31    handle_tracker_type_t type = 3; // arbitrary generic type
32    int data; // something that has an address we can use
33    handle_tracker_address_t found;
34
35    // repeat the test several times to see if it breaks
36    const int SEVERAL = 5; // arbitrary
37    for (int i = 0; i < SEVERAL; i++) {
38        // should fail to find a bogus handle
39        found = tracker.get(type, 0);  // bad handle
40        EXPECT_EQ(nullptr, found);
41
42        // create a valid handle and use it to lookup the object again
43        aaudio_handle_t dataHandle = tracker.put(type, &data);
44        ASSERT_TRUE(dataHandle > 0);
45        found = tracker.get(type, dataHandle);
46        EXPECT_EQ(&data, found);
47        found = tracker.get(type, 0); // bad handle
48        EXPECT_EQ(nullptr, found);
49
50        // wrong type
51        found = tracker.get(type+1, dataHandle);
52        EXPECT_EQ(nullptr, found);
53
54        // remove from storage
55        found = tracker.remove(type, dataHandle);
56        EXPECT_EQ(&data, found);
57        // should fail the second time
58        found = tracker.remove(type, dataHandle);
59        EXPECT_EQ(nullptr, found);
60    }
61}
62
63// Test filling the tracker.
64TEST(test_handle_tracker, aaudio_full_up) {
65    const int MAX_HANDLES = 5;
66    HandleTracker tracker(MAX_HANDLES);
67    handle_tracker_type_t type = 4; // arbitrary generic type
68    int data[MAX_HANDLES];
69    aaudio_handle_t handles[MAX_HANDLES];
70    handle_tracker_address_t found;
71
72    // repeat the test several times to see if it breaks
73    const int SEVERAL = 5; // arbitrary
74    for (int i = 0; i < SEVERAL; i++) {
75        for (int i = 0; i < MAX_HANDLES; i++) {
76            // add a handle
77            handles[i] = tracker.put(type, &data[i]);
78            ASSERT_TRUE(handles[i] > 0);
79            found = tracker.get(type, handles[i]);
80            EXPECT_EQ(&data[i], found);
81        }
82
83        // Now that it is full, try to add one more.
84        aaudio_handle_t handle = tracker.put(type, &data[0]);
85        EXPECT_TRUE(handle < 0);
86
87        for (int i = 0; i < MAX_HANDLES; i++) {
88            // look up each handle
89            found = tracker.get(type, handles[i]);
90            EXPECT_EQ(&data[i], found);
91        }
92
93        // remove one from storage
94        found = tracker.remove(type, handles[2]);
95        EXPECT_EQ(&data[2], found);
96        // now try to look up the same handle and fail
97        found = tracker.get(type, handles[2]);
98        EXPECT_EQ(nullptr, found);
99
100        // add that same one back
101        handle = tracker.put(type, &data[2]);
102        ASSERT_TRUE(handle > 0);
103        found = tracker.get(type, handle);
104        EXPECT_EQ(&data[2], found);
105        // now use a stale handle again with a valid index and fail
106        found = tracker.get(type, handles[2]);
107        EXPECT_EQ(nullptr, found);
108
109        // remove them all
110        handles[2] = handle;
111        for (int i = 0; i < MAX_HANDLES; i++) {
112            // look up each handle
113            found = tracker.remove(type, handles[i]);
114            EXPECT_EQ(&data[i], found);
115        }
116    }
117}
118