From f50b1ab64ebab0526961ce354f646db2cb8ad031 Mon Sep 17 00:00:00 2001 From: Pierre Tardy Date: Thu, 16 Sep 2021 16:55:47 +0200 Subject: [PATCH] use github api to find github tags svn version is kept if no GH_TOKEN is given in environ, but this method has a lot of issues (proxy support, scalability) Signed-off-by: Pierre Tardy --- vulnerabilities/package_managers.py | 95 +++++++++++++++-- .../github_api/release_response.json | 76 +++++++++++++ .../records/nexB_vulnerablecode_1.json | 1 + .../test_data/records/torvalds_linux_1.json | 1 + .../test_data/records/torvalds_linux_2.json | 1 + .../test_data/records/torvalds_linux_3.json | 1 + .../test_data/records/torvalds_linux_4.json | 1 + .../test_data/records/torvalds_linux_5.json | 1 + .../test_data/records/torvalds_linux_6.json | 1 + .../test_data/records/torvalds_linux_7.json | 1 + .../test_data/records/torvalds_linux_8.json | 1 + .../tests/test_package_managers.py | 100 +++++++++++++++++- 12 files changed, 270 insertions(+), 10 deletions(-) create mode 100644 vulnerabilities/tests/test_data/github_api/release_response.json create mode 100644 vulnerabilities/tests/test_data/records/nexB_vulnerablecode_1.json create mode 100644 vulnerabilities/tests/test_data/records/torvalds_linux_1.json create mode 100644 vulnerabilities/tests/test_data/records/torvalds_linux_2.json create mode 100644 vulnerabilities/tests/test_data/records/torvalds_linux_3.json create mode 100644 vulnerabilities/tests/test_data/records/torvalds_linux_4.json create mode 100644 vulnerabilities/tests/test_data/records/torvalds_linux_5.json create mode 100644 vulnerabilities/tests/test_data/records/torvalds_linux_6.json create mode 100644 vulnerabilities/tests/test_data/records/torvalds_linux_7.json create mode 100644 vulnerabilities/tests/test_data/records/torvalds_linux_8.json diff --git a/vulnerabilities/package_managers.py b/vulnerabilities/package_managers.py index f82bdd51e..347b85e9c 100644 --- a/vulnerabilities/package_managers.py +++ b/vulnerabilities/package_managers.py @@ -19,6 +19,7 @@ # for any legal advice. # VulnerableCode is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. +import os import asyncio import dataclasses import xml.etree.ElementTree as ET @@ -30,6 +31,7 @@ from typing import Set from aiohttp import ClientSession +import aiohttp from aiohttp.client_exceptions import ClientResponseError from aiohttp.client_exceptions import ServerDisconnectedError from bs4 import BeautifulSoup @@ -48,6 +50,10 @@ class VersionResponse: newer_versions: Set[str] = dataclasses.field(default_factory=set) +class GraphQLError(Exception): + pass + + class VersionAPI: def __init__(self, cache: Mapping[str, Set[Version]] = None): self.cache = cache or {} @@ -377,21 +383,92 @@ def extract_versions(resp: dict, pkg_name: str) -> Set[str]: class GitHubTagsAPI(VersionAPI): package_type = "github" + GQL_QUERY = """ + query getTags($name: String!, $owner: String!, $after: String) + { + repository(name: $name, owner: $owner) { + refs(refPrefix: "refs/tags/", first: 100, after: $after) { + totalCount + pageInfo { + endCursor + hasNextPage + } + nodes { + name + target { + ... on Commit { + committedDate + } + ... on Tag { + target { + ... on Commit { + committedDate + } + } + } + } + } + } + } + }""" - async def fetch(self, owner_repo: str, session) -> None: + def __init__(self, cache: Mapping[str, Set[Version]] = None): + self.gh_token = os.getenv("GH_TOKEN") + super().__init__(cache=cache) + + async def fetch(self, owner_repo: str, session: aiohttp.ClientSession) -> None: """ owner_repo is a string of format "{repo_owner}/{repo_name}" Example value of owner_repo = "nexB/scancode-toolkit" """ self.cache[owner_repo] = set() - endpoint = f"https://github.com/{owner_repo}" - - tags_xml = check_output(["svn", "ls", "--xml", f"{endpoint}/tags"], text=True) - elements = ET.fromstring(tags_xml) - for entry in elements.iter("entry"): - name = entry.find("name").text - release_date = dateparser.parse(entry.find("commit/date").text) - self.cache[owner_repo].add(Version(value=name, release_date=release_date)) + if self.gh_token: + # graphql api cannot work without api token + session.headers["Authorization"] = "token " + self.gh_token + endpoint = f"https://api.github.com/graphql" + owner, name = owner_repo.split("/") + query = {"query": self.GQL_QUERY, "variables": {"name": name, "owner": owner}} + + while True: + response = await session.post(endpoint, json=query) + resp_json = await response.json() + + if "errors" in resp_json: + raise GraphQLError(resp_json["errors"]) + + refs = resp_json["data"]["repository"]["refs"] + + for entry in refs["nodes"]: + name = entry["name"] + target = entry["target"] + # in case the tag is a signed tag, then the commit info is in target['target'] + if "committedDate" not in target: + target = target["target"] + if "committedDate" in target: + release_date = dateparser.parse(target["committedDate"]) + else: + # but tags can actually point to tree and not commit, so there is no date + # probably this only happened for linux. Github cannot even properly display it. + # https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux/+/refs/tags/v2.6.11 + release_date = None + self.cache[owner_repo].add(Version(value=name, release_date=release_date)) + + if not refs["pageInfo"]["hasNextPage"]: + break + # to fetch next page, we just set the after variable to endCursor + query["variables"]["after"] = refs["pageInfo"]["endCursor"] + + else: + # In case we don't have GH_TOKEN, we use the svn ls method to get the tags + # It allows to get all the information needed in one request without any rate limiting + # this method is however not scalable for larger repo and the api is unresponsive + # for repo with > 50 tags + endpoint = f"https://github.com/{owner_repo}" + tags_xml = check_output(["svn", "ls", "--xml", f"{endpoint}/tags"], text=True) + elements = ET.fromstring(tags_xml) + for entry in elements.iter("entry"): + name = entry.find("name").text + release_date = dateparser.parse(entry.find("commit/date").text) class HexVersionAPI(VersionAPI): diff --git a/vulnerabilities/tests/test_data/github_api/release_response.json b/vulnerabilities/tests/test_data/github_api/release_response.json new file mode 100644 index 000000000..a5f1d6111 --- /dev/null +++ b/vulnerabilities/tests/test_data/github_api/release_response.json @@ -0,0 +1,76 @@ +[ + { + "url": "https://api.github.com/repos/nexB/vulnerablecode/releases/32748782", + "assets_url": "https://api.github.com/repos/nexB/vulnerablecode/releases/32748782/assets", + "upload_url": "https://uploads.github.com/repos/nexB/vulnerablecode/releases/32748782/assets{?name,label}", + "html_url": "https://github.com/nexB/vulnerablecode/releases/tag/v20.10", + "id": 32748782, + "author": { + "login": "pombredanne", + "id": 675997, + "node_id": "MDQ6VXNlcjY3NTk5Nw==", + "avatar_url": "https://avatars.githubusercontent.com/u/675997?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pombredanne", + "html_url": "https://github.com/pombredanne", + "followers_url": "https://api.github.com/users/pombredanne/followers", + "following_url": "https://api.github.com/users/pombredanne/following{/other_user}", + "gists_url": "https://api.github.com/users/pombredanne/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pombredanne/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pombredanne/subscriptions", + "organizations_url": "https://api.github.com/users/pombredanne/orgs", + "repos_url": "https://api.github.com/users/pombredanne/repos", + "events_url": "https://api.github.com/users/pombredanne/events{/privacy}", + "received_events_url": "https://api.github.com/users/pombredanne/received_events", + "type": "User", + "site_admin": false + }, + "node_id": "MDc6UmVsZWFzZTMyNzQ4Nzgy", + "tag_name": "v20.10", + "target_commitish": "main", + "name": "v20.10", + "draft": false, + "prerelease": false, + "created_at": "2020-09-28T12:31:16Z", + "published_at": "2020-10-19T10:46:17Z", + "assets": [ + { + "url": "https://api.github.com/repos/nexB/vulnerablecode/releases/assets/27230021", + "id": 27230021, + "node_id": "MDEyOlJlbGVhc2VBc3NldDI3MjMwMDIx", + "name": "vulnerablecode-2020-10-19.json.xz", + "label": null, + "uploader": { + "login": "pombredanne", + "id": 675997, + "node_id": "MDQ6VXNlcjY3NTk5Nw==", + "avatar_url": "https://avatars.githubusercontent.com/u/675997?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/pombredanne", + "html_url": "https://github.com/pombredanne", + "followers_url": "https://api.github.com/users/pombredanne/followers", + "following_url": "https://api.github.com/users/pombredanne/following{/other_user}", + "gists_url": "https://api.github.com/users/pombredanne/gists{/gist_id}", + "starred_url": "https://api.github.com/users/pombredanne/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/pombredanne/subscriptions", + "organizations_url": "https://api.github.com/users/pombredanne/orgs", + "repos_url": "https://api.github.com/users/pombredanne/repos", + "events_url": "https://api.github.com/users/pombredanne/events{/privacy}", + "received_events_url": "https://api.github.com/users/pombredanne/received_events", + "type": "User", + "site_admin": false + }, + "content_type": "application/x-xz", + "state": "uploaded", + "size": 13603356, + "download_count": 20, + "created_at": "2020-10-20T09:40:08Z", + "updated_at": "2020-10-20T09:40:25Z", + "browser_download_url": "https://github.com/nexB/vulnerablecode/releases/download/v20.10/vulnerablecode-2020-10-19.json.xz" + } + ], + "tarball_url": "https://api.github.com/repos/nexB/vulnerablecode/tarball/v20.10", + "zipball_url": "https://api.github.com/repos/nexB/vulnerablecode/zipball/v20.10", + "body": "This release comes with the new calver versioning scheme and an initial data dump.\r\n\r\nTo load the JSON data attached here:\r\n- extract it with `unxz vulnerablecode-2020-10-19.json.xz`\r\n- run `DJANGO_DEV=1 python manage.py loaddata vulnerablecode-2020-10-19.json`\r\n\r\nThe data import is not optimized yet and takes a long time." + } +] diff --git a/vulnerabilities/tests/test_data/records/nexB_vulnerablecode_1.json b/vulnerabilities/tests/test_data/records/nexB_vulnerablecode_1.json new file mode 100644 index 000000000..44b97d59d --- /dev/null +++ b/vulnerabilities/tests/test_data/records/nexB_vulnerablecode_1.json @@ -0,0 +1 @@ +{"data":{"repository":{"refs":{"totalCount":2,"pageInfo":{"endCursor":"Mg","hasNextPage":false},"nodes":[{"name":"v0.1","target":{"committedDate":"2019-12-03T13:48:53Z"}},{"name":"v20.10","target":{"committedDate":"2020-09-28T12:31:16Z"}}]}}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/records/torvalds_linux_1.json b/vulnerabilities/tests/test_data/records/torvalds_linux_1.json new file mode 100644 index 000000000..95a28a8d1 --- /dev/null +++ b/vulnerabilities/tests/test_data/records/torvalds_linux_1.json @@ -0,0 +1 @@ +{"data":{"repository":{"refs":{"totalCount":713,"pageInfo":{"endCursor":"MTAw","hasNextPage":true},"nodes":[{"name":"v2.6.11-tree","target":{"target":{}}},{"name":"v2.6.11","target":{"target":{}}},{"name":"v2.6.12-rc2","target":{"target":{"committedDate":"2005-04-16T22:20:36Z"}}},{"name":"v2.6.12-rc3","target":{"target":{"committedDate":"2005-04-20T23:24:21Z"}}},{"name":"v2.6.12-rc4","target":{"target":{"committedDate":"2005-05-07T05:20:31Z"}}},{"name":"v2.6.12-rc5","target":{"target":{"committedDate":"2005-05-25T03:31:20Z"}}},{"name":"v2.6.12-rc6","target":{"target":{"committedDate":"2005-06-06T15:22:29Z"}}},{"name":"v2.6.12","target":{"target":{"committedDate":"2005-06-17T19:48:29Z"}}},{"name":"v2.6.13-rc1","target":{"target":{"committedDate":"2005-06-29T05:57:29Z"}}},{"name":"v2.6.13-rc2","target":{"target":{"committedDate":"2005-07-06T03:46:33Z"}}},{"name":"v2.6.13-rc3","target":{"target":{"committedDate":"2005-07-13T04:46:46Z"}}},{"name":"v2.6.13-rc4","target":{"target":{"committedDate":"2005-07-28T22:44:44Z"}}},{"name":"v2.6.13-rc5","target":{"target":{"committedDate":"2005-08-02T04:45:48Z"}}},{"name":"v2.6.13-rc6","target":{"target":{"committedDate":"2005-08-07T18:18:56Z"}}},{"name":"v2.6.13-rc7","target":{"target":{"committedDate":"2005-08-24T03:39:14Z"}}},{"name":"v2.6.13","target":{"target":{"committedDate":"2005-08-28T23:41:01Z"}}},{"name":"v2.6.14-rc1","target":{"target":{"committedDate":"2005-09-13T03:12:09Z"}}},{"name":"v2.6.14-rc2","target":{"target":{"committedDate":"2005-09-20T03:00:41Z"}}},{"name":"v2.6.14-rc3","target":{"target":{"committedDate":"2005-09-30T21:17:35Z"}}},{"name":"v2.6.14-rc4","target":{"target":{"committedDate":"2005-10-11T01:19:19Z"}}},{"name":"v2.6.14-rc5","target":{"target":{"committedDate":"2005-10-20T06:23:05Z"}}},{"name":"v2.6.14","target":{"target":{"committedDate":"2005-10-28T00:02:08Z"}}},{"name":"v2.6.15-rc1","target":{"target":{"committedDate":"2005-11-12T01:43:36Z"}}},{"name":"v2.6.15-rc2","target":{"target":{"committedDate":"2005-11-20T03:25:03Z"}}},{"name":"v2.6.15-rc3","target":{"target":{"committedDate":"2005-11-29T03:51:27Z"}}},{"name":"v2.6.15-rc4","target":{"target":{"committedDate":"2005-12-01T06:25:15Z"}}},{"name":"v2.6.15-rc5","target":{"target":{"committedDate":"2005-12-04T05:10:42Z"}}},{"name":"v2.6.15-rc6","target":{"target":{"committedDate":"2005-12-19T00:36:54Z"}}},{"name":"v2.6.15-rc7","target":{"target":{"committedDate":"2005-12-24T23:47:48Z"}}},{"name":"v2.6.15","target":{"target":{"committedDate":"2006-01-03T03:21:10Z"}}},{"name":"v2.6.16-rc1","target":{"target":{"committedDate":"2006-01-17T07:44:47Z"}}},{"name":"v2.6.16-rc2","target":{"target":{"committedDate":"2006-02-03T06:03:08Z"}}},{"name":"v2.6.16-rc3","target":{"target":{"committedDate":"2006-02-13T00:27:25Z"}}},{"name":"v2.6.16-rc4","target":{"target":{"committedDate":"2006-02-17T22:23:45Z"}}},{"name":"v2.6.16-rc5","target":{"target":{"committedDate":"2006-02-27T05:09:35Z"}}},{"name":"v2.6.16-rc6","target":{"target":{"committedDate":"2006-03-11T22:12:55Z"}}},{"name":"v2.6.16","target":{"target":{"committedDate":"2006-03-20T05:53:29Z"}}},{"name":"v2.6.17-rc1","target":{"target":{"committedDate":"2006-04-03T03:22:10Z"}}},{"name":"v2.6.17-rc2","target":{"target":{"committedDate":"2006-04-19T03:00:49Z"}}},{"name":"v2.6.17-rc3","target":{"target":{"committedDate":"2006-04-27T02:19:25Z"}}},{"name":"v2.6.17-rc4","target":{"target":{"committedDate":"2006-05-11T23:31:53Z"}}},{"name":"v2.6.17-rc5","target":{"target":{"committedDate":"2006-05-25T01:50:17Z"}}},{"name":"v2.6.17-rc6","target":{"target":{"committedDate":"2006-06-06T00:57:02Z"}}},{"name":"v2.6.17","target":{"target":{"committedDate":"2006-06-18T01:49:35Z"}}},{"name":"v2.6.18-rc1","target":{"target":{"committedDate":"2006-07-06T04:09:49Z"}}},{"name":"v2.6.18-rc2","target":{"target":{"committedDate":"2006-07-15T21:53:08Z"}}},{"name":"v2.6.18-rc3","target":{"target":{"committedDate":"2006-07-30T06:15:36Z"}}},{"name":"v2.6.18-rc4","target":{"target":{"committedDate":"2006-08-06T18:20:11Z"}}},{"name":"v2.6.18-rc5","target":{"target":{"committedDate":"2006-08-28T03:41:48Z"}}},{"name":"v2.6.18-rc6","target":{"target":{"committedDate":"2006-09-04T02:19:48Z"}}},{"name":"v2.6.18-rc7","target":{"target":{"committedDate":"2006-09-13T01:41:36Z"}}},{"name":"v2.6.18","target":{"target":{"committedDate":"2006-09-20T03:42:06Z"}}},{"name":"v2.6.19-rc1","target":{"target":{"committedDate":"2006-10-05T02:57:05Z"}}},{"name":"v2.6.19-rc2","target":{"target":{"committedDate":"2006-10-13T16:25:04Z"}}},{"name":"v2.6.19-rc3","target":{"target":{"committedDate":"2006-10-23T23:02:02Z"}}},{"name":"v2.6.19-rc4","target":{"target":{"committedDate":"2006-10-31T03:37:36Z"}}},{"name":"v2.6.19-rc5","target":{"target":{"committedDate":"2006-11-08T02:24:20Z"}}},{"name":"v2.6.19-rc6","target":{"target":{"committedDate":"2006-11-16T04:03:40Z"}}},{"name":"v2.6.19","target":{"target":{"committedDate":"2006-11-29T21:57:37Z"}}},{"name":"v2.6.20-rc1","target":{"target":{"committedDate":"2006-12-14T01:14:23Z"}}},{"name":"v2.6.20-rc2","target":{"target":{"committedDate":"2006-12-24T04:00:32Z"}}},{"name":"v2.6.20-rc3","target":{"target":{"committedDate":"2007-01-01T00:53:20Z"}}},{"name":"v2.6.20-rc4","target":{"target":{"committedDate":"2007-01-07T05:45:51Z"}}},{"name":"v2.6.20-rc5","target":{"target":{"committedDate":"2007-01-12T18:54:26Z"}}},{"name":"v2.6.20-rc6","target":{"target":{"committedDate":"2007-01-25T02:19:28Z"}}},{"name":"v2.6.20-rc7","target":{"target":{"committedDate":"2007-01-31T03:42:57Z"}}},{"name":"v2.6.20","target":{"target":{"committedDate":"2007-02-04T18:44:54Z"}}},{"name":"v2.6.21-rc1","target":{"target":{"committedDate":"2007-02-21T04:32:30Z"}}},{"name":"v2.6.21-rc2","target":{"target":{"committedDate":"2007-02-28T04:59:12Z"}}},{"name":"v2.6.21-rc3","target":{"target":{"committedDate":"2007-03-07T04:41:20Z"}}},{"name":"v2.6.21-rc4","target":{"target":{"committedDate":"2007-03-16T00:20:01Z"}}},{"name":"v2.6.21-rc5","target":{"target":{"committedDate":"2007-03-25T22:56:23Z"}}},{"name":"v2.6.21-rc6","target":{"target":{"committedDate":"2007-04-06T02:36:56Z"}}},{"name":"v2.6.21-rc7","target":{"target":{"committedDate":"2007-04-15T23:50:57Z"}}},{"name":"v2.6.21","target":{"target":{"committedDate":"2007-04-26T03:08:32Z"}}},{"name":"v2.6.22-rc1","target":{"target":{"committedDate":"2007-05-13T01:45:56Z"}}},{"name":"v2.6.22-rc2","target":{"target":{"committedDate":"2007-05-19T04:06:17Z"}}},{"name":"v2.6.22-rc3","target":{"target":{"committedDate":"2007-05-26T02:55:14Z"}}},{"name":"v2.6.22-rc4","target":{"target":{"committedDate":"2007-06-05T00:57:25Z"}}},{"name":"v2.6.22-rc5","target":{"target":{"committedDate":"2007-06-17T02:09:12Z"}}},{"name":"v2.6.22-rc6","target":{"target":{"committedDate":"2007-06-24T23:21:48Z"}}},{"name":"v2.6.22-rc7","target":{"target":{"committedDate":"2007-07-01T19:54:24Z"}}},{"name":"v2.6.22","target":{"target":{"committedDate":"2007-07-08T23:32:17Z"}}},{"name":"v2.6.23-rc1","target":{"target":{"committedDate":"2007-07-22T20:41:00Z"}}},{"name":"v2.6.23-rc2","target":{"target":{"committedDate":"2007-08-04T02:49:55Z"}}},{"name":"v2.6.23-rc3","target":{"target":{"committedDate":"2007-08-13T04:25:24Z"}}},{"name":"v2.6.23-rc4","target":{"target":{"committedDate":"2007-08-28T01:32:35Z"}}},{"name":"v2.6.23-rc5","target":{"target":{"committedDate":"2007-09-01T06:08:24Z"}}},{"name":"v2.6.23-rc6","target":{"target":{"committedDate":"2007-09-11T02:50:29Z"}}},{"name":"v2.6.23-rc7","target":{"target":{"committedDate":"2007-09-19T23:01:13Z"}}},{"name":"v2.6.23-rc8","target":{"target":{"committedDate":"2007-09-25T00:33:10Z"}}},{"name":"v2.6.23-rc9","target":{"target":{"committedDate":"2007-10-02T03:24:52Z"}}},{"name":"v2.6.23","target":{"target":{"committedDate":"2007-10-09T20:31:38Z"}}},{"name":"v2.6.24-rc1","target":{"target":{"committedDate":"2007-10-24T03:50:57Z"}}},{"name":"v2.6.24-rc2","target":{"target":{"committedDate":"2007-11-06T21:57:46Z"}}},{"name":"v2.6.24-rc3","target":{"target":{"committedDate":"2007-11-17T05:16:36Z"}}},{"name":"v2.6.24-rc4","target":{"target":{"committedDate":"2007-12-04T04:26:10Z"}}},{"name":"v2.6.24-rc5","target":{"target":{"committedDate":"2007-12-11T03:48:43Z"}}},{"name":"v2.6.24-rc6","target":{"target":{"committedDate":"2007-12-21T01:25:48Z"}}},{"name":"v2.6.24-rc7","target":{"target":{"committedDate":"2008-01-06T21:45:38Z"}}}]}}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/records/torvalds_linux_2.json b/vulnerabilities/tests/test_data/records/torvalds_linux_2.json new file mode 100644 index 000000000..c896d9c49 --- /dev/null +++ b/vulnerabilities/tests/test_data/records/torvalds_linux_2.json @@ -0,0 +1 @@ +{"data":{"repository":{"refs":{"totalCount":713,"pageInfo":{"endCursor":"MjAw","hasNextPage":true},"nodes":[{"name":"v2.6.24-rc8","target":{"target":{"committedDate":"2008-01-16T04:22:48Z"}}},{"name":"v2.6.24","target":{"target":{"committedDate":"2008-01-24T22:58:37Z"}}},{"name":"v2.6.25-rc1","target":{"target":{"committedDate":"2008-02-10T22:18:14Z"}}},{"name":"v2.6.25-rc2","target":{"target":{"committedDate":"2008-02-15T20:57:20Z"}}},{"name":"v2.6.25-rc3","target":{"target":{"committedDate":"2008-02-24T21:25:54Z"}}},{"name":"v2.6.25-rc4","target":{"target":{"committedDate":"2008-03-05T04:33:54Z"}}},{"name":"v2.6.25-rc5","target":{"target":{"committedDate":"2008-03-10T05:22:27Z"}}},{"name":"v2.6.25-rc6","target":{"target":{"committedDate":"2008-03-16T23:32:14Z"}}},{"name":"v2.6.25-rc7","target":{"target":{"committedDate":"2008-03-26T01:38:14Z"}}},{"name":"v2.6.25-rc8","target":{"target":{"committedDate":"2008-04-01T19:44:26Z"}}},{"name":"v2.6.25-rc9","target":{"target":{"committedDate":"2008-04-11T20:32:29Z"}}},{"name":"v2.6.25","target":{"target":{"committedDate":"2008-04-17T02:49:44Z"}}},{"name":"v2.6.26-rc1","target":{"target":{"committedDate":"2008-05-03T18:59:44Z"}}},{"name":"v2.6.26-rc2","target":{"target":{"committedDate":"2008-05-12T00:09:41Z"}}},{"name":"v2.6.26-rc3","target":{"target":{"committedDate":"2008-05-18T21:36:41Z"}}},{"name":"v2.6.26-rc4","target":{"target":{"committedDate":"2008-05-26T18:08:11Z"}}},{"name":"v2.6.26-rc5","target":{"target":{"committedDate":"2008-06-05T03:10:44Z"}}},{"name":"v2.6.26-rc6","target":{"target":{"committedDate":"2008-06-12T21:22:24Z"}}},{"name":"v2.6.26-rc7","target":{"target":{"committedDate":"2008-06-20T23:19:44Z"}}},{"name":"v2.6.26-rc8","target":{"target":{"committedDate":"2008-06-25T01:58:20Z"}}},{"name":"v2.6.26-rc9","target":{"target":{"committedDate":"2008-07-05T22:53:22Z"}}},{"name":"v2.6.26","target":{"target":{"committedDate":"2008-07-13T21:51:29Z"}}},{"name":"v2.6.27-rc1","target":{"target":{"committedDate":"2008-07-29T02:40:31Z"}}},{"name":"v2.6.27-rc2","target":{"target":{"committedDate":"2008-08-06T04:49:54Z"}}},{"name":"v2.6.27-rc3","target":{"target":{"committedDate":"2008-08-13T01:55:39Z"}}},{"name":"v2.6.27-rc4","target":{"target":{"committedDate":"2008-08-21T02:35:56Z"}}},{"name":"v2.6.27-rc5","target":{"target":{"committedDate":"2008-08-28T22:52:02Z"}}},{"name":"v2.6.27-rc6","target":{"target":{"committedDate":"2008-09-09T23:27:49Z"}}},{"name":"v2.6.27-rc7","target":{"target":{"committedDate":"2008-09-21T22:29:55Z"}}},{"name":"v2.6.27-rc8","target":{"target":{"committedDate":"2008-09-29T22:24:02Z"}}},{"name":"v2.6.27-rc9","target":{"target":{"committedDate":"2008-10-06T23:39:58Z"}}},{"name":"v2.6.27","target":{"target":{"committedDate":"2008-10-09T22:13:53Z"}}},{"name":"v2.6.28-rc1","target":{"target":{"committedDate":"2008-10-24T03:06:52Z"}}},{"name":"v2.6.28-rc2","target":{"target":{"committedDate":"2008-10-26T19:13:29Z"}}},{"name":"v2.6.28-rc3","target":{"target":{"committedDate":"2008-11-02T22:17:19Z"}}},{"name":"v2.6.28-rc4","target":{"target":{"committedDate":"2008-11-10T00:36:15Z"}}},{"name":"v2.6.28-rc5","target":{"target":{"committedDate":"2008-11-15T21:42:56Z"}}},{"name":"v2.6.28-rc6","target":{"target":{"committedDate":"2008-11-20T23:19:22Z"}}},{"name":"v2.6.28-rc7","target":{"target":{"committedDate":"2008-12-02T03:59:23Z"}}},{"name":"v2.6.28-rc8","target":{"target":{"committedDate":"2008-12-10T23:11:51Z"}}},{"name":"v2.6.28-rc9","target":{"target":{"committedDate":"2008-12-19T01:20:13Z"}}},{"name":"v2.6.28","target":{"target":{"committedDate":"2008-12-24T23:26:37Z"}}},{"name":"v2.6.29-rc1","target":{"target":{"committedDate":"2009-01-10T23:43:05Z"}}},{"name":"v2.6.29-rc2","target":{"target":{"committedDate":"2009-01-16T20:43:00Z"}}},{"name":"v2.6.29-rc3","target":{"target":{"committedDate":"2009-01-28T18:49:30Z"}}},{"name":"v2.6.29-rc4","target":{"target":{"committedDate":"2009-02-08T20:37:27Z"}}},{"name":"v2.6.29-rc5","target":{"target":{"committedDate":"2009-02-13T23:31:30Z"}}},{"name":"v2.6.29-rc6","target":{"target":{"committedDate":"2009-02-23T04:19:40Z"}}},{"name":"v2.6.29-rc7","target":{"target":{"committedDate":"2009-03-04T01:05:22Z"}}},{"name":"v2.6.29-rc8","target":{"target":{"committedDate":"2009-03-13T02:39:28Z"}}},{"name":"v2.6.29","target":{"target":{"committedDate":"2009-03-23T23:12:14Z"}}},{"name":"v2.6.30-rc1","target":{"target":{"committedDate":"2009-04-07T21:25:01Z"}}},{"name":"v2.6.30-rc2","target":{"target":{"committedDate":"2009-04-14T20:51:48Z"}}},{"name":"v2.6.30-rc3","target":{"target":{"committedDate":"2009-04-22T03:07:00Z"}}},{"name":"v2.6.30-rc4","target":{"target":{"committedDate":"2009-04-30T04:48:16Z"}}},{"name":"v2.6.30-rc5","target":{"target":{"committedDate":"2009-05-09T00:14:14Z"}}},{"name":"v2.6.30-rc6","target":{"target":{"committedDate":"2009-05-16T04:12:57Z"}}},{"name":"v2.6.30-rc7","target":{"target":{"committedDate":"2009-05-23T21:47:00Z"}}},{"name":"v2.6.30-rc8","target":{"target":{"committedDate":"2009-06-03T03:07:25Z"}}},{"name":"v2.6.30","target":{"target":{"committedDate":"2009-06-10T03:05:27Z"}}},{"name":"v2.6.31-rc1","target":{"target":{"committedDate":"2009-06-24T23:25:37Z"}}},{"name":"v2.6.31-rc2","target":{"target":{"committedDate":"2009-07-04T17:58:48Z"}}},{"name":"v2.6.31-rc3","target":{"target":{"committedDate":"2009-07-14T01:18:52Z"}}},{"name":"v2.6.31-rc4","target":{"target":{"committedDate":"2009-07-23T02:32:59Z"}}},{"name":"v2.6.31-rc5","target":{"target":{"committedDate":"2009-08-01T00:40:45Z"}}},{"name":"v2.6.31-rc6","target":{"target":{"committedDate":"2009-08-13T22:43:34Z"}}},{"name":"v2.6.31-rc7","target":{"target":{"committedDate":"2009-08-22T01:00:46Z"}}},{"name":"v2.6.31-rc8","target":{"target":{"committedDate":"2009-08-28T00:59:04Z"}}},{"name":"v2.6.31-rc9","target":{"target":{"committedDate":"2009-09-05T23:38:12Z"}}},{"name":"v2.6.31","target":{"target":{"committedDate":"2009-09-09T22:13:59Z"}}},{"name":"v2.6.32-rc1","target":{"target":{"committedDate":"2009-09-27T21:57:48Z"}}},{"name":"v2.6.32-rc2","target":{"target":{"committedDate":"2009-09-27T21:57:48Z"}}},{"name":"v2.6.32-rc3","target":{"target":{"committedDate":"2009-10-05T00:12:30Z"}}},{"name":"v2.6.32-rc4","target":{"target":{"committedDate":"2009-10-11T21:43:56Z"}}},{"name":"v2.6.32-rc5","target":{"target":{"committedDate":"2009-10-16T00:41:50Z"}}},{"name":"v2.6.32-rc6","target":{"target":{"committedDate":"2009-11-03T19:37:49Z"}}},{"name":"v2.6.32-rc7","target":{"target":{"committedDate":"2009-11-13T00:46:07Z"}}},{"name":"v2.6.32-rc8","target":{"target":{"committedDate":"2009-11-19T22:32:38Z"}}},{"name":"v2.6.32","target":{"target":{"committedDate":"2009-12-03T03:51:21Z"}}},{"name":"v2.6.33-rc1","target":{"target":{"committedDate":"2009-12-18T01:14:40Z"}}},{"name":"v2.6.33-rc2","target":{"target":{"committedDate":"2009-12-24T21:09:41Z"}}},{"name":"v2.6.33-rc3","target":{"target":{"committedDate":"2010-01-06T00:02:46Z"}}},{"name":"v2.6.33-rc4","target":{"target":{"committedDate":"2010-01-13T05:15:00Z"}}},{"name":"v2.6.33-rc5","target":{"target":{"committedDate":"2010-01-21T23:31:35Z"}}},{"name":"v2.6.33-rc6","target":{"target":{"committedDate":"2010-01-29T21:57:50Z"}}},{"name":"v2.6.33-rc7","target":{"target":{"committedDate":"2010-02-06T22:17:12Z"}}},{"name":"v2.6.33-rc8","target":{"target":{"committedDate":"2010-02-12T19:07:45Z"}}},{"name":"v2.6.33","target":{"target":{"committedDate":"2010-02-24T18:52:17Z"}}},{"name":"v2.6.34-rc1","target":{"target":{"committedDate":"2010-03-08T18:45:44Z"}}},{"name":"v2.6.34-rc2","target":{"target":{"committedDate":"2010-03-20T01:17:57Z"}}},{"name":"v2.6.34-rc3","target":{"target":{"committedDate":"2010-03-30T16:24:39Z"}}},{"name":"v2.6.34-rc4","target":{"target":{"committedDate":"2010-04-13T01:41:35Z"}}},{"name":"v2.6.34-rc5","target":{"target":{"committedDate":"2010-04-19T23:29:56Z"}}},{"name":"v2.6.34-rc6","target":{"target":{"committedDate":"2010-04-30T03:02:05Z"}}},{"name":"v2.6.34-rc7","target":{"target":{"committedDate":"2010-05-10T01:36:28Z"}}},{"name":"v2.6.34","target":{"target":{"committedDate":"2010-05-16T21:17:36Z"}}},{"name":"v2.6.35-rc1","target":{"target":{"committedDate":"2010-05-30T20:21:02Z"}}},{"name":"v2.6.35-rc2","target":{"target":{"committedDate":"2010-06-06T03:43:24Z"}}},{"name":"v2.6.35-rc3","target":{"target":{"committedDate":"2010-06-12T02:14:04Z"}}},{"name":"v2.6.35-rc4","target":{"target":{"committedDate":"2010-07-05T03:22:50Z"}}}]}}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/records/torvalds_linux_3.json b/vulnerabilities/tests/test_data/records/torvalds_linux_3.json new file mode 100644 index 000000000..6c154274a --- /dev/null +++ b/vulnerabilities/tests/test_data/records/torvalds_linux_3.json @@ -0,0 +1 @@ +{"data":{"repository":{"refs":{"totalCount":713,"pageInfo":{"endCursor":"MzAw","hasNextPage":true},"nodes":[{"name":"v2.6.35-rc5","target":{"target":{"committedDate":"2010-07-12T21:55:33Z"}}},{"name":"v2.6.35-rc6","target":{"target":{"committedDate":"2010-07-22T19:13:38Z"}}},{"name":"v2.6.35","target":{"target":{"committedDate":"2010-08-01T22:11:14Z"}}},{"name":"v2.6.36-rc1","target":{"target":{"committedDate":"2010-08-16T00:41:37Z"}}},{"name":"v2.6.36-rc2","target":{"target":{"committedDate":"2010-08-23T00:43:29Z"}}},{"name":"v2.6.36-rc3","target":{"target":{"committedDate":"2010-08-29T15:36:04Z"}}},{"name":"v2.6.36-rc4","target":{"target":{"committedDate":"2010-09-12T23:07:37Z"}}},{"name":"v2.6.36-rc5","target":{"target":{"committedDate":"2010-09-20T23:56:53Z"}}},{"name":"v2.6.36-rc6","target":{"target":{"committedDate":"2010-09-29T01:01:22Z"}}},{"name":"v2.6.36-rc7","target":{"target":{"committedDate":"2010-10-06T20:39:52Z"}}},{"name":"v2.6.36-rc8","target":{"target":{"committedDate":"2010-10-14T23:26:43Z"}}},{"name":"v2.6.36","target":{"target":{"committedDate":"2010-10-20T20:30:22Z"}}},{"name":"v2.6.37-rc1","target":{"target":{"committedDate":"2010-11-01T11:54:12Z"}}},{"name":"v2.6.37-rc2","target":{"target":{"committedDate":"2010-11-16T02:31:02Z"}}},{"name":"v2.6.37-rc3","target":{"target":{"committedDate":"2010-11-21T23:18:56Z"}}},{"name":"v2.6.37-rc4","target":{"target":{"committedDate":"2010-11-30T04:42:04Z"}}},{"name":"v2.6.37-rc5","target":{"target":{"committedDate":"2010-12-07T04:09:04Z"}}},{"name":"v2.6.37-rc6","target":{"target":{"committedDate":"2010-12-16T01:24:48Z"}}},{"name":"v2.6.37-rc7","target":{"target":{"committedDate":"2010-12-21T19:26:40Z"}}},{"name":"v2.6.37-rc8","target":{"target":{"committedDate":"2010-12-29T01:05:48Z"}}},{"name":"v2.6.37","target":{"target":{"committedDate":"2011-01-05T00:50:19Z"}}},{"name":"v2.6.38-rc1","target":{"target":{"committedDate":"2011-01-18T23:14:02Z"}}},{"name":"v2.6.38-rc2","target":{"target":{"committedDate":"2011-01-22T03:01:34Z"}}},{"name":"v2.6.38-rc3","target":{"target":{"committedDate":"2011-02-01T03:05:49Z"}}},{"name":"v2.6.38-rc4","target":{"target":{"committedDate":"2011-02-08T00:03:55Z"}}},{"name":"v2.6.38-rc5","target":{"target":{"committedDate":"2011-02-16T03:23:45Z"}}},{"name":"v2.6.38-rc6","target":{"target":{"committedDate":"2011-02-22T01:25:52Z"}}},{"name":"v2.6.38-rc7","target":{"target":{"committedDate":"2011-03-01T21:55:12Z"}}},{"name":"v2.6.38-rc8","target":{"target":{"committedDate":"2011-03-08T05:09:37Z"}}},{"name":"v2.6.38","target":{"target":{"committedDate":"2011-03-15T01:20:32Z"}}},{"name":"v2.6.39-rc1","target":{"target":{"committedDate":"2011-03-29T19:09:47Z"}}},{"name":"v2.6.39-rc2","target":{"target":{"committedDate":"2011-04-06T01:30:43Z"}}},{"name":"v2.6.39-rc3","target":{"target":{"committedDate":"2011-04-12T00:21:51Z"}}},{"name":"v2.6.39-rc4","target":{"target":{"committedDate":"2011-04-19T04:26:00Z"}}},{"name":"v2.6.39-rc5","target":{"target":{"committedDate":"2011-04-27T03:48:50Z"}}},{"name":"v2.6.39-rc6","target":{"target":{"committedDate":"2011-05-04T02:59:13Z"}}},{"name":"v2.6.39-rc7","target":{"target":{"committedDate":"2011-05-10T02:33:54Z"}}},{"name":"v2.6.39","target":{"target":{"committedDate":"2011-05-19T04:06:34Z"}}},{"name":"v3.0-rc1","target":{"target":{"committedDate":"2011-05-30T00:43:36Z"}}},{"name":"v3.0-rc2","target":{"target":{"committedDate":"2011-06-06T09:06:33Z"}}},{"name":"v3.0-rc3","target":{"target":{"committedDate":"2011-06-13T22:29:59Z"}}},{"name":"v3.0-rc4","target":{"target":{"committedDate":"2011-06-21T03:25:46Z"}}},{"name":"v3.0-rc5","target":{"target":{"committedDate":"2011-06-28T02:12:22Z"}}},{"name":"v3.0-rc6","target":{"target":{"committedDate":"2011-07-04T22:56:24Z"}}},{"name":"v3.0-rc7","target":{"target":{"committedDate":"2011-07-11T23:51:52Z"}}},{"name":"v3.0","target":{"target":{"committedDate":"2011-07-22T02:17:23Z"}}},{"name":"v3.1-rc1","target":{"target":{"committedDate":"2011-08-08T01:23:30Z"}}},{"name":"v3.1-rc2","target":{"target":{"committedDate":"2011-08-14T22:09:08Z"}}},{"name":"v3.1-rc3","target":{"target":{"committedDate":"2011-08-22T18:42:53Z"}}},{"name":"v3.1-rc4","target":{"target":{"committedDate":"2011-08-29T04:16:01Z"}}},{"name":"v3.1-rc5","target":{"target":{"committedDate":"2011-09-04T22:45:10Z"}}},{"name":"v3.1-rc6","target":{"target":{"committedDate":"2011-09-12T21:02:02Z"}}},{"name":"v3.1-rc7","target":{"target":{"committedDate":"2011-09-21T23:58:15Z"}}},{"name":"v3.1-rc8","target":{"target":{"committedDate":"2011-09-27T22:48:34Z"}}},{"name":"v3.1-rc9","target":{"target":{"committedDate":"2011-10-05T01:11:50Z"}}},{"name":"v3.1-rc10","target":{"target":{"committedDate":"2011-10-18T04:06:23Z"}}},{"name":"v3.1","target":{"target":{"committedDate":"2011-10-24T07:10:05Z"}}},{"name":"v3.2-rc1","target":{"target":{"committedDate":"2011-11-08T00:16:02Z"}}},{"name":"v3.2-rc2","target":{"target":{"committedDate":"2011-11-15T17:02:59Z"}}},{"name":"v3.2-rc3","target":{"target":{"committedDate":"2011-11-24T04:20:28Z"}}},{"name":"v3.2-rc4","target":{"target":{"committedDate":"2011-12-01T22:56:01Z"}}},{"name":"v3.2-rc5","target":{"target":{"committedDate":"2011-12-09T23:09:32Z"}}},{"name":"v3.2-rc6","target":{"target":{"committedDate":"2011-12-17T02:36:26Z"}}},{"name":"v3.2-rc7","target":{"target":{"committedDate":"2011-12-24T05:51:06Z"}}},{"name":"v3.2","target":{"target":{"committedDate":"2012-01-04T23:55:44Z"}}},{"name":"v3.3-rc1","target":{"target":{"committedDate":"2012-01-19T23:04:48Z"}}},{"name":"v3.3-rc2","target":{"target":{"committedDate":"2012-01-31T21:31:54Z"}}},{"name":"v3.3-rc3","target":{"target":{"committedDate":"2012-02-09T03:21:53Z"}}},{"name":"v3.3-rc4","target":{"target":{"committedDate":"2012-02-18T23:53:33Z"}}},{"name":"v3.3-rc5","target":{"target":{"committedDate":"2012-02-25T20:18:16Z"}}},{"name":"v3.3-rc6","target":{"target":{"committedDate":"2012-03-04T01:08:09Z"}}},{"name":"v3.3-rc7","target":{"target":{"committedDate":"2012-03-10T21:49:52Z"}}},{"name":"v3.3","target":{"target":{"committedDate":"2012-03-18T23:15:34Z"}}},{"name":"v3.4-rc1","target":{"target":{"committedDate":"2012-03-31T23:24:09Z"}}},{"name":"v3.4-rc2","target":{"target":{"committedDate":"2012-04-08T01:30:41Z"}}},{"name":"v3.4-rc3","target":{"target":{"committedDate":"2012-04-16T01:28:29Z"}}},{"name":"v3.4-rc4","target":{"target":{"committedDate":"2012-04-21T21:47:52Z"}}},{"name":"v3.4-rc5","target":{"target":{"committedDate":"2012-04-29T22:19:10Z"}}},{"name":"v3.4-rc6","target":{"target":{"committedDate":"2012-05-06T22:07:32Z"}}},{"name":"v3.4-rc7","target":{"target":{"committedDate":"2012-05-13T01:37:47Z"}}},{"name":"v3.4","target":{"target":{"committedDate":"2012-05-20T22:29:13Z"}}},{"name":"v3.5-rc1","target":{"target":{"committedDate":"2012-06-03T01:29:26Z"}}},{"name":"v3.5-rc2","target":{"target":{"committedDate":"2012-06-09T01:40:09Z"}}},{"name":"v3.5-rc3","target":{"target":{"committedDate":"2012-06-17T00:25:17Z"}}},{"name":"v3.5-rc4","target":{"target":{"committedDate":"2012-06-24T19:53:04Z"}}},{"name":"v3.5-rc5","target":{"target":{"committedDate":"2012-06-30T23:08:57Z"}}},{"name":"v3.5-rc6","target":{"target":{"committedDate":"2012-07-08T00:23:56Z"}}},{"name":"v3.5-rc7","target":{"target":{"committedDate":"2012-07-14T22:40:28Z"}}},{"name":"v3.5","target":{"target":{"committedDate":"2012-07-21T20:58:29Z"}}},{"name":"v3.6-rc1","target":{"target":{"committedDate":"2012-08-02T23:38:10Z"}}},{"name":"v3.6-rc2","target":{"target":{"committedDate":"2012-08-16T21:51:24Z"}}},{"name":"v3.6-rc3","target":{"target":{"committedDate":"2012-08-22T20:29:06Z"}}},{"name":"v3.6-rc4","target":{"target":{"committedDate":"2012-09-01T17:39:58Z"}}},{"name":"v3.6-rc5","target":{"target":{"committedDate":"2012-09-08T23:43:45Z"}}},{"name":"v3.6-rc6","target":{"target":{"committedDate":"2012-09-16T21:58:51Z"}}},{"name":"v3.6-rc7","target":{"target":{"committedDate":"2012-09-24T01:10:57Z"}}},{"name":"v3.6","target":{"target":{"committedDate":"2012-09-30T23:47:46Z"}}},{"name":"v3.7-rc1","target":{"target":{"committedDate":"2012-10-14T21:41:04Z"}}},{"name":"v3.7-rc2","target":{"target":{"committedDate":"2012-10-20T19:11:32Z"}}},{"name":"v3.7-rc3","target":{"target":{"committedDate":"2012-10-28T19:24:48Z"}}}]}}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/records/torvalds_linux_4.json b/vulnerabilities/tests/test_data/records/torvalds_linux_4.json new file mode 100644 index 000000000..8ec110629 --- /dev/null +++ b/vulnerabilities/tests/test_data/records/torvalds_linux_4.json @@ -0,0 +1 @@ +{"data":{"repository":{"refs":{"totalCount":713,"pageInfo":{"endCursor":"NDAw","hasNextPage":true},"nodes":[{"name":"v3.7-rc4","target":{"target":{"committedDate":"2012-11-04T19:07:39Z"}}},{"name":"v3.7-rc5","target":{"target":{"committedDate":"2012-11-11T12:44:33Z"}}},{"name":"v3.7-rc6","target":{"target":{"committedDate":"2012-11-17T01:42:40Z"}}},{"name":"v3.7-rc7","target":{"target":{"committedDate":"2012-11-26T01:59:19Z"}}},{"name":"v3.7-rc8","target":{"target":{"committedDate":"2012-12-03T19:22:37Z"}}},{"name":"v3.7","target":{"target":{"committedDate":"2012-12-11T03:30:57Z"}}},{"name":"v3.8-rc1","target":{"target":{"committedDate":"2012-12-22T01:19:00Z"}}},{"name":"v3.8-rc2","target":{"target":{"committedDate":"2013-01-03T02:13:21Z"}}},{"name":"v3.8-rc3","target":{"target":{"committedDate":"2013-01-10T02:59:55Z"}}},{"name":"v3.8-rc4","target":{"target":{"committedDate":"2013-01-18T03:25:45Z"}}},{"name":"v3.8-rc5","target":{"target":{"committedDate":"2013-01-25T19:57:28Z"}}},{"name":"v3.8-rc6","target":{"target":{"committedDate":"2013-02-01T01:08:14Z"}}},{"name":"v3.8-rc7","target":{"target":{"committedDate":"2013-02-08T21:20:39Z"}}},{"name":"v3.8","target":{"target":{"committedDate":"2013-02-18T23:58:34Z"}}},{"name":"v3.9-rc1","target":{"target":{"committedDate":"2013-03-03T23:11:05Z"}}},{"name":"v3.9-rc2","target":{"target":{"committedDate":"2013-03-10T23:54:19Z"}}},{"name":"v3.9-rc3","target":{"target":{"committedDate":"2013-03-17T22:59:32Z"}}},{"name":"v3.9-rc4","target":{"target":{"committedDate":"2013-03-23T23:52:44Z"}}},{"name":"v3.9-rc5","target":{"target":{"committedDate":"2013-03-31T22:12:43Z"}}},{"name":"v3.9-rc6","target":{"target":{"committedDate":"2013-04-08T03:49:54Z"}}},{"name":"v3.9-rc7","target":{"target":{"committedDate":"2013-04-15T00:45:16Z"}}},{"name":"v3.9-rc8","target":{"target":{"committedDate":"2013-04-21T21:38:45Z"}}},{"name":"v3.9","target":{"target":{"committedDate":"2013-04-29T00:36:01Z"}}},{"name":"v3.10-rc1","target":{"target":{"committedDate":"2013-05-12T00:14:08Z"}}},{"name":"v3.10-rc2","target":{"target":{"committedDate":"2013-05-20T21:37:38Z"}}},{"name":"v3.10-rc3","target":{"target":{"committedDate":"2013-05-26T23:00:47Z"}}},{"name":"v3.10-rc4","target":{"target":{"committedDate":"2013-06-02T08:11:17Z"}}},{"name":"v3.10-rc5","target":{"target":{"committedDate":"2013-06-09T00:41:04Z"}}},{"name":"v3.10-rc6","target":{"target":{"committedDate":"2013-06-15T21:51:07Z"}}},{"name":"v3.10-rc7","target":{"target":{"committedDate":"2013-06-22T19:47:31Z"}}},{"name":"v3.10","target":{"target":{"committedDate":"2013-06-30T22:13:29Z"}}},{"name":"v3.11-rc1","target":{"target":{"committedDate":"2013-07-14T22:18:27Z"}}},{"name":"v3.11-rc2","target":{"target":{"committedDate":"2013-07-21T19:05:29Z"}}},{"name":"v3.11-rc3","target":{"target":{"committedDate":"2013-07-29T03:53:33Z"}}},{"name":"v3.11-rc4","target":{"target":{"committedDate":"2013-08-04T20:46:46Z"}}},{"name":"v3.11-rc5","target":{"target":{"committedDate":"2013-08-12T01:04:20Z"}}},{"name":"v3.11-rc6","target":{"target":{"committedDate":"2013-08-18T21:36:53Z"}}},{"name":"v3.11-rc7","target":{"target":{"committedDate":"2013-08-26T00:43:22Z"}}},{"name":"v3.11","target":{"target":{"committedDate":"2013-09-02T20:46:10Z"}}},{"name":"v3.12-rc1","target":{"target":{"committedDate":"2013-09-16T20:17:51Z"}}},{"name":"v3.12-rc2","target":{"target":{"committedDate":"2013-09-23T22:41:09Z"}}},{"name":"v3.12-rc3","target":{"target":{"committedDate":"2013-09-29T22:02:38Z"}}},{"name":"v3.12-rc4","target":{"target":{"committedDate":"2013-10-06T21:00:20Z"}}},{"name":"v3.12-rc5","target":{"target":{"committedDate":"2013-10-13T22:41:28Z"}}},{"name":"v3.12-rc6","target":{"target":{"committedDate":"2013-10-19T19:28:15Z"}}},{"name":"v3.12-rc7","target":{"target":{"committedDate":"2013-10-27T23:12:03Z"}}},{"name":"v3.12","target":{"target":{"committedDate":"2013-11-03T23:41:51Z"}}},{"name":"v3.13-rc1","target":{"target":{"committedDate":"2013-11-22T19:30:55Z"}}},{"name":"v3.13-rc2","target":{"target":{"committedDate":"2013-11-29T20:57:14Z"}}},{"name":"v3.13-rc3","target":{"target":{"committedDate":"2013-12-06T17:34:04Z"}}},{"name":"v3.13-rc4","target":{"target":{"committedDate":"2013-12-15T20:31:33Z"}}},{"name":"v3.13-rc5","target":{"target":{"committedDate":"2013-12-22T21:08:32Z"}}},{"name":"v3.13-rc6","target":{"target":{"committedDate":"2013-12-30T00:01:33Z"}}},{"name":"v3.13-rc7","target":{"target":{"committedDate":"2014-01-04T23:12:14Z"}}},{"name":"v3.13-rc8","target":{"target":{"committedDate":"2014-01-12T10:04:18Z"}}},{"name":"v3.13","target":{"target":{"committedDate":"2014-01-20T02:40:07Z"}}},{"name":"v3.14-rc1","target":{"target":{"committedDate":"2014-02-03T00:42:13Z"}}},{"name":"v3.14-rc2","target":{"target":{"committedDate":"2014-02-10T02:15:47Z"}}},{"name":"v3.14-rc3","target":{"target":{"committedDate":"2014-02-16T21:30:25Z"}}},{"name":"v3.14-rc4","target":{"target":{"committedDate":"2014-02-24T01:40:03Z"}}},{"name":"v3.14-rc5","target":{"target":{"committedDate":"2014-03-03T02:56:16Z"}}},{"name":"v3.14-rc6","target":{"target":{"committedDate":"2014-03-10T02:41:57Z"}}},{"name":"v3.14-rc7","target":{"target":{"committedDate":"2014-03-17T01:51:24Z"}}},{"name":"v3.14-rc8","target":{"target":{"committedDate":"2014-03-25T02:31:17Z"}}},{"name":"v3.14","target":{"target":{"committedDate":"2014-03-31T03:40:15Z"}}},{"name":"v3.15-rc1","target":{"target":{"committedDate":"2014-04-13T21:18:35Z"}}},{"name":"v3.15-rc2","target":{"target":{"committedDate":"2014-04-20T18:08:50Z"}}},{"name":"v3.15-rc3","target":{"target":{"committedDate":"2014-04-28T02:29:27Z"}}},{"name":"v3.15-rc4","target":{"target":{"committedDate":"2014-05-05T01:14:42Z"}}},{"name":"v3.15-rc5","target":{"target":{"committedDate":"2014-05-09T20:10:52Z"}}},{"name":"v3.15-rc6","target":{"target":{"committedDate":"2014-05-21T21:42:02Z"}}},{"name":"v3.15-rc7","target":{"target":{"committedDate":"2014-05-25T23:06:00Z"}}},{"name":"v3.15-rc8","target":{"target":{"committedDate":"2014-06-02T02:12:24Z"}}},{"name":"v3.15","target":{"target":{"committedDate":"2014-06-08T18:19:54Z"}}},{"name":"v3.16-rc1","target":{"target":{"committedDate":"2014-06-16T03:45:28Z"}}},{"name":"v3.16-rc2","target":{"target":{"committedDate":"2014-06-22T05:02:54Z"}}},{"name":"v3.16-rc3","target":{"target":{"committedDate":"2014-06-29T21:11:36Z"}}},{"name":"v3.16-rc4","target":{"target":{"committedDate":"2014-07-06T19:37:51Z"}}},{"name":"v3.16-rc5","target":{"target":{"committedDate":"2014-07-13T21:04:33Z"}}},{"name":"v3.16-rc6","target":{"target":{"committedDate":"2014-07-21T04:04:16Z"}}},{"name":"v3.16-rc7","target":{"target":{"committedDate":"2014-07-27T19:41:55Z"}}},{"name":"v3.16","target":{"target":{"committedDate":"2014-08-03T22:25:02Z"}}},{"name":"v3.17-rc1","target":{"target":{"committedDate":"2014-08-16T16:40:26Z"}}},{"name":"v3.17-rc2","target":{"target":{"committedDate":"2014-08-25T22:36:20Z"}}},{"name":"v3.17-rc3","target":{"target":{"committedDate":"2014-09-01T01:23:04Z"}}},{"name":"v3.17-rc4","target":{"target":{"committedDate":"2014-09-07T23:09:43Z"}}},{"name":"v3.17-rc5","target":{"target":{"committedDate":"2014-09-15T00:50:12Z"}}},{"name":"v3.17-rc6","target":{"target":{"committedDate":"2014-09-21T22:43:02Z"}}},{"name":"v3.17-rc7","target":{"target":{"committedDate":"2014-09-28T21:29:07Z"}}},{"name":"v3.17","target":{"target":{"committedDate":"2014-10-05T19:23:04Z"}}},{"name":"v3.18-rc1","target":{"target":{"committedDate":"2014-10-20T01:08:38Z"}}},{"name":"v3.18-rc2","target":{"target":{"committedDate":"2014-10-26T23:48:41Z"}}},{"name":"v3.18-rc3","target":{"target":{"committedDate":"2014-11-02T23:01:51Z"}}},{"name":"v3.18-rc4","target":{"target":{"committedDate":"2014-11-09T22:55:29Z"}}},{"name":"v3.18-rc5","target":{"target":{"committedDate":"2014-11-17T00:36:20Z"}}},{"name":"v3.18-rc6","target":{"target":{"committedDate":"2014-11-23T23:25:20Z"}}},{"name":"v3.18-rc7","target":{"target":{"committedDate":"2014-12-01T00:42:27Z"}}},{"name":"v3.18","target":{"target":{"committedDate":"2014-12-07T22:21:05Z"}}},{"name":"v3.19-rc1","target":{"target":{"committedDate":"2014-12-21T01:08:50Z"}}},{"name":"v3.19-rc2","target":{"target":{"committedDate":"2014-12-29T00:49:37Z"}}}]}}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/records/torvalds_linux_5.json b/vulnerabilities/tests/test_data/records/torvalds_linux_5.json new file mode 100644 index 000000000..8019df785 --- /dev/null +++ b/vulnerabilities/tests/test_data/records/torvalds_linux_5.json @@ -0,0 +1 @@ +{"data":{"repository":{"refs":{"totalCount":713,"pageInfo":{"endCursor":"NTAw","hasNextPage":true},"nodes":[{"name":"v3.19-rc3","target":{"target":{"committedDate":"2015-01-06T01:05:20Z"}}},{"name":"v3.19-rc4","target":{"target":{"committedDate":"2015-01-11T20:44:53Z"}}},{"name":"v3.19-rc5","target":{"target":{"committedDate":"2015-01-18T06:02:20Z"}}},{"name":"v3.19-rc6","target":{"target":{"committedDate":"2015-01-26T04:04:41Z"}}},{"name":"v3.19-rc7","target":{"target":{"committedDate":"2015-02-02T04:07:21Z"}}},{"name":"v3.19","target":{"target":{"committedDate":"2015-02-09T02:54:22Z"}}},{"name":"v4.0-rc1","target":{"target":{"committedDate":"2015-02-23T02:21:14Z"}}},{"name":"v4.0-rc2","target":{"target":{"committedDate":"2015-03-03T17:04:59Z"}}},{"name":"v4.0-rc3","target":{"target":{"committedDate":"2015-03-08T23:09:09Z"}}},{"name":"v4.0-rc4","target":{"target":{"committedDate":"2015-03-16T00:38:20Z"}}},{"name":"v4.0-rc5","target":{"target":{"committedDate":"2015-03-22T23:50:21Z"}}},{"name":"v4.0-rc6","target":{"target":{"committedDate":"2015-03-29T22:26:31Z"}}},{"name":"v4.0-rc7","target":{"target":{"committedDate":"2015-04-06T22:39:45Z"}}},{"name":"v4.0","target":{"target":{"committedDate":"2015-04-12T22:12:50Z"}}},{"name":"v4.1-rc1","target":{"target":{"committedDate":"2015-04-27T00:59:10Z"}}},{"name":"v4.1-rc2","target":{"target":{"committedDate":"2015-05-04T02:22:23Z"}}},{"name":"v4.1-rc3","target":{"target":{"committedDate":"2015-05-10T22:12:29Z"}}},{"name":"v4.1-rc4","target":{"target":{"committedDate":"2015-05-18T17:13:47Z"}}},{"name":"v4.1-rc5","target":{"target":{"committedDate":"2015-05-25T01:22:35Z"}}},{"name":"v4.1-rc6","target":{"target":{"committedDate":"2015-06-01T02:01:07Z"}}},{"name":"v4.1-rc7","target":{"target":{"committedDate":"2015-06-08T03:23:50Z"}}},{"name":"v4.1-rc8","target":{"target":{"committedDate":"2015-06-15T01:51:10Z"}}},{"name":"v4.1","target":{"target":{"committedDate":"2015-06-22T05:05:43Z"}}},{"name":"v4.2-rc1","target":{"target":{"committedDate":"2015-07-05T18:01:52Z"}}},{"name":"v4.2-rc2","target":{"target":{"committedDate":"2015-07-12T22:10:30Z"}}},{"name":"v4.2-rc3","target":{"target":{"committedDate":"2015-07-19T21:45:02Z"}}},{"name":"v4.2-rc4","target":{"target":{"committedDate":"2015-07-26T19:26:21Z"}}},{"name":"v4.2-rc5","target":{"target":{"committedDate":"2015-08-03T01:34:55Z"}}},{"name":"v4.2-rc6","target":{"target":{"committedDate":"2015-08-09T19:54:30Z"}}},{"name":"v4.2-rc7","target":{"target":{"committedDate":"2015-08-16T23:34:13Z"}}},{"name":"v4.2-rc8","target":{"target":{"committedDate":"2015-08-24T03:52:59Z"}}},{"name":"v4.2","target":{"target":{"committedDate":"2015-08-30T18:34:09Z"}}},{"name":"v4.3-rc1","target":{"target":{"committedDate":"2015-09-12T23:35:56Z"}}},{"name":"v4.3-rc2","target":{"target":{"committedDate":"2015-09-20T21:32:34Z"}}},{"name":"v4.3-rc3","target":{"target":{"committedDate":"2015-09-27T11:50:08Z"}}},{"name":"v4.3-rc4","target":{"target":{"committedDate":"2015-10-04T15:57:17Z"}}},{"name":"v4.3-rc5","target":{"target":{"committedDate":"2015-10-11T18:09:45Z"}}},{"name":"v4.3-rc6","target":{"target":{"committedDate":"2015-10-18T23:08:42Z"}}},{"name":"v4.3-rc7","target":{"target":{"committedDate":"2015-10-25T01:39:47Z"}}},{"name":"v4.3","target":{"target":{"committedDate":"2015-11-02T00:05:25Z"}}},{"name":"v4.4-rc1","target":{"target":{"committedDate":"2015-11-16T01:00:27Z"}}},{"name":"v4.4-rc2","target":{"target":{"committedDate":"2015-11-23T00:45:59Z"}}},{"name":"v4.4-rc3","target":{"target":{"committedDate":"2015-11-30T02:58:26Z"}}},{"name":"v4.4-rc4","target":{"target":{"committedDate":"2015-12-06T23:43:12Z"}}},{"name":"v4.4-rc5","target":{"target":{"committedDate":"2015-12-14T01:42:58Z"}}},{"name":"v4.4-rc6","target":{"target":{"committedDate":"2015-12-21T00:06:09Z"}}},{"name":"v4.4-rc7","target":{"target":{"committedDate":"2015-12-28T02:17:37Z"}}},{"name":"v4.4-rc8","target":{"target":{"committedDate":"2016-01-03T23:15:37Z"}}},{"name":"v4.4","target":{"target":{"committedDate":"2016-01-10T23:01:32Z"}}},{"name":"v4.5-rc1","target":{"target":{"committedDate":"2016-01-24T21:06:47Z"}}},{"name":"v4.5-rc2","target":{"target":{"committedDate":"2016-02-01T02:12:16Z"}}},{"name":"v4.5-rc3","target":{"target":{"committedDate":"2016-02-07T23:38:30Z"}}},{"name":"v4.5-rc4","target":{"target":{"committedDate":"2016-02-14T21:05:20Z"}}},{"name":"v4.5-rc5","target":{"target":{"committedDate":"2016-02-20T21:39:35Z"}}},{"name":"v4.5-rc6","target":{"target":{"committedDate":"2016-02-28T16:41:20Z"}}},{"name":"v4.5-rc7","target":{"target":{"committedDate":"2016-03-06T22:48:03Z"}}},{"name":"v4.5","target":{"target":{"committedDate":"2016-03-14T04:28:54Z"}}},{"name":"v4.6-rc1","target":{"target":{"committedDate":"2016-03-26T23:03:24Z"}}},{"name":"v4.6-rc2","target":{"target":{"committedDate":"2016-04-03T14:09:40Z"}}},{"name":"v4.6-rc3","target":{"target":{"committedDate":"2016-04-11T00:58:30Z"}}},{"name":"v4.6-rc4","target":{"target":{"committedDate":"2016-04-18T02:13:32Z"}}},{"name":"v4.6-rc5","target":{"target":{"committedDate":"2016-04-24T23:17:05Z"}}},{"name":"v4.6-rc6","target":{"target":{"committedDate":"2016-05-01T22:52:31Z"}}},{"name":"v4.6-rc7","target":{"target":{"committedDate":"2016-05-08T21:38:32Z"}}},{"name":"v4.6","target":{"target":{"committedDate":"2016-05-15T22:43:13Z"}}},{"name":"v4.7-rc1","target":{"target":{"committedDate":"2016-05-29T16:29:24Z"}}},{"name":"v4.7-rc2","target":{"target":{"committedDate":"2016-06-05T21:31:26Z"}}},{"name":"v4.7-rc3","target":{"target":{"committedDate":"2016-06-12T14:20:35Z"}}},{"name":"v4.7-rc4","target":{"target":{"committedDate":"2016-06-20T04:30:02Z"}}},{"name":"v4.7-rc5","target":{"target":{"committedDate":"2016-06-27T00:52:03Z"}}},{"name":"v4.7-rc6","target":{"target":{"committedDate":"2016-07-04T06:01:00Z"}}},{"name":"v4.7-rc7","target":{"target":{"committedDate":"2016-07-11T03:24:59Z"}}},{"name":"v4.7","target":{"target":{"committedDate":"2016-07-24T19:23:50Z"}}},{"name":"v4.8-rc1","target":{"target":{"committedDate":"2016-08-08T01:18:00Z"}}},{"name":"v4.8-rc2","target":{"target":{"committedDate":"2016-08-15T02:11:36Z"}}},{"name":"v4.8-rc3","target":{"target":{"committedDate":"2016-08-21T23:14:10Z"}}},{"name":"v4.8-rc4","target":{"target":{"committedDate":"2016-08-28T22:04:33Z"}}},{"name":"v4.8-rc5","target":{"target":{"committedDate":"2016-09-04T21:31:46Z"}}},{"name":"v4.8-rc6","target":{"target":{"committedDate":"2016-09-12T03:02:25Z"}}},{"name":"v4.8-rc7","target":{"target":{"committedDate":"2016-09-19T00:27:41Z"}}},{"name":"v4.8-rc8","target":{"target":{"committedDate":"2016-09-26T01:47:13Z"}}},{"name":"v4.8","target":{"target":{"committedDate":"2016-10-02T23:24:33Z"}}},{"name":"v4.9-rc1","target":{"target":{"committedDate":"2016-10-15T19:17:50Z"}}},{"name":"v4.9-rc2","target":{"target":{"committedDate":"2016-10-24T00:10:14Z"}}},{"name":"v4.9-rc3","target":{"target":{"committedDate":"2016-10-29T20:52:02Z"}}},{"name":"v4.9-rc4","target":{"target":{"committedDate":"2016-11-05T23:23:36Z"}}},{"name":"v4.9-rc5","target":{"target":{"committedDate":"2016-11-13T18:32:32Z"}}},{"name":"v4.9-rc6","target":{"target":{"committedDate":"2016-11-20T21:52:19Z"}}},{"name":"v4.9-rc7","target":{"target":{"committedDate":"2016-11-27T21:08:04Z"}}},{"name":"v4.9-rc8","target":{"target":{"committedDate":"2016-12-04T20:50:51Z"}}},{"name":"v4.9","target":{"target":{"committedDate":"2016-12-11T19:17:54Z"}}},{"name":"v4.10-rc1","target":{"target":{"committedDate":"2016-12-26T00:13:08Z"}}},{"name":"v4.10-rc2","target":{"target":{"committedDate":"2017-01-01T22:31:53Z"}}},{"name":"v4.10-rc3","target":{"target":{"committedDate":"2017-01-08T22:18:17Z"}}},{"name":"v4.10-rc4","target":{"target":{"committedDate":"2017-01-16T00:21:59Z"}}},{"name":"v4.10-rc5","target":{"target":{"committedDate":"2017-01-22T20:54:15Z"}}},{"name":"v4.10-rc6","target":{"target":{"committedDate":"2017-01-29T22:25:17Z"}}},{"name":"v4.10-rc7","target":{"target":{"committedDate":"2017-02-05T23:10:58Z"}}},{"name":"v4.10-rc8","target":{"target":{"committedDate":"2017-02-12T21:03:20Z"}}},{"name":"v4.10","target":{"target":{"committedDate":"2017-02-19T22:34:00Z"}}}]}}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/records/torvalds_linux_6.json b/vulnerabilities/tests/test_data/records/torvalds_linux_6.json new file mode 100644 index 000000000..4c6914284 --- /dev/null +++ b/vulnerabilities/tests/test_data/records/torvalds_linux_6.json @@ -0,0 +1 @@ +{"data":{"repository":{"refs":{"totalCount":713,"pageInfo":{"endCursor":"NjAw","hasNextPage":true},"nodes":[{"name":"v4.11-rc1","target":{"target":{"committedDate":"2017-03-05T20:59:56Z"}}},{"name":"v4.11-rc2","target":{"target":{"committedDate":"2017-03-12T21:47:08Z"}}},{"name":"v4.11-rc3","target":{"target":{"committedDate":"2017-03-20T02:09:39Z"}}},{"name":"v4.11-rc4","target":{"target":{"committedDate":"2017-03-26T21:15:16Z"}}},{"name":"v4.11-rc5","target":{"target":{"committedDate":"2017-04-03T00:23:54Z"}}},{"name":"v4.11-rc6","target":{"target":{"committedDate":"2017-04-09T16:49:44Z"}}},{"name":"v4.11-rc7","target":{"target":{"committedDate":"2017-04-16T20:00:18Z"}}},{"name":"v4.11-rc8","target":{"target":{"committedDate":"2017-04-23T23:53:00Z"}}},{"name":"v4.11","target":{"target":{"committedDate":"2017-05-01T02:47:48Z"}}},{"name":"v4.12-rc1","target":{"target":{"committedDate":"2017-05-13T20:19:49Z"}}},{"name":"v4.12-rc2","target":{"target":{"committedDate":"2017-05-22T02:30:23Z"}}},{"name":"v4.12-rc3","target":{"target":{"committedDate":"2017-05-29T00:20:53Z"}}},{"name":"v4.12-rc4","target":{"target":{"committedDate":"2017-06-04T23:47:43Z"}}},{"name":"v4.12-rc5","target":{"target":{"committedDate":"2017-06-11T23:48:20Z"}}},{"name":"v4.12-rc6","target":{"target":{"committedDate":"2017-06-19T14:19:37Z"}}},{"name":"v4.12-rc7","target":{"target":{"committedDate":"2017-06-26T01:30:05Z"}}},{"name":"v4.12","target":{"target":{"committedDate":"2017-07-02T23:07:02Z"}}},{"name":"v4.13-rc1","target":{"target":{"committedDate":"2017-07-15T22:22:10Z"}}},{"name":"v4.13-rc2","target":{"target":{"committedDate":"2017-07-23T23:15:17Z"}}},{"name":"v4.13-rc3","target":{"target":{"committedDate":"2017-07-30T19:40:36Z"}}},{"name":"v4.13-rc4","target":{"target":{"committedDate":"2017-08-07T01:44:49Z"}}},{"name":"v4.13-rc5","target":{"target":{"committedDate":"2017-08-13T23:01:32Z"}}},{"name":"v4.13-rc6","target":{"target":{"committedDate":"2017-08-20T21:13:52Z"}}},{"name":"v4.13-rc7","target":{"target":{"committedDate":"2017-08-28T00:20:40Z"}}},{"name":"v4.13","target":{"target":{"committedDate":"2017-09-03T20:56:17Z"}}},{"name":"v4.14-rc1","target":{"target":{"committedDate":"2017-09-16T22:47:51Z"}}},{"name":"v4.14-rc2","target":{"target":{"committedDate":"2017-09-24T23:38:56Z"}}},{"name":"v4.14-rc3","target":{"target":{"committedDate":"2017-10-01T21:54:54Z"}}},{"name":"v4.14-rc4","target":{"target":{"committedDate":"2017-10-09T03:53:29Z"}}},{"name":"v4.14-rc5","target":{"target":{"committedDate":"2017-10-16T01:01:12Z"}}},{"name":"v4.14-rc6","target":{"target":{"committedDate":"2017-10-23T10:49:47Z"}}},{"name":"v4.14-rc7","target":{"target":{"committedDate":"2017-10-29T20:58:38Z"}}},{"name":"v4.14-rc8","target":{"target":{"committedDate":"2017-11-05T21:05:14Z"}}},{"name":"v4.14","target":{"target":{"committedDate":"2017-11-12T18:46:13Z"}}},{"name":"v4.15-rc1","target":{"target":{"committedDate":"2017-11-27T00:01:47Z"}}},{"name":"v4.15-rc2","target":{"target":{"committedDate":"2017-12-03T16:01:47Z"}}},{"name":"v4.15-rc3","target":{"target":{"committedDate":"2017-12-11T01:56:26Z"}}},{"name":"v4.15-rc4","target":{"target":{"committedDate":"2017-12-18T02:59:59Z"}}},{"name":"v4.15-rc5","target":{"target":{"committedDate":"2017-12-24T04:47:16Z"}}},{"name":"v4.15-rc6","target":{"target":{"committedDate":"2017-12-31T22:47:43Z"}}},{"name":"v4.15-rc7","target":{"target":{"committedDate":"2018-01-07T22:22:41Z"}}},{"name":"v4.15-rc8","target":{"target":{"committedDate":"2018-01-14T23:32:30Z"}}},{"name":"v4.15-rc9","target":{"target":{"committedDate":"2018-01-21T21:51:26Z"}}},{"name":"v4.15","target":{"target":{"committedDate":"2018-01-28T21:20:33Z"}}},{"name":"v4.16-rc1","target":{"target":{"committedDate":"2018-02-11T23:04:29Z"}}},{"name":"v4.16-rc2","target":{"target":{"committedDate":"2018-02-19T01:29:42Z"}}},{"name":"v4.16-rc3","target":{"target":{"committedDate":"2018-02-26T02:50:41Z"}}},{"name":"v4.16-rc4","target":{"target":{"committedDate":"2018-03-04T22:54:11Z"}}},{"name":"v4.16-rc5","target":{"target":{"committedDate":"2018-03-12T00:25:09Z"}}},{"name":"v4.16-rc6","target":{"target":{"committedDate":"2018-03-19T00:48:42Z"}}},{"name":"v4.16-rc7","target":{"target":{"committedDate":"2018-03-25T22:44:30Z"}}},{"name":"v4.16","target":{"target":{"committedDate":"2018-04-01T21:20:27Z"}}},{"name":"v4.17-rc1","target":{"target":{"committedDate":"2018-04-16T01:24:20Z"}}},{"name":"v4.17-rc2","target":{"target":{"committedDate":"2018-04-23T02:20:09Z"}}},{"name":"v4.17-rc3","target":{"target":{"committedDate":"2018-04-29T21:17:42Z"}}},{"name":"v4.17-rc4","target":{"target":{"committedDate":"2018-05-07T02:57:38Z"}}},{"name":"v4.17-rc5","target":{"target":{"committedDate":"2018-05-13T23:15:17Z"}}},{"name":"v4.17-rc6","target":{"target":{"committedDate":"2018-05-20T22:31:38Z"}}},{"name":"v4.17-rc7","target":{"target":{"committedDate":"2018-05-27T20:01:47Z"}}},{"name":"v4.17","target":{"target":{"committedDate":"2018-06-03T21:15:21Z"}}},{"name":"v4.18-rc1","target":{"target":{"committedDate":"2018-06-16T23:04:49Z"}}},{"name":"v4.18-rc2","target":{"target":{"committedDate":"2018-06-24T12:54:29Z"}}},{"name":"v4.18-rc3","target":{"target":{"committedDate":"2018-07-01T23:04:53Z"}}},{"name":"v4.18-rc4","target":{"target":{"committedDate":"2018-07-08T23:34:02Z"}}},{"name":"v4.18-rc5","target":{"target":{"committedDate":"2018-07-15T19:49:31Z"}}},{"name":"v4.18-rc6","target":{"target":{"committedDate":"2018-07-22T21:12:20Z"}}},{"name":"v4.18-rc7","target":{"target":{"committedDate":"2018-07-29T21:44:52Z"}}},{"name":"v4.18-rc8","target":{"target":{"committedDate":"2018-08-05T19:37:41Z"}}},{"name":"v4.18","target":{"target":{"committedDate":"2018-08-12T20:41:04Z"}}},{"name":"v4.19-rc1","target":{"target":{"committedDate":"2018-08-26T21:11:59Z"}}},{"name":"v4.19-rc2","target":{"target":{"committedDate":"2018-09-02T21:37:30Z"}}},{"name":"v4.19-rc3","target":{"target":{"committedDate":"2018-09-10T00:26:43Z"}}},{"name":"v4.19-rc4","target":{"target":{"committedDate":"2018-09-16T18:52:37Z"}}},{"name":"v4.19-rc5","target":{"target":{"committedDate":"2018-09-23T17:15:18Z"}}},{"name":"v4.19-rc6","target":{"target":{"committedDate":"2018-09-30T14:15:35Z"}}},{"name":"v4.19-rc7","target":{"target":{"committedDate":"2018-10-07T15:26:02Z"}}},{"name":"v4.19-rc8","target":{"target":{"committedDate":"2018-10-15T05:20:24Z"}}},{"name":"v4.19","target":{"target":{"committedDate":"2018-10-22T06:37:37Z"}}},{"name":"v4.20-rc1","target":{"target":{"committedDate":"2018-11-04T23:37:52Z"}}},{"name":"v4.20-rc2","target":{"target":{"committedDate":"2018-11-11T23:12:31Z"}}},{"name":"v4.20-rc3","target":{"target":{"committedDate":"2018-11-18T21:33:44Z"}}},{"name":"v4.20-rc4","target":{"target":{"committedDate":"2018-11-25T22:19:31Z"}}},{"name":"v4.20-rc5","target":{"target":{"committedDate":"2018-12-02T23:07:55Z"}}},{"name":"v4.20-rc6","target":{"target":{"committedDate":"2018-12-09T23:31:00Z"}}},{"name":"v4.20-rc7","target":{"target":{"committedDate":"2018-12-16T23:46:55Z"}}},{"name":"v4.20","target":{"target":{"committedDate":"2018-12-23T23:55:59Z"}}},{"name":"v5.0-rc1","target":{"target":{"committedDate":"2019-01-07T01:08:20Z"}}},{"name":"v5.0-rc2","target":{"target":{"committedDate":"2019-01-13T22:41:12Z"}}},{"name":"v5.0-rc3","target":{"target":{"committedDate":"2019-01-21T00:14:44Z"}}},{"name":"v5.0-rc4","target":{"target":{"committedDate":"2019-01-27T23:18:05Z"}}},{"name":"v5.0-rc5","target":{"target":{"committedDate":"2019-02-03T21:48:04Z"}}},{"name":"v5.0-rc6","target":{"target":{"committedDate":"2019-02-10T22:42:20Z"}}},{"name":"v5.0-rc7","target":{"target":{"committedDate":"2019-02-18T02:46:40Z"}}},{"name":"v5.0-rc8","target":{"target":{"committedDate":"2019-02-25T00:46:45Z"}}},{"name":"v5.0","target":{"target":{"committedDate":"2019-03-03T23:21:29Z"}}},{"name":"v5.1-rc1","target":{"target":{"committedDate":"2019-03-17T21:22:26Z"}}},{"name":"v5.1-rc2","target":{"target":{"committedDate":"2019-03-24T21:02:26Z"}}},{"name":"v5.1-rc3","target":{"target":{"committedDate":"2019-03-31T21:39:29Z"}}},{"name":"v5.1-rc4","target":{"target":{"committedDate":"2019-04-08T00:09:59Z"}}},{"name":"v5.1-rc5","target":{"target":{"committedDate":"2019-04-14T22:17:41Z"}}}]}}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/records/torvalds_linux_7.json b/vulnerabilities/tests/test_data/records/torvalds_linux_7.json new file mode 100644 index 000000000..295fd56a8 --- /dev/null +++ b/vulnerabilities/tests/test_data/records/torvalds_linux_7.json @@ -0,0 +1 @@ +{"data":{"repository":{"refs":{"totalCount":713,"pageInfo":{"endCursor":"NzAw","hasNextPage":true},"nodes":[{"name":"v5.1-rc6","target":{"target":{"committedDate":"2019-04-21T17:45:57Z"}}},{"name":"v5.1-rc7","target":{"target":{"committedDate":"2019-04-29T00:04:13Z"}}},{"name":"v5.1","target":{"target":{"committedDate":"2019-05-06T00:42:58Z"}}},{"name":"v5.2-rc1","target":{"target":{"committedDate":"2019-05-19T22:47:09Z"}}},{"name":"v5.2-rc2","target":{"target":{"committedDate":"2019-05-26T23:49:19Z"}}},{"name":"v5.2-rc3","target":{"target":{"committedDate":"2019-06-02T20:55:33Z"}}},{"name":"v5.2-rc4","target":{"target":{"committedDate":"2019-06-09T03:24:46Z"}}},{"name":"v5.2-rc5","target":{"target":{"committedDate":"2019-06-16T18:49:45Z"}}},{"name":"v5.2-rc6","target":{"target":{"committedDate":"2019-06-22T23:01:36Z"}}},{"name":"v5.2-rc7","target":{"target":{"committedDate":"2019-06-30T03:25:36Z"}}},{"name":"v5.2","target":{"target":{"committedDate":"2019-07-07T22:41:56Z"}}},{"name":"v5.3-rc1","target":{"target":{"committedDate":"2019-07-21T21:05:38Z"}}},{"name":"v5.3-rc2","target":{"target":{"committedDate":"2019-07-28T19:47:02Z"}}},{"name":"v5.3-rc3","target":{"target":{"committedDate":"2019-08-05T01:40:12Z"}}},{"name":"v5.3-rc4","target":{"target":{"committedDate":"2019-08-11T20:26:41Z"}}},{"name":"v5.3-rc5","target":{"target":{"committedDate":"2019-08-18T21:31:08Z"}}},{"name":"v5.3-rc6","target":{"target":{"committedDate":"2019-08-25T19:01:23Z"}}},{"name":"v5.3-rc7","target":{"target":{"committedDate":"2019-09-02T16:57:40Z"}}},{"name":"v5.3-rc8","target":{"target":{"committedDate":"2019-09-08T20:33:15Z"}}},{"name":"v5.3","target":{"target":{"committedDate":"2019-09-15T21:19:32Z"}}},{"name":"v5.4-rc1","target":{"target":{"committedDate":"2019-09-30T17:35:40Z"}}},{"name":"v5.4-rc2","target":{"target":{"committedDate":"2019-10-06T21:27:30Z"}}},{"name":"v5.4-rc3","target":{"target":{"committedDate":"2019-10-13T23:37:36Z"}}},{"name":"v5.4-rc4","target":{"target":{"committedDate":"2019-10-20T19:56:22Z"}}},{"name":"v5.4-rc5","target":{"target":{"committedDate":"2019-10-27T17:19:19Z"}}},{"name":"v5.4-rc6","target":{"target":{"committedDate":"2019-11-03T22:07:26Z"}}},{"name":"v5.4-rc7","target":{"target":{"committedDate":"2019-11-11T00:17:15Z"}}},{"name":"v5.4-rc8","target":{"target":{"committedDate":"2019-11-17T22:47:30Z"}}},{"name":"v5.4","target":{"target":{"committedDate":"2019-11-25T00:32:01Z"}}},{"name":"v5.5-rc1","target":{"target":{"committedDate":"2019-12-08T22:57:55Z"}}},{"name":"v5.5-rc2","target":{"target":{"committedDate":"2019-12-15T23:16:08Z"}}},{"name":"v5.5-rc3","target":{"target":{"committedDate":"2019-12-23T01:02:23Z"}}},{"name":"v5.5-rc4","target":{"target":{"committedDate":"2019-12-29T23:29:16Z"}}},{"name":"v5.5-rc5","target":{"target":{"committedDate":"2020-01-05T22:23:27Z"}}},{"name":"v5.5-rc6","target":{"target":{"committedDate":"2020-01-13T00:55:08Z"}}},{"name":"v5.5-rc7","target":{"target":{"committedDate":"2020-01-20T00:02:49Z"}}},{"name":"v5.5","target":{"target":{"committedDate":"2020-01-27T00:23:03Z"}}},{"name":"v5.6-rc1","target":{"target":{"committedDate":"2020-02-10T00:08:48Z"}}},{"name":"v5.6-rc2","target":{"target":{"committedDate":"2020-02-16T21:16:59Z"}}},{"name":"v5.6-rc3","target":{"target":{"committedDate":"2020-02-24T00:17:42Z"}}},{"name":"v5.6-rc4","target":{"target":{"committedDate":"2020-03-01T22:38:46Z"}}},{"name":"v5.6-rc5","target":{"target":{"committedDate":"2020-03-09T00:44:44Z"}}},{"name":"v5.6-rc6","target":{"target":{"committedDate":"2020-03-15T22:01:23Z"}}},{"name":"v5.6-rc7","target":{"target":{"committedDate":"2020-03-23T01:31:56Z"}}},{"name":"v5.6","target":{"target":{"committedDate":"2020-03-29T22:25:41Z"}}},{"name":"v5.7-rc1","target":{"target":{"committedDate":"2020-04-12T19:35:55Z"}}},{"name":"v5.7-rc2","target":{"target":{"committedDate":"2020-04-19T21:35:30Z"}}},{"name":"v5.7-rc3","target":{"target":{"committedDate":"2020-04-26T20:51:02Z"}}},{"name":"v5.7-rc4","target":{"target":{"committedDate":"2020-05-03T21:56:04Z"}}},{"name":"v5.7-rc5","target":{"target":{"committedDate":"2020-05-10T22:16:58Z"}}},{"name":"v5.7-rc6","target":{"target":{"committedDate":"2020-05-17T23:48:37Z"}}},{"name":"v5.7-rc7","target":{"target":{"committedDate":"2020-05-24T22:32:54Z"}}},{"name":"v5.7","target":{"target":{"committedDate":"2020-05-31T23:49:15Z"}}},{"name":"v5.8-rc1","target":{"target":{"committedDate":"2020-06-14T19:45:04Z"}}},{"name":"v5.8-rc2","target":{"target":{"committedDate":"2020-06-21T22:45:29Z"}}},{"name":"v5.8-rc3","target":{"target":{"committedDate":"2020-06-28T22:00:24Z"}}},{"name":"v5.8-rc4","target":{"target":{"committedDate":"2020-07-05T23:20:22Z"}}},{"name":"v5.8-rc5","target":{"target":{"committedDate":"2020-07-12T23:34:50Z"}}},{"name":"v5.8-rc6","target":{"target":{"committedDate":"2020-07-19T22:41:18Z"}}},{"name":"v5.8-rc7","target":{"target":{"committedDate":"2020-07-26T21:14:06Z"}}},{"name":"v5.8","target":{"target":{"committedDate":"2020-08-02T21:21:45Z"}}},{"name":"v5.9-rc1","target":{"target":{"committedDate":"2020-08-16T20:04:57Z"}}},{"name":"v5.9-rc2","target":{"target":{"committedDate":"2020-08-23T21:08:43Z"}}},{"name":"v5.9-rc3","target":{"target":{"committedDate":"2020-08-30T23:01:54Z"}}},{"name":"v5.9-rc4","target":{"target":{"committedDate":"2020-09-07T00:11:40Z"}}},{"name":"v5.9-rc5","target":{"target":{"committedDate":"2020-09-13T23:06:00Z"}}},{"name":"v5.9-rc6","target":{"target":{"committedDate":"2020-09-20T23:33:55Z"}}},{"name":"v5.9-rc7","target":{"target":{"committedDate":"2020-09-27T21:38:10Z"}}},{"name":"v5.9-rc8","target":{"target":{"committedDate":"2020-10-04T23:04:34Z"}}},{"name":"v5.9","target":{"target":{"committedDate":"2020-10-11T21:15:50Z"}}},{"name":"v5.10-rc1","target":{"target":{"committedDate":"2020-10-25T22:14:11Z"}}},{"name":"v5.10-rc2","target":{"target":{"committedDate":"2020-11-01T22:43:51Z"}}},{"name":"v5.10-rc3","target":{"target":{"committedDate":"2020-11-09T00:10:16Z"}}},{"name":"v5.10-rc4","target":{"target":{"committedDate":"2020-11-16T00:44:31Z"}}},{"name":"v5.10-rc5","target":{"target":{"committedDate":"2020-11-22T23:36:08Z"}}},{"name":"v5.10-rc6","target":{"target":{"committedDate":"2020-11-29T23:50:50Z"}}},{"name":"v5.10-rc7","target":{"target":{"committedDate":"2020-12-06T22:25:12Z"}}},{"name":"v5.10","target":{"target":{"committedDate":"2020-12-13T22:41:30Z"}}},{"name":"v5.11-rc1","target":{"target":{"committedDate":"2020-12-27T23:30:22Z"}}},{"name":"v5.11-rc2","target":{"target":{"committedDate":"2021-01-03T23:55:30Z"}}},{"name":"v5.11-rc3","target":{"target":{"committedDate":"2021-01-10T22:34:50Z"}}},{"name":"v5.11-rc4","target":{"target":{"committedDate":"2021-01-18T00:37:05Z"}}},{"name":"v5.11-rc5","target":{"target":{"committedDate":"2021-01-25T00:47:14Z"}}},{"name":"v5.11-rc6","target":{"target":{"committedDate":"2021-01-31T21:50:09Z"}}},{"name":"v5.11-rc7","target":{"target":{"committedDate":"2021-02-07T21:57:38Z"}}},{"name":"v5.11","target":{"target":{"committedDate":"2021-02-14T22:32:24Z"}}},{"name":"v5.12-rc1-dontuse","target":{"target":{"committedDate":"2021-03-01T00:05:19Z"}}},{"name":"v5.12-rc2","target":{"target":{"committedDate":"2021-03-06T01:33:41Z"}}},{"name":"v5.12-rc3","target":{"target":{"committedDate":"2021-03-14T21:41:02Z"}}},{"name":"v5.12-rc4","target":{"target":{"committedDate":"2021-03-21T21:56:43Z"}}},{"name":"v5.12-rc5","target":{"target":{"committedDate":"2021-03-28T22:48:16Z"}}},{"name":"v5.12-rc6","target":{"target":{"committedDate":"2021-04-04T21:15:36Z"}}},{"name":"v5.12-rc7","target":{"target":{"committedDate":"2021-04-11T22:16:13Z"}}},{"name":"v5.12-rc8","target":{"target":{"committedDate":"2021-04-18T21:45:32Z"}}},{"name":"v5.12","target":{"target":{"committedDate":"2021-04-25T20:49:08Z"}}},{"name":"v5.13-rc1","target":{"target":{"committedDate":"2021-05-09T21:17:44Z"}}},{"name":"v5.13-rc2","target":{"target":{"committedDate":"2021-05-16T22:27:44Z"}}},{"name":"v5.13-rc3","target":{"target":{"committedDate":"2021-05-23T21:42:48Z"}}},{"name":"v5.13-rc4","target":{"target":{"committedDate":"2021-05-30T21:58:25Z"}}},{"name":"v5.13-rc5","target":{"target":{"committedDate":"2021-06-06T22:47:27Z"}}}]}}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/records/torvalds_linux_8.json b/vulnerabilities/tests/test_data/records/torvalds_linux_8.json new file mode 100644 index 000000000..8e779366f --- /dev/null +++ b/vulnerabilities/tests/test_data/records/torvalds_linux_8.json @@ -0,0 +1 @@ +{"data":{"repository":{"refs":{"totalCount":713,"pageInfo":{"endCursor":"NzEz","hasNextPage":false},"nodes":[{"name":"v5.13-rc6","target":{"target":{"committedDate":"2021-06-13T21:43:10Z"}}},{"name":"v5.13-rc7","target":{"target":{"committedDate":"2021-06-20T22:03:15Z"}}},{"name":"v5.13","target":{"target":{"committedDate":"2021-06-27T22:21:11Z"}}},{"name":"v5.14-rc1","target":{"target":{"committedDate":"2021-07-11T22:07:40Z"}}},{"name":"v5.14-rc2","target":{"target":{"committedDate":"2021-07-18T21:13:49Z"}}},{"name":"v5.14-rc3","target":{"target":{"committedDate":"2021-07-25T22:35:14Z"}}},{"name":"v5.14-rc4","target":{"target":{"committedDate":"2021-08-02T00:04:17Z"}}},{"name":"v5.14-rc5","target":{"target":{"committedDate":"2021-08-08T20:49:31Z"}}},{"name":"v5.14-rc6","target":{"target":{"committedDate":"2021-08-15T23:40:53Z"}}},{"name":"v5.14-rc7","target":{"target":{"committedDate":"2021-08-22T21:24:56Z"}}},{"name":"v5.14","target":{"target":{"committedDate":"2021-08-29T22:04:50Z"}}},{"name":"v5.15-rc1","target":{"target":{"committedDate":"2021-09-12T23:28:37Z"}}},{"name":"v5.15-rc2","target":{"target":{"committedDate":"2021-09-20T00:28:22Z"}}}]}}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_package_managers.py b/vulnerabilities/tests/test_package_managers.py index 28c7cb3ab..2e74f7c54 100644 --- a/vulnerabilities/tests/test_package_managers.py +++ b/vulnerabilities/tests/test_package_managers.py @@ -21,11 +21,13 @@ # Visit https://github.com/nexB/vulnerablecode/ for support and download. import asyncio +import distutils.spawn import json import os +from unittest.case import SkipTest import xml.etree.ElementTree as ET from datetime import datetime -from bs4 import BeautifulSoup +from aiohttp.client import ClientSession from dateutil.tz import tzlocal from pytz import UTC from unittest import TestCase @@ -34,8 +36,10 @@ from vulnerabilities.package_managers import ComposerVersionAPI from vulnerabilities.package_managers import MavenVersionAPI from vulnerabilities.package_managers import NugetVersionAPI +from vulnerabilities.package_managers import GitHubTagsAPI from vulnerabilities.package_managers import Version from vulnerabilities.package_managers import VersionResponse +from vulnerabilities.package_managers import client_session BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TEST_DATA = os.path.join(BASE_DIR, "test_data") @@ -51,6 +55,14 @@ async def request(self, *args, **kwargs): mock_response.read = self.read return mock_response + def get(self, *args, **kwargs): + kwargs["method"] = "get" + return self.request(*args, **kwargs) + + def post(self, *args, **kwargs): + kwargs["method"] = "post" + return self.request(*args, **kwargs) + async def json(self): return self.return_val @@ -58,6 +70,57 @@ async def read(self): return self.return_val +class RecordedClientSession: + def __init__(self, test_id, regen=False): + self.test_id = test_id + self.req_num = 1 + self.headers = {} + self.regen = regen + if regen: + self.session = ClientSession() + + @property + def record_filename(self): + return os.path.join(TEST_DATA, "records", f"{self.test_id}_{self.req_num}.json") + + async def request(self, *args, **kwargs): + if self.regen: + self.session.headers.update(self.headers) + res = await self.session.request(*args, **kwargs) + data = await res.read() + with open(self.record_filename, "wb") as f: + f.write(data) + with open(self.record_filename, "rb") as f: + self.return_val = f.read() + + mock_response = AsyncMock() + mock_response.json = self.json + mock_response.read = self.read + self.req_num += 1 + return mock_response + + def get(self, *args, **kwargs): + return self.request("get", *args, **kwargs) + + def post(self, *args, **kwargs): + return self.request("post", *args, **kwargs) + + async def json(self): + return json.loads(self.return_val) + + async def read(self): + return self.return_val + + async def __aenter__(self): + if self.regen: + await self.session.__aenter__() + return self + + async def __aexit__(self, exc_type, exc, tb): + if self.regen: + return await self.session.__aexit__(exc_type, exc, tb) + + class TestComposerVersionAPI(TestCase): @classmethod def setUpClass(cls): @@ -496,3 +559,38 @@ def test_fetch(self): # self.version_api.load_to_api("Exfat.Ntfs") # assert self.version_api.get("Exfat.Ntfs") == self.expected_versions + + +class TestGitHubTagsAPI(TestCase): + regen = False + + def setUp(self) -> None: + if not os.getenv("GH_TOKEN"): + if not distutils.spawn.find_executable("svn"): + raise SkipTest("cannot find svn executable and GH_TOKEN variable is not set") + + return super().setUp() + + def do_test_fetch(self, ownername): + self.version_api = GitHubTagsAPI() + test_id = ownername.replace("/", "_") + + async def async_run(): + async with RecordedClientSession(test_id, regen=self.regen) as session: + await self.version_api.fetch(ownername, session) + + asyncio.run(async_run()) + + def test_simple(self): + self.do_test_fetch("nexB/vulnerablecode") + assert self.version_api.get("nexB/vulnerablecode") == VersionResponse( + newer_versions=set(), + valid_versions={ + "v0.1", + "v20.10", + }, + ) + + def test_huge_repo(self): + self.do_test_fetch("torvalds/linux") + assert len(self.version_api.get("torvalds/linux").valid_versions) > 700