1
2# Copyright (c) 2014 Ahmed H. Ismail
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#     http://www.apache.org/licenses/LICENSE-2.0
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS,
9# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10# See the License for the specific language governing permissions and
11# limitations under the License.
12
13from __future__ import absolute_import
14from __future__ import print_function
15from __future__ import unicode_literals
16
17import codecs
18import os
19import tempfile
20from unittest import TestCase
21
22from spdx.parsers.rdf import Parser as RDFParser
23from spdx.parsers.rdfbuilders import Builder as RDFBuilder
24from spdx.parsers.loggers import StandardLogger
25from spdx.parsers.tagvalue import Parser as TVParser
26from spdx.parsers.tagvaluebuilders import Builder as TVBuilder
27from spdx.parsers.jsonparser import Parser as JSONParser
28from spdx.parsers.yamlparser import Parser as YAMLParser
29from spdx.parsers.xmlparser import Parser as XMLParser
30from spdx.parsers.jsonyamlxmlbuilders import Builder as JSONYAMLXMLBuilder
31import spdx.writers.rdf as rdfwriter
32import spdx.writers.tagvalue as tvwriter
33import spdx.writers.json as jsonwriter
34import spdx.writers.yaml as yamlwriter
35import spdx.writers.xml as xmlwriter
36
37from tests import utils_test
38
39
40def get_temp_file(extension=''):
41    """
42    Return a unique new temporary file location to a non-existing
43    temporary file that can safely be created without a risk of name
44    collision.
45    """
46
47    if extension and not extension.startswith('.'):
48            extension = '.' + extension
49    file_name = 'temp_file' + extension
50    temp_dir = tempfile.mkdtemp()
51    return os.path.join(temp_dir, file_name)
52
53
54class TestConversions(TestCase):
55    maxDiff = None
56
57    def parse_rdf_file(self, file_name):
58        with open(file_name, mode='rb') as infile:
59            rdfparser = RDFParser(RDFBuilder(), StandardLogger())
60            doc, error = rdfparser.parse(infile)
61        assert not error
62        assert doc.validate([]) == []
63        return doc
64
65    def parse_tagvalue_file(self, file_name):
66        with open(file_name, mode='r') as infile:
67            tvparser = TVParser(TVBuilder(), StandardLogger())
68            tvparser.build()
69            doc, error = tvparser.parse(infile.read())
70        assert not error
71        assert doc.validate([]) == []
72        return doc
73
74    def parse_json_file(self, file_name):
75        with open(file_name, mode='r') as infile:
76            jsonparser = JSONParser(JSONYAMLXMLBuilder(), StandardLogger())
77            doc, error = jsonparser.parse(infile)
78        assert not error
79        assert doc.validate([]) == []
80        return doc
81
82    def parse_yaml_file(self, file_name):
83        with open(file_name, mode='r') as infile:
84            yamlparser = YAMLParser(JSONYAMLXMLBuilder(), StandardLogger())
85            doc, error = yamlparser.parse(infile)
86        assert not error
87        assert doc.validate([]) == []
88        return doc
89
90    def parse_xml_file(self, file_name):
91        with open(file_name, mode='r') as infile:
92            xmlparser = XMLParser(JSONYAMLXMLBuilder(), StandardLogger())
93            doc, error = xmlparser.parse(infile)
94        assert not error
95        assert doc.validate([]) == []
96        return doc
97
98    def write_tagvalue_file(self, document, file_name):
99        with codecs.open(file_name, mode='w', encoding='utf-8') as out:
100            tvwriter.write_document(document, out)
101
102    def write_rdf_file(self, document, file_name):
103        with open(file_name, mode='wb') as out:
104            rdfwriter.write_document(document, out)
105
106    def write_json_file(self, document, file_name):
107        with open(file_name, mode='w') as out:
108            jsonwriter.write_document(document, out)
109
110    def write_yaml_file(self, document, file_name):
111        with open(file_name, mode='w') as out:
112            yamlwriter.write_document(document, out)
113
114    def write_xml_file(self, document, file_name):
115        with open(file_name, mode='w') as out:
116            xmlwriter.write_document(document, out)
117
118    def test_tagvalue_rdf(self):
119        doc = self.parse_tagvalue_file(utils_test.get_test_loc('formats/SPDXTagExample.tag'))
120        filename = get_temp_file('.rdf')
121        self.write_rdf_file(doc, filename)
122        self.parse_rdf_file(filename)
123
124    def test_json_rdf(self):
125        doc = self.parse_json_file(utils_test.get_test_loc('formats/SPDXJsonExample.json'))
126        filename = get_temp_file('.rdf')
127        self.write_rdf_file(doc, filename)
128        self.parse_rdf_file(filename)
129
130    def test_yaml_rdf(self):
131        doc = self.parse_yaml_file(utils_test.get_test_loc('formats/SPDXYamlExample.yaml'))
132        filename = get_temp_file('.rdf')
133        self.write_rdf_file(doc, filename)
134        self.parse_rdf_file(filename)
135
136    def test_xml_rdf(self):
137        doc = self.parse_xml_file(utils_test.get_test_loc('formats/SPDXXmlExample.xml'))
138        filename = get_temp_file('.rdf')
139        self.write_rdf_file(doc, filename)
140        self.parse_rdf_file(filename)
141
142    def test_rdf_rdf(self):
143        doc = self.parse_rdf_file(utils_test.get_test_loc('formats/SPDXRdfExample.rdf'))
144        filename = get_temp_file('.rdf')
145        self.write_rdf_file(doc, filename)
146        self.parse_rdf_file(filename)
147
148    def test_tagvalue_tagvalue(self):
149        doc = self.parse_tagvalue_file(utils_test.get_test_loc('formats/SPDXTagExample.tag'))
150        filename = get_temp_file('.tag')
151        self.write_tagvalue_file(doc, filename)
152        self.parse_tagvalue_file(filename)
153
154    def test_rdf_tagvalue(self):
155        doc = self.parse_rdf_file(utils_test.get_test_loc('formats/SPDXRdfExample.rdf'))
156        filename = get_temp_file('.tag')
157        self.write_tagvalue_file(doc, filename)
158        self.parse_tagvalue_file(filename)
159
160    def test_json_tagvalue(self):
161        doc = self.parse_json_file(utils_test.get_test_loc('formats/SPDXJsonExample.json'))
162        filename = get_temp_file('.tag')
163        self.write_tagvalue_file(doc, filename)
164        self.parse_tagvalue_file(filename)
165
166    def test_yaml_tagvalue(self):
167        doc = self.parse_yaml_file(utils_test.get_test_loc('formats/SPDXYamlExample.yaml'))
168        filename = get_temp_file('.tag')
169        self.write_tagvalue_file(doc, filename)
170        self.parse_tagvalue_file(filename)
171
172    def test_xml_tagvalue(self):
173        doc = self.parse_xml_file(utils_test.get_test_loc('formats/SPDXXmlExample.xml'))
174        filename = get_temp_file('.tag')
175        self.write_tagvalue_file(doc, filename)
176        self.parse_tagvalue_file(filename)
177
178    def test_tagvalue_json(self):
179        doc = self.parse_tagvalue_file(utils_test.get_test_loc('formats/SPDXTagExample.tag'))
180        filename = get_temp_file('.json')
181        self.write_json_file(doc, filename)
182        self.parse_json_file(filename)
183
184    def test_rdf_json(self):
185        doc = self.parse_rdf_file(utils_test.get_test_loc('formats/SPDXRdfExample.rdf'))
186        filename = get_temp_file('.json')
187        self.write_json_file(doc, filename)
188        self.parse_json_file(filename)
189
190    def test_yaml_json(self):
191        doc = self.parse_yaml_file(utils_test.get_test_loc('formats/SPDXYamlExample.yaml'))
192        filename = get_temp_file('.json')
193        self.write_json_file(doc, filename)
194        self.parse_json_file(filename)
195
196    def test_xml_json(self):
197        doc = self.parse_xml_file(utils_test.get_test_loc('formats/SPDXXmlExample.xml'))
198        filename = get_temp_file('.json')
199        self.write_json_file(doc, filename)
200        self.parse_json_file(filename)
201
202    def test_json_json(self):
203        doc = self.parse_json_file(utils_test.get_test_loc('formats/SPDXJsonExample.json'))
204        filename = get_temp_file('.json')
205        self.write_json_file(doc, filename)
206        self.parse_json_file(filename)
207
208    def test_tagvalue_yaml(self):
209        doc = self.parse_tagvalue_file(utils_test.get_test_loc('formats/SPDXTagExample.tag'))
210        filename = get_temp_file('.yaml')
211        self.write_yaml_file(doc, filename)
212        self.parse_yaml_file(filename)
213
214    def test_rdf_yaml(self):
215        doc = self.parse_rdf_file(utils_test.get_test_loc('formats/SPDXRdfExample.rdf'))
216        filename = get_temp_file('.yaml')
217        self.write_yaml_file(doc, filename)
218        self.parse_yaml_file(filename)
219
220    def test_json_yaml(self):
221        doc = self.parse_json_file(utils_test.get_test_loc('formats/SPDXJsonExample.json'))
222        filename = get_temp_file('.yaml')
223        self.write_yaml_file(doc, filename)
224        self.parse_yaml_file(filename)
225
226    def test_xml_yaml(self):
227        doc = self.parse_xml_file(utils_test.get_test_loc('formats/SPDXXmlExample.xml'))
228        filename = get_temp_file('.yaml')
229        self.write_yaml_file(doc, filename)
230        self.parse_yaml_file(filename)
231
232    def test_yaml_yaml(self):
233        doc = self.parse_yaml_file(utils_test.get_test_loc('formats/SPDXYamlExample.yaml'))
234        filename = get_temp_file('.yaml')
235        self.write_yaml_file(doc, filename)
236        self.parse_yaml_file(filename)
237
238    def test_tagvalue_xml(self):
239        doc = self.parse_tagvalue_file(utils_test.get_test_loc('formats/SPDXTagExample.tag'))
240        filename = get_temp_file('.xml')
241        self.write_xml_file(doc, filename)
242        self.parse_xml_file(filename)
243
244    def test_rdf_xml(self):
245        doc = self.parse_rdf_file(utils_test.get_test_loc('formats/SPDXRdfExample.rdf'))
246        filename = get_temp_file('.xml')
247        self.write_xml_file(doc, filename)
248        self.parse_xml_file(filename)
249
250    def test_json_xml(self):
251        doc = self.parse_json_file(utils_test.get_test_loc('formats/SPDXJsonExample.json'))
252        filename = get_temp_file('.xml')
253        self.write_xml_file(doc, filename)
254        self.parse_xml_file(filename)
255
256    def test_yaml_xml(self):
257        doc = self.parse_yaml_file(utils_test.get_test_loc('formats/SPDXYamlExample.yaml'))
258        filename = get_temp_file('.xml')
259        self.write_xml_file(doc, filename)
260        self.parse_xml_file(filename)
261
262    def test_xml_xml(self):
263        doc = self.parse_xml_file(utils_test.get_test_loc('formats/SPDXXmlExample.xml'))
264        filename = get_temp_file('.xml')
265        self.write_xml_file(doc, filename)
266        self.parse_xml_file(filename)
267