dedupe_set_test.cc revision e21dc3db191df04c100620965bee4617b3b24397
1193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier/*
2193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier * Copyright (C) 2013 The Android Open Source Project
3193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier *
4193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License");
5193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier * you may not use this file except in compliance with the License.
6193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier * You may obtain a copy of the License at
7193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier *
8193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier *      http://www.apache.org/licenses/LICENSE-2.0
9193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier *
10193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier * Unless required by applicable law or agreed to in writing, software
11193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS,
12193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier * See the License for the specific language governing permissions and
14193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier * limitations under the License.
15193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier */
16193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier
17193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier#include "dedupe_set.h"
18e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe
19e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe#include <algorithm>
20e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe#include <cstdio>
21e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe
22ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom#include "gtest/gtest.h"
23ba150c37d582eeeb8c11ba5245edc281cf31793cBrian Carlstrom#include "thread-inl.h"
24193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier
25193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartiernamespace art {
26193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier
27193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartierclass DedupeHashFunc {
28193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier public:
29193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  size_t operator()(const std::vector<uint8_t>& array) const {
30193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    size_t hash = 0;
31193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    for (uint8_t c : array) {
32193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier      hash += c;
33193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier      hash += hash << 10;
34193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier      hash += hash >> 6;
35193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    }
36193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    return hash;
37193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  }
38193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier};
39413e89f277ec6ba1bdf2040f5b5611f29a27a447Brian CarlstromTEST(DedupeSetTest, Test) {
40193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  Thread* self = Thread::Current();
41193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  typedef std::vector<uint8_t> ByteArray;
42e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe  SwapAllocator<void> swap(nullptr);
43e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe  DedupeSet<ByteArray, SwapVector<uint8_t>, size_t, DedupeHashFunc> deduplicator("test", swap);
44e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe  SwapVector<uint8_t>* array1;
45193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  {
46193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    ByteArray test1;
47193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(10);
48193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(20);
49193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(30);
50193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(45);
51e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe
52193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    array1 = deduplicator.Add(self, test1);
53e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe    ASSERT_NE(array1, nullptr);
54e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe    ASSERT_TRUE(std::equal(test1.begin(), test1.end(), array1->begin()));
55193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  }
56193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier
57e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe  SwapVector<uint8_t>* array2;
58193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  {
59193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    ByteArray test1;
60193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(10);
61193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(20);
62193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(30);
63193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(45);
64193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    array2 = deduplicator.Add(self, test1);
65193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    ASSERT_EQ(array2, array1);
66e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe    ASSERT_TRUE(std::equal(test1.begin(), test1.end(), array2->begin()));
67193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  }
68193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier
69e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe  SwapVector<uint8_t>* array3;
70193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  {
71193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    ByteArray test1;
72193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(10);
73193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(22);
74193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(30);
75193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    test1.push_back(47);
76193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier    array3 = deduplicator.Add(self, test1);
77e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe    ASSERT_NE(array3, nullptr);
78e21dc3db191df04c100620965bee4617b3b24397Andreas Gampe    ASSERT_TRUE(std::equal(test1.begin(), test1.end(), array3->begin()));
79193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier  }
80193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier}
81193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier
82193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier}  // namespace art
83