134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar/*
234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar * Copyright (C) 2017 The Android Open Source Project
334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar *
434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar * you may not use this file except in compliance with the License.
634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar * You may obtain a copy of the License at
734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar *
834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar *
1034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar * Unless required by applicable law or agreed to in writing, software
1134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
1234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar * See the License for the specific language governing permissions and
1434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar * limitations under the License.
1534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar */
1634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
1734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
18bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viverettepackage androidx.room;
1934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
2034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
21bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.room.InvalidationTracker.ObservedTableTracker.ADD;
22bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.room.InvalidationTracker.ObservedTableTracker.NO_OP;
23bdc4c86d3dff74f6634a38e2f7b316b0e823a2c8Alan Viveretteimport static androidx.room.InvalidationTracker.ObservedTableTracker.REMOVE;
2434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
2534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport static org.hamcrest.CoreMatchers.is;
2634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport static org.hamcrest.CoreMatchers.nullValue;
2734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport static org.hamcrest.MatcherAssert.assertThat;
2834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
2934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport org.junit.Before;
3034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport org.junit.Test;
3134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport org.junit.runner.RunWith;
3234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport org.junit.runners.JUnit4;
3334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
3434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarimport java.util.Arrays;
3534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
3634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar@RunWith(JUnit4.class)
3734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyarpublic class ObservedTableTrackerTest {
3834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    private static final int TABLE_COUNT = 5;
3934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    private InvalidationTracker.ObservedTableTracker mTracker;
4034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
4134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    @Before
4234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    public void setup() {
4334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker = new InvalidationTracker.ObservedTableTracker(TABLE_COUNT);
4434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
4534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
4634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    @Test
4734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    public void basicAdd() {
4834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onAdded(2, 3);
4934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(createResponse(2, ADD, 3, ADD)));
5034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
5134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
5234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    @Test
5334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    public void basicRemove() {
5434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        initState(2, 3);
5534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onRemoved(3);
5634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(createResponse(3, REMOVE)));
5734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
5834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
5934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    @Test
6034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    public void noChange() {
6134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        initState(1, 3);
6234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onAdded(3);
6334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(nullValue()));
6434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
6534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
6634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    @Test
6734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    public void returnNullUntilSync() {
6834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        initState(1, 3);
6934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onAdded(4);
7034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(createResponse(4, ADD)));
7134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onAdded(0);
7234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(nullValue()));
7334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onSyncCompleted();
7434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(createResponse(0, ADD)));
7534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
7634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
7734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    @Test
7834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    public void multipleAdditionsDeletions() {
7934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        initState(2, 4);
8034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onAdded(2);
8134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(nullValue()));
8234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onAdded(2, 4);
8334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(nullValue()));
8434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onRemoved(2);
8534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(nullValue()));
8634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onRemoved(2, 4);
8734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(nullValue()));
8834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onAdded(1, 3);
8934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onRemoved(2, 4);
9034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        assertThat(mTracker.getTablesToSync(), is(
9134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar                createResponse(1, ADD, 2, REMOVE, 3, ADD, 4, REMOVE)));
9234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
9334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
9434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    private void initState(int... tableIds) {
9534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onAdded(tableIds);
9634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.getTablesToSync();
9734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        mTracker.onSyncCompleted();
9834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
9934e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar
10034e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    private static int[] createResponse(int... tuples) {
10134e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        int[] result = new int[TABLE_COUNT];
10234e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        Arrays.fill(result, NO_OP);
10334e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        for (int i = 0; i < tuples.length; i += 2) {
10434e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar            result[tuples[i]] = tuples[i + 1];
10534e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        }
10634e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar        return result;
10734e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar    }
10834e5031083f735db3a395b0f6aa430880b072d71Yigit Boyar}
109