# Copyright (c) 2023 The Regents of the University of California # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer; # redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution; # neither the name of the copyright holders nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import unittest import tempfile import os from typing import Dict import json from gem5.resources.client_api.jsonclient import JSONClient class JSONClientTestSuite(unittest.TestCase): """Test cases for gem5.resources.client_api.jsonclient""" @classmethod def setUpClass(cls) -> str: """ This creates a simple resources collection for testing """ file_contents = [ { "category": "binary", "id": "this-is-a-test-resource", "description": "This is a test resource", "architecture": "X86", "size": 13816, "tags": ["asmtest", "testing", "riscv", "testing"], "is_zipped": False, "md5sum": "4e70a98b6976969deffff91eed17fba1", "source": "src/asmtest", "url": "http://dist.gem5.org/dist/develop/test-progs/asmtest/bin/rv64mi-p-sbreak", "code_examples": [], "license": " BSD-3-Clause", "author": [], "source_url": "https://github.com/gem5/gem5-resources/tree/develop/src/asmtest", "resource_version": "1.0.0", "gem5_versions": ["23.0"], "example_usage": 'get_resource(resource_name="rv64mi-p-sbreak")', }, { "category": "binary", "id": "this-is-a-test-resource", "description": "This is a test resource but double newer", "architecture": "X86", "size": 13816, "tags": ["asmtest"], "is_zipped": False, "md5sum": "4e70a98b6976969deffff91eed17fba1", "source": "src/asmtest", "url": "http://dist.gem5.org/dist/develop/test-progs/asmtest/bin/rv64mi-p-sbreak", "code_examples": [], "license": " BSD-3-Clause", "author": [], "source_url": "https://github.com/gem5/gem5-resources/tree/develop/src/asmtest", "resource_version": "2.0.0", "gem5_versions": ["23.1"], "example_usage": 'get_resource(resource_name="rv64mi-p-sbreak")', }, { "category": "simpoint", "id": "test-version", "description": "Simpoints for running the 'x86-print-this' resource with the parameters `\"print this\" 15000`. This is encapsulated in the 'x86-print-this-15000-with-simpoints' workload.", "architecture": "X86", "size": 10240, "tags": [], "is_zipped": False, "md5sum": "3fcffe3956c8a95e3fb82e232e2b41fb", "is_tar_archive": True, "url": "http://dist.gem5.org/dist/develop/simpoints/x86-print-this-15000-simpoints-20221013.tar", "simpoint_interval": 1000000, "warmup_interval": 1000000, "code_examples": [], "license": "", "author": [], "source_url": "", "resource_version": "1.0.0", "gem5_versions": ["23.0"], "workload_name": "x86-print-this-15000-with-simpoints", "example_usage": 'get_resource(resource_name="x86-print-this-1500-simpoints")', "workloads": [ "x86-print-this-15000-with-simpoints", "x86-print-this-15000-with-simpoints-and-checkpoint", ], }, { "category": "file", "id": "test-version", "description": "Simpoints for running the 'x86-print-this' resource with the parameters `\"print this\" 15000`. This is encapsulated in the 'x86-print-this-15000-with-simpoints' workload.", "architecture": "X86", "size": 10240, "tags": [], "is_zipped": False, "md5sum": "3fcffe3956c8a95e3fb82e232e2b41fb", "is_tar_archive": True, "url": "http://dist.gem5.org/dist/develop/simpoints/x86-print-this-15000-simpoints-20221013.tar", "simpoint_interval": 1000000, "warmup_interval": 1000000, "code_examples": [], "license": "", "author": [], "source_url": "", "resource_version": "0.2.0", "gem5_versions": ["23.0"], "workload_name": "x86-print-this-15000-with-simpoints", "example_usage": 'get_resource(resource_name="x86-print-this-1500-simpoints")', "workloads": [ "x86-print-this-15000-with-simpoints", "x86-print-this-15000-with-simpoints-and-checkpoint", ], }, ] file = tempfile.NamedTemporaryFile(mode="w", delete=False) file.write(json.dumps(file_contents)) file.close() cls.file_path = file.name @classmethod def tearDownClass(cls) -> None: os.remove(cls.file_path) def verify_json(self, json: Dict) -> None: """ This verifies the JSON file created in created in "create_temp_resources_json" has been loaded correctly into a Python dictionary. """ self.assertEquals(4, len(json)) self.assertTrue("id" in json[0]) self.assertEquals("this-is-a-test-resource", json[0]["id"]) self.assertEquals("binary", json[0]["category"]) self.assertTrue("id" in json[1]) self.assertEquals("this-is-a-test-resource", json[1]["id"]) self.assertTrue("id" in json[2]) self.assertEquals("test-version", json[2]["id"]) self.assertTrue("id" in json[3]) self.assertEquals("test-version", json[3]["id"]) def test_get_resources_json_at_path(self) -> None: # Tests JSONClient.get_resources_json() client = JSONClient(path=self.file_path) json = client.get_resources_json() self.verify_json(json=json) def test_get_resources_json_invalid_url(self) -> None: # Tests the JSONClient.get_resources_json() function in case where an # invalid url is passed as the URL/PATH of the resources JSON file. path = "NotAURLorFilePath" with self.assertRaises(Exception) as context: client = JSONClient(path=path) json = client.get_resources_json() self.assertTrue( f"Resources location '{path}' is not a valid path or URL." in str(context.exception) )