1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *    http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16use crate::common::*;
17use asset_sdk::*;
18
19#[test]
20fn add_all_tags() {
21    let alias = function!().as_bytes();
22    add_all_tags_asset(alias).unwrap();
23
24    let res = query_attr_by_alias(alias).unwrap();
25    assert_eq!(1, res.len());
26    assert_eq!(19, res[0].len());
27    assert_eq!(alias, *res[0].get_bytes_attr(&Tag::Alias).unwrap());
28    assert_eq!(NORMAL_LABEL1, *res[0].get_bytes_attr(&Tag::DataLabelNormal1).unwrap());
29    assert_eq!(NORMAL_LABEL2, *res[0].get_bytes_attr(&Tag::DataLabelNormal2).unwrap());
30    assert_eq!(NORMAL_LABEL3, *res[0].get_bytes_attr(&Tag::DataLabelNormal3).unwrap());
31    assert_eq!(NORMAL_LABEL4, *res[0].get_bytes_attr(&Tag::DataLabelNormal4).unwrap());
32    assert_eq!(NORMAL_LOCAL_LABEL1, *res[0].get_bytes_attr(&Tag::DataLabelNormalLocal1).unwrap());
33    assert_eq!(NORMAL_LOCAL_LABEL2, *res[0].get_bytes_attr(&Tag::DataLabelNormalLocal2).unwrap());
34    assert_eq!(NORMAL_LOCAL_LABEL3, *res[0].get_bytes_attr(&Tag::DataLabelNormalLocal3).unwrap());
35    assert_eq!(NORMAL_LOCAL_LABEL4, *res[0].get_bytes_attr(&Tag::DataLabelNormalLocal4).unwrap());
36    assert_eq!(CRITICAL_LABEL1, *res[0].get_bytes_attr(&Tag::DataLabelCritical1).unwrap());
37    assert_eq!(CRITICAL_LABEL2, *res[0].get_bytes_attr(&Tag::DataLabelCritical2).unwrap());
38    assert_eq!(CRITICAL_LABEL3, *res[0].get_bytes_attr(&Tag::DataLabelCritical3).unwrap());
39    assert_eq!(CRITICAL_LABEL4, *res[0].get_bytes_attr(&Tag::DataLabelCritical4).unwrap());
40    assert_eq!(Accessibility::DevicePowerOn, res[0].get_enum_attr::<Accessibility>(&Tag::Accessibility).unwrap());
41    assert_eq!(AuthType::Any, res[0].get_enum_attr::<AuthType>(&Tag::AuthType).unwrap());
42    assert_eq!(SyncType::ThisDevice, res[0].get_enum_attr::<SyncType>(&Tag::SyncType).unwrap());
43    assert!(!res[0].get_bool_attr(&Tag::IsPersistent).unwrap());
44    assert!(!res[0].get_bool_attr(&Tag::RequirePasswordSet).unwrap());
45
46    remove_by_alias(alias).unwrap();
47}
48
49#[test]
50fn add_required_tags() {
51    let func_name = function!().as_bytes();
52    let mut attrs = AssetMap::new();
53    attrs.insert_attr(Tag::Alias, func_name.to_owned());
54    attrs.insert_attr(Tag::Secret, func_name.to_owned());
55    attrs.insert_attr(Tag::Accessibility, Accessibility::DevicePowerOn);
56    asset_sdk::Manager::build().unwrap().add(&attrs).unwrap();
57
58    let res = query_all_by_alias(func_name).unwrap();
59    assert_eq!(1, res.len());
60    assert_eq!(8, res[0].len());
61    assert_eq!(func_name, *res[0].get_bytes_attr(&Tag::Alias).unwrap());
62    assert_eq!(func_name, *res[0].get_bytes_attr(&Tag::Secret).unwrap());
63    assert_eq!(Accessibility::DevicePowerOn, res[0].get_enum_attr::<Accessibility>(&Tag::Accessibility).unwrap());
64    assert_eq!(AuthType::None, res[0].get_enum_attr::<AuthType>(&Tag::AuthType).unwrap());
65    assert_eq!(SyncType::Never, res[0].get_enum_attr::<SyncType>(&Tag::SyncType).unwrap());
66    assert!(!res[0].get_bool_attr(&Tag::IsPersistent).unwrap());
67    assert!(!res[0].get_bool_attr(&Tag::RequirePasswordSet).unwrap());
68    remove_by_alias(func_name).unwrap();
69}
70
71#[test]
72fn add_english_secret() {
73    let func_name = function!();
74    let mut attrs = AssetMap::new();
75    attrs.insert_attr(Tag::Alias, func_name.as_bytes().to_owned());
76    attrs.insert_attr(Tag::Secret, func_name.as_bytes().to_owned());
77    attrs.insert_attr(Tag::Accessibility, Accessibility::DevicePowerOn);
78    asset_sdk::Manager::build().unwrap().add(&attrs).unwrap();
79
80    let res = query_all_by_alias(func_name.as_bytes()).unwrap();
81    assert_eq!(1, res.len());
82    let bytes = res[0].get_bytes_attr(&Tag::Secret).unwrap();
83    assert_eq!(func_name, String::from_utf8(bytes.to_owned()).unwrap());
84    remove_by_alias(func_name.as_bytes()).unwrap();
85}
86
87#[test]
88fn add_chinese_secret() {
89    let alias = "Здравствуйте";
90    let secret = "中文";
91    let mut attrs = AssetMap::new();
92    attrs.insert_attr(Tag::Alias, alias.as_bytes().to_owned());
93    attrs.insert_attr(Tag::Secret, secret.as_bytes().to_owned());
94    attrs.insert_attr(Tag::Accessibility, Accessibility::DevicePowerOn);
95    asset_sdk::Manager::build().unwrap().add(&attrs).unwrap();
96
97    let res = query_all_by_alias(alias.as_bytes()).unwrap();
98    assert_eq!(1, res.len());
99    let bytes = res[0].get_bytes_attr(&Tag::Secret).unwrap();
100    assert_eq!(secret, String::from_utf8(bytes.to_owned()).unwrap());
101    let bytes = res[0].get_bytes_attr(&Tag::Alias).unwrap();
102    assert_eq!(alias, String::from_utf8(bytes.to_owned()).unwrap());
103    remove_by_alias(alias.as_bytes()).unwrap();
104}
105
106#[test]
107fn add_same_alias_throw_error() {
108    let function_name = function!().as_bytes();
109
110    // step1. insert data
111    let mut attrs = AssetMap::new();
112    attrs.insert_attr(Tag::Alias, function_name.to_owned());
113    attrs.insert_attr(Tag::Secret, function_name.to_owned());
114    attrs.insert_attr(Tag::Accessibility, Accessibility::DevicePowerOn);
115    asset_sdk::Manager::build().unwrap().add(&attrs).unwrap();
116
117    // step2. insert data with the same alias, default resolution: throw error
118    expect_error_eq(ErrCode::Duplicated, asset_sdk::Manager::build().unwrap().add(&attrs).unwrap_err());
119
120    // step3. insert data with the same alias, specified resolution: throw error
121    attrs.insert_attr(Tag::ConflictResolution, ConflictResolution::ThrowError);
122    expect_error_eq(ErrCode::Duplicated, asset_sdk::Manager::build().unwrap().add(&attrs).unwrap_err());
123
124    remove_by_alias(function_name).unwrap();
125}
126
127#[test]
128fn add_same_alias_overwrite() {
129    let function_name = function!().as_bytes();
130
131    // step1. insert data
132    let mut attrs = AssetMap::new();
133    attrs.insert_attr(Tag::Alias, function_name.to_owned());
134    attrs.insert_attr(Tag::Secret, function_name.to_owned());
135    attrs.insert_attr(Tag::Accessibility, Accessibility::DevicePowerOn);
136    asset_sdk::Manager::build().unwrap().add(&attrs).unwrap();
137
138    // step2. query data with no label
139    let res = query_attr_by_alias(function_name).unwrap();
140    assert_eq!(1, res.len());
141    assert!(res[0].get(&Tag::DataLabelCritical1).is_none());
142
143    // step3. insert data with the same alias, specified resolution: overwrite
144    let critical_label = "add_same_alias_overwrite".as_bytes();
145    attrs.insert_attr(Tag::DataLabelCritical1, critical_label.to_owned());
146    attrs.insert_attr(Tag::ConflictResolution, ConflictResolution::Overwrite);
147    attrs.insert_attr(Tag::Accessibility, Accessibility::DevicePowerOn);
148    asset_sdk::Manager::build().unwrap().add(&attrs).unwrap();
149
150    // step4. query new data with critical label
151    let res = query_attr_by_alias(function_name).unwrap();
152    assert_eq!(1, res.len());
153    assert_eq!(critical_label, *res[0].get_bytes_attr(&Tag::DataLabelCritical1).unwrap());
154
155    remove_by_alias(function_name).unwrap();
156}
157
158#[test]
159fn add_multiple_sync_types() {
160    let function_name = function!().as_bytes();
161    let sync_type = (SyncType::ThisDevice as u32) | (SyncType::TrustedDevice as u32);
162    let mut attrs = AssetMap::new();
163    attrs.insert_attr(Tag::Alias, function_name.to_owned());
164    attrs.insert_attr(Tag::Secret, function_name.to_owned());
165    attrs.insert_attr(Tag::SyncType, sync_type);
166    attrs.insert_attr(Tag::Accessibility, Accessibility::DevicePowerOn);
167    asset_sdk::Manager::build().unwrap().add(&attrs).unwrap();
168
169    let res = query_attr_by_alias(function_name).unwrap();
170    assert_eq!(1, res.len());
171    assert_eq!(sync_type, res[0].get_num_attr(&Tag::SyncType).unwrap());
172    remove_by_alias(function_name).unwrap();
173}
174
175#[test]
176fn add_is_persistent_auth_wrong() {
177    let function_name = function!().as_bytes();
178    let mut attrs = AssetMap::new();
179    attrs.insert_attr(Tag::Alias, function_name.to_owned());
180    attrs.insert_attr(Tag::Secret, function_name.to_owned());
181    attrs.insert_attr(Tag::Accessibility, Accessibility::DevicePowerOn);
182    attrs.insert_attr(Tag::IsPersistent, true);
183    expect_error_eq(ErrCode::PermissionDenied, asset_sdk::Manager::build().unwrap().add(&attrs).unwrap_err());
184
185    attrs.insert_attr(Tag::IsPersistent, false);
186    expect_error_eq(ErrCode::PermissionDenied, asset_sdk::Manager::build().unwrap().add(&attrs).unwrap_err());
187}
188