| # 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) |
| ) |