blob: 74260845795293bfa39c49a47e20bfc44fa3b314 [file] [log] [blame]
Adrienne Walker08b0c972019-03-12 13:31:30 -07001/*
2 * Copyright 2019 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "src/core/SkDescriptor.h"
9#include "tests/Test.h"
Adrienne Walker08b0c972019-03-12 13:31:30 -070010
11class SkDescriptorTestHelper {
12public:
13 static void SetLength(SkDescriptor* desc, size_t length) { desc->fLength = length; }
14};
15
16DEF_TEST(Descriptor_empty, r) {
17 const size_t size = sizeof(SkDescriptor);
18
19 auto desc = SkDescriptor::Alloc(size);
20 desc->init();
21 REPORTER_ASSERT(r, desc->isValid());
22 REPORTER_ASSERT(r, desc->getLength() == size);
23}
24
25DEF_TEST(Descriptor_valid_simple, r) {
26 const size_t size =
27 sizeof(SkDescriptor) + sizeof(SkDescriptor::Entry) + sizeof(SkScalerContextRec);
28
29 auto desc = SkDescriptor::Alloc(size);
30 desc->init();
31 SkScalerContextRec rec;
32 desc->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
33 REPORTER_ASSERT(r, desc->isValid());
34 REPORTER_ASSERT(r, desc->getLength() == size);
35
36 SkDescriptorTestHelper::SetLength(desc.get(), size - 4);
37 REPORTER_ASSERT(r, !desc->isValid());
38}
39
40DEF_TEST(Descriptor_valid_simple_extra_space, r) {
41 const size_t extra_space = 100;
42 const size_t size =
43 sizeof(SkDescriptor) + sizeof(SkDescriptor::Entry) + sizeof(SkScalerContextRec);
44
45 auto desc = SkDescriptor::Alloc(size + extra_space);
46 desc->init();
47 SkScalerContextRec rec;
48 desc->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
49 REPORTER_ASSERT(r, desc->isValid());
50 REPORTER_ASSERT(r, desc->getLength() == size);
51
52 SkDescriptorTestHelper::SetLength(desc.get(), size - 4);
53 REPORTER_ASSERT(r, !desc->isValid());
54}
55
56DEF_TEST(Descriptor_valid_more_tags, r) {
57 const size_t effectSize = 16;
58 const size_t testSize = 32;
59 const size_t size = sizeof(SkDescriptor) + 3 * sizeof(SkDescriptor::Entry) +
60 sizeof(SkScalerContextRec) + effectSize + testSize;
61
62 auto desc = SkDescriptor::Alloc(size);
63 desc->init();
64 SkScalerContextRec rec;
65 desc->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
66 desc->addEntry(kEffects_SkDescriptorTag, effectSize, nullptr);
67 desc->addEntry(SkSetFourByteTag('t', 'e', 's', 't'), testSize, nullptr);
68 REPORTER_ASSERT(r, desc->isValid());
69 REPORTER_ASSERT(r, desc->getLength() == size);
70
71 SkDescriptorTestHelper::SetLength(desc.get(), size - 4);
72 REPORTER_ASSERT(r, !desc->isValid());
73}
74
75DEF_TEST(Descriptor_invalid_rec_size, r) {
76 const size_t size =
Mike Klein73b0df12019-03-12 17:40:46 -050077 sizeof(SkDescriptor) + sizeof(SkDescriptor::Entry) + sizeof(SkScalerContextRec) - 4;
Adrienne Walker08b0c972019-03-12 13:31:30 -070078
79 auto desc = SkDescriptor::Alloc(size);
80 desc->init();
81 SkScalerContextRec rec;
Mike Klein73b0df12019-03-12 17:40:46 -050082 desc->addEntry(kRec_SkDescriptorTag, sizeof(rec) - 4, &rec);
Adrienne Walker08b0c972019-03-12 13:31:30 -070083 REPORTER_ASSERT(r, desc->getLength() == size);
84 REPORTER_ASSERT(r, !desc->isValid());
85}
86
87DEF_TEST(Descriptor_invalid_length, r) {
88 const size_t size = sizeof(SkDescriptor) + sizeof(SkDescriptor::Entry);
89 const size_t effect_size = 1000;
90
91 auto desc = SkDescriptor::Alloc(size);
92 desc->init();
93 SkScalerContextRec rec;
94 desc->addEntry(kEffects_SkDescriptorTag, effect_size, nullptr);
95
96 SkDescriptorTestHelper::SetLength(desc.get(), size);
97 REPORTER_ASSERT(r, !desc->isValid());
98
99 SkDescriptorTestHelper::SetLength(desc.get(), size + effect_size);
100 REPORTER_ASSERT(r, desc->isValid());
101}