1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <limits.h>
6 #include <ddk/device.h>
7 #include <unittest/unittest.h>
8 
9 extern zx_device_t* ddk_test_dev;
10 
11 static const char* TEST_STRING = "testing 1 2 3";
12 
add_metadata_test(void)13 static bool add_metadata_test(void) {
14     char buffer[32] = {};
15     zx_status_t status;
16     size_t actual;
17 
18     BEGIN_TEST;
19 
20     status = device_get_metadata(ddk_test_dev, 1, buffer,sizeof(buffer), &actual);
21     ASSERT_EQ(status, ZX_ERR_NOT_FOUND, "device_get_metadata did not return ZX_ERR_NOT_FOUND");
22 
23     status = device_add_metadata(ddk_test_dev, 1, TEST_STRING, strlen(TEST_STRING) + 1);
24     ASSERT_EQ(status, ZX_OK, "device_add_metadata failed");
25 
26     status = device_get_metadata(ddk_test_dev, 1, buffer, sizeof(buffer), &actual);
27     ASSERT_EQ(status, ZX_OK, "device_get_metadata failed");
28     ASSERT_EQ(actual, strlen(TEST_STRING) + 1, "");
29     ASSERT_EQ(strcmp(buffer, TEST_STRING), 0, "");
30 
31     END_TEST;
32 }
33 
publish_metadata_test(void)34 static bool publish_metadata_test(void) {
35     char buffer[32] = {};
36     zx_status_t status;
37     size_t actual;
38 
39     BEGIN_TEST;
40     // This should fail since the path does not match us or our potential children.
41     status = device_publish_metadata(ddk_test_dev, "/dev/misc/sysinfo", 2, TEST_STRING,
42                                      strlen(TEST_STRING) + 1);
43     ASSERT_EQ(status, ZX_ERR_ACCESS_DENIED, "");
44 
45     // We are allowed to add metadata to own path.
46     status = device_publish_metadata(ddk_test_dev, "/dev/test/test/ddk-test", 2, TEST_STRING,
47                                      strlen(TEST_STRING) + 1);
48     ASSERT_EQ(status, ZX_OK, "");
49 
50     status = device_get_metadata(ddk_test_dev, 2, buffer, sizeof(buffer), &actual);
51     ASSERT_EQ(status, ZX_OK, "device_get_metadata failed");
52     ASSERT_EQ(actual, strlen(TEST_STRING) + 1, "");
53     ASSERT_EQ(strcmp(buffer, TEST_STRING), 0, "");
54 
55     // We are allowed to add metadata to our potential children.
56     status = device_publish_metadata(ddk_test_dev, "/dev/test/test/ddk-test/child", 2, TEST_STRING,
57                                      strlen(TEST_STRING) + 1);
58     ASSERT_EQ(status, ZX_OK, "");
59 
60     END_TEST;
61 }
62 
63 BEGIN_TEST_CASE(metadata_tests)
64 RUN_TEST(add_metadata_test)
65 RUN_TEST(publish_metadata_test)
66 END_TEST_CASE(metadata_tests)
67 
68 struct test_case_element* test_case_ddk_metadata = TEST_CASE_ELEMENT(metadata_tests);
69