xref: /aosp_15_r20/external/spdx-tools/rdfloader/parser2v3/parse_license_test.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Li
3*ba677afaSXin Lipackage parser2v3
4*ba677afaSXin Li
5*ba677afaSXin Liimport (
6*ba677afaSXin Li	"reflect"
7*ba677afaSXin Li	"sort"
8*ba677afaSXin Li	"testing"
9*ba677afaSXin Li
10*ba677afaSXin Li	gordfParser "github.com/spdx/gordf/rdfloader/parser"
11*ba677afaSXin Li)
12*ba677afaSXin Li
13*ba677afaSXin Lifunc Test_rdfParser2_3_getAnyLicenseFromNode(t *testing.T) {
14*ba677afaSXin Li	// since this function is a mux, we just have to make sure that with each
15*ba677afaSXin Li	// type of input, it is able to redirect the request to an appropriate
16*ba677afaSXin Li	// license getter.
17*ba677afaSXin Li
18*ba677afaSXin Li	// TestCase 1: input node is just a node string without any associated
19*ba677afaSXin Li	//			   triple (either a NONE|NOASSERTION) because for other case,
20*ba677afaSXin Li	//			   the license should've been associated with other triples
21*ba677afaSXin Li	parser, _ := parserFromBodyContent(``)
22*ba677afaSXin Li	inputNode := &gordfParser.Node{
23*ba677afaSXin Li		NodeType: gordfParser.IRI,
24*ba677afaSXin Li		ID:       NS_SPDX + "NONE",
25*ba677afaSXin Li	}
26*ba677afaSXin Li	lic, err := parser.getAnyLicenseFromNode(inputNode)
27*ba677afaSXin Li	if err != nil {
28*ba677afaSXin Li		t.Errorf("error parsing a valid license input: %v", err)
29*ba677afaSXin Li	}
30*ba677afaSXin Li	// checking if the return type is a SpecialLicense
31*ba677afaSXin Li	switch lic.(type) {
32*ba677afaSXin Li	case SpecialLicense:
33*ba677afaSXin Li	default:
34*ba677afaSXin Li		t.Errorf("expected license to be of type SpecialLicense, found %v", reflect.TypeOf(lic))
35*ba677afaSXin Li	}
36*ba677afaSXin Li
37*ba677afaSXin Li	// TestCase 2: DisjunctiveLicenseSet:
38*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
39*ba677afaSXin Li		<spdx:DisjunctiveLicenseSet>
40*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/Nokia"/>
41*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/LGPL-2.0"/>
42*ba677afaSXin Li		</spdx:DisjunctiveLicenseSet>
43*ba677afaSXin Li	`)
44*ba677afaSXin Li	inputNode = parser.gordfParserObj.Triples[0].Subject
45*ba677afaSXin Li	lic, err = parser.getAnyLicenseFromNode(inputNode)
46*ba677afaSXin Li	if err != nil {
47*ba677afaSXin Li		t.Errorf("error parsing a valid license input: %v", err)
48*ba677afaSXin Li	}
49*ba677afaSXin Li	// checking if the return type is a DisjunctiveLicenseSet
50*ba677afaSXin Li	switch lic.(type) {
51*ba677afaSXin Li	case DisjunctiveLicenseSet:
52*ba677afaSXin Li	default:
53*ba677afaSXin Li		t.Errorf("expected license to be of type DisjunctiveLicenseSet, found %v", reflect.TypeOf(lic))
54*ba677afaSXin Li	}
55*ba677afaSXin Li
56*ba677afaSXin Li	// TestCase 3: ConjunctiveLicenseSet:
57*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
58*ba677afaSXin Li		<spdx:ConjunctiveLicenseSet>
59*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/Nokia"/>
60*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/LGPL-2.0"/>
61*ba677afaSXin Li		</spdx:ConjunctiveLicenseSet>
62*ba677afaSXin Li	`)
63*ba677afaSXin Li	inputNode = parser.gordfParserObj.Triples[0].Subject
64*ba677afaSXin Li	lic, err = parser.getAnyLicenseFromNode(inputNode)
65*ba677afaSXin Li	if err != nil {
66*ba677afaSXin Li		t.Errorf("error parsing a valid license input: %v", err)
67*ba677afaSXin Li	}
68*ba677afaSXin Li	// checking if the return type is a ConjunctiveLicenseSet
69*ba677afaSXin Li	switch lic.(type) {
70*ba677afaSXin Li	case ConjunctiveLicenseSet:
71*ba677afaSXin Li	default:
72*ba677afaSXin Li		t.Errorf("expected license to be of type ConjunctiveLicenseSet, found %v", reflect.TypeOf(lic))
73*ba677afaSXin Li	}
74*ba677afaSXin Li
75*ba677afaSXin Li	// TestCase 4: ExtractedLicensingInfo
76*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
77*ba677afaSXin Li		<spdx:ExtractedLicensingInfo rdf:about="http://spdx.dev/spdx.rdf#LicenseRef-Freeware">
78*ba677afaSXin Li			<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
79*ba677afaSXin Li			<spdx:name>freeware</spdx:name>
80*ba677afaSXin Li			<spdx:extractedText><![CDATA[...]]></spdx:extractedText>
81*ba677afaSXin Li	  	</spdx:ExtractedLicensingInfo>
82*ba677afaSXin Li	`)
83*ba677afaSXin Li	inputNode = parser.gordfParserObj.Triples[0].Subject
84*ba677afaSXin Li	lic, err = parser.getAnyLicenseFromNode(inputNode)
85*ba677afaSXin Li	if err != nil {
86*ba677afaSXin Li		t.Errorf("error parsing a valid license input: %v", err)
87*ba677afaSXin Li	}
88*ba677afaSXin Li	// checking if the return type is a ExtractedLicensingInfo
89*ba677afaSXin Li	switch lic.(type) {
90*ba677afaSXin Li	case ExtractedLicensingInfo:
91*ba677afaSXin Li	default:
92*ba677afaSXin Li		t.Errorf("expected license to be of type ExtractedLicensingInfo, found %v", reflect.TypeOf(lic))
93*ba677afaSXin Li	}
94*ba677afaSXin Li
95*ba677afaSXin Li	// TestCase 4: ExtractedLicensingInfo
96*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
97*ba677afaSXin Li		<spdx:ExtractedLicensingInfo rdf:about="http://spdx.dev/spdx.rdf#LicenseRef-Freeware">
98*ba677afaSXin Li			<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
99*ba677afaSXin Li			<spdx:name>freeware</spdx:name>
100*ba677afaSXin Li			<spdx:extractedText><![CDATA[...]]></spdx:extractedText>
101*ba677afaSXin Li	  	</spdx:ExtractedLicensingInfo>
102*ba677afaSXin Li	`)
103*ba677afaSXin Li	inputNode = parser.gordfParserObj.Triples[0].Subject
104*ba677afaSXin Li	lic, err = parser.getAnyLicenseFromNode(inputNode)
105*ba677afaSXin Li	if err != nil {
106*ba677afaSXin Li		t.Errorf("error parsing a valid license input: %v", err)
107*ba677afaSXin Li	}
108*ba677afaSXin Li	// checking if the return type is a ExtractedLicensingInfo
109*ba677afaSXin Li	switch lic.(type) {
110*ba677afaSXin Li	case ExtractedLicensingInfo:
111*ba677afaSXin Li	default:
112*ba677afaSXin Li		t.Errorf("expected license to be of type ExtractedLicensingInfo, found %v", reflect.TypeOf(lic))
113*ba677afaSXin Li	}
114*ba677afaSXin Li
115*ba677afaSXin Li	// TestCase 5: License
116*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
117*ba677afaSXin Li		<spdx:License rdf:about="http://spdx.org/licenses/Apache-2.0">
118*ba677afaSXin Li			<spdx:standardLicenseTemplate>&lt;&gt; Apache License Version 2.0, January 2004 http://www.apache.org/licenses/&lt;&gt;&lt;&gt; TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION&lt;&gt; &lt;&gt; Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. &lt;&gt; Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. &lt;&gt; Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. &lt;&gt; Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: &lt;&gt; You must give any other recipients of the Work or Derivative Works a copy of this License; and &lt;&gt; You must cause any modified files to carry prominent notices stating that You changed the files; and &lt;&gt; You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and &lt;&gt; If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. &lt;&gt; Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. &lt;&gt; Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. &lt;&gt; Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. &lt;&gt; Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. &lt;&gt; Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.&lt;&gt; END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright &lt;&gt; Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.&lt;&gt;</spdx:standardLicenseTemplate>
119*ba677afaSXin Li			<rdfs:seeAlso>http://www.apache.org/licenses/LICENSE-2.0</rdfs:seeAlso>
120*ba677afaSXin Li			<spdx:name>Apache License 2.0</spdx:name>
121*ba677afaSXin Li			<spdx:licenseId>Apache-2.0</spdx:licenseId>
122*ba677afaSXin Li			<spdx:isOsiApproved>true</spdx:isOsiApproved>
123*ba677afaSXin Li			<rdfs:seeAlso>http://www.opensource.org/licenses/Apache-2.0</rdfs:seeAlso>
124*ba677afaSXin Li			<spdx:licenseText>...</spdx:licenseText>
125*ba677afaSXin Li			<spdx:standardLicenseHeader>...</spdx:standardLicenseHeader>
126*ba677afaSXin Li	  </spdx:License>
127*ba677afaSXin Li	`)
128*ba677afaSXin Li	inputNode = parser.gordfParserObj.Triples[0].Subject
129*ba677afaSXin Li	lic, err = parser.getAnyLicenseFromNode(inputNode)
130*ba677afaSXin Li	if err != nil {
131*ba677afaSXin Li		t.Errorf("error parsing a valid license input: %v", err)
132*ba677afaSXin Li	}
133*ba677afaSXin Li	// checking if the return type is a License
134*ba677afaSXin Li	switch lic.(type) {
135*ba677afaSXin Li	case License:
136*ba677afaSXin Li	default:
137*ba677afaSXin Li		t.Errorf("expected license to be of type License, found %v", reflect.TypeOf(lic))
138*ba677afaSXin Li	}
139*ba677afaSXin Li
140*ba677afaSXin Li	// TestCase 5: WithExceptionOperator
141*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
142*ba677afaSXin Li		<spdx:WithExceptionOperator>
143*ba677afaSXin Li			<spdx:licenseException>
144*ba677afaSXin Li				<spdx:LicenseException rdf:nodeID="A1">
145*ba677afaSXin Li					<spdx:example></spdx:example>
146*ba677afaSXin Li					<spdx:licenseExceptionId>Libtool-exception</spdx:licenseExceptionId>
147*ba677afaSXin Li					<rdfs:comment></rdfs:comment>
148*ba677afaSXin Li				</spdx:LicenseException>
149*ba677afaSXin Li			</spdx:licenseException>
150*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/GPL-2.0-or-later"/>
151*ba677afaSXin Li		</spdx:WithExceptionOperator>
152*ba677afaSXin Li	`)
153*ba677afaSXin Li	inputNode = parser.gordfParserObj.Triples[0].Subject
154*ba677afaSXin Li	lic, err = parser.getAnyLicenseFromNode(inputNode)
155*ba677afaSXin Li	if err != nil {
156*ba677afaSXin Li		t.Errorf("error parsing a valid license input: %v", err)
157*ba677afaSXin Li	}
158*ba677afaSXin Li	// checking if the return type is a WithExceptionOperator
159*ba677afaSXin Li	switch lic.(type) {
160*ba677afaSXin Li	case WithExceptionOperator:
161*ba677afaSXin Li	default:
162*ba677afaSXin Li		t.Errorf("expected license to be of type WithExceptionOperator, found %v", reflect.TypeOf(lic))
163*ba677afaSXin Li	}
164*ba677afaSXin Li
165*ba677afaSXin Li	// TestCase 6: OrLaterOperator
166*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
167*ba677afaSXin Li		<spdx:OrLaterOperator>
168*ba677afaSXin Li			<spdx:member>
169*ba677afaSXin Li				<spdx:SimpleLicensingInfo>
170*ba677afaSXin Li					<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
171*ba677afaSXin Li					<spdx:name>freeware</spdx:name>
172*ba677afaSXin Li				</spdx:SimpleLicensingInfo>
173*ba677afaSXin Li			</spdx:member>
174*ba677afaSXin Li		</spdx:OrLaterOperator>
175*ba677afaSXin Li	`)
176*ba677afaSXin Li	inputNode = parser.gordfParserObj.Triples[0].Subject
177*ba677afaSXin Li	lic, err = parser.getAnyLicenseFromNode(inputNode)
178*ba677afaSXin Li	if err != nil {
179*ba677afaSXin Li		t.Errorf("error parsing a valid license input: %v", err)
180*ba677afaSXin Li	}
181*ba677afaSXin Li	// checking if the return type is a OrLaterOperator
182*ba677afaSXin Li	switch lic.(type) {
183*ba677afaSXin Li	case OrLaterOperator:
184*ba677afaSXin Li	default:
185*ba677afaSXin Li		t.Errorf("expected license to be of type OrLaterOperator, found %v", reflect.TypeOf(lic))
186*ba677afaSXin Li	}
187*ba677afaSXin Li
188*ba677afaSXin Li	// TestCase 7: checking if an unknown license raises an error.
189*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
190*ba677afaSXin Li		<spdx:UnknownLicense>
191*ba677afaSXin Li			<spdx:unknownTag />
192*ba677afaSXin Li		</spdx:UnknownLicense>
193*ba677afaSXin Li	`)
194*ba677afaSXin Li	node := parser.gordfParserObj.Triples[0].Subject
195*ba677afaSXin Li	_, err = parser.getAnyLicenseFromNode(node)
196*ba677afaSXin Li	t.Log(err)
197*ba677afaSXin Li	if err == nil {
198*ba677afaSXin Li		t.Errorf("should've raised an error for invalid input")
199*ba677afaSXin Li	}
200*ba677afaSXin Li
201*ba677afaSXin Li	// TestCase 8: cyclic dependent license must raise an error.
202*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
203*ba677afaSXin Li		<spdx:ConjunctiveLicenseSet rdf:about="#SPDXRef-RecursiveLicense">
204*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/GPL-2.0-or-later"/>
205*ba677afaSXin Li			<spdx:member>
206*ba677afaSXin Li				<spdx:ConjunctiveLicenseSet rdf:about="#SPDXRef-RecursiveLicense">
207*ba677afaSXin Li					<spdx:member rdf:resource="http://spdx.org/licenses/LGPL-2.0"/>
208*ba677afaSXin Li					<spdx:member rdf:resource="http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#SPDXRef-RecursiveLicense"/>
209*ba677afaSXin Li				</spdx:ConjunctiveLicenseSet>
210*ba677afaSXin Li			</spdx:member>
211*ba677afaSXin Li		</spdx:ConjunctiveLicenseSet>
212*ba677afaSXin Li	`)
213*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
214*ba677afaSXin Li	_, err = parser.getAnyLicenseFromNode(node)
215*ba677afaSXin Li	if err == nil {
216*ba677afaSXin Li		t.Errorf("expected an error due to cyclic dependent license. found %v", err)
217*ba677afaSXin Li	}
218*ba677afaSXin Li}
219*ba677afaSXin Li
220*ba677afaSXin Lifunc Test_rdfParser2_3_getConjunctiveLicenseSetFromNode(t *testing.T) {
221*ba677afaSXin Li	var parser *rdfParser2_3
222*ba677afaSXin Li	var err error
223*ba677afaSXin Li	var licenseNode *gordfParser.Node
224*ba677afaSXin Li	var license ConjunctiveLicenseSet
225*ba677afaSXin Li
226*ba677afaSXin Li	// TestCase 1: invalid license member
227*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
228*ba677afaSXin Li		<spdx:ConjunctiveLicenseSet>
229*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/Unknown"/>
230*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/LGPL-2.0"/>
231*ba677afaSXin Li		</spdx:ConjunctiveLicenseSet>
232*ba677afaSXin Li	`)
233*ba677afaSXin Li	licenseNode = parser.gordfParserObj.Triples[0].Subject
234*ba677afaSXin Li	_, err = parser.getConjunctiveLicenseSetFromNode(licenseNode)
235*ba677afaSXin Li	if err == nil {
236*ba677afaSXin Li		t.Errorf("expected an error saying invalid license member, found <nil>")
237*ba677afaSXin Li	}
238*ba677afaSXin Li
239*ba677afaSXin Li	// TestCase 2: invalid predicate in the licenseSet.
240*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
241*ba677afaSXin Li		<spdx:ConjunctiveLicenseSet>
242*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/CC0-1.0"/>
243*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/LGPL-2.0"/>
244*ba677afaSXin Li			<spdx:unknownTag />
245*ba677afaSXin Li		</spdx:ConjunctiveLicenseSet>
246*ba677afaSXin Li	`)
247*ba677afaSXin Li	licenseNode = parser.gordfParserObj.Triples[0].Subject
248*ba677afaSXin Li	_, err = parser.getConjunctiveLicenseSetFromNode(licenseNode)
249*ba677afaSXin Li	if err == nil {
250*ba677afaSXin Li		t.Errorf("expected an error saying invalid predicate found")
251*ba677afaSXin Li	}
252*ba677afaSXin Li
253*ba677afaSXin Li	// TestCase 3: valid example.
254*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
255*ba677afaSXin Li		<spdx:ConjunctiveLicenseSet>
256*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/Nokia"/>
257*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/LGPL-2.0"/>
258*ba677afaSXin Li		</spdx:ConjunctiveLicenseSet>
259*ba677afaSXin Li	`)
260*ba677afaSXin Li	licenseNode = parser.gordfParserObj.Triples[0].Subject
261*ba677afaSXin Li	license, err = parser.getConjunctiveLicenseSetFromNode(licenseNode)
262*ba677afaSXin Li	if err != nil {
263*ba677afaSXin Li		t.Errorf("unexpected error parsing licenseSet: %v", err)
264*ba677afaSXin Li	}
265*ba677afaSXin Li	nMembers := len(license.members)
266*ba677afaSXin Li	if nMembers != 2 {
267*ba677afaSXin Li		t.Errorf("expected licenseSet to have 2 members, found %d", nMembers)
268*ba677afaSXin Li	}
269*ba677afaSXin Li	licenseMembers := mapLicensesToStrings(license.members)
270*ba677afaSXin Li	expectedLicenseMembers := []string{"LGPL-2.0", "Nokia"}
271*ba677afaSXin Li	sort.Strings(licenseMembers)
272*ba677afaSXin Li	if !reflect.DeepEqual(licenseMembers, expectedLicenseMembers) {
273*ba677afaSXin Li		t.Errorf("expected %v, found %v", expectedLicenseMembers, licenseMembers)
274*ba677afaSXin Li	}
275*ba677afaSXin Li}
276*ba677afaSXin Li
277*ba677afaSXin Lifunc Test_rdfParser2_3_getDisjunctiveLicenseSetFromNode(t *testing.T) {
278*ba677afaSXin Li	var parser *rdfParser2_3
279*ba677afaSXin Li	var err error
280*ba677afaSXin Li	var licenseNode *gordfParser.Node
281*ba677afaSXin Li	var license DisjunctiveLicenseSet
282*ba677afaSXin Li
283*ba677afaSXin Li	// TestCase 1: invalid license member
284*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
285*ba677afaSXin Li		<spdx:DisjunctiveLicenseSet>
286*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/Unknown"/>
287*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/LGPL-2.0"/>
288*ba677afaSXin Li		</spdx:DisjunctiveLicenseSet>
289*ba677afaSXin Li	`)
290*ba677afaSXin Li	licenseNode = parser.gordfParserObj.Triples[0].Subject
291*ba677afaSXin Li	_, err = parser.getDisjunctiveLicenseSetFromNode(licenseNode)
292*ba677afaSXin Li	if err == nil {
293*ba677afaSXin Li		t.Errorf("expected an error saying invalid license member, found <nil>")
294*ba677afaSXin Li	}
295*ba677afaSXin Li
296*ba677afaSXin Li	// TestCase 2: invalid predicate in the licenseSet.
297*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
298*ba677afaSXin Li		<spdx:DisjunctiveLicenseSet>
299*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/Unknown"/>
300*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/LGPL-2.0"/>
301*ba677afaSXin Li			<spdx:unknownTag />
302*ba677afaSXin Li		</spdx:DisjunctiveLicenseSet>
303*ba677afaSXin Li	`)
304*ba677afaSXin Li	licenseNode = parser.gordfParserObj.Triples[0].Subject
305*ba677afaSXin Li	_, err = parser.getDisjunctiveLicenseSetFromNode(licenseNode)
306*ba677afaSXin Li	if err == nil {
307*ba677afaSXin Li		t.Errorf("expected an error saying invalid predicate found")
308*ba677afaSXin Li	}
309*ba677afaSXin Li
310*ba677afaSXin Li	// TestCase 3: valid example.
311*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
312*ba677afaSXin Li		<spdx:DisjunctiveLicenseSet>
313*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/Nokia"/>
314*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/LGPL-2.0"/>
315*ba677afaSXin Li		</spdx:DisjunctiveLicenseSet>
316*ba677afaSXin Li	`)
317*ba677afaSXin Li	licenseNode = parser.gordfParserObj.Triples[0].Subject
318*ba677afaSXin Li	license, err = parser.getDisjunctiveLicenseSetFromNode(licenseNode)
319*ba677afaSXin Li	if err != nil {
320*ba677afaSXin Li		t.Errorf("unexpected error parsing licenseSet: %v", err)
321*ba677afaSXin Li	}
322*ba677afaSXin Li	nMembers := len(license.members)
323*ba677afaSXin Li	if nMembers != 2 {
324*ba677afaSXin Li		t.Errorf("expected licenseSet to have 2 members, found %d", nMembers)
325*ba677afaSXin Li	}
326*ba677afaSXin Li	licenseMembers := mapLicensesToStrings(license.members)
327*ba677afaSXin Li	expectedLicenseMembers := []string{"LGPL-2.0", "Nokia"}
328*ba677afaSXin Li	sort.Strings(licenseMembers)
329*ba677afaSXin Li	if !reflect.DeepEqual(licenseMembers, expectedLicenseMembers) {
330*ba677afaSXin Li		t.Errorf("expected %v, found %v", expectedLicenseMembers, licenseMembers)
331*ba677afaSXin Li	}
332*ba677afaSXin Li}
333*ba677afaSXin Li
334*ba677afaSXin Lifunc Test_rdfParser2_3_getLicenseExceptionFromNode(t *testing.T) {
335*ba677afaSXin Li	var licenseException LicenseException
336*ba677afaSXin Li	var err error
337*ba677afaSXin Li	var node *gordfParser.Node
338*ba677afaSXin Li	var parser *rdfParser2_3
339*ba677afaSXin Li
340*ba677afaSXin Li	// TestCase 1: invalid value for rdf:seeAlso
341*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
342*ba677afaSXin Li		<spdx:LicenseException>
343*ba677afaSXin Li			<rdfs:seeAlso>see-also</rdfs:seeAlso>
344*ba677afaSXin Li			<spdx:example></spdx:example>
345*ba677afaSXin Li			<spdx:licenseExceptionId>Libtool-exception</spdx:licenseExceptionId>
346*ba677afaSXin Li			<rdfs:comment></rdfs:comment>
347*ba677afaSXin Li		</spdx:LicenseException>
348*ba677afaSXin Li	`)
349*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
350*ba677afaSXin Li	_, err = parser.getLicenseExceptionFromNode(node)
351*ba677afaSXin Li	if err == nil {
352*ba677afaSXin Li		t.Errorf("should've raised an error due to invalid uri for rdfs:seeAlso")
353*ba677afaSXin Li	}
354*ba677afaSXin Li
355*ba677afaSXin Li	// TestCase 2: invalid predicate for licenseException
356*ba677afaSXin Li	// TestCase 1: invalid value for rdf:seeAlso
357*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
358*ba677afaSXin Li		<spdx:LicenseException>
359*ba677afaSXin Li			<spdx:example></spdx:example>
360*ba677afaSXin Li			<spdx:licenseExceptionId>Libtool-exception</spdx:licenseExceptionId>
361*ba677afaSXin Li			<rdfs:unknown></rdfs:unknown>
362*ba677afaSXin Li		</spdx:LicenseException>
363*ba677afaSXin Li	`)
364*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
365*ba677afaSXin Li	_, err = parser.getLicenseExceptionFromNode(node)
366*ba677afaSXin Li	if err == nil {
367*ba677afaSXin Li		t.Errorf("should've raised an error due to invalid predicate")
368*ba677afaSXin Li	}
369*ba677afaSXin Li
370*ba677afaSXin Li	// TestCase 3: everything valid
371*ba677afaSXin Li	// TestCase 1: invalid value for rdf:seeAlso
372*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
373*ba677afaSXin Li		<spdx:LicenseException>
374*ba677afaSXin Li			<rdfs:seeAlso rdf:resource="http://www.opensource.org/licenses/GPL-3.0"/>
375*ba677afaSXin Li			<spdx:example>no example</spdx:example>
376*ba677afaSXin Li			<spdx:licenseExceptionId>Libtool-exception</spdx:licenseExceptionId>
377*ba677afaSXin Li			<rdfs:comment>no comments</rdfs:comment>
378*ba677afaSXin Li			<spdx:licenseExceptionText>text</spdx:licenseExceptionText>
379*ba677afaSXin Li			<spdx:name>name</spdx:name>
380*ba677afaSXin Li		</spdx:LicenseException>
381*ba677afaSXin Li	`)
382*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
383*ba677afaSXin Li	licenseException, err = parser.getLicenseExceptionFromNode(node)
384*ba677afaSXin Li	if err != nil {
385*ba677afaSXin Li		t.Fatalf("unexpected error while parsing a valid licenseException")
386*ba677afaSXin Li	}
387*ba677afaSXin Li	expectedCrossReference := "http://www.opensource.org/licenses/GPL-3.0"
388*ba677afaSXin Li	if licenseException.seeAlso != expectedCrossReference {
389*ba677afaSXin Li		t.Errorf("expected: %s, found: %s", expectedCrossReference, licenseException.seeAlso)
390*ba677afaSXin Li	}
391*ba677afaSXin Li	expectedExample := "no example"
392*ba677afaSXin Li	if licenseException.example != expectedExample {
393*ba677afaSXin Li		t.Errorf("expected: %s, got: %s", expectedExample, licenseException.example)
394*ba677afaSXin Li	}
395*ba677afaSXin Li	if licenseException.licenseExceptionId != "Libtool-exception" {
396*ba677afaSXin Li		t.Errorf("expected: %s, got: %s", "Libtool-exception", licenseException.licenseExceptionId)
397*ba677afaSXin Li	}
398*ba677afaSXin Li	if licenseException.comment != "no comments" {
399*ba677afaSXin Li		t.Errorf("expected: %s, got: %s", "no comments", licenseException.comment)
400*ba677afaSXin Li	}
401*ba677afaSXin Li	if licenseException.licenseExceptionText != "text" {
402*ba677afaSXin Li		t.Errorf("expected: '%s', got: '%s'", "text", licenseException.licenseExceptionText)
403*ba677afaSXin Li	}
404*ba677afaSXin Li	if licenseException.name != "name" {
405*ba677afaSXin Li		t.Errorf("expected: '%s', got: '%s'", "name", licenseException.name)
406*ba677afaSXin Li	}
407*ba677afaSXin Li}
408*ba677afaSXin Li
409*ba677afaSXin Lifunc Test_rdfParser2_3_getLicenseFromNode(t *testing.T) {
410*ba677afaSXin Li	var parser *rdfParser2_3
411*ba677afaSXin Li	var node *gordfParser.Node
412*ba677afaSXin Li	var license License
413*ba677afaSXin Li	var err error
414*ba677afaSXin Li
415*ba677afaSXin Li	// TestCase 1: isOsiApproved is not a valid boolean
416*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
417*ba677afaSXin Li		<spdx:License>
418*ba677afaSXin Li			<spdx:isOsiApproved>no</spdx:isOsiApproved>
419*ba677afaSXin Li		</spdx:License>
420*ba677afaSXin Li	`)
421*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
422*ba677afaSXin Li	license, err = parser.getLicenseFromNode(node)
423*ba677afaSXin Li	if err == nil {
424*ba677afaSXin Li		t.Errorf("expected function to raise an error stating isOsiApproved should be a valid boolean type")
425*ba677afaSXin Li	}
426*ba677afaSXin Li
427*ba677afaSXin Li	// TestCase 2: rdf:seeAlso not a valid uri must raise an error
428*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
429*ba677afaSXin Li		<spdx:License>
430*ba677afaSXin Li			<rdfs:seeAlso>uri</rdfs:seeAlso>
431*ba677afaSXin Li		</spdx:License>
432*ba677afaSXin Li	`)
433*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
434*ba677afaSXin Li	license, err = parser.getLicenseFromNode(node)
435*ba677afaSXin Li	if err == nil {
436*ba677afaSXin Li		t.Errorf("expected function to raise an error stating invalid uri for rdfs:seeAlso")
437*ba677afaSXin Li	}
438*ba677afaSXin Li
439*ba677afaSXin Li	// TestCase 3: isDeprecatedLicenseId is not a valid boolean
440*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
441*ba677afaSXin Li		<spdx:License>
442*ba677afaSXin Li			<spdx:isDeprecatedLicenseId>yes</spdx:isDeprecatedLicenseId>
443*ba677afaSXin Li		</spdx:License>
444*ba677afaSXin Li	`)
445*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
446*ba677afaSXin Li	license, err = parser.getLicenseFromNode(node)
447*ba677afaSXin Li	if err == nil {
448*ba677afaSXin Li		t.Errorf("expected function to raise an error stating isDeprecatedLicenseId should be a valid boolean type")
449*ba677afaSXin Li	}
450*ba677afaSXin Li
451*ba677afaSXin Li	// TestCase 4: isFsfLibre is not a valid boolean
452*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
453*ba677afaSXin Li		<spdx:License>
454*ba677afaSXin Li			<spdx:isFsfLibre>no</spdx:isFsfLibre>
455*ba677afaSXin Li		</spdx:License>
456*ba677afaSXin Li	`)
457*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
458*ba677afaSXin Li	license, err = parser.getLicenseFromNode(node)
459*ba677afaSXin Li	if err == nil {
460*ba677afaSXin Li		t.Errorf("expected function to raise an error stating isFsfLibre should be a valid boolean type")
461*ba677afaSXin Li	}
462*ba677afaSXin Li
463*ba677afaSXin Li	// TestCase 5: invalid triple for License:
464*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
465*ba677afaSXin Li		<spdx:License>
466*ba677afaSXin Li			<spdx:unknown />
467*ba677afaSXin Li		</spdx:License>
468*ba677afaSXin Li	`)
469*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
470*ba677afaSXin Li	license, err = parser.getLicenseFromNode(node)
471*ba677afaSXin Li	if err == nil {
472*ba677afaSXin Li		t.Errorf("invalid predicate should've raised an error, got <nil>")
473*ba677afaSXin Li	}
474*ba677afaSXin Li
475*ba677afaSXin Li	// TestCase 5: everything valid:
476*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
477*ba677afaSXin Li		<spdx:License rdf:about="http://spdx.org/licenses/GPL-3.0-or-later">
478*ba677afaSXin Li			<rdfs:seeAlso>http://www.opensource.org/licenses/GPL-3.0</rdfs:seeAlso>
479*ba677afaSXin Li			<spdx:isOsiApproved>true</spdx:isOsiApproved>
480*ba677afaSXin Li			<spdx:licenseText>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</spdx:licenseText>
481*ba677afaSXin Li			<spdx:name>GNU General Public License v3.0 or later</spdx:name>
482*ba677afaSXin Li			<spdx:standardLicenseHeaderTemplate>...</spdx:standardLicenseHeaderTemplate>
483*ba677afaSXin Li			<spdx:licenseId>GPL-3.0-or-later</spdx:licenseId>
484*ba677afaSXin Li			<rdfs:comment>This license was released: 29 June 2007</rdfs:comment>
485*ba677afaSXin Li			<spdx:isFsfLibre>true</spdx:isFsfLibre>
486*ba677afaSXin Li			<spdx:standardLicenseHeader>...</spdx:standardLicenseHeader>
487*ba677afaSXin Li			<spdx:standardLicenseTemplate>....</spdx:standardLicenseTemplate>
488*ba677afaSXin Li		</spdx:License>
489*ba677afaSXin Li	`)
490*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
491*ba677afaSXin Li	license, err = parser.getLicenseFromNode(node)
492*ba677afaSXin Li	if err != nil {
493*ba677afaSXin Li		t.Errorf("error parsing a valid input: %v", err)
494*ba677afaSXin Li	}
495*ba677afaSXin Li	expectedSeeAlso := "http://www.opensource.org/licenses/GPL-3.0"
496*ba677afaSXin Li	if len(license.seeAlso) != 1 {
497*ba677afaSXin Li		t.Fatalf("expected seeAlso to have 1 element, got %d", len(license.seeAlso))
498*ba677afaSXin Li	}
499*ba677afaSXin Li	if license.seeAlso[len(license.seeAlso)-1] != expectedSeeAlso {
500*ba677afaSXin Li		t.Errorf("expected %s, got %s", expectedSeeAlso, license.seeAlso)
501*ba677afaSXin Li	}
502*ba677afaSXin Li	if license.isOsiApproved != true {
503*ba677afaSXin Li		t.Errorf("expected %t, got %t", true, license.isOsiApproved)
504*ba677afaSXin Li	}
505*ba677afaSXin Li	expectedLicenseText := "GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007"
506*ba677afaSXin Li	if license.licenseText != expectedLicenseText {
507*ba677afaSXin Li		t.Errorf("expected %s, got %s", expectedSeeAlso, license.licenseText)
508*ba677afaSXin Li	}
509*ba677afaSXin Li	expectedName := "GNU General Public License v3.0 or later"
510*ba677afaSXin Li	if license.name != expectedName {
511*ba677afaSXin Li		t.Errorf("expected %s, got %s", expectedName, license.name)
512*ba677afaSXin Li	}
513*ba677afaSXin Li	expectedstdLicHeader := "..."
514*ba677afaSXin Li	if license.standardLicenseHeader != expectedstdLicHeader {
515*ba677afaSXin Li		t.Errorf("expected %s, got %s", expectedstdLicHeader, license.standardLicenseHeader)
516*ba677afaSXin Li	}
517*ba677afaSXin Li	expectedLicenseId := "GPL-3.0-or-later"
518*ba677afaSXin Li	if expectedLicenseId != license.licenseID {
519*ba677afaSXin Li		t.Errorf("expected %s, got %s", expectedLicenseId, license.licenseID)
520*ba677afaSXin Li	}
521*ba677afaSXin Li	expectedLicenseComment := "This license was released: 29 June 2007"
522*ba677afaSXin Li	if expectedLicenseComment != license.comment {
523*ba677afaSXin Li		t.Errorf("expected %s, got %s", expectedLicenseComment, license.comment)
524*ba677afaSXin Li	}
525*ba677afaSXin Li	expectedstdLicTemplate := "..."
526*ba677afaSXin Li	if license.standardLicenseHeader != expectedstdLicTemplate {
527*ba677afaSXin Li		t.Errorf("expected %s, got %s", expectedstdLicTemplate, license.standardLicenseTemplate)
528*ba677afaSXin Li	}
529*ba677afaSXin Li	expectedstdLicHeaderTemplate := "..."
530*ba677afaSXin Li	if license.standardLicenseHeaderTemplate != expectedstdLicHeaderTemplate {
531*ba677afaSXin Li		t.Errorf("expected %s, got %s", expectedstdLicHeaderTemplate, license.standardLicenseHeaderTemplate)
532*ba677afaSXin Li	}
533*ba677afaSXin Li	if license.isFsfLibre != true {
534*ba677afaSXin Li		t.Errorf("expected %t, got %t", true, license.isFsfLibre)
535*ba677afaSXin Li	}
536*ba677afaSXin Li}
537*ba677afaSXin Li
538*ba677afaSXin Lifunc Test_rdfParser2_3_getOrLaterOperatorFromNode(t *testing.T) {
539*ba677afaSXin Li	var parser *rdfParser2_3
540*ba677afaSXin Li	var node *gordfParser.Node
541*ba677afaSXin Li	var err error
542*ba677afaSXin Li
543*ba677afaSXin Li	// TestCase 1: more than one member in the OrLaterOperator tag must raise an error
544*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
545*ba677afaSXin Li		<spdx:OrLaterOperator>
546*ba677afaSXin Li			<spdx:member>
547*ba677afaSXin Li				<spdx:SimpleLicensingInfo>
548*ba677afaSXin Li					<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
549*ba677afaSXin Li					<spdx:name>freeware</spdx:name>
550*ba677afaSXin Li				</spdx:SimpleLicensingInfo>
551*ba677afaSXin Li			</spdx:member>
552*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/Nokia"/>
553*ba677afaSXin Li		</spdx:OrLaterOperator>
554*ba677afaSXin Li	`)
555*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
556*ba677afaSXin Li	_, err = parser.getOrLaterOperatorFromNode(node)
557*ba677afaSXin Li	if err == nil {
558*ba677afaSXin Li		t.Error("expected an error due to more than one members, got <nil>")
559*ba677afaSXin Li	}
560*ba677afaSXin Li
561*ba677afaSXin Li	// TestCase 2: Invalid predicate must raise an error
562*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
563*ba677afaSXin Li		<spdx:OrLaterOperator>
564*ba677afaSXin Li			<spdx:members>
565*ba677afaSXin Li				<spdx:SimpleLicensingInfo>
566*ba677afaSXin Li					<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
567*ba677afaSXin Li					<spdx:name>freeware</spdx:name>
568*ba677afaSXin Li				</spdx:SimpleLicensingInfo>
569*ba677afaSXin Li			</spdx:members>
570*ba677afaSXin Li		</spdx:OrLaterOperator>
571*ba677afaSXin Li	`)
572*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
573*ba677afaSXin Li	_, err = parser.getOrLaterOperatorFromNode(node)
574*ba677afaSXin Li	if err == nil {
575*ba677afaSXin Li		t.Error("expected an error due to invalid predicate, got <nil>")
576*ba677afaSXin Li	}
577*ba677afaSXin Li
578*ba677afaSXin Li	// TestCase 5: invalid member
579*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
580*ba677afaSXin Li		<spdx:OrLaterOperator>
581*ba677afaSXin Li			<spdx:member>
582*ba677afaSXin Li				<spdx:SimpleLicensingInfo>
583*ba677afaSXin Li					<spdx:invalidTag />
584*ba677afaSXin Li					<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
585*ba677afaSXin Li					<spdx:name>freeware</spdx:name>
586*ba677afaSXin Li				</spdx:SimpleLicensingInfo>
587*ba677afaSXin Li			</spdx:member>
588*ba677afaSXin Li		</spdx:OrLaterOperator>
589*ba677afaSXin Li	`)
590*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
591*ba677afaSXin Li	_, err = parser.getOrLaterOperatorFromNode(node)
592*ba677afaSXin Li	if err == nil {
593*ba677afaSXin Li		t.Errorf("expected an error parsing invalid license member, got %v", err)
594*ba677afaSXin Li	}
595*ba677afaSXin Li
596*ba677afaSXin Li	// TestCase 4: valid input
597*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
598*ba677afaSXin Li		<spdx:OrLaterOperator>
599*ba677afaSXin Li			<spdx:member>
600*ba677afaSXin Li				<spdx:SimpleLicensingInfo>
601*ba677afaSXin Li					<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
602*ba677afaSXin Li					<spdx:name>freeware</spdx:name>
603*ba677afaSXin Li				</spdx:SimpleLicensingInfo>
604*ba677afaSXin Li			</spdx:member>
605*ba677afaSXin Li		</spdx:OrLaterOperator>
606*ba677afaSXin Li	`)
607*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
608*ba677afaSXin Li	_, err = parser.getOrLaterOperatorFromNode(node)
609*ba677afaSXin Li	if err != nil {
610*ba677afaSXin Li		t.Errorf("unexpected error parsing a valid input: %v", err)
611*ba677afaSXin Li	}
612*ba677afaSXin Li}
613*ba677afaSXin Li
614*ba677afaSXin Lifunc Test_rdfParser2_3_getSimpleLicensingInfoFromNode(t *testing.T) {
615*ba677afaSXin Li	// nothing to test. The just provides an interface to call function that
616*ba677afaSXin Li	// uses triples to render a SimpleLicensingInfo.
617*ba677afaSXin Li	parser, _ := parserFromBodyContent(`
618*ba677afaSXin Li		<spdx:SimpleLicensingInfo>
619*ba677afaSXin Li			<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
620*ba677afaSXin Li			<spdx:name>freeware</spdx:name>
621*ba677afaSXin Li		</spdx:SimpleLicensingInfo>
622*ba677afaSXin Li	`)
623*ba677afaSXin Li	node := parser.gordfParserObj.Triples[0].Subject
624*ba677afaSXin Li	_, err := parser.getSimpleLicensingInfoFromNode(node)
625*ba677afaSXin Li	if err != nil {
626*ba677afaSXin Li		t.Errorf("error parsing a valid input: %v", err)
627*ba677afaSXin Li	}
628*ba677afaSXin Li}
629*ba677afaSXin Li
630*ba677afaSXin Lifunc Test_rdfParser2_3_getSimpleLicensingInfoFromTriples(t *testing.T) {
631*ba677afaSXin Li	var parser *rdfParser2_3
632*ba677afaSXin Li	var err error
633*ba677afaSXin Li	var license SimpleLicensingInfo
634*ba677afaSXin Li
635*ba677afaSXin Li	// TestCase 1: invalid rdf:seeAlso attribute
636*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
637*ba677afaSXin Li		<spdx:SimpleLicensingInfo>
638*ba677afaSXin Li			<rdfs:seeAlso>an invalid uri</rdfs:seeAlso>
639*ba677afaSXin Li		</spdx:SimpleLicensingInfo>
640*ba677afaSXin Li    `)
641*ba677afaSXin Li	_, err = parser.getSimpleLicensingInfoFromTriples(parser.gordfParserObj.Triples)
642*ba677afaSXin Li	if err == nil {
643*ba677afaSXin Li		t.Error("expected an error reporting invalid uri for rdf:seeAlso, got <nil>")
644*ba677afaSXin Li	}
645*ba677afaSXin Li
646*ba677afaSXin Li	// TestCase 2: invalid predicate must raise an error
647*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
648*ba677afaSXin Li		<spdx:SimpleLicensingInfo>
649*ba677afaSXin Li			<rdfs:invalidPredicate />
650*ba677afaSXin Li		</spdx:SimpleLicensingInfo>
651*ba677afaSXin Li    `)
652*ba677afaSXin Li	_, err = parser.getSimpleLicensingInfoFromTriples(parser.gordfParserObj.Triples)
653*ba677afaSXin Li	if err == nil {
654*ba677afaSXin Li		t.Error("expected an error reporting invalid predicate, got <nil>")
655*ba677afaSXin Li	}
656*ba677afaSXin Li
657*ba677afaSXin Li	// TestCase 3: valid example
658*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
659*ba677afaSXin Li		<spdx:SimpleLicensingInfo>
660*ba677afaSXin Li			<rdfs:comment>comment</rdfs:comment>
661*ba677afaSXin Li			<spdx:licenseId>lid</spdx:licenseId>
662*ba677afaSXin Li			<spdx:name>name</spdx:name>
663*ba677afaSXin Li			<rdfs:seeAlso>https://opensource.org/licenses/MPL-1.0</rdfs:seeAlso>
664*ba677afaSXin Li			<spdx:example>example</spdx:example>
665*ba677afaSXin Li		</spdx:SimpleLicensingInfo>
666*ba677afaSXin Li    `)
667*ba677afaSXin Li	license, err = parser.getSimpleLicensingInfoFromTriples(parser.gordfParserObj.Triples)
668*ba677afaSXin Li	if err != nil {
669*ba677afaSXin Li		t.Fatalf("unexpected error: %v", err)
670*ba677afaSXin Li	}
671*ba677afaSXin Li	expectedComment := "comment"
672*ba677afaSXin Li	expectedLicenseId := "lid"
673*ba677afaSXin Li	expectedName := "name"
674*ba677afaSXin Li	expectedSeeAlso := "https://opensource.org/licenses/MPL-1.0"
675*ba677afaSXin Li	expectedExample := "example"
676*ba677afaSXin Li	if expectedComment != license.comment {
677*ba677afaSXin Li		t.Errorf("expected %v, got %v", expectedComment, license.comment)
678*ba677afaSXin Li	}
679*ba677afaSXin Li	if expectedLicenseId != license.licenseID {
680*ba677afaSXin Li		t.Errorf("expected %v, got %v", expectedLicenseId, license.licenseID)
681*ba677afaSXin Li	}
682*ba677afaSXin Li	if expectedName != license.name {
683*ba677afaSXin Li		t.Errorf("expected %v, got %v", expectedName, license.name)
684*ba677afaSXin Li	}
685*ba677afaSXin Li	if len(license.seeAlso) != 1 {
686*ba677afaSXin Li		t.Fatalf("expected seeAlso to have 1 element, found %d", len(license.seeAlso))
687*ba677afaSXin Li	}
688*ba677afaSXin Li	if license.seeAlso[0] != expectedSeeAlso {
689*ba677afaSXin Li		t.Errorf("expected %v, got %v", expectedSeeAlso, license.seeAlso[0])
690*ba677afaSXin Li	}
691*ba677afaSXin Li	if license.example != expectedExample {
692*ba677afaSXin Li		t.Errorf("expected %v, got %v", expectedExample, license.example)
693*ba677afaSXin Li	}
694*ba677afaSXin Li}
695*ba677afaSXin Li
696*ba677afaSXin Lifunc Test_rdfParser2_3_getSpecialLicenseFromNode(t *testing.T) {
697*ba677afaSXin Li	var parser *rdfParser2_3
698*ba677afaSXin Li	var node *gordfParser.Node
699*ba677afaSXin Li	var license SpecialLicense
700*ba677afaSXin Li
701*ba677afaSXin Li	// TestCase 1: NONE
702*ba677afaSXin Li	parser, _ = parserFromBodyContent(``)
703*ba677afaSXin Li	node = &gordfParser.Node{
704*ba677afaSXin Li		NodeType: gordfParser.IRI,
705*ba677afaSXin Li		ID:       NS_SPDX + "NONE",
706*ba677afaSXin Li	}
707*ba677afaSXin Li	license, err := parser.getSpecialLicenseFromNode(node)
708*ba677afaSXin Li	if err != nil {
709*ba677afaSXin Li		t.Errorf("error parsing a valid node: %v", err)
710*ba677afaSXin Li	}
711*ba677afaSXin Li	if license.value != "NONE" {
712*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NONE", license.value)
713*ba677afaSXin Li	}
714*ba677afaSXin Li
715*ba677afaSXin Li	// TestCase 2: NOASSERTION
716*ba677afaSXin Li	parser, _ = parserFromBodyContent(``)
717*ba677afaSXin Li	node = &gordfParser.Node{
718*ba677afaSXin Li		NodeType: gordfParser.IRI,
719*ba677afaSXin Li		ID:       NS_SPDX + "NOASSERTION",
720*ba677afaSXin Li	}
721*ba677afaSXin Li	license, err = parser.getSpecialLicenseFromNode(node)
722*ba677afaSXin Li	if err != nil {
723*ba677afaSXin Li		t.Errorf("error parsing a valid node: %v", err)
724*ba677afaSXin Li	}
725*ba677afaSXin Li	if license.value != "NOASSERTION" {
726*ba677afaSXin Li		t.Errorf("expected %s, got %s", "NOASSERTION", license.value)
727*ba677afaSXin Li	}
728*ba677afaSXin Li
729*ba677afaSXin Li	// TestCase 4: undefined standard license
730*ba677afaSXin Li	parser, _ = parserFromBodyContent(``)
731*ba677afaSXin Li	node = &gordfParser.Node{
732*ba677afaSXin Li		NodeType: gordfParser.IRI,
733*ba677afaSXin Li		ID:       "https://opensource.org/licenses/unknown",
734*ba677afaSXin Li	}
735*ba677afaSXin Li	_, err = parser.getSpecialLicenseFromNode(node)
736*ba677afaSXin Li	if err == nil {
737*ba677afaSXin Li		t.Errorf("expected an error saying invalid license")
738*ba677afaSXin Li	}
739*ba677afaSXin Li
740*ba677afaSXin Li	// TestCase 4: valid standard license
741*ba677afaSXin Li	parser, _ = parserFromBodyContent(``)
742*ba677afaSXin Li	node = &gordfParser.Node{
743*ba677afaSXin Li		NodeType: gordfParser.IRI,
744*ba677afaSXin Li		ID:       "https://opensource.org/licenses/MPL-1.0",
745*ba677afaSXin Li	}
746*ba677afaSXin Li	license, err = parser.getSpecialLicenseFromNode(node)
747*ba677afaSXin Li	if err != nil {
748*ba677afaSXin Li		t.Errorf("error parsing a valid node: %v", err)
749*ba677afaSXin Li	}
750*ba677afaSXin Li	if license.value != "MPL-1.0" {
751*ba677afaSXin Li		t.Errorf("expected %s, got %s", "MPL-1.0", license.value)
752*ba677afaSXin Li	}
753*ba677afaSXin Li}
754*ba677afaSXin Li
755*ba677afaSXin Lifunc Test_rdfParser2_3_getWithExceptionOperatorFromNode(t *testing.T) {
756*ba677afaSXin Li	var parser *rdfParser2_3
757*ba677afaSXin Li	var node *gordfParser.Node
758*ba677afaSXin Li	var err error
759*ba677afaSXin Li
760*ba677afaSXin Li	// TestCase 1: more than one member in the OrLaterOperator tag must raise an error
761*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
762*ba677afaSXin Li		<spdx:WithExceptionOperator>
763*ba677afaSXin Li			<spdx:member>
764*ba677afaSXin Li				<spdx:SimpleLicensingInfo>
765*ba677afaSXin Li					<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
766*ba677afaSXin Li					<spdx:name>freeware</spdx:name>
767*ba677afaSXin Li				</spdx:SimpleLicensingInfo>
768*ba677afaSXin Li			</spdx:member>
769*ba677afaSXin Li			<spdx:member rdf:resource="http://spdx.org/licenses/Nokia"/>
770*ba677afaSXin Li		</spdx:WithExceptionOperator>
771*ba677afaSXin Li	`)
772*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
773*ba677afaSXin Li	_, err = parser.getWithExceptionOperatorFromNode(node)
774*ba677afaSXin Li	if err == nil {
775*ba677afaSXin Li		t.Error("expected an error due to more than one members, got <nil>")
776*ba677afaSXin Li	}
777*ba677afaSXin Li
778*ba677afaSXin Li	// TestCase 2: Invalid predicate must raise an error
779*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
780*ba677afaSXin Li		<spdx:WithExceptionOperator>
781*ba677afaSXin Li			<spdx:members>
782*ba677afaSXin Li				<spdx:SimpleLicensingInfo>
783*ba677afaSXin Li					<spdx:licenseId>LicenseRef-Freeware</spdx:licenseId>
784*ba677afaSXin Li					<spdx:name>freeware</spdx:name>
785*ba677afaSXin Li				</spdx:SimpleLicensingInfo>
786*ba677afaSXin Li			</spdx:members>
787*ba677afaSXin Li		</spdx:WithExceptionOperator>
788*ba677afaSXin Li	`)
789*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
790*ba677afaSXin Li	_, err = parser.getWithExceptionOperatorFromNode(node)
791*ba677afaSXin Li	if err == nil {
792*ba677afaSXin Li		t.Error("expected an error due to invalid predicate, got <nil>")
793*ba677afaSXin Li	}
794*ba677afaSXin Li
795*ba677afaSXin Li	// TestCase 3: Invalid member
796*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
797*ba677afaSXin Li		<spdx:WithExceptionOperator>
798*ba677afaSXin Li			<spdx:member>
799*ba677afaSXin Li				<spdx:License rdf:about="http://spdx.org/licenses/GPL-2.0-or-later">
800*ba677afaSXin Li					<spdx:unknownTag />
801*ba677afaSXin Li				</spdx:License>
802*ba677afaSXin Li			</spdx:member>
803*ba677afaSXin Li		</spdx:WithExceptionOperator>
804*ba677afaSXin Li	`)
805*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
806*ba677afaSXin Li	_, err = parser.getWithExceptionOperatorFromNode(node)
807*ba677afaSXin Li	if err == nil {
808*ba677afaSXin Li		t.Error("expected an error due to error parsing a member, got <nil>")
809*ba677afaSXin Li	}
810*ba677afaSXin Li
811*ba677afaSXin Li	// TestCase 4: Invalid licenseException
812*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
813*ba677afaSXin Li		<spdx:WithExceptionOperator>
814*ba677afaSXin Li			<spdx:member>
815*ba677afaSXin Li				<spdx:License rdf:about="http://spdx.org/licenses/GPL-2.0-or-later"/>
816*ba677afaSXin Li			</spdx:member>
817*ba677afaSXin Li			<spdx:licenseException>
818*ba677afaSXin Li				<spdx:LicenseException>
819*ba677afaSXin Li					<spdx:invalidTag />
820*ba677afaSXin Li					<spdx:example>example</spdx:example>
821*ba677afaSXin Li					<spdx:licenseExceptionId>Libtool-exception</spdx:licenseExceptionId>
822*ba677afaSXin Li					<rdfs:comment>comment</rdfs:comment>
823*ba677afaSXin Li				</spdx:LicenseException>
824*ba677afaSXin Li			</spdx:licenseException>
825*ba677afaSXin Li		</spdx:WithExceptionOperator>
826*ba677afaSXin Li	`)
827*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
828*ba677afaSXin Li	_, err = parser.getWithExceptionOperatorFromNode(node)
829*ba677afaSXin Li	if err == nil {
830*ba677afaSXin Li		t.Error("expected an error due to invalid licenseException, got <nil>")
831*ba677afaSXin Li	}
832*ba677afaSXin Li
833*ba677afaSXin Li	// TestCase 5: valid input
834*ba677afaSXin Li	parser, _ = parserFromBodyContent(`
835*ba677afaSXin Li		<spdx:WithExceptionOperator>
836*ba677afaSXin Li			<spdx:member>
837*ba677afaSXin Li				<spdx:License rdf:about="http://spdx.org/licenses/GPL-2.0-or-later"/>
838*ba677afaSXin Li			</spdx:member>
839*ba677afaSXin Li			<spdx:licenseException>
840*ba677afaSXin Li				<spdx:LicenseException>
841*ba677afaSXin Li					<spdx:example>example</spdx:example>
842*ba677afaSXin Li					<spdx:licenseExceptionId>Libtool-exception</spdx:licenseExceptionId>
843*ba677afaSXin Li					<rdfs:comment>comment</rdfs:comment>
844*ba677afaSXin Li				</spdx:LicenseException>
845*ba677afaSXin Li			</spdx:licenseException>
846*ba677afaSXin Li		</spdx:WithExceptionOperator>
847*ba677afaSXin Li	`)
848*ba677afaSXin Li	node = parser.gordfParserObj.Triples[0].Subject
849*ba677afaSXin Li	_, err = parser.getWithExceptionOperatorFromNode(node)
850*ba677afaSXin Li	if err != nil {
851*ba677afaSXin Li		t.Errorf("error parsing a valid input: %v", err)
852*ba677afaSXin Li	}
853*ba677afaSXin Li}
854