1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2013 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h"
9cb93a386Sopenharmony_ci#include "src/core/SkDiscardableMemory.h"
10cb93a386Sopenharmony_ci#include "src/lazy/SkDiscardableMemoryPool.h"
11cb93a386Sopenharmony_ci#include "tests/Test.h"
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_ci#include <cstring>
14cb93a386Sopenharmony_ci#include <memory>
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_cinamespace {
17cb93a386Sopenharmony_ciconstexpr char kTestString[] = "HELLO, WORLD!";
18cb93a386Sopenharmony_ciconstexpr size_t kTestStringLength = sizeof(kTestString);
19cb93a386Sopenharmony_ci}  // namespace
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_cistatic void test_dm(skiatest::Reporter* reporter,
22cb93a386Sopenharmony_ci                    SkDiscardableMemory* dm,
23cb93a386Sopenharmony_ci                    bool assertRelock) {
24cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, dm);
25cb93a386Sopenharmony_ci    if (!dm) {
26cb93a386Sopenharmony_ci        return;
27cb93a386Sopenharmony_ci    }
28cb93a386Sopenharmony_ci    void* ptr = dm->data();
29cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, ptr);
30cb93a386Sopenharmony_ci    if (!ptr) {
31cb93a386Sopenharmony_ci        return;
32cb93a386Sopenharmony_ci    }
33cb93a386Sopenharmony_ci    memcpy(ptr, kTestString, sizeof(kTestString));
34cb93a386Sopenharmony_ci    dm->unlock();
35cb93a386Sopenharmony_ci    bool relockSuccess = dm->lock();
36cb93a386Sopenharmony_ci    if (assertRelock) {
37cb93a386Sopenharmony_ci        REPORTER_ASSERT(reporter, relockSuccess);
38cb93a386Sopenharmony_ci    }
39cb93a386Sopenharmony_ci    if (!relockSuccess) {
40cb93a386Sopenharmony_ci        return;
41cb93a386Sopenharmony_ci    }
42cb93a386Sopenharmony_ci    ptr = dm->data();
43cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, ptr);
44cb93a386Sopenharmony_ci    if (!ptr) {
45cb93a386Sopenharmony_ci        return;
46cb93a386Sopenharmony_ci    }
47cb93a386Sopenharmony_ci    REPORTER_ASSERT(reporter, 0 == memcmp(ptr, kTestString, kTestStringLength));
48cb93a386Sopenharmony_ci    dm->unlock();
49cb93a386Sopenharmony_ci}
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ciDEF_TEST(DiscardableMemory_global, reporter) {
52cb93a386Sopenharmony_ci    std::unique_ptr<SkDiscardableMemory> dm(SkDiscardableMemory::Create(kTestStringLength));
53cb93a386Sopenharmony_ci    // lock() test is allowed to fail, since other threads could be
54cb93a386Sopenharmony_ci    // using global pool.
55cb93a386Sopenharmony_ci    test_dm(reporter, dm.get(), false);
56cb93a386Sopenharmony_ci}
57cb93a386Sopenharmony_ci
58cb93a386Sopenharmony_ciDEF_TEST(DiscardableMemory_nonglobal, reporter) {
59cb93a386Sopenharmony_ci    sk_sp<SkDiscardableMemoryPool> pool(
60cb93a386Sopenharmony_ci        SkDiscardableMemoryPool::Make(1024));
61cb93a386Sopenharmony_ci    std::unique_ptr<SkDiscardableMemory> dm(pool->create(kTestStringLength));
62cb93a386Sopenharmony_ci    test_dm(reporter, dm.get(), true);
63cb93a386Sopenharmony_ci}
64cb93a386Sopenharmony_ci
65