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><> Apache License Version 2.0, January 2004 http://www.apache.org/licenses/<><> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION<> <> 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. <> 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. <> 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. <> 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: <> You must give any other recipients of the Work or Derivative Works a copy of this License; and <> You must cause any modified files to carry prominent notices stating that You changed the files; and <> 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 <> 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. <> 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. <> 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. <> 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. <> 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. <> 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.<> 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 <> 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.<></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